public async Task <Response> Get( ReadAllStreamMessageOperation operation, CancellationToken cancellationToken) { var message = await operation.Invoke(_streamStore, cancellationToken); if (message.MessageId == Guid.Empty) { return(new Response( new HALResponse(new HALModelConfig()) .AddLinks(Links.Feed()) .AddLinks(Links.Find()), 404)); } var payload = await message.GetJsonData(cancellationToken); return(new Response( new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }).AddLinks( Links.Self(message), Links.Message(message), Links.Feed(), Links.Find()))); }
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> GetPage( ReadAllStreamOperation operation, CancellationToken cancellationToken) { var page = await operation.Invoke(_streamStore, cancellationToken); var streamMessages = page.Messages.OrderByDescending(m => m.Position).ToArray(); var payloads = await Task.WhenAll(streamMessages .Select(message => operation.EmbedPayload ? message.GetJsonData(cancellationToken) : Task.FromResult <string>(null)) .ToArray()); var response = new Response( new HALResponse(new { page.FromPosition, page.NextPosition, page.IsEnd }) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(page, operation)) .AddLinks(Links.Feed(operation)) .AddEmbeddedCollection( Constants.Relations.Message, streamMessages.Zip( payloads, (message, payload) => new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }) .AddLinks(Links.Message.Self(message))))); if (operation.FromPositionInclusive == Position.End) { var headPosition = streamMessages.Length > 0 ? streamMessages[0].Position : Position.End; response.Headers[Constants.Headers.HeadPosition] = new[] { $"{headPosition}" }; } return(response); }
public async Task <Response> GetPage(ReadStreamOperation operation, CancellationToken cancellationToken) { var page = await operation.Invoke(_streamStore, cancellationToken); var streamMessages = page.Messages.OrderByDescending(m => m.Position).ToArray(); var payloads = await Task.WhenAll(streamMessages .Select(message => operation.EmbedPayload ? message.GetJsonData(cancellationToken) : Task.FromResult <string>(null)) .ToArray()); return(new Response( new HALResponse(new { page.LastStreamVersion, page.LastStreamPosition, page.FromStreamVersion, page.NextStreamVersion, page.IsEnd }) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(page, operation)) .AddLinks(Links.Feed(operation)) .AddLinks(Links.Metadata(operation)) .AddEmbeddedCollection( Constants.Relations.Message, streamMessages.Zip( payloads, (message, payload) => new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }) .AddLinks(Links.Message.Self(message)))), page.Status == PageReadStatus.StreamNotFound ? 404 : 200)); }
public async Task <Response> Post( SetStreamMetadataOperation operation, CancellationToken cancellationToken) { await operation.Invoke(_streamStore, cancellationToken); var response = new Response(new HALResponse(new { operation.StreamId, operation.MaxAge, operation.MaxCount, operation.MetadataJson }) .AddLinks( Links.Self(), Links.Metadata(), Links.Feed(operation))); return(response); }
public async Task <Response> AppendMessages( AppendStreamOperation operation, CancellationToken cancellationToken) { var result = await operation.Invoke(_streamStore, cancellationToken); var response = new Response( new HALResponse(result) .AddLinks(Links.Self(operation)) .AddLinks(Links.Feed(operation)), result.CurrentVersion == 0 ? 201 : 200); if (operation.ExpectedVersion == ExpectedVersion.NoStream) { response.Headers[Constants.Headers.Location] = new[] { $"streams/{operation.StreamId}" }; } return(response); }
public async Task <Response> Get(ReadStreamOperation operation, CancellationToken cancellationToken) { if (!operation.IsUriCanonical) { return(new Response(new HALResponse(null), 308) { Headers = { [Constants.Headers.Location] = new[] { operation.Self } } }); } var page = await operation.Invoke(_streamStore, cancellationToken); var streamMessages = page.Messages.OrderByDescending(m => m.Position).ToArray(); var payloads = await Task.WhenAll( Array.ConvertAll( streamMessages, message => operation.EmbedPayload ? message.GetJsonData(cancellationToken) : SkippedPayload.Instance)); var response = new Response( new HALResponse(new { page.LastStreamVersion, page.LastStreamPosition, page.FromStreamVersion, page.NextStreamVersion, page.IsEnd }) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(page, operation)) .AddLinks(Links.Feed(operation)) .AddLinks(Links.Metadata(operation)) .AddLinks(Links.Index()) .AddLinks(Links.Find()) .AddEmbeddedResource( Constants.Relations.AppendToStream, Schemas.AppendToStream) .AddEmbeddedResource( Constants.Relations.Delete, Schemas.DeleteStream) .AddEmbeddedCollection( Constants.Relations.Message, streamMessages.Zip( payloads, (message, payload) => new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }) .AddLinks( Links.Message.Self(message), Links.Message.Feed(message)))), page.Status == PageReadStatus.StreamNotFound ? 404 : 200); if (page.TryGetETag(out var eTag)) { response.Headers.Add(eTag); } return(response); }
public async Task <Response> Get( ReadAllStreamOperation operation, CancellationToken cancellationToken) { if (_useCanonicalUrls && !operation.IsUriCanonical) { return(new Response(new HALResponse(null), 308) { Headers = { [Constants.Headers.Location] = new[] { operation.Self } } }); } var page = await operation.Invoke(_streamStore, cancellationToken); var streamMessages = page.Messages.OrderByDescending(m => m.Position).ToArray(); var payloads = await Task.WhenAll( Array.ConvertAll( streamMessages, message => operation.EmbedPayload ? message.GetJsonData(cancellationToken) : SkippedPayload.Instance)); var response = new Response( new HALResponse(new { page.FromPosition, page.NextPosition, page.IsEnd }) .AddLinks(Links.Self(operation)) .AddLinks(Links.Navigation(page, operation)) .AddLinks(Links.Feed(operation)) .AddLinks(Links.Find()) .AddEmbeddedCollection( Constants.Relations.Message, streamMessages.Zip( payloads, (message, payload) => new HALResponse(new { message.MessageId, message.CreatedUtc, message.Position, message.StreamId, message.StreamVersion, message.Type, payload, metadata = message.JsonMetadata }) .AddLinks( Links.Message.Self(message), Links.Message.Feed(message))))); if (operation.FromPositionInclusive == Position.End) { var headPosition = streamMessages.Length > 0 ? streamMessages[0].Position : Position.End; response.Headers[Constants.Headers.HeadPosition] = new[] { $"{headPosition}" }; } if (page.TryGetETag(operation.FromPositionInclusive, out var eTag)) { response.Headers.Add(eTag); response.Headers.Add(CacheControl.NoCache); } else { response.Headers.Add(CacheControl.OneYear); } return(response); }