Skip to content

Commit e07903c

Browse files
committed
Process review feedback
1 parent 67b39e7 commit e07903c

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

41 files changed

+285
-155
lines changed

Diff for: src/JsonApiDotNetCore.OpenApi/ActionDescriptorExtensions.cs

+2-1
Original file line numberDiff line numberDiff line change
@@ -32,7 +32,8 @@ public static MethodInfo GetActionMethod(this ActionDescriptor descriptor)
3232
ArgumentGuard.NotNull(descriptor, nameof(descriptor));
3333

3434
return (ControllerParameterDescriptor?)descriptor.Parameters.FirstOrDefault(parameterDescriptor =>
35-
// ReSharper disable once ConstantConditionalAccessQualifier Motivation: see https://github.com/dotnet/aspnetcore/issues/32538
35+
// ReSharper disable once ConstantConditionalAccessQualifier
36+
// Justification: see https://github.com/dotnet/aspnetcore/issues/32538
3637
parameterDescriptor.BindingInfo?.BindingSource == BindingSource.Body);
3738
}
3839
}

Diff for: src/JsonApiDotNetCore.OpenApi/DataTypeClass.cs

+10
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,10 @@
1+
namespace JsonApiDotNetCore.OpenApi
2+
{
3+
internal enum DataTypeClass
4+
{
5+
NullableReferenceType,
6+
NonNullableReferenceType,
7+
ValueType,
8+
NullableValueType
9+
}
10+
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiActionDescriptorCollectionProvider.cs

+27-6
Original file line numberDiff line numberDiff line change
@@ -102,16 +102,24 @@ private static void UpdateProducesResponseTypeAttribute(ActionDescriptor endpoin
102102
{
103103
if (ProducesJsonApiResponseBody(endpoint))
104104
{
105-
var producesResponse = endpoint.GetFilterMetadata<ProducesResponseTypeAttribute>()!;
106-
producesResponse.Type = responseTypeToSet;
105+
var producesResponse = endpoint.GetFilterMetadata<ProducesResponseTypeAttribute>();
106+
107+
if (producesResponse != null)
108+
{
109+
producesResponse.Type = responseTypeToSet;
110+
111+
return;
112+
}
107113
}
114+
115+
throw new UnreachableCodeException();
108116
}
109117

110118
private static bool ProducesJsonApiResponseBody(ActionDescriptor endpoint)
111119
{
112-
var produces = endpoint.GetFilterMetadata<ProducesAttribute>()!;
120+
var produces = endpoint.GetFilterMetadata<ProducesAttribute>();
113121

114-
return produces.ContentTypes.Any(contentType => contentType == HeaderConstants.MediaType);
122+
return produces != null && produces.ContentTypes.Any(contentType => contentType == HeaderConstants.MediaType);
115123
}
116124

117125
private static IList<ActionDescriptor> Expand(ActionDescriptor genericEndpoint, ExpansibleEndpointMetadata metadata,
@@ -123,7 +131,13 @@ private static IList<ActionDescriptor> Expand(ActionDescriptor genericEndpoint,
123131
{
124132
ActionDescriptor expandedEndpoint = Clone(genericEndpoint);
125133
RemovePathParameter(expandedEndpoint.Parameters, JsonApiPathParameter.RelationshipName);
126-
ExpandTemplate(expandedEndpoint.AttributeRouteInfo!, relationshipName);
134+
135+
if (expandedEndpoint.AttributeRouteInfo == null)
136+
{
137+
throw new NotSupportedException("Only attribute based routing is supported for JsonApiDotNetCore endpoints");
138+
}
139+
140+
ExpandTemplate(expandedEndpoint.AttributeRouteInfo, relationshipName);
127141

128142
expansionCallback(expandedEndpoint, relationshipType, relationshipName);
129143

@@ -135,7 +149,14 @@ private static IList<ActionDescriptor> Expand(ActionDescriptor genericEndpoint,
135149

136150
private static void UpdateBodyParameterDescriptor(ActionDescriptor endpoint, Type bodyType, string? parameterName = null)
137151
{
138-
ControllerParameterDescriptor requestBodyDescriptor = endpoint.GetBodyParameterDescriptor()!;
152+
ControllerParameterDescriptor? requestBodyDescriptor = endpoint.GetBodyParameterDescriptor();
153+
154+
if (requestBodyDescriptor == null)
155+
{
156+
// ASP.NET model binding picks up on [FromBody] in base classes, so even when it is left out in an override, this should not be reachable.
157+
throw new UnreachableCodeException();
158+
}
159+
139160
requestBodyDescriptor.ParameterType = bodyType;
140161
ParameterInfo replacementParameterInfo = requestBodyDescriptor.ParameterInfo.WithParameterType(bodyType);
141162

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/JsonApiEndpointMetadataContainer.cs

+8-2
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,14 @@ namespace JsonApiDotNetCore.OpenApi.JsonApiMetadata
55
/// </summary>
66
internal sealed class JsonApiEndpointMetadataContainer
77
{
8-
public IJsonApiRequestMetadata? RequestMetadata { get; init; }
8+
public IJsonApiRequestMetadata? RequestMetadata { get; }
99

10-
public IJsonApiResponseMetadata? ResponseMetadata { get; init; }
10+
public IJsonApiResponseMetadata? ResponseMetadata { get; }
11+
12+
public JsonApiEndpointMetadataContainer(IJsonApiRequestMetadata? requestMetadata, IJsonApiResponseMetadata? responseMetadata)
13+
{
14+
RequestMetadata = requestMetadata;
15+
ResponseMetadata = responseMetadata;
16+
}
1117
}
1218
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/JsonApiEndpointMetadataProvider.cs

+8-5
Original file line numberDiff line numberDiff line change
@@ -40,13 +40,16 @@ public JsonApiEndpointMetadataContainer Get(MethodInfo controllerAction)
4040
throw new NotSupportedException($"Unable to provide metadata for non-JsonApiDotNetCore endpoint '{controllerAction.ReflectedType!.FullName}'.");
4141
}
4242

43-
ResourceType primaryResourceType = _controllerResourceMapping.GetResourceTypeForController(controllerAction.ReflectedType)!;
43+
ResourceType? primaryResourceType = _controllerResourceMapping.GetResourceTypeForController(controllerAction.ReflectedType);
4444

45-
return new JsonApiEndpointMetadataContainer
45+
if (primaryResourceType == null)
4646
{
47-
RequestMetadata = GetRequestMetadata(endpoint.Value, primaryResourceType.ClrType),
48-
ResponseMetadata = GetResponseMetadata(endpoint.Value, primaryResourceType.ClrType)
49-
};
47+
throw new UnreachableCodeException();
48+
}
49+
50+
IJsonApiRequestMetadata? requestMetadata = GetRequestMetadata(endpoint.Value, primaryResourceType.ClrType);
51+
IJsonApiResponseMetadata? responseMetadata = GetResponseMetadata(endpoint.Value, primaryResourceType.ClrType);
52+
return new JsonApiEndpointMetadataContainer(requestMetadata, responseMetadata);
5053
}
5154

5255
private IJsonApiRequestMetadata? GetRequestMetadata(JsonApiEndpoint endpoint, Type primaryResourceType)

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/PrimaryRequestMetadata.cs

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ internal sealed class PrimaryRequestMetadata : IJsonApiRequestMetadata
88

99
public PrimaryRequestMetadata(Type type)
1010
{
11+
ArgumentGuard.NotNull(type, nameof(type));
12+
1113
Type = type;
1214
}
1315
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/PrimaryResponseMetadata.cs

+2
Original file line numberDiff line numberDiff line change
@@ -8,6 +8,8 @@ internal sealed class PrimaryResponseMetadata : IJsonApiResponseMetadata
88

99
public PrimaryResponseMetadata(Type type)
1010
{
11+
ArgumentGuard.NotNull(type, nameof(type));
12+
1113
Type = type;
1214
}
1315
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/RelationshipRequestMetadata.cs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ internal sealed class RelationshipRequestMetadata : ExpansibleEndpointMetadata,
99

1010
public RelationshipRequestMetadata(IDictionary<string, Type> requestBodyTypeByRelationshipName)
1111
{
12+
ArgumentGuard.NotNull(requestBodyTypeByRelationshipName, nameof(requestBodyTypeByRelationshipName));
13+
1214
ExpansionElements = requestBodyTypeByRelationshipName;
1315
}
1416
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/RelationshipResponseMetadata.cs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ internal sealed class RelationshipResponseMetadata : ExpansibleEndpointMetadata,
99

1010
public RelationshipResponseMetadata(IDictionary<string, Type> responseTypesByRelationshipName)
1111
{
12+
ArgumentGuard.NotNull(responseTypesByRelationshipName, nameof(responseTypesByRelationshipName));
13+
1214
ExpansionElements = responseTypesByRelationshipName;
1315
}
1416
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiMetadata/SecondaryResponseMetadata.cs

+2
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,8 @@ internal sealed class SecondaryResponseMetadata : ExpansibleEndpointMetadata, IJ
99

1010
public SecondaryResponseMetadata(IDictionary<string, Type> responseTypesByRelationshipName)
1111
{
12+
ArgumentGuard.NotNull(responseTypesByRelationshipName, nameof(responseTypesByRelationshipName));
13+
1214
ExpansionElements = responseTypesByRelationshipName;
1315
}
1416
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/PrimaryResourceResponseDocument.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
66
using JsonApiDotNetCore.Resources;
77

8-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
9-
108
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents
119
{
1210
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
1311
internal sealed class PrimaryResourceResponseDocument<TResource> : SingleData<ResourceResponseObject<TResource>>
1412
where TResource : IIdentifiable
1513
{
16-
public IDictionary<string, object> Meta { get; set; }
14+
public IDictionary<string, object> Meta { get; set; } = null!;
1715

18-
public JsonapiObject Jsonapi { get; set; }
16+
public JsonapiObject Jsonapi { get; set; } = null!;
1917

2018
[Required]
21-
public LinksInResourceDocument Links { get; set; }
19+
public LinksInResourceDocument Links { get; set; } = null!;
2220
}
2321
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceCollectionResponseDocument.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
66
using JsonApiDotNetCore.Resources;
77

8-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
9-
108
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents
119
{
1210
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
1311
internal sealed class ResourceCollectionResponseDocument<TResource> : ManyData<ResourceResponseObject<TResource>>
1412
where TResource : IIdentifiable
1513
{
16-
public IDictionary<string, object> Meta { get; set; }
14+
public IDictionary<string, object> Meta { get; set; } = null!;
1715

18-
public JsonapiObject Jsonapi { get; set; }
16+
public JsonapiObject Jsonapi { get; set; } = null!;
1917

2018
[Required]
21-
public LinksInResourceCollectionDocument Links { get; set; }
19+
public LinksInResourceCollectionDocument Links { get; set; } = null!;
2220
}
2321
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceIdentifierCollectionResponseDocument.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
66
using JsonApiDotNetCore.Resources;
77

8-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
9-
108
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents
119
{
1210
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
1311
internal sealed class ResourceIdentifierCollectionResponseDocument<TResource> : ManyData<ResourceIdentifierObject<TResource>>
1412
where TResource : IIdentifiable
1513
{
16-
public IDictionary<string, object> Meta { get; set; }
14+
public IDictionary<string, object> Meta { get; set; } = null!;
1715

18-
public JsonapiObject Jsonapi { get; set; }
16+
public JsonapiObject Jsonapi { get; set; } = null!;
1917

2018
[Required]
21-
public LinksInResourceIdentifierCollectionDocument Links { get; set; }
19+
public LinksInResourceIdentifierCollectionDocument Links { get; set; } = null!;
2220
}
2321
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceIdentifierResponseDocument.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
66
using JsonApiDotNetCore.Resources;
77

8-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
9-
108
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents
119
{
1210
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
1311
internal sealed class ResourceIdentifierResponseDocument<TResource> : SingleData<ResourceIdentifierObject<TResource>>
1412
where TResource : IIdentifiable
1513
{
16-
public IDictionary<string, object> Meta { get; set; }
14+
public IDictionary<string, object> Meta { get; set; } = null!;
1715

18-
public JsonapiObject Jsonapi { get; set; }
16+
public JsonapiObject Jsonapi { get; set; } = null!;
1917

2018
[Required]
21-
public LinksInResourceIdentifierDocument Links { get; set; }
19+
public LinksInResourceIdentifierDocument Links { get; set; } = null!;
2220
}
2321
}

Diff for: src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/SecondaryResourceResponseDocument.cs

+3-5
Original file line numberDiff line numberDiff line change
@@ -5,19 +5,17 @@
55
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
66
using JsonApiDotNetCore.Resources;
77

8-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
9-
108
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents
119
{
1210
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
1311
internal sealed class SecondaryResourceResponseDocument<TResource> : SingleData<ResourceResponseObject<TResource>>
1412
where TResource : IIdentifiable
1513
{
16-
public IDictionary<string, object> Meta { get; set; }
14+
public IDictionary<string, object> Meta { get; set; } = null!;
1715

18-
public JsonapiObject Jsonapi { get; set; }
16+
public JsonapiObject Jsonapi { get; set; } = null!;
1917

2018
[Required]
21-
public LinksInResourceDocument Links { get; set; }
19+
public LinksInResourceDocument Links { get; set; } = null!;
2220
}
2321
}
Original file line numberDiff line numberDiff line change
@@ -1,19 +1,17 @@
11
using System.Collections.Generic;
22
using JetBrains.Annotations;
33

4-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
5-
64
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects
75
{
86
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
97
internal sealed class JsonapiObject
108
{
11-
public string Version { get; set; }
9+
public string Version { get; set; } = null!;
1210

13-
public ICollection<string> Ext { get; set; }
11+
public ICollection<string> Ext { get; set; } = null!;
1412

15-
public ICollection<string> Profile { get; set; }
13+
public ICollection<string> Profile { get; set; } = null!;
1614

17-
public IDictionary<string, object> Meta { get; set; }
15+
public IDictionary<string, object> Meta { get; set; } = null!;
1816
}
1917
}
Original file line numberDiff line numberDiff line change
@@ -1,17 +1,15 @@
11
using System.ComponentModel.DataAnnotations;
22
using JetBrains.Annotations;
33

4-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
5-
64
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Links
75
{
86
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
97
internal sealed class LinksInRelationshipObject
108
{
119
[Required]
12-
public string Self { get; set; }
10+
public string Self { get; set; } = null!;
1311

1412
[Required]
15-
public string Related { get; set; }
13+
public string Related { get; set; } = null!;
1614
}
1715
}
Original file line numberDiff line numberDiff line change
@@ -1,25 +1,23 @@
11
using System.ComponentModel.DataAnnotations;
22
using JetBrains.Annotations;
33

4-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
5-
64
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Links
75
{
86
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
97
internal sealed class LinksInResourceCollectionDocument
108
{
119
[Required]
12-
public string Self { get; set; }
10+
public string Self { get; set; } = null!;
1311

14-
public string Describedby { get; set; }
12+
public string Describedby { get; set; } = null!;
1513

1614
[Required]
17-
public string First { get; set; }
15+
public string First { get; set; } = null!;
1816

19-
public string Last { get; set; }
17+
public string Last { get; set; } = null!;
2018

21-
public string Prev { get; set; }
19+
public string Prev { get; set; } = null!;
2220

23-
public string Next { get; set; }
21+
public string Next { get; set; } = null!;
2422
}
2523
}
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,14 @@
11
using System.ComponentModel.DataAnnotations;
22
using JetBrains.Annotations;
33

4-
#pragma warning disable 8618 // Non-nullable member is uninitialized.
5-
64
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Links
75
{
86
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
97
internal sealed class LinksInResourceDocument
108
{
119
[Required]
12-
public string Self { get; set; }
10+
public string Self { get; set; } = null!;
1311

14-
public string Describedby { get; set; }
12+
public string Describedby { get; set; } = null!;
1513
}
1614
}

0 commit comments

Comments
 (0)