예제 #1
0
        public void TestUrlBuilderWithSchemeAndHostAndOptionalStringPathSegmentsTrue()
        {
            // Arrange
            var configuration = new UrlBuilderConfiguration
            {
                Scheme = Uri.UriSchemeHttps,
                Host   = "api.example.com"
            };

            var pathSegments = new[]
            {
                "articles",
                "42"
            };

            // Act
            var url = UrlBuilder.Create(configuration)
                      .Path(pathSegments, true)
                      .Build();

            this.Output.WriteLine(url);

            // Assert
            Assert.Equal("https://api.example.com/articles/42", url);
        }
예제 #2
0
        // PRIVATE METHODS //////////////////////////////////////////////////
        #region Factory Methods
        private static IDocumentContextOptions CreateDocumentContextOptions(IServiceModel apiServiceModel,
                                                                            IHypermediaAssemblerRegistry apiHypermediaAssemblerRegistry,
                                                                            IOptions <ApiHypermediaOptions> apiHypermediaOptionsAccessor)
        {
            Contract.Requires(apiServiceModel != null);
            Contract.Requires(apiHypermediaOptionsAccessor != null);

            var options        = new DocumentContextOptions <DocumentContext>();
            var optionsBuilder = new DocumentContextOptionsBuilder(options);

            optionsBuilder.UseServiceModel(apiServiceModel);
            if (apiHypermediaAssemblerRegistry != null)
            {
                optionsBuilder.UseHypermediaAssemblerRegistry(apiHypermediaAssemblerRegistry);
            }

            var apiHypermediaOptions = apiHypermediaOptionsAccessor.Value;

            var scheme = apiHypermediaOptions.Scheme;
            var host   = apiHypermediaOptions.Host;
            var port   = apiHypermediaOptions.Port;
            var urlBuilderConfiguration = new UrlBuilderConfiguration(scheme, host, port);

            optionsBuilder.UseUrlBuilderConfiguration(urlBuilderConfiguration);

            return(options);
        }
예제 #3
0
        private static Link CreatePlaylistResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var playlistResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                                 .Path(PlaylistResourceKeyWords.Self)
                                                 .Build();

            return(new Link(playlistResourceCollectionLink));
        }
예제 #4
0
        private static Link CreateTrackResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var trackResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                              .Path(TrackResourceKeyWords.Self)
                                              .Build();

            return(new Link(trackResourceCollectionLink));
        }
예제 #5
0
        private static Link CreateEmployeeResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var employeeResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                                 .Path(EmployeeResourceKeyWords.Self)
                                                 .Build();

            return(new Link(employeeResourceCollectionLink));
        }
예제 #6
0
        private static Link CreateMediaTypeResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var mediaTypeResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                                  .Path(MediaTypeResourceKeyWords.Self)
                                                  .Build();

            return(new Link(mediaTypeResourceCollectionLink));
        }
예제 #7
0
        private static Link CreateInvoiceResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var invoiceResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                                .Path(InvoiceResourceKeyWords.Self)
                                                .Build();

            return(new Link(invoiceResourceCollectionLink));
        }
예제 #8
0
        private static Link CreateCustomerResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var customersResourceCollectionLink = UrlBuilder.Create(urlBuilderConfiguration)
                                                  .Path(CustomerResourceKeyWords.Self)
                                                  .Build();

            return(new Link(customersResourceCollectionLink));
        }
        private static Link CreateCommentsResourceCollectionUrl(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var commentsResourceCollectionUrl = UrlBuilder.Create(urlBuilderConfiguration)
                                                .Path("comments")
                                                .Build();
            var commentsResourceCollectionLink = new Link(commentsResourceCollectionUrl);

            return(commentsResourceCollectionLink);
        }
        private static UrlBuilderConfiguration CreateUrlBuilderConfiguration(Uri currentRequestUri)
        {
            var scheme = currentRequestUri.Scheme;
            var host   = currentRequestUri.Host;
            var port   = currentRequestUri.Port;
            var urlBuilderConfiguration = new UrlBuilderConfiguration(scheme, host, port);

            return(urlBuilderConfiguration);
        }
        private static Link CreatePeopleResourceCollectionUrl(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var peopleResourceCollectionUrl = UrlBuilder.Create(urlBuilderConfiguration)
                                              .Path("people")
                                              .Build();
            var peopleResourceCollectionLink = new Link(peopleResourceCollectionUrl);

            return(peopleResourceCollectionLink);
        }
        private static Link CreateArticlesResourceCollectionUrl(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var articlesResourceCollectionUrl = UrlBuilder.Create(urlBuilderConfiguration)
                                                .Path("articles")
                                                .Build();
            var articlesResourceCollectionLink = new Link(articlesResourceCollectionUrl);

            return(articlesResourceCollectionLink);
        }
        private static Link CreateBlogsResourceCollectionLink(UrlBuilderConfiguration urlBuilderConfiguration)
        {
            var blogsResourceCollectionUrl = UrlBuilder.Create(urlBuilderConfiguration)
                                             .Path("blogs")
                                             .Build();
            var blogResourceCollectionLink = new Link(blogsResourceCollectionUrl);

            return(blogResourceCollectionLink);
        }
예제 #14
0
        public void TestUrlBuilderWithEmptyConfiguration()
        {
            // Arrange
            var configuration = new UrlBuilderConfiguration();

            // Act

            // Assert
            Assert.Throws <UriFormatException>(() => UrlBuilder.Create(configuration).Build());
        }
예제 #15
0
        public Task <Document> GetHomeDocument()
        {
            var homeResource = new Home
            {
                Message = "Chinook Sample JSON:API Project"
            };

            var currentRequestUri = _httpContextAccessor.HttpContext.GetCurrentRequestUri();

            var scheme = currentRequestUri.Scheme;
            var host   = currentRequestUri.Host;
            var port   = currentRequestUri.Port;
            var urlBuilderConfiguration           = new UrlBuilderConfiguration(scheme, host, port);
            var customersResourceCollectionLink   = CreateCustomerResourceCollectionLink(urlBuilderConfiguration);
            var albumResourceCollectionLink       = CreateAlbumResourceCollectionLink(urlBuilderConfiguration);
            var artistResourceCollectionLink      = CreateArtistResourceCollectionLink(urlBuilderConfiguration);
            var employeeResourceCollectionLink    = CreateEmployeeResourceCollectionLink(urlBuilderConfiguration);
            var genreResourceCollectionLink       = CreateGenreResourceCollectionLink(urlBuilderConfiguration);
            var invoiceResourceCollectionLink     = CreateInvoiceResourceCollectionLink(urlBuilderConfiguration);
            var invoiceItemResourceCollectionLink = CreateInvoiceItemResourceCollectionLink(urlBuilderConfiguration);
            var mediaTypeResourceCollectionLink   = CreateMediaTypeResourceCollectionLink(urlBuilderConfiguration);
            var playlistResourceCollectionLink    = CreatePlaylistResourceCollectionLink(urlBuilderConfiguration);
            var trackResourceCollectionLink       = CreateTrackResourceCollectionLink(urlBuilderConfiguration);

            using var chinookDocumentContext = new ChinookJsonApiDocumentContext(currentRequestUri);
            var document = chinookDocumentContext
                           .NewDocument(currentRequestUri)
                           .SetJsonApiVersion(JsonApiVersion.Version10)
                           .Links()
                           .AddSelfLink()
                           .LinksEnd()
                           .Resource(homeResource)
                           .Links()
                           .AddLink(CustomerResourceKeyWords.Self, customersResourceCollectionLink)
                           .AddLink(AlbumResourceKeyWords.Self, albumResourceCollectionLink)
                           .AddLink(ArtistResourceKeyWords.Self, artistResourceCollectionLink)
                           .AddLink(EmployeeResourceKeyWords.Self, employeeResourceCollectionLink)
                           .AddLink(GenreResourceKeyWords.Self, genreResourceCollectionLink)
                           .AddLink(InvoiceResourceKeyWords.Self, invoiceResourceCollectionLink)
                           .AddLink(InvoiceItemResourceKeyWords.Self, invoiceItemResourceCollectionLink)
                           .AddLink(MediaTypeResourceKeyWords.Self, mediaTypeResourceCollectionLink)
                           .AddLink(PlaylistResourceKeyWords.Self, playlistResourceCollectionLink)
                           .AddLink(TrackResourceKeyWords.Self, trackResourceCollectionLink)
                           .LinksEnd()
                           .ResourceEnd()
                           .WriteDocument();

            _logger.LogInformation("Request for {URL} generated JSON:API document {doc}", currentRequestUri, document);
            return(Task.FromResult(document));
        }
        public Document GetAsync()
        {
            var apiEntryPoint = new ApiEntryPoint
            {
                Message = @"Entry point into the Blogging Hypermedia API powered by JsonApiFramework [Server]." + " " +
                          "Implements the JSON API 1.0 specification.",
                Version = "1.0"
            };

            /////////////////////////////////////////////////////
            // Build JSON API document
            /////////////////////////////////////////////////////
            var currentRequestUri = this.Request.GetUri();

            var scheme = currentRequestUri.Scheme;
            var host   = currentRequestUri.Host;
            var port   = currentRequestUri.Port;
            var urlBuilderConfiguration = new UrlBuilderConfiguration(scheme, host, port);

            var blogsResourceCollectionLink    = CreateBlogsResourceCollectionLink(urlBuilderConfiguration);
            var articlesResourceCollectionLink = CreateArticlesResourceCollectionUrl(urlBuilderConfiguration);
            var commentsResourceCollectionLink = CreateCommentsResourceCollectionUrl(urlBuilderConfiguration);
            var peopleResourceCollectionLink   = CreatePeopleResourceCollectionUrl(urlBuilderConfiguration);

            using (var documentContext = new BloggingDocumentContext(currentRequestUri))
            {
                var document = documentContext
                               .NewDocument(currentRequestUri)
                               .SetJsonApiVersion(JsonApiVersion.Version10)
                               .Links()
                               .AddSelfLink()
                               .LinksEnd()
                               .Resource(apiEntryPoint)
                               .Links()
                               .AddLink("blogs", blogsResourceCollectionLink)
                               .AddLink("articles", articlesResourceCollectionLink)
                               .AddLink("comments", commentsResourceCollectionLink)
                               .AddLink("people", peopleResourceCollectionLink)
                               .LinksEnd()
                               .ResourceEnd()
                               .WriteDocument();

                return(document);
            }
        }
예제 #17
0
        public void TestUrlBuilderWithSchemeAndHost()
        {
            // Arrange
            var configuration = new UrlBuilderConfiguration
            {
                Scheme = Uri.UriSchemeHttps,
                Host   = "api.example.com"
            };

            // Act
            var url = UrlBuilder.Create(configuration)
                      .Build();

            this.Output.WriteLine(url);

            // Assert
            Assert.Equal("https://api.example.com", url);
        }
예제 #18
0
        public void TestUrlBuilderWithSchemeAndHostAndPortAndStringPathSegment()
        {
            // Arrange
            var configuration = new UrlBuilderConfiguration
            {
                Scheme = Uri.UriSchemeHttps,
                Host   = "api.example.com",
                Port   = 443
            };

            // Act
            var url = UrlBuilder.Create(configuration)
                      .Path("articles")
                      .Build();

            this.Output.WriteLine(url);

            // Assert
            Assert.Equal("https://api.example.com:443/articles", url);
        }
예제 #19
0
        public void TestUrlBuilderWithSchemeAndHostAndPortAndRootStringPathSegments()
        {
            // Arrange
            var configuration = new UrlBuilderConfiguration
            {
                Scheme           = Uri.UriSchemeHttps,
                Host             = "api.example.com",
                Port             = 443,
                RootPathSegments = new[] { "api", "en-us" }
            };

            // Act
            var url = UrlBuilder.Create(configuration)
                      .Build();

            this.Output.WriteLine(url);

            // Assert
            Assert.Equal("https://api.example.com:443/api/en-us", url);
        }
예제 #20
0
 public OraChallengeDocumentContext(string host, int?port = null)
 {
     UrlBuilderConfiguration = new UrlBuilderConfiguration("http", host, port);
 }