Skip to content

Commit 68cad58

Browse files
authored
Merge pull request #1647 from json-api-dotnet/merge-master-into-openapi
Merge master into openapi
2 parents 9010f16 + 11aafa4 commit 68cad58

20 files changed

+404
-225
lines changed

src/JsonApiDotNetCore.Annotations/Configuration/ResourceType.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -217,7 +217,7 @@ public RelationshipAttribute GetRelationshipByPropertyName(string propertyName)
217217
}
218218

219219
/// <summary>
220-
/// Returns all directly and indirectly non-abstract resource types that derive from this resource type.
220+
/// Returns all non-abstract resource types that directly or indirectly derive from this resource type.
221221
/// </summary>
222222
public IReadOnlySet<ResourceType> GetAllConcreteDerivedTypes()
223223
{

src/JsonApiDotNetCore.OpenApi.Swashbuckle/JsonApiActionDescriptorCollectionProvider.cs

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,7 @@ private static List<ActionDescriptor> Expand(ActionDescriptor genericEndpoint, N
163163

164164
ActionDescriptor expandedEndpoint = Clone(genericEndpoint);
165165

166-
RemovePathParameter(expandedEndpoint.Parameters, JsonApiPathParameter.RelationshipName);
166+
RemovePathParameter(expandedEndpoint.Parameters, "relationshipName");
167167

168168
ExpandTemplate(expandedEndpoint.AttributeRouteInfo!, relationshipName);
169169

@@ -212,12 +212,12 @@ private static FilterDescriptor Clone(FilterDescriptor descriptor)
212212

213213
private static void RemovePathParameter(ICollection<ParameterDescriptor> parameters, string parameterName)
214214
{
215-
ParameterDescriptor relationshipName = parameters.Single(parameterDescriptor => parameterDescriptor.Name == parameterName);
216-
parameters.Remove(relationshipName);
215+
ParameterDescriptor descriptor = parameters.Single(parameterDescriptor => parameterDescriptor.Name == parameterName);
216+
parameters.Remove(descriptor);
217217
}
218218

219219
private static void ExpandTemplate(AttributeRouteInfo route, string expansionParameter)
220220
{
221-
route.Template = route.Template!.Replace(JsonApiRoutingTemplate.RelationshipNameRoutePlaceholder, expansionParameter);
221+
route.Template = route.Template!.Replace("{relationshipName}", expansionParameter);
222222
}
223223
}

src/JsonApiDotNetCore.OpenApi.Swashbuckle/JsonApiEndpoint.cs

Lines changed: 0 additions & 16 deletions
This file was deleted.
Lines changed: 13 additions & 47 deletions
Original file line numberDiff line numberDiff line change
@@ -1,72 +1,38 @@
11
using System.Reflection;
22
using JsonApiDotNetCore.Controllers;
3-
using Microsoft.AspNetCore.Mvc;
3+
using JsonApiDotNetCore.Middleware;
44
using Microsoft.AspNetCore.Mvc.Routing;
55

66
namespace JsonApiDotNetCore.OpenApi.Swashbuckle.JsonApiMetadata;
77

88
internal sealed class EndpointResolver
99
{
10-
public JsonApiEndpoint? Get(MethodInfo controllerAction)
10+
public static EndpointResolver Instance { get; } = new();
11+
12+
private EndpointResolver()
13+
{
14+
}
15+
16+
public JsonApiEndpoints GetEndpoint(MethodInfo controllerAction)
1117
{
1218
ArgumentGuard.NotNull(controllerAction);
1319

1420
if (!IsJsonApiController(controllerAction))
1521
{
16-
return null;
17-
}
18-
19-
if (IsAtomicOperationsController(controllerAction))
20-
{
21-
return JsonApiEndpoint.PostOperations;
22+
return JsonApiEndpoints.None;
2223
}
2324

24-
HttpMethodAttribute? method = Attribute.GetCustomAttributes(controllerAction, true).OfType<HttpMethodAttribute>().FirstOrDefault();
25-
26-
return ResolveJsonApiEndpoint(method);
25+
IEnumerable<HttpMethodAttribute> httpMethodAttributes = controllerAction.GetCustomAttributes<HttpMethodAttribute>(true);
26+
return httpMethodAttributes.GetJsonApiEndpoint();
2727
}
2828

29-
private static bool IsJsonApiController(MethodInfo controllerAction)
29+
private bool IsJsonApiController(MethodInfo controllerAction)
3030
{
3131
return typeof(CoreJsonApiController).IsAssignableFrom(controllerAction.ReflectedType);
3232
}
3333

34-
private static bool IsAtomicOperationsController(MethodInfo controllerAction)
34+
public bool IsAtomicOperationsController(MethodInfo controllerAction)
3535
{
3636
return typeof(BaseJsonApiOperationsController).IsAssignableFrom(controllerAction.ReflectedType);
3737
}
38-
39-
private static JsonApiEndpoint? ResolveJsonApiEndpoint(HttpMethodAttribute? httpMethod)
40-
{
41-
return httpMethod switch
42-
{
43-
HttpGetAttribute attr => attr.Template switch
44-
{
45-
null => JsonApiEndpoint.GetCollection,
46-
JsonApiRoutingTemplate.PrimaryEndpoint => JsonApiEndpoint.GetSingle,
47-
JsonApiRoutingTemplate.SecondaryEndpoint => JsonApiEndpoint.GetSecondary,
48-
JsonApiRoutingTemplate.RelationshipEndpoint => JsonApiEndpoint.GetRelationship,
49-
_ => null
50-
},
51-
HttpPostAttribute attr => attr.Template switch
52-
{
53-
null => JsonApiEndpoint.PostResource,
54-
JsonApiRoutingTemplate.RelationshipEndpoint => JsonApiEndpoint.PostRelationship,
55-
_ => null
56-
},
57-
HttpPatchAttribute attr => attr.Template switch
58-
{
59-
JsonApiRoutingTemplate.PrimaryEndpoint => JsonApiEndpoint.PatchResource,
60-
JsonApiRoutingTemplate.RelationshipEndpoint => JsonApiEndpoint.PatchRelationship,
61-
_ => null
62-
},
63-
HttpDeleteAttribute attr => attr.Template switch
64-
{
65-
JsonApiRoutingTemplate.PrimaryEndpoint => JsonApiEndpoint.DeleteResource,
66-
JsonApiRoutingTemplate.RelationshipEndpoint => JsonApiEndpoint.DeleteRelationship,
67-
_ => null
68-
},
69-
_ => null
70-
};
71-
}
7238
}

src/JsonApiDotNetCore.OpenApi.Swashbuckle/JsonApiMetadata/JsonApiEndpointMetadataProvider.cs

Lines changed: 20 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,6 @@
11
using System.Reflection;
22
using JsonApiDotNetCore.Configuration;
3+
using JsonApiDotNetCore.Controllers;
34
using JsonApiDotNetCore.Middleware;
45
using JsonApiDotNetCore.OpenApi.Swashbuckle.JsonApiObjects.Documents;
56
using JsonApiDotNetCore.Resources.Annotations;
@@ -12,18 +13,14 @@ namespace JsonApiDotNetCore.OpenApi.Swashbuckle.JsonApiMetadata;
1213
/// </summary>
1314
internal sealed class JsonApiEndpointMetadataProvider
1415
{
15-
private readonly EndpointResolver _endpointResolver;
1616
private readonly IControllerResourceMapping _controllerResourceMapping;
1717
private readonly NonPrimaryDocumentTypeFactory _nonPrimaryDocumentTypeFactory;
1818

19-
public JsonApiEndpointMetadataProvider(EndpointResolver endpointResolver, IControllerResourceMapping controllerResourceMapping,
20-
NonPrimaryDocumentTypeFactory nonPrimaryDocumentTypeFactory)
19+
public JsonApiEndpointMetadataProvider(IControllerResourceMapping controllerResourceMapping, NonPrimaryDocumentTypeFactory nonPrimaryDocumentTypeFactory)
2120
{
22-
ArgumentGuard.NotNull(endpointResolver);
2321
ArgumentGuard.NotNull(controllerResourceMapping);
2422
ArgumentGuard.NotNull(nonPrimaryDocumentTypeFactory);
2523

26-
_endpointResolver = endpointResolver;
2724
_controllerResourceMapping = controllerResourceMapping;
2825
_nonPrimaryDocumentTypeFactory = nonPrimaryDocumentTypeFactory;
2926
}
@@ -32,16 +29,16 @@ public JsonApiEndpointMetadataContainer Get(MethodInfo controllerAction)
3229
{
3330
ArgumentGuard.NotNull(controllerAction);
3431

35-
JsonApiEndpoint? endpoint = _endpointResolver.Get(controllerAction);
36-
37-
if (endpoint == null)
32+
if (EndpointResolver.Instance.IsAtomicOperationsController(controllerAction))
3833
{
39-
throw new NotSupportedException($"Unable to provide metadata for non-JSON:API endpoint '{controllerAction.ReflectedType!.FullName}'.");
34+
return new JsonApiEndpointMetadataContainer(AtomicOperationsRequestMetadata.Instance, AtomicOperationsResponseMetadata.Instance);
4035
}
4136

42-
if (endpoint == JsonApiEndpoint.PostOperations)
37+
JsonApiEndpoints endpoint = EndpointResolver.Instance.GetEndpoint(controllerAction);
38+
39+
if (endpoint == JsonApiEndpoints.None)
4340
{
44-
return new JsonApiEndpointMetadataContainer(AtomicOperationsRequestMetadata.Instance, AtomicOperationsResponseMetadata.Instance);
41+
throw new NotSupportedException($"Unable to provide metadata for non-JSON:API endpoint '{controllerAction.ReflectedType!.FullName}'.");
4542
}
4643

4744
ResourceType? primaryResourceType = _controllerResourceMapping.GetResourceTypeForController(controllerAction.ReflectedType);
@@ -51,19 +48,19 @@ public JsonApiEndpointMetadataContainer Get(MethodInfo controllerAction)
5148
throw new UnreachableCodeException();
5249
}
5350

54-
IJsonApiRequestMetadata? requestMetadata = GetRequestMetadata(endpoint.Value, primaryResourceType);
55-
IJsonApiResponseMetadata? responseMetadata = GetResponseMetadata(endpoint.Value, primaryResourceType);
51+
IJsonApiRequestMetadata? requestMetadata = GetRequestMetadata(endpoint, primaryResourceType);
52+
IJsonApiResponseMetadata? responseMetadata = GetResponseMetadata(endpoint, primaryResourceType);
5653
return new JsonApiEndpointMetadataContainer(requestMetadata, responseMetadata);
5754
}
5855

59-
private IJsonApiRequestMetadata? GetRequestMetadata(JsonApiEndpoint endpoint, ResourceType primaryResourceType)
56+
private IJsonApiRequestMetadata? GetRequestMetadata(JsonApiEndpoints endpoint, ResourceType primaryResourceType)
6057
{
6158
return endpoint switch
6259
{
63-
JsonApiEndpoint.PostResource => GetPostResourceRequestMetadata(primaryResourceType.ClrType),
64-
JsonApiEndpoint.PatchResource => GetPatchResourceRequestMetadata(primaryResourceType.ClrType),
65-
JsonApiEndpoint.PostRelationship or JsonApiEndpoint.PatchRelationship or JsonApiEndpoint.DeleteRelationship => GetRelationshipRequestMetadata(
66-
primaryResourceType.Relationships, endpoint != JsonApiEndpoint.PatchRelationship),
60+
JsonApiEndpoints.Post => GetPostResourceRequestMetadata(primaryResourceType.ClrType),
61+
JsonApiEndpoints.Patch => GetPatchResourceRequestMetadata(primaryResourceType.ClrType),
62+
JsonApiEndpoints.PostRelationship or JsonApiEndpoints.PatchRelationship or JsonApiEndpoints.DeleteRelationship => GetRelationshipRequestMetadata(
63+
primaryResourceType.Relationships, endpoint != JsonApiEndpoints.PatchRelationship),
6764
_ => null
6865
};
6966
}
@@ -92,14 +89,14 @@ private RelationshipRequestMetadata GetRelationshipRequestMetadata(IEnumerable<R
9289
return new RelationshipRequestMetadata(requestDocumentTypesByRelationshipName);
9390
}
9491

95-
private IJsonApiResponseMetadata? GetResponseMetadata(JsonApiEndpoint endpoint, ResourceType primaryResourceType)
92+
private IJsonApiResponseMetadata? GetResponseMetadata(JsonApiEndpoints endpoint, ResourceType primaryResourceType)
9693
{
9794
return endpoint switch
9895
{
99-
JsonApiEndpoint.GetCollection or JsonApiEndpoint.GetSingle or JsonApiEndpoint.PostResource or JsonApiEndpoint.PatchResource =>
100-
GetPrimaryResponseMetadata(primaryResourceType.ClrType, endpoint == JsonApiEndpoint.GetCollection),
101-
JsonApiEndpoint.GetSecondary => GetSecondaryResponseMetadata(primaryResourceType.Relationships),
102-
JsonApiEndpoint.GetRelationship => GetRelationshipResponseMetadata(primaryResourceType.Relationships),
96+
JsonApiEndpoints.GetCollection or JsonApiEndpoints.GetSingle or JsonApiEndpoints.Post or JsonApiEndpoints.Patch => GetPrimaryResponseMetadata(
97+
primaryResourceType.ClrType, endpoint == JsonApiEndpoints.GetCollection),
98+
JsonApiEndpoints.GetSecondary => GetSecondaryResponseMetadata(primaryResourceType.Relationships),
99+
JsonApiEndpoints.GetRelationship => GetRelationshipResponseMetadata(primaryResourceType.Relationships),
103100
_ => null
104101
};
105102
}

src/JsonApiDotNetCore.OpenApi.Swashbuckle/JsonApiPathParameter.cs

Lines changed: 0 additions & 8 deletions
This file was deleted.

src/JsonApiDotNetCore.OpenApi.Swashbuckle/JsonApiRoutingTemplate.cs

Lines changed: 0 additions & 12 deletions
This file was deleted.

0 commit comments

Comments
 (0)