Skip to content

Small refactor #1116

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 5 commits into from
Dec 1, 2021
Merged
Show file tree
Hide file tree
Changes from 1 commit
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
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
using System;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using JsonApiDotNetCore.Resources.Annotations;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects
Expand All @@ -10,8 +10,8 @@ internal sealed class NonPrimaryDocumentTypeFactory
private static readonly DocumentOpenTypes SecondaryResponseDocumentOpenTypes = new(typeof(ResourceCollectionResponseDocument<>),
typeof(NullableSecondaryResourceResponseDocument<>), typeof(SecondaryResourceResponseDocument<>));

private static readonly DocumentOpenTypes RelationshipRequestDocumentOpenTypes = new(typeof(ToManyRelationshipRequestData<>),
typeof(NullableToOneRelationshipRequestData<>), typeof(ToOneRelationshipRequestData<>));
private static readonly DocumentOpenTypes RelationshipRequestDocumentOpenTypes = new(typeof(ToManyRelationshipInRequest<>),
typeof(NullableToOneRelationshipInRequest<>), typeof(ToOneRelationshipInRequest<>));

private static readonly DocumentOpenTypes RelationshipResponseDocumentOpenTypes = new(typeof(ResourceIdentifierCollectionResponseDocument<>),
typeof(NullableResourceIdentifierResponseDocument<>), typeof(ResourceIdentifierResponseDocument<>));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,14 +1,14 @@
using System;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using JsonApiDotNetCore.Resources.Annotations;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects
{
internal sealed class RelationshipDataTypeFactory
internal sealed class RelationshipTypeFactory
{
public static RelationshipDataTypeFactory Instance { get; } = new();
public static RelationshipTypeFactory Instance { get; } = new();

private RelationshipDataTypeFactory()
private RelationshipTypeFactory()
{
}

Expand All @@ -26,10 +26,10 @@ public Type GetForResponse(RelationshipAttribute relationship)
// @formatter:nested_ternary_style expanded

Type relationshipDataOpenType = relationship is HasManyAttribute
? typeof(ToManyRelationshipResponseData<>)
? typeof(ToManyRelationshipInResponse<>)
: relationship.IsNullable()
? typeof(NullableToOneRelationshipResponseData<>)
: typeof(ToOneRelationshipResponseData<>);
? typeof(NullableToOneRelationshipInResponse<>)
: typeof(ToOneRelationshipInResponse<>);

// @formatter:nested_ternary_style restore

Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class NullableToOneRelationshipRequestData<TResource> : NullableSingleData<ResourceIdentifierObject<TResource>>
internal sealed class NullableToOneRelationshipInRequest<TResource> : NullableSingleData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class NullableToOneRelationshipResponseData<TResource> : NullableSingleData<ResourceIdentifierObject<TResource>>
internal sealed class NullableToOneRelationshipInResponse<TResource> : NullableSingleData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
[Required]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class ToManyRelationshipRequestData<TResource> : ManyData<ResourceIdentifierObject<TResource>>
internal sealed class ToManyRelationshipInRequest<TResource> : ManyData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class ToManyRelationshipResponseData<TResource> : ManyData<ResourceIdentifierObject<TResource>>
internal sealed class ToManyRelationshipInResponse<TResource> : ManyData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
[Required]
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -2,10 +2,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class ToOneRelationshipRequestData<TResource> : SingleData<ResourceIdentifierObject<TResource>>
internal sealed class ToOneRelationshipInRequest<TResource> : SingleData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
}
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -5,10 +5,10 @@
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources;

namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships
{
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
internal sealed class ToOneRelationshipResponseData<TResource> : SingleData<ResourceIdentifierObject<TResource>>
internal sealed class ToOneRelationshipInResponse<TResource> : SingleData<ResourceIdentifierObject<TResource>>
where TResource : IIdentifiable
{
[Required]
Expand Down
8 changes: 4 additions & 4 deletions src/JsonApiDotNetCore.OpenApi/JsonApiOperationIdSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -6,7 +6,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.Middleware;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using Microsoft.AspNetCore.Mvc;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Controllers;
Expand All @@ -32,9 +32,9 @@ internal sealed class JsonApiOperationIdSelector
[typeof(ResourceIdentifierCollectionResponseDocument<>)] = RelationshipOperationIdTemplate,
[typeof(ResourceIdentifierResponseDocument<>)] = RelationshipOperationIdTemplate,
[typeof(NullableResourceIdentifierResponseDocument<>)] = RelationshipOperationIdTemplate,
[typeof(ToOneRelationshipRequestData<>)] = RelationshipOperationIdTemplate,
[typeof(NullableToOneRelationshipRequestData<>)] = RelationshipOperationIdTemplate,
[typeof(ToManyRelationshipRequestData<>)] = RelationshipOperationIdTemplate
[typeof(ToOneRelationshipInRequest<>)] = RelationshipOperationIdTemplate,
[typeof(NullableToOneRelationshipInRequest<>)] = RelationshipOperationIdTemplate,
[typeof(ToManyRelationshipInRequest<>)] = RelationshipOperationIdTemplate
};

private readonly IControllerResourceMapping _controllerResourceMapping;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System.Threading.Tasks;
using JsonApiDotNetCore.Middleware;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.AspNetCore.Mvc.Formatters;
using Microsoft.Net.Http.Headers;
Expand All @@ -15,9 +15,9 @@ internal sealed class JsonApiRequestFormatMetadataProvider : IInputFormatter, IA
{
private static readonly Type[] JsonApiRequestObjectOpenType =
{
typeof(ToManyRelationshipRequestData<>),
typeof(ToOneRelationshipRequestData<>),
typeof(NullableToOneRelationshipRequestData<>),
typeof(ToManyRelationshipInRequest<>),
typeof(ToOneRelationshipInRequest<>),
typeof(NullableToOneRelationshipInRequest<>),
typeof(ResourcePostRequestDocument<>),
typeof(ResourcePatchRequestDocument<>)
};
Expand Down
14 changes: 7 additions & 7 deletions src/JsonApiDotNetCore.OpenApi/JsonApiSchemaIdSelector.cs
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using Humanizer;
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;

namespace JsonApiDotNetCore.OpenApi
Expand All @@ -17,19 +17,19 @@ internal sealed class JsonApiSchemaIdSelector
[typeof(ResourcePatchRequestDocument<>)] = "###-patch-request-document",
[typeof(ResourcePostRequestObject<>)] = "###-data-in-post-request",
[typeof(ResourcePatchRequestObject<>)] = "###-data-in-patch-request",
[typeof(ToOneRelationshipRequestData<>)] = "to-one-###-request-data",
[typeof(NullableToOneRelationshipRequestData<>)] = "nullable-to-one-###-request-data",
[typeof(ToManyRelationshipRequestData<>)] = "to-many-###-request-data",
[typeof(ToOneRelationshipInRequest<>)] = "to-one-###-data-in-request",
[typeof(NullableToOneRelationshipInRequest<>)] = "nullable-to-one-###-data-in-request",
[typeof(ToManyRelationshipInRequest<>)] = "to-many-###-data-in-request",
[typeof(PrimaryResourceResponseDocument<>)] = "###-primary-response-document",
[typeof(SecondaryResourceResponseDocument<>)] = "###-secondary-response-document",
[typeof(NullableSecondaryResourceResponseDocument<>)] = "nullable-###-secondary-response-document",
[typeof(ResourceCollectionResponseDocument<>)] = "###-collection-response-document",
[typeof(ResourceIdentifierResponseDocument<>)] = "###-identifier-response-document",
[typeof(NullableResourceIdentifierResponseDocument<>)] = "nullable-###-identifier-response-document",
[typeof(ResourceIdentifierCollectionResponseDocument<>)] = "###-identifier-collection-response-document",
[typeof(ToOneRelationshipResponseData<>)] = "to-one-###-response-data",
[typeof(NullableToOneRelationshipResponseData<>)] = "nullable-to-one-###-response-data",
[typeof(ToManyRelationshipResponseData<>)] = "to-many-###-response-data",
[typeof(ToOneRelationshipInResponse<>)] = "to-one-###-data-in-response",
[typeof(NullableToOneRelationshipInResponse<>)] = "nullable-to-one-###-data-in-response",
[typeof(ToManyRelationshipInResponse<>)] = "to-many-###-data-in-response",
[typeof(ResourceResponseObject<>)] = "###-data-in-response",
[typeof(ResourceIdentifierObject<>)] = "###-identifier"
};
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using JsonApiDotNetCore.Configuration;
using JsonApiDotNetCore.OpenApi.JsonApiObjects;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;

Expand All @@ -23,9 +23,9 @@ internal sealed class JsonApiSchemaGenerator : ISchemaGenerator
typeof(ResourceIdentifierCollectionResponseDocument<>),
typeof(ResourceIdentifierResponseDocument<>),
typeof(NullableResourceIdentifierResponseDocument<>),
typeof(ToManyRelationshipRequestData<>),
typeof(ToOneRelationshipRequestData<>),
typeof(NullableToOneRelationshipRequestData<>)
typeof(ToManyRelationshipInRequest<>),
typeof(ToOneRelationshipInRequest<>),
typeof(NullableToOneRelationshipInRequest<>)
};

private readonly ISchemaGenerator _defaultSchemaGenerator;
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,7 +4,7 @@
using System.Linq;
using System.Reflection;
using JsonApiDotNetCore.OpenApi.JsonApiObjects;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.RelationshipData;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
using JsonApiDotNetCore.Resources.Annotations;
using Microsoft.OpenApi.Models;
Expand All @@ -16,11 +16,11 @@ internal sealed class ResourceFieldObjectSchemaBuilder
{
private static readonly SchemaRepository ResourceSchemaRepository = new();

private static readonly Type[] RelationshipResponseDataOpenTypes =
private static readonly Type[] RelationshipInResponseOpenTypes =
{
typeof(ToOneRelationshipResponseData<>),
typeof(ToManyRelationshipResponseData<>),
typeof(NullableToOneRelationshipResponseData<>)
typeof(ToOneRelationshipInResponse<>),
typeof(ToManyRelationshipInResponse<>),
typeof(NullableToOneRelationshipInResponse<>)
};

private readonly ResourceTypeInfo _resourceTypeInfo;
Expand Down Expand Up @@ -180,7 +180,7 @@ private void SetMembersOfRelationshipsObject(OpenApiSchema fullSchemaForRelation
if (matchingRelationship != null)
{
EnsureResourceIdentifierObjectSchemaExists(matchingRelationship);
AddRelationshipDataSchemaToResourceObject(matchingRelationship, fullSchemaForRelationshipsObject);
AddRelationshipSchemaToResourceObject(matchingRelationship, fullSchemaForRelationshipsObject);
}
}
}
Expand Down Expand Up @@ -212,59 +212,58 @@ private void GenerateResourceIdentifierObjectSchema(Type resourceIdentifierObjec
fullSchemaForResourceIdentifierObject.Properties[JsonApiObjectPropertyName.Type] = _resourceTypeSchemaGenerator.Get(resourceType);
}

private void AddRelationshipDataSchemaToResourceObject(RelationshipAttribute relationship, OpenApiSchema fullSchemaForRelationshipObject)
private void AddRelationshipSchemaToResourceObject(RelationshipAttribute relationship, OpenApiSchema fullSchemaForRelationshipsObject)
{
Type relationshipDataType = GetRelationshipDataType(relationship, _resourceTypeInfo.ResourceObjectOpenType);
Type relationshipSchemaType = GetRelationshipSchemaType(relationship, _resourceTypeInfo.ResourceObjectOpenType);

OpenApiSchema relationshipDataSchema = GetReferenceSchemaForRelationshipData(relationshipDataType) ??
CreateRelationshipDataObjectSchema(relationshipDataType);
OpenApiSchema relationshipSchema = GetReferenceSchemaForRelationship(relationshipSchemaType) ?? CreateRelationshipSchema(relationshipSchemaType);

fullSchemaForRelationshipObject.Properties.Add(relationship.PublicName, relationshipDataSchema);
fullSchemaForRelationshipsObject.Properties.Add(relationship.PublicName, relationshipSchema);

if (IsFieldRequired(relationship))
{
fullSchemaForRelationshipObject.Required.Add(relationship.PublicName);
fullSchemaForRelationshipsObject.Required.Add(relationship.PublicName);
}
}

private static Type GetRelationshipDataType(RelationshipAttribute relationship, Type resourceObjectType)
private static Type GetRelationshipSchemaType(RelationshipAttribute relationship, Type resourceObjectType)
{
return resourceObjectType.GetGenericTypeDefinition().IsAssignableTo(typeof(ResourceResponseObject<>))
? RelationshipDataTypeFactory.Instance.GetForResponse(relationship)
: RelationshipDataTypeFactory.Instance.GetForRequest(relationship);
? RelationshipTypeFactory.Instance.GetForResponse(relationship)
: RelationshipTypeFactory.Instance.GetForRequest(relationship);
}

private OpenApiSchema? GetReferenceSchemaForRelationshipData(Type relationshipDataType)
private OpenApiSchema? GetReferenceSchemaForRelationship(Type relationshipSchemaType)
{
_schemaRepositoryAccessor.Current.TryLookupByType(relationshipDataType, out OpenApiSchema? referenceSchemaForRelationshipData);
return referenceSchemaForRelationshipData;
_schemaRepositoryAccessor.Current.TryLookupByType(relationshipSchemaType, out OpenApiSchema? referenceSchema);
return referenceSchema;
}

private OpenApiSchema CreateRelationshipDataObjectSchema(Type relationshipDataType)
private OpenApiSchema CreateRelationshipSchema(Type relationshipSchemaType)
{
OpenApiSchema referenceSchema = _defaultSchemaGenerator.GenerateSchema(relationshipDataType, _schemaRepositoryAccessor.Current);
OpenApiSchema referenceSchema = _defaultSchemaGenerator.GenerateSchema(relationshipSchemaType, _schemaRepositoryAccessor.Current);

OpenApiSchema fullSchema = _schemaRepositoryAccessor.Current.Schemas[referenceSchema.Reference.Id];

if (IsDataPropertyNullable(relationshipDataType))
if (IsDataPropertyNullable(relationshipSchemaType))
{
fullSchema.Properties[JsonApiObjectPropertyName.Data] =
_nullableReferenceSchemaGenerator.GenerateSchema(fullSchema.Properties[JsonApiObjectPropertyName.Data]);
}

Type relationshipDataOpenType = relationshipDataType.GetGenericTypeDefinition();

if (IsRelationshipDataPropertyInResponse(relationshipDataOpenType))
if (IsRelationshipInResponseType(relationshipSchemaType))
{
fullSchema.Required.Remove(JsonApiObjectPropertyName.Data);
}

return referenceSchema;
}

private static bool IsRelationshipDataPropertyInResponse(Type relationshipDataOpenType)
private static bool IsRelationshipInResponseType(Type relationshipSchemaType)
{
return RelationshipResponseDataOpenTypes.Contains(relationshipDataOpenType);
Type relationshipSchemaOpenType = relationshipSchemaType.GetGenericTypeDefinition();

return RelationshipInResponseOpenTypes.Contains(relationshipSchemaOpenType);
}

private static bool IsDataPropertyNullable(Type type)
Expand Down
Loading