Skip to content

Commit 728745d

Browse files
committed
Centralize component schema ID templates
1 parent f0102fc commit 728745d

File tree

2 files changed

+34
-25
lines changed

2 files changed

+34
-25
lines changed

src/JsonApiDotNetCore.OpenApi/JsonApiSchemaIdSelector.cs

Lines changed: 29 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ namespace JsonApiDotNetCore.OpenApi;
99

1010
internal sealed class JsonApiSchemaIdSelector
1111
{
12+
private const string ResourceTypeSchemaIdTemplate = "[ResourceName] Resource Type";
13+
1214
private static readonly IDictionary<Type, string> OpenTypeToSchemaTemplateMap = new Dictionary<Type, string>
1315
{
1416
[typeof(ResourcePostRequestDocument<>)] = "[ResourceName] Post Request Document",
@@ -61,19 +63,37 @@ public string GetSchemaId(Type type)
6163
return resourceType.PublicName.Singularize();
6264
}
6365

64-
JsonNamingPolicy? namingPolicy = _options.SerializerOptions.PropertyNamingPolicy;
65-
66-
if (type.IsConstructedGenericType && OpenTypeToSchemaTemplateMap.ContainsKey(type.GetGenericTypeDefinition()))
66+
if (type.IsConstructedGenericType)
6767
{
6868
Type openType = type.GetGenericTypeDefinition();
69-
Type resourceClrType = type.GetGenericArguments().First();
70-
resourceType = _resourceGraph.GetResourceType(resourceClrType);
7169

72-
string pascalCaseSchemaId = OpenTypeToSchemaTemplateMap[openType].Replace("[ResourceName]", resourceType.PublicName.Singularize()).ToPascalCase();
73-
return namingPolicy != null ? namingPolicy.ConvertName(pascalCaseSchemaId) : pascalCaseSchemaId;
70+
if (OpenTypeToSchemaTemplateMap.TryGetValue(openType, out string? schemaTemplate))
71+
{
72+
Type resourceClrType = type.GetGenericArguments().First();
73+
resourceType = _resourceGraph.GetResourceType(resourceClrType);
74+
75+
return ApplySchemaTemplate(schemaTemplate, resourceType);
76+
}
7477
}
7578

76-
// Used for a fixed set of types, such as JsonApiObject, LinksInResourceCollectionDocument etc.
77-
return namingPolicy != null ? namingPolicy.ConvertName(type.Name) : type.Name;
79+
// Used for a fixed set of non-generic types, such as Jsonapi, LinksInResourceCollectionDocument etc.
80+
return ApplySchemaTemplate(type.Name, null);
81+
}
82+
83+
private string ApplySchemaTemplate(string schemaTemplate, ResourceType? resourceType)
84+
{
85+
string pascalCaseSchemaId = resourceType != null
86+
? schemaTemplate.Replace("[ResourceName]", resourceType.PublicName.Singularize()).ToPascalCase()
87+
: schemaTemplate.ToPascalCase();
88+
89+
JsonNamingPolicy? namingPolicy = _options.SerializerOptions.PropertyNamingPolicy;
90+
return namingPolicy != null ? namingPolicy.ConvertName(pascalCaseSchemaId) : pascalCaseSchemaId;
91+
}
92+
93+
public string GetSchemaId(ResourceType resourceType)
94+
{
95+
ArgumentGuard.NotNull(resourceType);
96+
97+
return ApplySchemaTemplate(ResourceTypeSchemaIdTemplate, resourceType);
7898
}
7999
}

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/ResourceTypeSchemaGenerator.cs

Lines changed: 5 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,3 @@
1-
using System.Text.Json;
2-
using Humanizer;
31
using JsonApiDotNetCore.Configuration;
42
using Microsoft.OpenApi.Any;
53
using Microsoft.OpenApi.Models;
@@ -9,14 +7,13 @@ namespace JsonApiDotNetCore.OpenApi.SwaggerComponents;
97

108
internal sealed class ResourceTypeSchemaGenerator
119
{
12-
private const string ResourceTypeSchemaIdTemplate = "[ResourceName] Resource Type";
13-
private readonly IJsonApiOptions _options;
10+
private readonly JsonApiSchemaIdSelector _schemaIdSelector;
1411

15-
public ResourceTypeSchemaGenerator(IJsonApiOptions options)
12+
public ResourceTypeSchemaGenerator(JsonApiSchemaIdSelector schemaIdSelector)
1613
{
17-
ArgumentGuard.NotNull(options);
14+
ArgumentGuard.NotNull(schemaIdSelector);
1815

19-
_options = options;
16+
_schemaIdSelector = schemaIdSelector;
2017
}
2118

2219
public OpenApiSchema Get(ResourceType resourceType, SchemaRepository schemaRepository)
@@ -39,7 +36,7 @@ public OpenApiSchema Get(ResourceType resourceType, SchemaRepository schemaRepos
3936
AdditionalPropertiesAllowed = false
4037
};
4138

42-
string schemaId = GetSchemaId(resourceType);
39+
string schemaId = _schemaIdSelector.GetSchemaId(resourceType);
4340

4441
referenceSchema = new OpenApiSchema
4542
{
@@ -55,12 +52,4 @@ public OpenApiSchema Get(ResourceType resourceType, SchemaRepository schemaRepos
5552

5653
return referenceSchema;
5754
}
58-
59-
private string GetSchemaId(ResourceType resourceType)
60-
{
61-
string pascalCaseSchemaId = ResourceTypeSchemaIdTemplate.Replace("[ResourceName]", resourceType.PublicName.Singularize()).ToPascalCase();
62-
63-
JsonNamingPolicy? namingPolicy = _options.SerializerOptions.PropertyNamingPolicy;
64-
return namingPolicy != null ? namingPolicy.ConvertName(pascalCaseSchemaId) : pascalCaseSchemaId;
65-
}
6655
}

0 commit comments

Comments
 (0)