public async Task read_head_link_no_messages(string stream, string baseAddress, HttpStatusCode statusCode) { using (var firstResponse = await _fixture.HttpClient.GetAsync($"{baseAddress}{stream}")) using (var response = await _fixture.HttpClient.GetAsync($"{baseAddress}{firstResponse.Headers.Location}")) { response.StatusCode.ShouldBe(statusCode); var eTag = IsAllStream(stream) ? ETag.FromPosition(Position.End) : ETag.FromStreamVersion(StreamVersion.End); response.Headers.ETag.ShouldBe(new EntityTagHeaderValue(eTag)); var resource = await response.AsHal(); resource.ShouldLink(Constants.Relations.Self, $"{stream}?{LastLinkQuery}"); resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}"); resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}"); resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{LastLinkQuery}"); if (!IsAllStream($"{baseAddress}{stream}")) { resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata"); } } }
public async Task read_head_link_when_multiple_pages(string path, string root) { var result = await _fixture.WriteNMessages(StreamId, 30); using (var response = await _fixture.HttpClient.GetAsync($"{path}")) { response.StatusCode.ShouldBe(HttpStatusCode.OK); var eTag = IsAllStream(path) ? ETag.FromPosition(result.CurrentPosition) : ETag.FromStreamVersion(result.CurrentVersion); response.Headers.ETag.ShouldBe(new EntityTagHeaderValue(eTag)); var resource = await response.AsHal(); var links = Links .FromRequestMessage(response.RequestMessage) .Index() .Find() .Add(Constants.Relations.Self, $"{path}?{LastLinkQuery}", !IsAllStream(path) ? StreamId : null) .Add(Constants.Relations.Last, $"{path}?{LastLinkQuery}") .Add(Constants.Relations.Previous, $"{path}?d=b&m=20&p=9&e=0") .Add(Constants.Relations.First, $"{path}?{FirstLinkQuery}") .Add(Constants.Relations.Feed, $"{path}?{LastLinkQuery}", !IsAllStream(path) ? StreamId : null); if (!IsAllStream($"{path}")) { links.Add(Constants.Relations.Metadata, $"{path}/metadata"); } resource.ShouldLink(links); } }
public async Task read_first_link(string stream, string baseAddress) { var result = await _fixture.WriteNMessages("a-stream", 10); using (var response = await _fixture.HttpClient.GetAsync($"{baseAddress}{stream}?{FirstLinkQuery}")) { response.StatusCode.ShouldBe(HttpStatusCode.OK); var eTag = IsAllStream(stream) ? ETag.FromPosition(result.CurrentPosition) : ETag.FromStreamVersion(result.CurrentVersion); response.Headers.ETag.ShouldBe(new EntityTagHeaderValue(eTag)); var resource = await response.AsHal(); resource.ShouldLink(Constants.Relations.Self, $"{stream}?{FirstLinkQuery}"); resource.ShouldLink(Constants.Relations.Last, $"{stream}?{LastLinkQuery}"); resource.ShouldLink(Constants.Relations.First, $"{stream}?{FirstLinkQuery}"); resource.ShouldLink(Constants.Relations.Feed, $"{stream}?{FirstLinkQuery}"); if (!IsAllStream($"{baseAddress}{stream}")) { resource.ShouldLink(Constants.Relations.Metadata, $"{stream}/metadata"); } } }
public async Task read_head_link_no_messages(string path, string root, HttpStatusCode statusCode) { using (var response = await _fixture.HttpClient.GetAsync(path)) { response.StatusCode.ShouldBe(statusCode); var eTag = IsAllStream(path) ? ETag.FromPosition(Position.End) : ETag.FromStreamVersion(StreamVersion.End); response.Headers.ETag.ShouldBe(new EntityTagHeaderValue(eTag)); var resource = await response.AsHal(); var links = Links .FromRequestMessage(response.RequestMessage) .Index() .Find() .Add(Constants.Relations.Self, $"{path}?{LastLinkQuery}", !IsAllStream(path) ? StreamId : null) .Add(Constants.Relations.Last, $"{path}?{LastLinkQuery}") .Add(Constants.Relations.First, $"{path}?{FirstLinkQuery}") .Add(Constants.Relations.Feed, $"{path}?{LastLinkQuery}", !IsAllStream(path) ? StreamId : null); if (!IsAllStream(path)) { links.Add(Constants.Relations.Metadata, $"{path}/metadata"); } resource.ShouldLink(links); } }
public async Task <Response> Get( GetStreamMetadataOperation operation, CancellationToken cancellationToken) { var result = await operation.Invoke(_streamStore, cancellationToken); var response = new HalJsonResponse(new HALResponse(new { result.StreamId, result.MetadataStreamVersion, result.MaxAge, result.MaxCount, result.MetadataJson }) .AddLinks( Links .FromOperation(operation) .Index() .Find() .Browse() .StreamMetadataNavigation(operation)) .AddEmbeddedResource( Constants.Relations.Metadata, metadata), result.MetadataStreamVersion >= 0 ? 200 : 404) { Headers = { ETag.FromStreamVersion(result.MetadataStreamVersion) } }; return(response); }
public async Task <Response> Get( GetStreamMetadataOperation operation, CancellationToken cancellationToken) { var result = await operation.Invoke(_streamStore, cancellationToken); var response = new Response(new HALResponse(new { result.StreamId, result.MetadataStreamVersion, result.MaxAge, result.MaxCount, result.MetadataJson }) .AddLinks( Links.Self(), Links.Metadata(), Links.Feed(operation)) .AddEmbeddedResource( Constants.Relations.Metadata, Schemas.SetStreamMetadata), result.MetadataStreamVersion >= 0 ? 200 : 404) { Headers = { ETag.FromStreamVersion(result.MetadataStreamVersion) } }; return(response); }
public async Task <Response> Get( ReadStreamMessageByStreamVersionOperation operation, CancellationToken cancellationToken) { var message = await operation.Invoke(_streamStore, cancellationToken); var links = Links .FromPath(operation.Path) .Index() .Find() .Browse() .StreamMessageNavigation(message, operation); if (message.MessageId == Guid.Empty) { return(new HalJsonResponse( new HALResponse(new { operation.StreamId, operation.StreamVersion }) .AddLinks(links), 404)); } if (operation.StreamVersion == StreamVersion.End) { return(new HalJsonResponse(new HALResponse(new object()), 307) { Headers = { [Constants.Headers.Location] = new[] { $"{message.StreamVersion}" } } }); } var payload = await message.GetJsonData(cancellationToken); var eTag = ETag.FromStreamVersion(message.StreamVersion); return(new HalJsonResponse( new StreamMessageHALResponse(message, payload) .AddEmbeddedResource( Constants.Relations.DeleteMessage, DeleteStreamMessage) .AddLinks(links)) { Headers = { eTag, CacheControl.OneYear } }); }
public async Task <Response> Get( ReadStreamMessageByStreamVersionOperation operation, CancellationToken cancellationToken) { var message = await operation.Invoke(_streamStore, cancellationToken); if (message.MessageId == Guid.Empty) { return(new Response( new HALResponse(new { operation.StreamId, operation.StreamVersion }) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(operation)) .AddLinks(Links.Message(operation)) .AddLinks(Links.Find()), 404)); } if (operation.StreamVersion == StreamVersion.End) { return(new Response(new HALResponse(new object()), 307) { Headers = { [Constants.Headers.Location] = new[] { $"{message.StreamVersion}" } } }); } var payload = await message.GetJsonData(cancellationToken); var eTag = ETag.FromStreamVersion(message.StreamVersion); return(new Response( new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }) .AddEmbeddedResource( Constants.Relations.Delete, Schemas.DeleteStreamMessage) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(operation, message)) .AddLinks(Links.Message(operation)) .AddLinks(Links.Find())) { Headers = { eTag, CacheControl.OneYear } }); }