Esempio n. 1
0
        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");
                    }
                }
        }
Esempio n. 2
0
        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);
            }
        }
Esempio n. 3
0
        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");
                }
            }
        }
Esempio n. 4
0
        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
                }
            });
        }