1
+ using System . Text . Json ;
1
2
using Humanizer ;
2
3
using JsonApiDotNetCore . Configuration ;
3
4
using JsonApiDotNetCore . OpenApi . JsonApiObjects . Documents ;
@@ -10,42 +11,41 @@ internal sealed class JsonApiSchemaIdSelector
10
11
{
11
12
private static readonly IDictionary < Type , string > OpenTypeToSchemaTemplateMap = new Dictionary < Type , string >
12
13
{
13
- [ typeof ( ResourcePostRequestDocument < > ) ] = "###-post-request-document " ,
14
- [ typeof ( ResourcePatchRequestDocument < > ) ] = "###-patch-request-document " ,
15
- [ typeof ( ResourceObjectInPostRequest < > ) ] = "###-data-in-post-request " ,
16
- [ typeof ( AttributesInPostRequest < > ) ] = "###-attributes-in-post-request " ,
17
- [ typeof ( RelationshipsInPostRequest < > ) ] = "###-relationships-in-post-request " ,
18
- [ typeof ( ResourceObjectInPatchRequest < > ) ] = "###-data-in-patch-request " ,
19
- [ typeof ( AttributesInPatchRequest < > ) ] = "###-attributes-in-patch-request " ,
20
- [ typeof ( RelationshipsInPatchRequest < > ) ] = "###-relationships-in-patch-request " ,
21
- [ typeof ( ToOneRelationshipInRequest < > ) ] = "to-one-###-in-request " ,
22
- [ typeof ( NullableToOneRelationshipInRequest < > ) ] = "nullable-to-one-###-in-request " ,
23
- [ typeof ( ToManyRelationshipInRequest < > ) ] = "to-many-###-in-request " ,
24
- [ typeof ( PrimaryResourceResponseDocument < > ) ] = "###-primary-response-document " ,
25
- [ typeof ( SecondaryResourceResponseDocument < > ) ] = "###-secondary-response-document " ,
26
- [ typeof ( NullableSecondaryResourceResponseDocument < > ) ] = "nullable-###-secondary-response-document " ,
27
- [ typeof ( ResourceCollectionResponseDocument < > ) ] = "###-collection-response-document " ,
28
- [ typeof ( ResourceIdentifierResponseDocument < > ) ] = "###-identifier-response-document " ,
29
- [ typeof ( NullableResourceIdentifierResponseDocument < > ) ] = "nullable-###-identifier-response-document " ,
30
- [ typeof ( ResourceIdentifierCollectionResponseDocument < > ) ] = "###-identifier-collection-response-document " ,
31
- [ typeof ( ToOneRelationshipInResponse < > ) ] = "to-one-###-in-response " ,
32
- [ typeof ( NullableToOneRelationshipInResponse < > ) ] = "nullable-to-one-###-in-response " ,
33
- [ typeof ( ToManyRelationshipInResponse < > ) ] = "to-many-###-in-response " ,
34
- [ typeof ( ResourceObjectInResponse < > ) ] = "###-data-in-response " ,
35
- [ typeof ( AttributesInResponse < > ) ] = "###-attributes-in-response " ,
36
- [ typeof ( RelationshipsInResponse < > ) ] = "###-relationships-in-response " ,
37
- [ typeof ( ResourceIdentifierObject < > ) ] = "###-identifier "
14
+ [ typeof ( ResourcePostRequestDocument < > ) ] = "[ResourceName] Post Request Document " ,
15
+ [ typeof ( ResourcePatchRequestDocument < > ) ] = "[ResourceName] Patch Request Document " ,
16
+ [ typeof ( ResourceObjectInPostRequest < > ) ] = "[ResourceName] Data In Post Request " ,
17
+ [ typeof ( AttributesInPostRequest < > ) ] = "[ResourceName] Attributes In Post Request " ,
18
+ [ typeof ( RelationshipsInPostRequest < > ) ] = "[ResourceName] Relationships In Post Request " ,
19
+ [ typeof ( ResourceObjectInPatchRequest < > ) ] = "[ResourceName] Data In Patch Request " ,
20
+ [ typeof ( AttributesInPatchRequest < > ) ] = "[ResourceName] Attributes In Patch Request " ,
21
+ [ typeof ( RelationshipsInPatchRequest < > ) ] = "[ResourceName] Relationships In Patch Request " ,
22
+ [ typeof ( ToOneRelationshipInRequest < > ) ] = "To One [ResourceName] In Request " ,
23
+ [ typeof ( NullableToOneRelationshipInRequest < > ) ] = "Nullable To One [ResourceName] In Request " ,
24
+ [ typeof ( ToManyRelationshipInRequest < > ) ] = "To Many [ResourceName] In Request " ,
25
+ [ typeof ( PrimaryResourceResponseDocument < > ) ] = "[ResourceName] Primary Response Document " ,
26
+ [ typeof ( SecondaryResourceResponseDocument < > ) ] = "[ResourceName] Secondary Response Document " ,
27
+ [ typeof ( NullableSecondaryResourceResponseDocument < > ) ] = "Nullable [ResourceName] Secondary Response Document " ,
28
+ [ typeof ( ResourceCollectionResponseDocument < > ) ] = "[ResourceName] Collection Response Document " ,
29
+ [ typeof ( ResourceIdentifierResponseDocument < > ) ] = "[ResourceName] Identifier Response Document " ,
30
+ [ typeof ( NullableResourceIdentifierResponseDocument < > ) ] = "Nullable [ResourceName] Identifier Response Document " ,
31
+ [ typeof ( ResourceIdentifierCollectionResponseDocument < > ) ] = "[ResourceName] Identifier Collection Response Document " ,
32
+ [ typeof ( ToOneRelationshipInResponse < > ) ] = "To One [ResourceName] In Response " ,
33
+ [ typeof ( NullableToOneRelationshipInResponse < > ) ] = "Nullable To One [ResourceName] In Response " ,
34
+ [ typeof ( ToManyRelationshipInResponse < > ) ] = "To Many [ResourceName] In Response " ,
35
+ [ typeof ( ResourceObjectInResponse < > ) ] = "[ResourceName] Data In Response " ,
36
+ [ typeof ( AttributesInResponse < > ) ] = "[ResourceName] Attributes In Response " ,
37
+ [ typeof ( RelationshipsInResponse < > ) ] = "[ResourceName] Relationships In Response " ,
38
+ [ typeof ( ResourceIdentifierObject < > ) ] = "[ResourceName] Identifier "
38
39
} ;
39
40
40
- private readonly ResourceNameFormatter _formatter ;
41
+ private readonly JsonNamingPolicy ? _namingPolicy ;
41
42
private readonly IResourceGraph _resourceGraph ;
42
43
43
- public JsonApiSchemaIdSelector ( ResourceNameFormatter formatter , IResourceGraph resourceGraph )
44
+ public JsonApiSchemaIdSelector ( JsonNamingPolicy ? namingPolicy , IResourceGraph resourceGraph )
44
45
{
45
- ArgumentGuard . NotNull ( formatter , nameof ( formatter ) ) ;
46
46
ArgumentGuard . NotNull ( resourceGraph , nameof ( resourceGraph ) ) ;
47
47
48
- _formatter = formatter ;
48
+ _namingPolicy = namingPolicy ;
49
49
_resourceGraph = resourceGraph ;
50
50
}
51
51
@@ -62,14 +62,21 @@ public string GetSchemaId(Type type)
62
62
63
63
if ( type . IsConstructedGenericType && OpenTypeToSchemaTemplateMap . ContainsKey ( type . GetGenericTypeDefinition ( ) ) )
64
64
{
65
+ Type openType = type . GetGenericTypeDefinition ( ) ;
65
66
Type resourceClrType = type . GetGenericArguments ( ) . First ( ) ;
66
- string resourceName = _formatter . FormatResourceName ( resourceClrType ) . Singularize ( ) ;
67
+ resourceType = _resourceGraph . FindResourceType ( resourceClrType ) ;
67
68
68
- string template = OpenTypeToSchemaTemplateMap [ type . GetGenericTypeDefinition ( ) ] ;
69
- return template . Replace ( "###" , resourceName ) ;
69
+ if ( resourceType == null )
70
+ {
71
+ throw new UnreachableCodeException ( ) ;
72
+ }
73
+
74
+ string pascalCaseSchemaId = OpenTypeToSchemaTemplateMap [ openType ] . Replace ( "[ResourceName]" , resourceType . PublicName . Singularize ( ) ) . Pascalize ( ) ;
75
+
76
+ return _namingPolicy != null ? _namingPolicy . ConvertName ( pascalCaseSchemaId ) : pascalCaseSchemaId ;
70
77
}
71
78
72
- // Used for a fixed set of types, such as jsonapi-object, links-in-many-resource-document etc.
73
- return _formatter . FormatResourceName ( type ) . Singularize ( ) ;
79
+ // Used for a fixed set of types, such as JsonApiObject, LinksInResourceCollectionDocument etc.
80
+ return _namingPolicy != null ? _namingPolicy . ConvertName ( type . Name ) : type . Name ;
74
81
}
75
82
}
0 commit comments