Skip to content

Commit 86af528

Browse files
authored
Merge pull request #1365 from json-api-dotnet/jsonapi-object
OpenAPI: Include jsonapi element or not, depending on options
2 parents 0709ea4 + 2c1869f commit 86af528

File tree

18 files changed

+41
-98
lines changed

18 files changed

+41
-98
lines changed

src/JsonApiDotNetCore.OpenApi/JsonApiActionDescriptorCollectionProvider.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -27,6 +27,7 @@ public JsonApiActionDescriptorCollectionProvider(IControllerResourceMapping cont
2727
{
2828
ArgumentGuard.NotNull(controllerResourceMapping);
2929
ArgumentGuard.NotNull(defaultProvider);
30+
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
3031

3132
_defaultProvider = defaultProvider;
3233
_jsonApiEndpointMetadataProvider = new JsonApiEndpointMetadataProvider(controllerResourceMapping, resourceFieldValidationMetadataProvider);

src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/JsonApiEndpointMetadataProvider.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@ public JsonApiEndpointMetadataProvider(IControllerResourceMapping controllerReso
2020
ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
2121
{
2222
ArgumentGuard.NotNull(controllerResourceMapping);
23+
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
24+
2325
_nonPrimaryDocumentTypeFactory = new NonPrimaryDocumentTypeFactory(resourceFieldValidationMetadataProvider);
2426
_controllerResourceMapping = controllerResourceMapping;
2527
}

src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/RelationshipTypeFactory.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,8 @@ internal sealed class RelationshipTypeFactory
1010

1111
public RelationshipTypeFactory(ResourceFieldValidationMetadataProvider resourceFieldValidationMetadataProvider)
1212
{
13+
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
14+
1315
_nonPrimaryDocumentTypeFactory = new NonPrimaryDocumentTypeFactory(resourceFieldValidationMetadataProvider);
1416
_resourceFieldValidationMetadataProvider = resourceFieldValidationMetadataProvider;
1517
}

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/CachingSwaggerGenerator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@ internal sealed class CachingSwaggerGenerator : ISwaggerProvider
1717
public CachingSwaggerGenerator(SwaggerGenerator defaultSwaggerGenerator)
1818
{
1919
ArgumentGuard.NotNull(defaultSwaggerGenerator);
20+
2021
_defaultSwaggerGenerator = defaultSwaggerGenerator;
2122
}
2223

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/JsonApiSchemaGenerator.cs

Lines changed: 22 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -45,6 +45,7 @@ internal sealed class JsonApiSchemaGenerator : ISchemaGenerator
4545
};
4646

4747
private readonly ISchemaGenerator _defaultSchemaGenerator;
48+
private readonly IJsonApiOptions _options;
4849
private readonly ResourceObjectSchemaGenerator _resourceObjectSchemaGenerator;
4950
private readonly NullableReferenceSchemaGenerator _nullableReferenceSchemaGenerator;
5051
private readonly SchemaRepositoryAccessor _schemaRepositoryAccessor = new();
@@ -55,8 +56,10 @@ public JsonApiSchemaGenerator(SchemaGenerator defaultSchemaGenerator, IResourceG
5556
ArgumentGuard.NotNull(defaultSchemaGenerator);
5657
ArgumentGuard.NotNull(resourceGraph);
5758
ArgumentGuard.NotNull(options);
59+
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
5860

5961
_defaultSchemaGenerator = defaultSchemaGenerator;
62+
_options = options;
6063
_nullableReferenceSchemaGenerator = new NullableReferenceSchemaGenerator(_schemaRepositoryAccessor, options.SerializerOptions.PropertyNamingPolicy);
6164

6265
_resourceObjectSchemaGenerator = new ResourceObjectSchemaGenerator(defaultSchemaGenerator, resourceGraph, options, _schemaRepositoryAccessor,
@@ -84,6 +87,11 @@ public OpenApiSchema GenerateSchema(Type modelType, SchemaRepository schemaRepos
8487
{
8588
SetDataObjectSchemaToNullable(schema);
8689
}
90+
91+
if (!_options.IncludeJsonApiVersion)
92+
{
93+
RemoveJsonApiObject(schema);
94+
}
8795
}
8896

8997
return _defaultSchemaGenerator.GenerateSchema(modelType, schemaRepository, memberInfo, parameterInfo, routeInfo);
@@ -129,19 +137,27 @@ private static bool IsDataPropertyNullableInDocument(Type documentType)
129137
return JsonApiDocumentWithNullableDataOpenTypes.Contains(documentOpenType);
130138
}
131139

140+
private static OpenApiSchema CreateArrayTypeDataSchema(OpenApiSchema referenceSchemaForResourceObject)
141+
{
142+
return new OpenApiSchema
143+
{
144+
Items = referenceSchemaForResourceObject,
145+
Type = "array"
146+
};
147+
}
148+
132149
private void SetDataObjectSchemaToNullable(OpenApiSchema referenceSchemaForDocument)
133150
{
134151
OpenApiSchema fullSchemaForDocument = _schemaRepositoryAccessor.Current.Schemas[referenceSchemaForDocument.Reference.Id];
135152
OpenApiSchema referenceSchemaForData = fullSchemaForDocument.Properties[JsonApiPropertyName.Data];
136153
fullSchemaForDocument.Properties[JsonApiPropertyName.Data] = _nullableReferenceSchemaGenerator.GenerateSchema(referenceSchemaForData);
137154
}
138155

139-
private static OpenApiSchema CreateArrayTypeDataSchema(OpenApiSchema referenceSchemaForResourceObject)
156+
private void RemoveJsonApiObject(OpenApiSchema referenceSchemaForDocument)
140157
{
141-
return new OpenApiSchema
142-
{
143-
Items = referenceSchemaForResourceObject,
144-
Type = "array"
145-
};
158+
OpenApiSchema fullSchemaForDocument = _schemaRepositoryAccessor.Current.Schemas[referenceSchemaForDocument.Reference.Id];
159+
fullSchemaForDocument.Properties.Remove(JsonApiPropertyName.Jsonapi);
160+
161+
_schemaRepositoryAccessor.Current.Schemas.Remove("jsonapi-object");
146162
}
147163
}

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/NullableReferenceSchemaGenerator.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,7 +20,6 @@ public NullableReferenceSchemaGenerator(ISchemaRepositoryAccessor schemaReposito
2020
ArgumentGuard.NotNull(schemaRepositoryAccessor);
2121

2222
_schemaRepositoryAccessor = schemaRepositoryAccessor;
23-
2423
_nullableSchemaReferenceId = namingPolicy != null ? namingPolicy.ConvertName(PascalCaseNullableSchemaReferenceId) : PascalCaseNullableSchemaReferenceId;
2524
}
2625

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/OpenApiSchemaExtensions.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -6,6 +6,9 @@ internal static class OpenApiSchemaExtensions
66
{
77
public static void ReorderProperties(this OpenApiSchema fullSchemaForResourceObject, IEnumerable<string> propertyNamesInOrder)
88
{
9+
ArgumentGuard.NotNull(fullSchemaForResourceObject);
10+
ArgumentGuard.NotNull(propertyNamesInOrder);
11+
912
var propertiesInOrder = new Dictionary<string, OpenApiSchema>();
1013

1114
foreach (string propertyName in propertyNamesInOrder)

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/ResourceFieldObjectSchemaBuilder.cs

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,6 +74,8 @@ private IDictionary<string, OpenApiSchema> GetFieldSchemas()
7474

7575
public void SetMembersOfAttributesObject(OpenApiSchema fullSchemaForAttributesObject)
7676
{
77+
ArgumentGuard.NotNull(fullSchemaForAttributesObject);
78+
7779
AttrCapabilities requiredCapability = GetRequiredCapabilityForAttributes(_resourceTypeInfo.ResourceObjectOpenType);
7880

7981
foreach ((string fieldName, OpenApiSchema resourceFieldSchema) in _schemasForResourceFields)
@@ -127,6 +129,8 @@ private bool IsFieldRequired(ResourceFieldAttribute field)
127129

128130
public void SetMembersOfRelationshipsObject(OpenApiSchema fullSchemaForRelationshipsObject)
129131
{
132+
ArgumentGuard.NotNull(fullSchemaForRelationshipsObject);
133+
130134
foreach (string fieldName in _schemasForResourceFields.Keys)
131135
{
132136
RelationshipAttribute? matchingRelationship = _resourceTypeInfo.ResourceType.FindRelationshipByPublicName(fieldName);

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/ResourceObjectSchemaGenerator.cs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -31,6 +31,7 @@ public ResourceObjectSchemaGenerator(SchemaGenerator defaultSchemaGenerator, IRe
3131
ArgumentGuard.NotNull(resourceGraph);
3232
ArgumentGuard.NotNull(options);
3333
ArgumentGuard.NotNull(schemaRepositoryAccessor);
34+
ArgumentGuard.NotNull(resourceFieldValidationMetadataProvider);
3435

3536
_defaultSchemaGenerator = defaultSchemaGenerator;
3637
_resourceGraph = resourceGraph;

src/JsonApiDotNetCore.OpenApi/SwaggerComponents/SchemaRepositoryAccessor.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -12,7 +12,7 @@ public SchemaRepository Current
1212
{
1313
if (_schemaRepository == null)
1414
{
15-
throw new InvalidOperationException("SchemaRepository unavailable.");
15+
throw new InvalidOperationException("SchemaRepository is unavailable.");
1616
}
1717

1818
return _schemaRepository;

0 commit comments

Comments
 (0)