Skip to content
This repository was archived by the owner on Sep 3, 2024. It is now read-only.

Commit 94ce44c

Browse files
using new links class on all stream resource
1 parent cfb9b4f commit 94ce44c

10 files changed

Lines changed: 184 additions & 180 deletions

src/SqlStreamStore.HAL.Tests/LinkAssertionExtensions.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,5 @@
11
namespace SqlStreamStore.HAL.Tests
22
{
3-
using System;
4-
using Microsoft.VisualStudio.TestPlatform.ObjectModel;
53
using Shouldly;
64

75
internal static class LinkAssertionExtensions

src/SqlStreamStore.HAL.Tests/StreamNavigationTests.cs

Lines changed: 44 additions & 36 deletions
Original file line numberDiff line numberDiff line change
@@ -45,18 +45,21 @@ public async Task read_head_link_no_messages(string stream, string baseAddress,
4545

4646
var resource = await response.AsHal();
4747

48-
resource.ShouldLink(Constants.Relations.Self, $"{stream}?{LastLinkQuery}");
49-
50-
resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}");
51-
52-
resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}");
53-
54-
resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{LastLinkQuery}");
48+
var links = TheLinks
49+
.RootedAt("../")
50+
.Index()
51+
.Find()
52+
.Add(Constants.Relations.Self, $"{stream}?{LastLinkQuery}")
53+
.Add(Constants.Relations.Last, $"{stream}?{LastLinkQuery}")
54+
.Add(Constants.Relations.First, $"{stream}?{FirstLinkQuery}")
55+
.Add(Constants.Relations.Feed, $"{stream}?{LastLinkQuery}");
5556

5657
if(!IsAllStream($"{baseAddress}{stream}"))
5758
{
58-
resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata");
59+
links.Add(Constants.Relations.Metadata, $"{stream}/metadata");
5960
}
61+
62+
resource.ShouldLink(links);
6063
}
6164
}
6265

@@ -86,20 +89,22 @@ await _fixture.HttpClient.GetAsync($"{baseAddress}{firstResponse.Headers.Locatio
8689

8790
var resource = await response.AsHal();
8891

89-
resource.ShouldLink(Constants.Relations.Self, $"{stream}?{LastLinkQuery}");
90-
91-
resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}");
92-
93-
resource.ShouldLink(Constants.Relations.Previous, $"{stream}?d=b&m=20&p=9&e=0");
94-
95-
resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}");
96-
97-
resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{LastLinkQuery}");
92+
var links = TheLinks
93+
.RootedAt("../")
94+
.Index()
95+
.Find()
96+
.Add(Constants.Relations.Self, $"{stream}?{LastLinkQuery}")
97+
.Add(Constants.Relations.Last, $"{stream}?{LastLinkQuery}")
98+
.Add(Constants.Relations.Previous, $"{stream}?d=b&m=20&p=9&e=0")
99+
.Add(Constants.Relations.First, $"{stream}?{FirstLinkQuery}")
100+
.Add(Constants.Relations.Feed, $"{stream}?{LastLinkQuery}");
98101

99102
if(!IsAllStream($"{baseAddress}{stream}"))
100103
{
101-
resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata");
104+
links.Add(Constants.Relations.Metadata, $"{stream}/metadata");
102105
}
106+
107+
resource.ShouldLink(links);
103108
}
104109
}
105110
}
@@ -119,18 +124,20 @@ public async Task read_first_link(string stream, string baseAddress)
119124

120125
var resource = await response.AsHal();
121126

122-
resource.ShouldLink(Constants.Relations.Self, $"{stream}?{FirstLinkQuery}");
123-
124-
resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}");
125-
126-
resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}");
127-
128-
resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{FirstLinkQuery}");
127+
var links = TheLinks.RootedAt("../")
128+
.Index()
129+
.Find()
130+
.Add(Constants.Relations.Self, $"{stream}?{FirstLinkQuery}")
131+
.Add(Constants.Relations.Last, $"{stream}?{LastLinkQuery}")
132+
.Add(Constants.Relations.First, $"{stream}?{FirstLinkQuery}")
133+
.Add(Constants.Relations.Feed, $"{stream}?{FirstLinkQuery}");
129134

130135
if(!IsAllStream($"{baseAddress}{stream}"))
131136
{
132-
resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata");
137+
links.Add(Constants.Relations.Metadata, $"{stream}/metadata");
133138
}
139+
140+
resource.ShouldLink(links);
134141
}
135142
}
136143

@@ -145,20 +152,21 @@ public async Task read_first_link_when_multiple_pages(string stream, string base
145152

146153
var resource = await response.AsHal();
147154

148-
resource.ShouldLink(Constants.Relations.Self, $"{stream}?{FirstLinkQuery}");
149-
150-
resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}");
151-
152-
resource.ShouldLink(Constants.Relations.Next, $"{stream}?d=f&m=20&p=20&e=0");
153-
154-
resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}");
155-
156-
resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{FirstLinkQuery}");
155+
var links = TheLinks.RootedAt("../")
156+
.Index()
157+
.Find()
158+
.Add(Constants.Relations.Self, $"{stream}?{FirstLinkQuery}")
159+
.Add(Constants.Relations.Last, $"{stream}?{LastLinkQuery}")
160+
.Add(Constants.Relations.Next, $"{stream}?d=f&m=20&p=20&e=0")
161+
.Add(Constants.Relations.First, $"{stream}?{FirstLinkQuery}")
162+
.Add(Constants.Relations.Feed, $"{stream}?{FirstLinkQuery}");
157163

158164
if(!IsAllStream($"{baseAddress}{stream}"))
159165
{
160-
resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata");
166+
links.Add(Constants.Relations.Metadata, $"{stream}/metadata");
161167
}
168+
169+
resource.ShouldLink(links);
162170
}
163171
}
164172

Lines changed: 57 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,57 @@
1+
namespace SqlStreamStore.HAL.AllStream
2+
{
3+
using System.Linq;
4+
using SqlStreamStore.HAL.Resources;
5+
using SqlStreamStore.Streams;
6+
7+
internal static class AllStreamLinkExtensions
8+
{
9+
public static TheLinks Navigation(
10+
this TheLinks links,
11+
ReadAllPage page,
12+
ReadAllStreamOperation operation)
13+
{
14+
var first = LinkFormatter.FormatForwardLink(
15+
Constants.Streams.All,
16+
operation.MaxCount,
17+
Position.Start,
18+
operation.EmbedPayload);
19+
20+
var last = LinkFormatter.FormatBackwardLink(
21+
Constants.Streams.All,
22+
operation.MaxCount,
23+
Position.End,
24+
operation.EmbedPayload);
25+
26+
links.Add(Constants.Relations.First, first);
27+
28+
if(operation.Self != first && !page.IsEnd)
29+
{
30+
links.Add(
31+
Constants.Relations.Previous,
32+
LinkFormatter.FormatBackwardLink(
33+
Constants.Streams.All,
34+
operation.MaxCount,
35+
page.Messages.Min(m => m.Position) - 1,
36+
operation.EmbedPayload));
37+
}
38+
39+
links.Add(Constants.Relations.Feed, operation.Self).Self();
40+
41+
if(operation.Self != last && !page.IsEnd)
42+
{
43+
links.Add(
44+
Constants.Relations.Next,
45+
LinkFormatter.FormatForwardLink(
46+
Constants.Streams.All,
47+
operation.MaxCount,
48+
page.Messages.Max(m => m.Position) + 1,
49+
operation.EmbedPayload));
50+
}
51+
52+
links.Add(Constants.Relations.Last, last);
53+
54+
return links;
55+
}
56+
}
57+
}

src/SqlStreamStore.HAL/Resources/AllStreamResource.cs renamed to src/SqlStreamStore.HAL/AllStream/AllStreamResource.cs

Lines changed: 8 additions & 78 deletions
Original file line numberDiff line numberDiff line change
@@ -1,12 +1,12 @@
1-
namespace SqlStreamStore.HAL.Resources
1+
namespace SqlStreamStore.HAL.AllStream
22
{
33
using System;
4-
using System.Collections.Generic;
54
using System.Linq;
65
using System.Net.Http;
76
using System.Threading;
87
using System.Threading.Tasks;
98
using Halcyon.HAL;
9+
using SqlStreamStore.HAL.Resources;
1010
using SqlStreamStore.Streams;
1111

1212
internal class AllStreamResource : IResource
@@ -59,10 +59,12 @@ public async Task<Response> Get(
5959
page.NextPosition,
6060
page.IsEnd
6161
})
62-
.AddLinks(Links.Self(operation))
63-
.AddLinks(Links.Navigation(page, operation))
64-
.AddLinks(Links.Feed(operation))
65-
.AddLinks(Links.Find())
62+
.AddLinks(
63+
TheLinks
64+
.RootedAt("../")
65+
.Index()
66+
.Find()
67+
.Navigation(page, operation))
6668
.AddEmbeddedCollection(
6769
Constants.Relations.Message,
6870
streamMessages.Zip(
@@ -106,78 +108,6 @@ public async Task<Response> Get(
106108

107109
private static class Links
108110
{
109-
public static Link Find() => SqlStreamStore.HAL.Links.Find("../streams/{streamId}");
110-
111-
public static Link Self(ReadAllStreamOperation operation)
112-
=> new Link(Constants.Relations.Self, operation.Self);
113-
114-
public static Link First(ReadAllStreamOperation operation)
115-
=> new Link(
116-
Constants.Relations.First,
117-
LinkFormatter.FormatForwardLink(
118-
Constants.Streams.All,
119-
operation.MaxCount,
120-
Position.Start,
121-
operation.EmbedPayload));
122-
123-
public static Link Last(ReadAllStreamOperation operation)
124-
=> new Link(
125-
Constants.Relations.Last,
126-
LinkFormatter.FormatBackwardLink(
127-
Constants.Streams.All,
128-
operation.MaxCount,
129-
Position.End,
130-
operation.EmbedPayload));
131-
132-
public static Link Last()
133-
=> new Link(
134-
Constants.Relations.Last,
135-
LinkFormatter.FormatBackwardLink(
136-
Constants.Streams.All,
137-
Constants.MaxCount,
138-
Position.End,
139-
false));
140-
141-
public static Link Feed(ReadAllStreamOperation operation)
142-
=> new Link(Constants.Relations.Feed, operation.Self);
143-
144-
public static Link Feed()
145-
=> new Link(Constants.Relations.Feed, Last().Href);
146-
147-
public static Link Previous(ReadAllPage page, ReadAllStreamOperation operation)
148-
=> new Link(
149-
Constants.Relations.Previous,
150-
LinkFormatter.FormatBackwardLink(
151-
Constants.Streams.All,
152-
operation.MaxCount,
153-
page.Messages.Min(m => m.Position) - 1,
154-
operation.EmbedPayload));
155-
156-
public static Link Next(ReadAllPage page, ReadAllStreamOperation operation)
157-
=> new Link(
158-
Constants.Relations.Next,
159-
LinkFormatter.FormatForwardLink(
160-
Constants.Streams.All,
161-
operation.MaxCount,
162-
page.Messages.Max(m => m.Position) + 1,
163-
operation.EmbedPayload));
164-
165-
public static IEnumerable<Link> Navigation(ReadAllPage page, ReadAllStreamOperation operation)
166-
{
167-
var first = First(operation);
168-
var last = Last(operation);
169-
170-
yield return first;
171-
172-
if(operation.Self != first.Href && !page.IsEnd)
173-
yield return Previous(page, operation);
174-
175-
if(operation.Self != last.Href && !page.IsEnd)
176-
yield return Next(page, operation);
177-
178-
yield return last;
179-
}
180-
181111
public static class Message
182112
{
183113
public static Link Self(StreamMessage message) => new Link(

src/SqlStreamStore.HAL/ReadAllStreamMiddleware.cs renamed to src/SqlStreamStore.HAL/AllStream/ReadAllStreamMiddleware.cs

Lines changed: 6 additions & 19 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,7 @@
1-
namespace SqlStreamStore.HAL
1+
namespace SqlStreamStore.HAL.AllStream
22
{
33
using Microsoft.AspNetCore.Builder;
44
using Microsoft.AspNetCore.Http;
5-
using SqlStreamStore.HAL.AllStreamMessage;
6-
using SqlStreamStore.HAL.Resources;
75
using MidFunc = System.Func<
86
Microsoft.AspNetCore.Http.HttpContext,
97
System.Func<System.Threading.Tasks.Task>,
@@ -18,19 +16,17 @@ public static IApplicationBuilder UseReadAllStream(
1816
SqlStreamStoreMiddlewareOptions options)
1917
{
2018
var allStream = new AllStreamResource(streamStore, options.UseCanonicalUrls);
21-
var allStreamMessages = new AllStreamMessageResource(streamStore);
2219

2320
return builder
24-
.MapWhen(IsAllStream, inner => inner.Use(GetStream(allStream)))
25-
.MapWhen(IsAllStreamMessage, inner => inner.Use(GetStreamMessage(allStreamMessages)));
21+
.MapWhen(IsGetAllStream, inner => inner.Use(GetStream(allStream)))
22+
.MapWhen(IsOptionsAllStream, inner => inner.UseOptions(allStream));
2623
}
2724

28-
private static bool IsAllStream(HttpContext context)
25+
private static bool IsGetAllStream(HttpContext context)
2926
=> context.IsGetOrHead() && context.Request.Path.IsAllStream();
3027

31-
private static bool IsAllStreamMessage(HttpContext context)
32-
=> context.IsGetOrHead() && context.Request.Path.IsAllStreamMessage();
33-
28+
private static bool IsOptionsAllStream(HttpContext context)
29+
=> context.IsOptions() && context.Request.Path.IsAllStream();
3430

3531
private static MidFunc GetStream(AllStreamResource allStream) => async (context, next) =>
3632
{
@@ -40,14 +36,5 @@ private static MidFunc GetStream(AllStreamResource allStream) => async (context,
4036

4137
await context.WriteResponse(response);
4238
};
43-
44-
private static MidFunc GetStreamMessage(AllStreamMessageResource allStreamMessages) => async (context, next) =>
45-
{
46-
var response = await allStreamMessages.Get(
47-
new ReadAllStreamMessageOperation(context.Request),
48-
context.RequestAborted);
49-
50-
await context.WriteResponse(response);
51-
};
5239
}
5340
}

src/SqlStreamStore.HAL/Resources/ReadAllStreamOperation.cs renamed to src/SqlStreamStore.HAL/AllStream/ReadAllStreamOperation.cs

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
1-
namespace SqlStreamStore.HAL.Resources
1+
namespace SqlStreamStore.HAL.AllStream
22
{
33
using System.Threading;
44
using System.Threading.Tasks;
55
using Microsoft.AspNetCore.Http;
6+
using SqlStreamStore.HAL.Resources;
67
using SqlStreamStore.Streams;
78

89
internal class ReadAllStreamOperation : IStreamStoreOperation<ReadAllPage>

0 commit comments

Comments
 (0)