Ejemplo n.º 1
0
        public async Task RequiresApiResourceProviderInstance()
        {
            var config = new JsonApiConfiguration()
            {
                ApiResourceProviderFactory = new NullApiResourceProviderFactory()
            };

            using (var server = new NewSetupJsonApiServer(config))
            {
                var client = server.GetClient();
                // id 1 is mapped to circle object
                var result = await client.GetJsonResponseAsync("api/shape/1");

                _output.WriteLine(result.ToString());

                var errors = result["errors"];
                Assert.Equal(1, errors.Count());

                var error = errors[0];

                Assert.Equal("https://github.com/joukevandermaas/saule/wiki",
                             error["links"]["about"].Value <string>());

                Assert.Equal("Saule.JsonApiException",
                             error["code"].Value <string>());

                Assert.Equal("Saule.JsonApiException: ApiResourceProviderFactory returned null but it should always return an instance of IApiResourceProvider.",
                             error["detail"].Value <string>());
            }
        }
Ejemplo n.º 2
0
        public void Configuration(IAppBuilder app)
        {
            var configuration = new JsonApiConfiguration();
            configuration.RegisterEntityFrameworkResourceType<Building>();
            configuration.RegisterEntityFrameworkResourceType<City>();
            configuration.RegisterEntityFrameworkResourceType<Comment>();
            configuration.RegisterEntityFrameworkResourceType<Company>();
            configuration.RegisterEntityFrameworkResourceType<Language>();
            configuration.RegisterEntityFrameworkResourceType<LanguageUserLink>(c =>
            {
                c.OverrideDefaultFilterById(LanguageUserLinkFilterByIdFactory);
                c.OverrideDefaultSortById(LanguageUserLinkSortByIdFactory);
            });
            configuration.RegisterResourceType<Post>();
            configuration.RegisterEntityFrameworkResourceType<State>();
            configuration.RegisterEntityFrameworkResourceType<Tag>();
            configuration.RegisterEntityFrameworkResourceType<User>();
            configuration.RegisterEntityFrameworkResourceType<UserGroup>();
            configuration.RegisterResourceType<Sample>(); // Example of a resource type not controlled by EF
            configuration.RegisterMappedType<Starship, StarshipDto, StarshipDocumentMaterializer>(c =>
            {
                c.ConfigureRelationship(s => s.Officers,
                    rc => rc.UseMaterializer<StarshipOfficersRelatedResourceMaterializer>());
                c.ConfigureRelationship(s => s.ShipCounselor,
                    rc => rc.UseMaterializer<StarshipShipCounselorRelatedResourceMaterializer>());
            }); // Example of a resource that is mapped from a DB entity
            configuration.RegisterResourceType<StarshipOfficerDto>();

            var configurator = new JsonApiHttpAutofacConfigurator();
            configurator.OnApplicationLifetimeScopeCreating(builder =>
            {
                builder.Register(c => _dbContextFactory())
                    .AsSelf()
                    .As<DbContext>()
                    .InstancePerRequest();
                builder.RegisterModule<JsonApiAutofacEntityFrameworkModule>();
                builder.RegisterType<CustomEntityFrameworkResourceObjectMaterializer>()
                    .As<IEntityFrameworkResourceObjectMaterializer>();
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            });
            configurator.OnApplicationLifetimeScopeBegun(applicationLifetimeScope =>
            {
                // TODO: is this a candidate for spinning into a JSONAPI.Autofac.WebApi.Owin package? Yuck
                app.UseAutofacMiddleware(applicationLifetimeScope);
            });

            var httpConfig = new HttpConfiguration
            {
                IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
            };

            // Additional Web API routes
            httpConfig.Routes.MapHttpRoute("Samples", "samples", new { Controller = "Samples" });
            httpConfig.Routes.MapHttpRoute("Search", "search", new { Controller = "Search" });
            httpConfig.Routes.MapHttpRoute("Trees", "trees", new { Controller = "Trees" });

            configurator.Apply(httpConfig, configuration);
            app.UseWebApi(httpConfig);
            app.UseAutofacWebApi(httpConfig);
        }
        public async Task BuilderAndConverterConstructor()
        {
            var config = new JsonApiConfiguration
            {
                UrlPathBuilder = new CanonicalUrlPathBuilder(),
                JsonConverters = { new StringEnumConverter() }
            };

            using (var server = new NewSetupJsonApiServer(config))
            {
                var client = server.GetClient();
                var result = await client.GetJsonResponseAsync("api/companies/456/");

                _output.WriteLine(result.ToString());

                Assert.Equal("National", result["data"]["attributes"]["location"].Value <string>());

                result = await client.GetJsonResponseAsync("api/people/");

                _output.WriteLine(result.ToString());

                var relatedUrl = result["data"][0]["relationships"]["job"]["links"]["related"]
                                 .Value <string>();
                Assert.Equal("http://localhost/corporations/456/", relatedUrl);
            }
        }
 private JsonApiMediaTypeFormatter(HttpRequestMessage request, JsonApiConfiguration configuration,
                                   Func <IDocumentParser> documentParserFunc,
                                   Func <IDocumentBuilder> documentBuilderFunc)
     : this(configuration, documentParserFunc, documentBuilderFunc)
 {
     _request = request;
 }
Ejemplo n.º 5
0
 internal void MergeAndSetupConfiguration(IAppBuilder app, JsonApiHttpAutofacConfigurator configurator,
                                          HttpConfiguration httpConfig, JsonApiConfiguration configuration)
 {
     configurator.Apply(httpConfig, configuration);
     app.UseWebApi(httpConfig);
     app.UseAutofacWebApi(httpConfig);
 }
Ejemplo n.º 6
0
 public ResourceSerializer(JsonSerializer serializer = null, JsonApiConfiguration config = null, IUrlPathBuilder urlBuilder = null)
 {
     _serializer = serializer ?? new JsonSerializer {
         ReferenceLoopHandling = ReferenceLoopHandling.Ignore
     };
     _config     = config ?? new JsonApiConfiguration();
     _urlBuilder = urlBuilder ?? new DefaultUrlPathBuilder();
 }
Ejemplo n.º 7
0
 public JsonApiDelegatingHandler(JsonApiConfiguration configuration)
 {
     if (configuration == null)
     {
         throw new ArgumentNullException(nameof(configuration));
     }
     _configuration = configuration;
 }
Ejemplo n.º 8
0
        public void JsonApiConfiguration_Constructur_VerifyConverters()
        {
            var config = new JsonApiConfiguration();

            Assert.That(config.SerializerSettings, Is.Not.Null);
            Assert.That(config.SerializerSettings.Converters.Any(x => x is IsoDateTimeConverter));
            Assert.That(config.SerializerSettings.Converters.Any(x => x is StringEnumConverter && ((StringEnumConverter)x).CamelCaseText));
        }
Ejemplo n.º 9
0
        private NewSetupJsonApiServer CreateServer()
        {
            var config = new JsonApiConfiguration()
            {
                ApiResourceProviderFactory = new ShapeApiResourceProviderFactory()
            };

            return(new NewSetupJsonApiServer(config));
        }
Ejemplo n.º 10
0
        public void JsonApiConfiguration_Validate_NoResourceConfiguration_DoesNotThrow()
        {
            var config = new JsonApiConfiguration
            {
                ResourceConfigurations = new ResourceConfigurationsBuilder().Build()
            };

            Assert.DoesNotThrow(() => config.Validate());
        }
Ejemplo n.º 11
0
        /// <summary>
        /// Converts json into an object of a specified type
        /// </summary>
        /// <param name="object">Json to convert</param>
        /// <param name="type">Type to convert to</param>
        /// <param name="config">The configuration to be used for deserialization</param>
        /// <returns>Json converted into the specified type of object</returns>
        public object Deserialize(JToken @object, Type type, JsonApiConfiguration config = null)
        {
            if (config == null)
            {
                config = new JsonApiConfiguration();
            }

            var target = new ResourceDeserializer(@object, type, config.PropertyNameConverter);
            return target.Deserialize();
        }
 public static void RegisterEntityFrameworkResourceType <TResourceType>(this JsonApiConfiguration jsonApiConfiguration,
                                                                        Action <IResourceTypeConfigurator <TResourceType> > configurationAction = null) where TResourceType : class
 {
     jsonApiConfiguration.RegisterResourceType <TResourceType>(c =>
     {
         c.UseDocumentMaterializer <EntityFrameworkDocumentMaterializer <TResourceType> >();
         if (configurationAction != null)
         {
             configurationAction(c);
         }
     });
 }
Ejemplo n.º 13
0
        /// <summary>
        /// Produces the Json Api response that represents the given @object.
        /// </summary>
        /// <param name="object">The object to serialize.</param>
        /// <param name="requestUri">The request uri that prompted the response.</param>
        /// <param name="config">The configuration to be used for serialization.</param>
        /// <returns>A <see cref="JToken"/> representing the object.</returns>
        public JToken Serialize(object @object, Uri requestUri, JsonApiConfiguration config = null)
        {
            if (config == null)
            {
                config = new JsonApiConfiguration();
            }

            var request = new HttpRequestMessage(HttpMethod.Get, requestUri);
            var queryContext = GetQueryContext(request.GetQueryNameValuePairs());

            _serializer.QueryContext = queryContext;

            var preprocessResult = _serializer.PreprocessContent(@object, new T(), requestUri, config);
            return JsonApiSerializer.Serialize(preprocessResult);
        }
        public async Task ConverterConstructor()
        {
            var config = new JsonApiConfiguration
            {
                JsonConverters = { new StringEnumConverter() }
            };

            using (var server = new NewSetupJsonApiServer(config))
            {
                var client = server.GetClient();
                var result = await client.GetJsonResponseAsync("api/companies/456/");

                _output.WriteLine(result.ToString());

                Assert.Equal("National", result["data"]["attributes"]["location"].Value <string>());
            }
        }
Ejemplo n.º 15
0
        private static HttpConfiguration GetWebApiConfiguration()
        {
            var httpConfig = new HttpConfiguration();

            var containerBuilder = new ContainerBuilder();

            containerBuilder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            containerBuilder.RegisterType <TodoMvcContext>().As <DbContext>().InstancePerRequest();
            var container = containerBuilder.Build();

            var configuration = new JsonApiConfiguration();

            configuration.RegisterEntityFrameworkResourceType <Todo>(c => c.OverrideDefaultResourceTypeName("todos"));
            configuration.SetupHttpConfigurationUsingAutofac(httpConfig, container);

            return(httpConfig);
        }
Ejemplo n.º 16
0
        internal NewSetupJsonApiServer(JsonApiConfiguration config)
        {
            var httpConfig = new HttpConfiguration();

            if (config == null)
            {
                httpConfig.ConfigureJsonApi();
            }
            else
            {
                httpConfig.ConfigureJsonApi(config);
            }

            httpConfig.MapHttpAttributeRoutes(new DefaultDirectRouteProvider());

            _server = TestServer.Create(builder =>
            {
                builder.UseWebApi(httpConfig);
            });
        }
        public async Task LimitsPageSize()
        {
            var apiConfig = new JsonApiConfiguration
            {
                PaginationConfig = new PaginationConfig {
                    DefaultPageSize = 2, DefaultPageSizeLimit = 4
                }
            };

            using (var server = new NewSetupJsonApiServer(apiConfig))
            {
                var client = server.GetClient();
                var result = await client.GetFullJsonResponseAsync("api/companies/querypagesize/?page[size]=5");

                Assert.Equal(HttpStatusCode.BadRequest, result.StatusCode);

                var resultCount = ((JArray)result.Content["data"])?.Count;
                Assert.Equal(null, resultCount);
            }
        }
Ejemplo n.º 18
0
        /// <summary>
        /// Build up the <see cref="JsonApiConfiguration"/> which registers all the model types and their mappings.
        /// </summary>
        /// <returns></returns>
        internal JsonApiConfiguration BuildConfiguration()
        {
            var configuration = new JsonApiConfiguration(
                new Core.PluralizationService(
                    new Dictionary <string, string> {
                { "Child", "Children" }
            }));

            configuration.RegisterEntityFrameworkResourceType <Building>();
            configuration.RegisterEntityFrameworkResourceType <City>();
            configuration.RegisterEntityFrameworkResourceType <Comment>();
            configuration.RegisterEntityFrameworkResourceType <Company>();
            configuration.RegisterEntityFrameworkResourceType <Language>();
            configuration.RegisterEntityFrameworkResourceType <LanguageUserLink>(c =>
            {
                c.OverrideDefaultFilterById(LanguageUserLinkFilterByIdFactory);
                c.OverrideDefaultSortById(LanguageUserLinkSortByIdFactory);
            });
            configuration.RegisterResourceType <Post>();
            configuration.RegisterResourceType <PostID>();
            configuration.RegisterResourceType <PostLongId>();
            configuration.RegisterEntityFrameworkResourceType <State>();
            configuration.RegisterEntityFrameworkResourceType <Tag>();
            configuration.RegisterEntityFrameworkResourceType <User>();
            configuration.RegisterEntityFrameworkResourceType <UserGroup>();
            configuration.RegisterResourceType <Sample>(); // Example of a resource type not controlled by EF
            configuration.RegisterMappedType <Starship, StarshipDto, StarshipDocumentMaterializer>(c =>
            {
                c.ConfigureRelationship(s => s.Officers,
                                        rc => rc.UseMaterializer <StarshipOfficersRelatedResourceMaterializer>());
                c.ConfigureRelationship(s => s.ShipCounselor,
                                        rc => rc.UseMaterializer <StarshipShipCounselorRelatedResourceMaterializer>());
            }); // Example of a resource that is mapped from a DB entity
            configuration.RegisterResourceType <StarshipOfficerDto>();
            configuration.RegisterEntityFrameworkResourceType <Master>();
            configuration.RegisterEntityFrameworkResourceType <Child>();
            configuration.RegisterResourceType <PostSearch>().ResolveCollectionWith <PostSearchResourceQueryResolver>();
            configuration.RegisterResourceType <CommentSearch>().ResolveCollectionWith <CommentSearchResourceQueryResolver>();
            return(configuration);
        }
        public async Task UsesQueryFilterExpression()
        {
            var config = new JsonApiConfiguration();

            config.QueryFilterExpressions.SetExpression <string>((left, right) => left != right);

            using (var server = new NewSetupJsonApiServer(config))
            {
                var client = server.GetClient();
                var result = await client.GetJsonResponseAsync("api/query/people?filter[last-name]=Russel");

                _output.WriteLine(result.ToString());

                var names = ((JArray)result["data"])
                            .Select(p => p["attributes"]["last-name"].Value <string>())
                            .ToList();

                var filtered = names.Where(a => a != "Russel").ToList();

                Assert.Equal(filtered.Count, names.Count);
            }
        }
        public JsonApiMediaTypeFormatter(JsonApiConfiguration configuration,
                                         Func <IDocumentParser> documentParserFunc,
                                         Func <IDocumentBuilder> documentBuilderFunc)
        {
            if (configuration == null)
            {
                throw new ArgumentNullException(nameof(configuration));
            }
            if (documentParserFunc == null)
            {
                throw new ArgumentNullException(nameof(documentParserFunc));
            }
            if (documentBuilderFunc == null)
            {
                throw new ArgumentNullException(nameof(documentBuilderFunc));
            }
            _configuration       = configuration;
            _documentParserFunc  = documentParserFunc;
            _documentBuilderFunc = documentBuilderFunc;
            _jsonSerializer      = JsonSerializer.Create(configuration.SerializerSettings);

            SupportedEncodings.Add(new UTF8Encoding(false, true));
            SupportedMediaTypes.Add(new MediaTypeHeaderValue(_configuration.MediaType));
        }
Ejemplo n.º 21
0
        /// <summary>
        /// Configures JSON API message handler and media type formatter on the given <see cref="HttpConfiguration"/> instance.
        /// </summary>
        /// <param name="httpConfiguration">The <see cref="HttpConfiguration"/> instance.</param>
        /// <param name="configurationAction">An action to modify the default <see cref="JsonApiConfiguration"/>.</param>
        /// <returns>The <see cref="HttpConfiguration"/> instance for method chaining purposes.</returns>
        public static HttpConfiguration UseJsonApi(this HttpConfiguration httpConfiguration, Action <JsonApiConfiguration> configurationAction)
        {
            if (httpConfiguration == null)
            {
                throw new ArgumentNullException(nameof(httpConfiguration));
            }
            if (configurationAction == null)
            {
                throw new ArgumentNullException(nameof(configurationAction));
            }

            var jsonApiConfiguration = new JsonApiConfiguration();

            configurationAction(jsonApiConfiguration);
            jsonApiConfiguration.Validate();

            httpConfiguration.MessageHandlers.Add(new JsonApiDelegatingHandler(jsonApiConfiguration));

            httpConfiguration.Formatters.Add(new JsonApiMediaTypeFormatter(jsonApiConfiguration,
                                                                           () => new DocumentParser(jsonApiConfiguration),
                                                                           () => new DocumentBuilder(jsonApiConfiguration)));

            return(httpConfiguration);
        }
Ejemplo n.º 22
0
        public PreprocessResult PreprocessContent(object @object, ApiResource resource, Uri requestUri, JsonApiConfiguration config)
        {
            var result = new PreprocessResult
            {
                JsonConverters = JsonConverters
            };

            if (requestUri == null)
            {
                throw new ArgumentNullException(nameof(requestUri));
            }

            try
            {
                var error = GetAsError(@object);
                if (error != null)
                {
                    result.ErrorContent = error;
                    return(result);
                }

                var dataObject = @object;

                if (QueryContext != null && !QueryContext.IsHandledQuery)
                {
                    if (QueryContext.Filter != null)
                    {
                        dataObject = Query.ApplyFiltering(dataObject, QueryContext.Filter, resource);
                    }

                    if (QueryContext.Sort != null)
                    {
                        dataObject = Query.ApplySorting(dataObject, QueryContext.Sort, resource);
                    }

                    if (QueryContext.Pagination != null)
                    {
                        dataObject = Query.ApplyPagination(dataObject, QueryContext.Pagination, resource);
                    }
                }

                result.ResourceSerializer = new ResourceSerializer(
                    value: dataObject,
                    type: resource,
                    baseUrl: requestUri,
                    propertyNameConverter: config.PropertyNameConverter,
                    urlBuilder: UrlPathBuilder,
                    paginationContext: QueryContext?.Pagination,
                    includeContext: QueryContext?.Include,
                    fieldsetContext: QueryContext?.Fieldset);
            }
            catch (Exception ex)
            {
                result.ErrorContent = GetAsError(ex);
            }

            return(result);
        }
Ejemplo n.º 23
0
 public DocumentParser(JsonApiConfiguration configuration)
 {
     _configuration  = configuration;
     _jsonSerializer = JsonSerializer.Create(configuration.SerializerSettings);
 }
Ejemplo n.º 24
0
        public void Configuration(IAppBuilder app)
        {
            var configuration = new JsonApiConfiguration();

            configuration.RegisterEntityFrameworkResourceType <Building>();
            configuration.RegisterEntityFrameworkResourceType <City>();
            configuration.RegisterEntityFrameworkResourceType <Comment>();
            configuration.RegisterEntityFrameworkResourceType <Company>();
            configuration.RegisterEntityFrameworkResourceType <Language>();
            configuration.RegisterEntityFrameworkResourceType <LanguageUserLink>(c =>
            {
                c.OverrideDefaultFilterById(LanguageUserLinkFilterByIdFactory);
                c.OverrideDefaultSortById(LanguageUserLinkSortByIdFactory);
            });
            configuration.RegisterResourceType <Post>();
            configuration.RegisterEntityFrameworkResourceType <State>();
            configuration.RegisterEntityFrameworkResourceType <Tag>();
            configuration.RegisterEntityFrameworkResourceType <User>();
            configuration.RegisterEntityFrameworkResourceType <UserGroup>();
            configuration.RegisterResourceType <Sample>(); // Example of a resource type not controlled by EF
            configuration.RegisterMappedType <Starship, StarshipDto, StarshipDocumentMaterializer>(c =>
            {
                c.ConfigureRelationship(s => s.Officers,
                                        rc => rc.UseMaterializer <StarshipOfficersRelatedResourceMaterializer>());
                c.ConfigureRelationship(s => s.ShipCounselor,
                                        rc => rc.UseMaterializer <StarshipShipCounselorRelatedResourceMaterializer>());
            }); // Example of a resource that is mapped from a DB entity
            configuration.RegisterResourceType <StarshipOfficerDto>();

            var configurator = new JsonApiHttpAutofacConfigurator();

            configurator.OnApplicationLifetimeScopeCreating(builder =>
            {
                builder.Register(c => _dbContextFactory())
                .AsSelf()
                .As <DbContext>()
                .InstancePerRequest();
                builder.RegisterModule <JsonApiAutofacEntityFrameworkModule>();
                builder.RegisterType <CustomEntityFrameworkResourceObjectMaterializer>()
                .As <IEntityFrameworkResourceObjectMaterializer>();
                builder.RegisterApiControllers(Assembly.GetExecutingAssembly());
            });
            configurator.OnApplicationLifetimeScopeBegun(applicationLifetimeScope =>
            {
                // TODO: is this a candidate for spinning into a JSONAPI.Autofac.WebApi.Owin package? Yuck
                app.UseAutofacMiddleware(applicationLifetimeScope);
            });

            var httpConfig = new HttpConfiguration
            {
                IncludeErrorDetailPolicy = IncludeErrorDetailPolicy.Always
            };

            // Additional Web API routes
            httpConfig.Routes.MapHttpRoute("Samples", "samples", new { Controller = "Samples" });
            httpConfig.Routes.MapHttpRoute("Search", "search", new { Controller = "Search" });
            httpConfig.Routes.MapHttpRoute("Trees", "trees", new { Controller = "Trees" });

            configurator.Apply(httpConfig, configuration);
            app.UseWebApi(httpConfig);
            app.UseAutofacWebApi(httpConfig);
        }
Ejemplo n.º 25
0
        public void JsonApiConfiguration_Constructor_VerifyContractResolver()
        {
            var config = new JsonApiConfiguration();

            Assert.True(config.SerializerSettings.ContractResolver.GetType() == typeof(CamelCasePropertyNamesContractResolver));
        }
 public DocumentBuilder(JsonApiConfiguration configuration)
 {
     _configuration = configuration;
 }