Skip to content

rename contextGraph to resourceGraph #428

New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Merged
merged 1 commit into from
Oct 15, 2018
Merged
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
8 changes: 4 additions & 4 deletions benchmarks/Serialization/JsonApiDeserializer_Benchmarks.cs
Original file line number Diff line number Diff line change
@@ -32,13 +32,13 @@ public class JsonApiDeserializer_Benchmarks {
private readonly JsonApiDeSerializer _jsonApiDeSerializer;

public JsonApiDeserializer_Benchmarks() {
var contextGraphBuilder = new ContextGraphBuilder();
contextGraphBuilder.AddResource<SimpleType>(TYPE_NAME);
var contextGraph = contextGraphBuilder.Build();
var resourceGraphBuilder = new ResourceGraphBuilder();
resourceGraphBuilder.AddResource<SimpleType>(TYPE_NAME);
var resourceGraph = resourceGraphBuilder.Build();

var jsonApiContextMock = new Mock<IJsonApiContext>();
jsonApiContextMock.SetupAllProperties();
jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph);
jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary<AttrAttribute, object>());

var jsonApiOptions = new JsonApiOptions();
8 changes: 4 additions & 4 deletions benchmarks/Serialization/JsonApiSerializer_Benchmarks.cs
Original file line number Diff line number Diff line change
@@ -19,13 +19,13 @@ public class JsonApiSerializer_Benchmarks {
private readonly JsonApiSerializer _jsonApiSerializer;

public JsonApiSerializer_Benchmarks() {
var contextGraphBuilder = new ContextGraphBuilder();
contextGraphBuilder.AddResource<SimpleType>(TYPE_NAME);
var contextGraph = contextGraphBuilder.Build();
var resourceGraphBuilder = new ResourceGraphBuilder();
resourceGraphBuilder.AddResource<SimpleType>(TYPE_NAME);
var resourceGraph = resourceGraphBuilder.Build();

var jsonApiContextMock = new Mock<IJsonApiContext>();
jsonApiContextMock.SetupAllProperties();
jsonApiContextMock.Setup(m => m.ContextGraph).Returns(contextGraph);
jsonApiContextMock.Setup(m => m.ResourceGraph).Returns(resourceGraph);
jsonApiContextMock.Setup(m => m.AttributesToUpdate).Returns(new Dictionary<AttrAttribute, object>());

var jsonApiOptions = new JsonApiOptions();
2 changes: 1 addition & 1 deletion src/Examples/NoEntityFrameworkExample/Startup.cs
Original file line number Diff line number Diff line change
@@ -35,7 +35,7 @@ public virtual IServiceProvider ConfigureServices(IServiceCollection services)

services.AddJsonApi(options => {
options.Namespace = "api/v1";
options.BuildContextGraph((builder) => {
options.BuildResourceGraph((builder) => {
builder.AddResource<TodoItem>("custom-todo-items");
});
}, mvcBuilder);
2 changes: 1 addition & 1 deletion src/Examples/ResourceEntitySeparationExample/Startup.cs
Original file line number Diff line number Diff line change
@@ -49,7 +49,7 @@ public virtual IServiceProvider ConfigureServices(IServiceCollection services)
options.Namespace = "api/v1";
options.DefaultPageSize = 10;
options.IncludeTotalRecordCount = true;
options.BuildContextGraph((builder) => {
options.BuildResourceGraph((builder) => {
builder.AddResource<CourseResource>("courses");
builder.AddResource<DepartmentResource>("departments");
builder.AddResource<StudentResource>("students");
32 changes: 16 additions & 16 deletions src/JsonApiDotNetCore/Builders/ContextGraphBuilder.cs
Original file line number Diff line number Diff line change
@@ -13,12 +13,12 @@

namespace JsonApiDotNetCore.Builders
{
public interface IContextGraphBuilder
public interface IResourceGraphBuilder
{
/// <summary>
/// Construct the <see cref="ContextGraph"/>
/// Construct the <see cref="ResourceGraph"/>
/// </summary>
IContextGraph Build();
IResourceGraph Build();

/// <summary>
/// Add a json:api resource
@@ -29,7 +29,7 @@ public interface IContextGraphBuilder
/// If nothing is specified, the configured name formatter will be used.
/// See <see cref="JsonApiOptions.ResourceNameFormatter" />.
/// </param>
IContextGraphBuilder AddResource<TResource>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<int>;
IResourceGraphBuilder AddResource<TResource>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<int>;

/// <summary>
/// Add a json:api resource
@@ -41,7 +41,7 @@ public interface IContextGraphBuilder
/// If nothing is specified, the configured name formatter will be used.
/// See <see cref="JsonApiOptions.ResourceNameFormatter" />.
/// </param>
IContextGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<TId>;
IResourceGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<TId>;

/// <summary>
/// Add a json:api resource
@@ -53,28 +53,28 @@ public interface IContextGraphBuilder
/// If nothing is specified, the configured name formatter will be used.
/// See <see cref="JsonApiOptions.ResourceNameFormatter" />.
/// </param>
IContextGraphBuilder AddResource(Type entityType, Type idType, string pluralizedTypeName = null);
IResourceGraphBuilder AddResource(Type entityType, Type idType, string pluralizedTypeName = null);

/// <summary>
/// Add all the models that are part of the provided <see cref="DbContext" />
/// that also implement <see cref="IIdentifiable"/>
/// </summary>
/// <typeparam name="T">The <see cref="DbContext"/> implementation type.</typeparam>
IContextGraphBuilder AddDbContext<T>() where T : DbContext;
IResourceGraphBuilder AddDbContext<T>() where T : DbContext;

/// <summary>
/// Specify the <see cref="IResourceNameFormatter"/> used to format resource names.
/// </summary>
/// <param name="resourceNameFormatter">Formatter used to define exposed resource names by convention.</param>
IContextGraphBuilder UseNameFormatter(IResourceNameFormatter resourceNameFormatter);
IResourceGraphBuilder UseNameFormatter(IResourceNameFormatter resourceNameFormatter);

/// <summary>
/// Which links to include. Defaults to <see cref="Link.All"/>.
/// </summary>
Link DocumentLinks { get; set; }
}

public class ContextGraphBuilder : IContextGraphBuilder
public class ResourceGraphBuilder : IResourceGraphBuilder
{
private List<ContextEntity> _entities = new List<ContextEntity>();
private List<ValidationResult> _validationResults = new List<ValidationResult>();
@@ -83,25 +83,25 @@ public class ContextGraphBuilder : IContextGraphBuilder

public Link DocumentLinks { get; set; } = Link.All;

public IContextGraph Build()
public IResourceGraph Build()
{
// this must be done at build so that call order doesn't matter
_entities.ForEach(e => e.Links = GetLinkFlags(e.EntityType));

var graph = new ContextGraph(_entities, _usesDbContext, _validationResults);
var graph = new ResourceGraph(_entities, _usesDbContext, _validationResults);
return graph;
}

/// <inheritdoc />
public IContextGraphBuilder AddResource<TResource>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<int>
public IResourceGraphBuilder AddResource<TResource>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<int>
=> AddResource<TResource, int>(pluralizedTypeName);

/// <inheritdoc />
public IContextGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<TId>
public IResourceGraphBuilder AddResource<TResource, TId>(string pluralizedTypeName = null) where TResource : class, IIdentifiable<TId>
=> AddResource(typeof(TResource), typeof(TId), pluralizedTypeName);

/// <inheritdoc />
public IContextGraphBuilder AddResource(Type entityType, Type idType, string pluralizedTypeName = null)
public IResourceGraphBuilder AddResource(Type entityType, Type idType, string pluralizedTypeName = null)
{
AssertEntityIsNotAlreadyDefined(entityType);

@@ -222,7 +222,7 @@ protected virtual Type GetRelationshipType(RelationshipAttribute relation, Prope
private Type GetResourceDefinitionType(Type entityType) => typeof(ResourceDefinition<>).MakeGenericType(entityType);

/// <inheritdoc />
public IContextGraphBuilder AddDbContext<T>() where T : DbContext
public IResourceGraphBuilder AddDbContext<T>() where T : DbContext
{
_usesDbContext = true;

@@ -290,7 +290,7 @@ private void AssertEntityIsNotAlreadyDefined(Type entityType)
}

/// <inheritdoc />
public IContextGraphBuilder UseNameFormatter(IResourceNameFormatter resourceNameFormatter)
public IResourceGraphBuilder UseNameFormatter(IResourceNameFormatter resourceNameFormatter)
{
_resourceNameFormatter = resourceNameFormatter;
return this;
22 changes: 11 additions & 11 deletions src/JsonApiDotNetCore/Builders/DocumentBuilder.cs
Original file line number Diff line number Diff line change
@@ -12,7 +12,7 @@ namespace JsonApiDotNetCore.Builders
public class DocumentBuilder : IDocumentBuilder
{
private readonly IJsonApiContext _jsonApiContext;
private readonly IContextGraph _contextGraph;
private readonly IResourceGraph _resourceGraph;
private readonly IRequestMeta _requestMeta;
private readonly DocumentBuilderOptions _documentBuilderOptions;
private readonly IScopedServiceProvider _scopedServiceProvider;
@@ -24,15 +24,15 @@ public DocumentBuilder(
IScopedServiceProvider scopedServiceProvider = null)
{
_jsonApiContext = jsonApiContext;
_contextGraph = jsonApiContext.ContextGraph;
_resourceGraph = jsonApiContext.ResourceGraph;
_requestMeta = requestMeta;
_documentBuilderOptions = documentBuilderOptionsProvider?.GetDocumentBuilderOptions() ?? new DocumentBuilderOptions();
_scopedServiceProvider = scopedServiceProvider;
}

public Document Build(IIdentifiable entity)
{
var contextEntity = _contextGraph.GetContextEntity(entity.GetType());
var contextEntity = _resourceGraph.GetContextEntity(entity.GetType());

var resourceDefinition = _scopedServiceProvider?.GetService(contextEntity.ResourceType) as IResourceDefinition;
var document = new Document
@@ -52,7 +52,7 @@ public Document Build(IIdentifiable entity)
public Documents Build(IEnumerable<IIdentifiable> entities)
{
var entityType = entities.GetElementType();
var contextEntity = _contextGraph.GetContextEntity(entityType);
var contextEntity = _resourceGraph.GetContextEntity(entityType);
var resourceDefinition = _scopedServiceProvider?.GetService(contextEntity.ResourceType) as IResourceDefinition;

var enumeratedEntities = entities as IList<IIdentifiable> ?? entities.ToList();
@@ -179,7 +179,7 @@ private RelationshipData GetRelationshipData(RelationshipAttribute attr, Context
}

// this only includes the navigation property, we need to actually check the navigation property Id
var navigationEntity = _jsonApiContext.ContextGraph.GetRelationshipValue(entity, attr);
var navigationEntity = _jsonApiContext.ResourceGraph.GetRelationshipValue(entity, attr);
if (navigationEntity == null)
relationshipData.SingleData = attr.IsHasOne
? GetIndependentRelationshipIdentifier((HasOneAttribute)attr, entity)
@@ -217,7 +217,7 @@ private List<ResourceObject> IncludeRelationshipChain(
if(relationship == null)
throw new JsonApiException(400, $"{parentEntity.EntityName} does not contain relationship {requestedRelationship}");

var navigationEntity = _jsonApiContext.ContextGraph.GetRelationshipValue(parentResource, relationship);
var navigationEntity = _jsonApiContext.ResourceGraph.GetRelationshipValue(parentResource, relationship);
if (navigationEntity is IEnumerable hasManyNavigationEntity)
{
foreach (IIdentifiable includedEntity in hasManyNavigationEntity)
@@ -240,7 +240,7 @@ private List<ResourceObject> IncludeSingleResourceRelationships(
{
if (relationshipChainIndex < relationshipChain.Length)
{
var nextContextEntity = _jsonApiContext.ContextGraph.GetContextEntity(relationship.Type);
var nextContextEntity = _jsonApiContext.ResourceGraph.GetContextEntity(relationship.Type);
var resource = (IIdentifiable)navigationEntity;
// recursive call
if (relationshipChainIndex < relationshipChain.Length - 1)
@@ -271,7 +271,7 @@ private ResourceObject GetIncludedEntity(IIdentifiable entity)
{
if (entity == null) return null;

var contextEntity = _jsonApiContext.ContextGraph.GetContextEntity(entity.GetType());
var contextEntity = _jsonApiContext.ResourceGraph.GetContextEntity(entity.GetType());
var resourceDefinition = _scopedServiceProvider.GetService(contextEntity.ResourceType) as IResourceDefinition;

var data = GetData(contextEntity, entity, resourceDefinition);
@@ -296,7 +296,7 @@ private List<ResourceIdentifierObject> GetRelationships(IEnumerable<object> enti
// so, we just lookup the type of the first entity on the graph
// this is better than trying to get it from the generic parameter since it could
// be less specific than what is registered on the graph (e.g. IEnumerable<object>)
typeName = typeName ?? _jsonApiContext.ContextGraph.GetContextEntity(entity.GetType()).EntityName;
typeName = typeName ?? _jsonApiContext.ResourceGraph.GetContextEntity(entity.GetType()).EntityName;
relationships.Add(new ResourceIdentifierObject
{
Type = typeName,
@@ -309,7 +309,7 @@ private List<ResourceIdentifierObject> GetRelationships(IEnumerable<object> enti
private ResourceIdentifierObject GetRelationship(object entity)
{
var objType = entity.GetType();
var contextEntity = _jsonApiContext.ContextGraph.GetContextEntity(objType);
var contextEntity = _jsonApiContext.ResourceGraph.GetContextEntity(objType);

if (entity is IIdentifiable identifiableEntity)
return new ResourceIdentifierObject
@@ -327,7 +327,7 @@ private ResourceIdentifierObject GetIndependentRelationshipIdentifier(HasOneAttr
if (independentRelationshipIdentifier == null)
return null;

var relatedContextEntity = _jsonApiContext.ContextGraph.GetContextEntity(hasOne.Type);
var relatedContextEntity = _jsonApiContext.ResourceGraph.GetContextEntity(hasOne.Type);
if (relatedContextEntity == null) // TODO: this should probably be a debug log at minimum
return null;

18 changes: 9 additions & 9 deletions src/JsonApiDotNetCore/Configuration/JsonApiOptions.cs
Original file line number Diff line number Diff line change
@@ -77,7 +77,7 @@ public class JsonApiOptions
/// <summary>
/// The graph of all resources exposed by this application.
/// </summary>
public IContextGraph ContextGraph { get; set; }
public IResourceGraph ResourceGraph { get; set; }

/// <summary>
/// Use relative links for all resources.
@@ -158,28 +158,28 @@ public IContractResolver JsonContractResolver
ContractResolver = new DasherizedResolver()
};

public void BuildContextGraph<TContext>(Action<IContextGraphBuilder> builder) where TContext : DbContext
public void BuildResourceGraph<TContext>(Action<IResourceGraphBuilder> builder) where TContext : DbContext
{
BuildContextGraph(builder);
BuildResourceGraph(builder);

ContextGraphBuilder.AddDbContext<TContext>();
ResourceGraphBuilder.AddDbContext<TContext>();

ContextGraph = ContextGraphBuilder.Build();
ResourceGraph = ResourceGraphBuilder.Build();
}

public void BuildContextGraph(Action<IContextGraphBuilder> builder)
public void BuildResourceGraph(Action<IResourceGraphBuilder> builder)
{
if (builder == null) return;

builder(ContextGraphBuilder);
builder(ResourceGraphBuilder);

ContextGraph = ContextGraphBuilder.Build();
ResourceGraph = ResourceGraphBuilder.Build();
}

public void EnableExtension(JsonApiExtension extension)
=> EnabledExtensions.Add(extension);

internal IContextGraphBuilder ContextGraphBuilder { get; } = new ContextGraphBuilder();
internal IResourceGraphBuilder ResourceGraphBuilder { get; } = new ResourceGraphBuilder();
internal List<JsonApiExtension> EnabledExtensions { get; set; } = new List<JsonApiExtension>();
}
}
4 changes: 2 additions & 2 deletions src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs
Original file line number Diff line number Diff line change
@@ -156,7 +156,7 @@ public virtual async Task<IActionResult> PostAsync([FromBody] T entity)
return Forbidden();

if (_jsonApiContext.Options.ValidateModelState && !ModelState.IsValid)
return UnprocessableEntity(ModelState.ConvertToErrorCollection<T>(_jsonApiContext.ContextGraph));
return UnprocessableEntity(ModelState.ConvertToErrorCollection<T>(_jsonApiContext.ResourceGraph));

entity = await _create.CreateAsync(entity);

@@ -171,7 +171,7 @@ public virtual async Task<IActionResult> PatchAsync(TId id, [FromBody] T entity)
return UnprocessableEntity();

if (_jsonApiContext.Options.ValidateModelState && !ModelState.IsValid)
return UnprocessableEntity(ModelState.ConvertToErrorCollection<T>(_jsonApiContext.ContextGraph));
return UnprocessableEntity(ModelState.ConvertToErrorCollection<T>(_jsonApiContext.ResourceGraph));

var updatedEntity = await _update.UpdateAsync(id, entity);

2 changes: 1 addition & 1 deletion src/JsonApiDotNetCore/Data/DefaultEntityRepository.cs
Original file line number Diff line number Diff line change
@@ -317,7 +317,7 @@ public virtual IQueryable<TEntity> Include(IQueryable<TEntity> entities, string
: $"{internalRelationshipPath}.{relationship.RelationshipPath}";

if(i < relationshipChain.Length)
entity = _jsonApiContext.ContextGraph.GetContextEntity(relationship.Type);
entity = _jsonApiContext.ResourceGraph.GetContextEntity(relationship.Type);
}

return entities.Include(internalRelationshipPath);
Original file line number Diff line number Diff line change
@@ -14,7 +14,7 @@ public static class IApplicationBuilderExtensions
public static IApplicationBuilder UseJsonApi(this IApplicationBuilder app, bool useMvc = true)
{
DisableDetailedErrorsIfProduction(app);
LogContextGraphValidations(app);
LogResourceGraphValidations(app);

app.UseMiddleware<RequestMiddleware>();

@@ -35,14 +35,14 @@ private static void DisableDetailedErrorsIfProduction(IApplicationBuilder app)
}
}

private static void LogContextGraphValidations(IApplicationBuilder app)
private static void LogResourceGraphValidations(IApplicationBuilder app)
{
var logger = app.ApplicationServices.GetService(typeof(ILogger<ContextGraphBuilder>)) as ILogger;
var contextGraph = app.ApplicationServices.GetService(typeof(IContextGraph)) as ContextGraph;
var logger = app.ApplicationServices.GetService(typeof(ILogger<ResourceGraphBuilder>)) as ILogger;
var resourceGraph = app.ApplicationServices.GetService(typeof(IResourceGraph)) as ResourceGraph;

if (logger != null && contextGraph != null)
if (logger != null && resourceGraph != null)
{
contextGraph.ValidationResults.ForEach((v) =>
resourceGraph.ValidationResults.ForEach((v) =>
logger.Log(
v.LogLevel,
new EventId(),
Loading