-
-
Notifications
You must be signed in to change notification settings - Fork 163
Expand file tree
/
Copy pathJsonApiSchemaGenerator.cs
More file actions
76 lines (62 loc) · 3.24 KB
/
JsonApiSchemaGenerator.cs
File metadata and controls
76 lines (62 loc) · 3.24 KB
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
using System.Reflection;
using JsonApiDotNetCore.Controllers;
using JsonApiDotNetCore.OpenApi.Swashbuckle.SchemaGenerators.Components;
using JsonApiDotNetCore.OpenApi.Swashbuckle.SchemaGenerators.Documents;
using Microsoft.AspNetCore.Mvc.ApiExplorer;
using Microsoft.OpenApi.Models;
using Swashbuckle.AspNetCore.SwaggerGen;
namespace JsonApiDotNetCore.OpenApi.Swashbuckle.SchemaGenerators;
internal sealed class JsonApiSchemaGenerator : ISchemaGenerator
{
private readonly SchemaGenerator _defaultSchemaGenerator;
private readonly ResourceIdSchemaGenerator _resourceIdSchemaGenerator;
private readonly DocumentSchemaGenerator[] _documentSchemaGenerators;
public JsonApiSchemaGenerator(SchemaGenerator defaultSchemaGenerator, ResourceIdSchemaGenerator resourceIdSchemaGenerator,
IEnumerable<DocumentSchemaGenerator> documentSchemaGenerators)
{
ArgumentNullException.ThrowIfNull(defaultSchemaGenerator);
ArgumentNullException.ThrowIfNull(resourceIdSchemaGenerator);
ArgumentNullException.ThrowIfNull(documentSchemaGenerators);
_defaultSchemaGenerator = defaultSchemaGenerator;
_resourceIdSchemaGenerator = resourceIdSchemaGenerator;
_documentSchemaGenerators = documentSchemaGenerators as DocumentSchemaGenerator[] ?? documentSchemaGenerators.ToArray();
}
public OpenApiSchema GenerateSchema(Type schemaType, SchemaRepository schemaRepository, MemberInfo? memberInfo = null, ParameterInfo? parameterInfo = null,
ApiParameterRouteInfo? routeInfo = null)
{
ArgumentNullException.ThrowIfNull(schemaType);
ArgumentNullException.ThrowIfNull(schemaRepository);
if (parameterInfo is { Name: "id" } && IsJsonApiParameter(parameterInfo))
{
return _resourceIdSchemaGenerator.GenerateSchema(parameterInfo, schemaRepository);
}
DocumentSchemaGenerator? schemaGenerator = GetDocumentSchemaGenerator(schemaType);
if (schemaGenerator != null)
{
OpenApiSchema referenceSchema = schemaGenerator.GenerateSchema(schemaType, schemaRepository);
if (memberInfo != null || parameterInfo != null)
{
// For unknown reasons, Swashbuckle chooses to wrap request bodies in allOf, but not response bodies.
// We just replicate that behavior here. See https://github.com/domaindrivendev/Swashbuckle.AspNetCore/issues/861#issuecomment-1373631712.
referenceSchema = referenceSchema.WrapInExtendedSchema();
}
return referenceSchema;
}
return _defaultSchemaGenerator.GenerateSchema(schemaType, schemaRepository, memberInfo, parameterInfo, routeInfo);
}
private static bool IsJsonApiParameter(ParameterInfo parameter)
{
return parameter.Member.DeclaringType != null && parameter.Member.DeclaringType.IsAssignableTo(typeof(CoreJsonApiController));
}
private DocumentSchemaGenerator? GetDocumentSchemaGenerator(Type schemaType)
{
foreach (DocumentSchemaGenerator documentSchemaGenerator in _documentSchemaGenerators)
{
if (documentSchemaGenerator.CanGenerate(schemaType))
{
return documentSchemaGenerator;
}
}
return null;
}
}