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>()); } }
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; }
internal void MergeAndSetupConfiguration(IAppBuilder app, JsonApiHttpAutofacConfigurator configurator, HttpConfiguration httpConfig, JsonApiConfiguration configuration) { configurator.Apply(httpConfig, configuration); app.UseWebApi(httpConfig); app.UseAutofacWebApi(httpConfig); }
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(); }
public JsonApiDelegatingHandler(JsonApiConfiguration configuration) { if (configuration == null) { throw new ArgumentNullException(nameof(configuration)); } _configuration = configuration; }
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)); }
private NewSetupJsonApiServer CreateServer() { var config = new JsonApiConfiguration() { ApiResourceProviderFactory = new ShapeApiResourceProviderFactory() }; return(new NewSetupJsonApiServer(config)); }
public void JsonApiConfiguration_Validate_NoResourceConfiguration_DoesNotThrow() { var config = new JsonApiConfiguration { ResourceConfigurations = new ResourceConfigurationsBuilder().Build() }; Assert.DoesNotThrow(() => config.Validate()); }
/// <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); } }); }
/// <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>()); } }
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); }
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); } }
/// <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)); }
/// <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); }
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); }
public DocumentParser(JsonApiConfiguration configuration) { _configuration = configuration; _jsonSerializer = JsonSerializer.Create(configuration.SerializerSettings); }
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 void JsonApiConfiguration_Constructor_VerifyContractResolver() { var config = new JsonApiConfiguration(); Assert.True(config.SerializerSettings.ContractResolver.GetType() == typeof(CamelCasePropertyNamesContractResolver)); }
public DocumentBuilder(JsonApiConfiguration configuration) { _configuration = configuration; }