Skip to content

Commit 1ec31d2

Browse files
committed
Declare Data properties as members instead of via base type
1 parent 1bdee8b commit 1ec31d2

24 files changed

+140
-155
lines changed

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/NullableResourceIdentifierResponseDocument.cs

Lines changed: 6 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -7,10 +7,10 @@
77

88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

10-
// Types in the current namespace are never touched by ASP.NET ModelState validation, therefore using a non-nullable reference type for a property does not
10+
// Types in the JsonApiObjects namespace are never touched by ASP.NET ModelState validation, therefore using a non-nullable reference type for a property does not
1111
// imply this property is required. Instead, we use [Required] explicitly, because this is how Swashbuckle is instructed to mark properties as required.
1212
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
13-
internal sealed class NullableResourceIdentifierResponseDocument<TResource> : NullableSingleData<ResourceIdentifier<TResource>>
13+
internal sealed class NullableResourceIdentifierResponseDocument<TResource>
1414
where TResource : IIdentifiable
1515
{
1616
[JsonPropertyName("jsonapi")]
@@ -20,6 +20,10 @@ internal sealed class NullableResourceIdentifierResponseDocument<TResource> : Nu
2020
[JsonPropertyName("links")]
2121
public ResourceIdentifierTopLevelLinks Links { get; set; } = null!;
2222

23+
[Required]
24+
[JsonPropertyName("data")]
25+
public ResourceIdentifier<TResource>? Data { get; set; }
26+
2327
[JsonPropertyName("meta")]
2428
public IDictionary<string, object> Meta { get; set; } = null!;
2529
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/NullableSecondaryResourceResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class NullableSecondaryResourceResponseDocument<TResource> : NullableSingleData<ResourceDataInResponse<TResource>>
11+
internal sealed class NullableSecondaryResourceResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class NullableSecondaryResourceResponseDocument<TResource> : Nul
1818
[JsonPropertyName("links")]
1919
public ResourceTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ResourceDataInResponse<TResource>? Data { get; set; }
24+
2125
[JsonPropertyName("included")]
2226
public IList<ResourceData> Included { get; set; } = null!;
2327

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/PrimaryResourceResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class PrimaryResourceResponseDocument<TResource> : SingleData<ResourceDataInResponse<TResource>>
11+
internal sealed class PrimaryResourceResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class PrimaryResourceResponseDocument<TResource> : SingleData<Re
1818
[JsonPropertyName("links")]
1919
public ResourceTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ResourceDataInResponse<TResource> Data { get; set; } = null!;
24+
2125
[JsonPropertyName("included")]
2226
public IList<ResourceData> Included { get; set; } = null!;
2327

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceCollectionResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class ResourceCollectionResponseDocument<TResource> : ManyData<ResourceDataInResponse<TResource>>
11+
internal sealed class ResourceCollectionResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class ResourceCollectionResponseDocument<TResource> : ManyData<R
1818
[JsonPropertyName("links")]
1919
public ResourceCollectionTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ICollection<ResourceDataInResponse<TResource>> Data { get; set; } = null!;
24+
2125
[JsonPropertyName("included")]
2226
public IList<ResourceData> Included { get; set; } = null!;
2327

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceIdentifierCollectionResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class ResourceIdentifierCollectionResponseDocument<TResource> : ManyData<ResourceIdentifier<TResource>>
11+
internal sealed class ResourceIdentifierCollectionResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class ResourceIdentifierCollectionResponseDocument<TResource> :
1818
[JsonPropertyName("links")]
1919
public ResourceIdentifierCollectionTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ICollection<ResourceIdentifier<TResource>> Data { get; set; } = null!;
24+
2125
[JsonPropertyName("meta")]
2226
public IDictionary<string, object> Meta { get; set; } = null!;
2327
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/ResourceIdentifierResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class ResourceIdentifierResponseDocument<TResource> : SingleData<ResourceIdentifier<TResource>>
11+
internal sealed class ResourceIdentifierResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class ResourceIdentifierResponseDocument<TResource> : SingleData
1818
[JsonPropertyName("links")]
1919
public ResourceIdentifierTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ResourceIdentifier<TResource> Data { get; set; } = null!;
24+
2125
[JsonPropertyName("meta")]
2226
public IDictionary<string, object> Meta { get; set; } = null!;
2327
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.Json.Serialization;
13
using JetBrains.Annotations;
24
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
35
using JsonApiDotNetCore.Resources;
46

57
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8-
internal sealed class ResourcePatchRequestDocument<TResource> : SingleData<ResourceDataInPatchRequest<TResource>>
9-
where TResource : IIdentifiable;
10+
internal sealed class ResourcePatchRequestDocument<TResource>
11+
where TResource : IIdentifiable
12+
{
13+
[Required]
14+
[JsonPropertyName("data")]
15+
public ResourceDataInPatchRequest<TResource> Data { get; set; } = null!;
16+
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.Json.Serialization;
13
using JetBrains.Annotations;
24
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
35
using JsonApiDotNetCore.Resources;
46

57
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8-
internal sealed class ResourcePostRequestDocument<TResource> : SingleData<ResourceDataInPostRequest<TResource>>
9-
where TResource : IIdentifiable;
10+
internal sealed class ResourcePostRequestDocument<TResource>
11+
where TResource : IIdentifiable
12+
{
13+
[Required]
14+
[JsonPropertyName("data")]
15+
public ResourceDataInPostRequest<TResource> Data { get; set; } = null!;
16+
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Documents/SecondaryResourceResponseDocument.cs

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,7 @@
88
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Documents;
99

1010
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
11-
internal sealed class SecondaryResourceResponseDocument<TResource> : SingleData<ResourceDataInResponse<TResource>>
11+
internal sealed class SecondaryResourceResponseDocument<TResource>
1212
where TResource : IIdentifiable
1313
{
1414
[JsonPropertyName("jsonapi")]
@@ -18,6 +18,10 @@ internal sealed class SecondaryResourceResponseDocument<TResource> : SingleData<
1818
[JsonPropertyName("links")]
1919
public ResourceTopLevelLinks Links { get; set; } = null!;
2020

21+
[Required]
22+
[JsonPropertyName("data")]
23+
public ResourceDataInResponse<TResource> Data { get; set; } = null!;
24+
2125
[JsonPropertyName("included")]
2226
public IList<ResourceData> Included { get; set; } = null!;
2327

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/ManyData.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/NullableSingleData.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.Json.Serialization;
13
using JetBrains.Annotations;
24
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
35
using JsonApiDotNetCore.Resources;
46

57
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8-
internal sealed class NullableToOneRelationshipInRequest<TResource> : NullableSingleData<ResourceIdentifier<TResource>>
9-
where TResource : IIdentifiable;
10+
internal sealed class NullableToOneRelationshipInRequest<TResource>
11+
where TResource : IIdentifiable
12+
{
13+
[Required]
14+
[JsonPropertyName("data")]
15+
public ResourceIdentifier<TResource>? Data { get; set; }
16+
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Relationships/NullableToOneRelationshipInResponse.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using System.Text.Json.Serialization;
23
using JetBrains.Annotations;
34
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Links;
@@ -7,13 +8,17 @@
78
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
89

910
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
10-
internal sealed class NullableToOneRelationshipInResponse<TResource> : NullableSingleData<ResourceIdentifier<TResource>>
11+
internal sealed class NullableToOneRelationshipInResponse<TResource>
1112
where TResource : IIdentifiable
1213
{
1314
// Non-required because the related controller may be unavailable when used in an include.
1415
[JsonPropertyName("links")]
1516
public RelationshipLinks Links { get; set; } = null!;
1617

18+
[Required]
19+
[JsonPropertyName("data")]
20+
public ResourceIdentifier<TResource>? Data { get; set; }
21+
1722
[JsonPropertyName("meta")]
1823
public IDictionary<string, object> Meta { get; set; } = null!;
1924
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.Json.Serialization;
13
using JetBrains.Annotations;
24
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
35
using JsonApiDotNetCore.Resources;
46

57
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8-
internal sealed class ToManyRelationshipInRequest<TResource> : ManyData<ResourceIdentifier<TResource>>
9-
where TResource : IIdentifiable;
10+
internal sealed class ToManyRelationshipInRequest<TResource>
11+
where TResource : IIdentifiable
12+
{
13+
[Required]
14+
[JsonPropertyName("data")]
15+
public ICollection<ResourceIdentifier<TResource>> Data { get; set; } = null!;
16+
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Relationships/ToManyRelationshipInResponse.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using System.Text.Json.Serialization;
23
using JetBrains.Annotations;
34
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Links;
@@ -7,13 +8,17 @@
78
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
89

910
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
10-
internal sealed class ToManyRelationshipInResponse<TResource> : ManyData<ResourceIdentifier<TResource>>
11+
internal sealed class ToManyRelationshipInResponse<TResource>
1112
where TResource : IIdentifiable
1213
{
1314
// Non-required because the related controller may be unavailable when used in an include.
1415
[JsonPropertyName("links")]
1516
public RelationshipLinks Links { get; set; } = null!;
1617

18+
[Required]
19+
[JsonPropertyName("data")]
20+
public ICollection<ResourceIdentifier<TResource>> Data { get; set; } = null!;
21+
1722
[JsonPropertyName("meta")]
1823
public IDictionary<string, object> Meta { get; set; } = null!;
1924
}
Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,16 @@
1+
using System.ComponentModel.DataAnnotations;
2+
using System.Text.Json.Serialization;
13
using JetBrains.Annotations;
24
using JsonApiDotNetCore.OpenApi.JsonApiObjects.ResourceObjects;
35
using JsonApiDotNetCore.Resources;
46

57
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
68

79
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
8-
internal sealed class ToOneRelationshipInRequest<TResource> : SingleData<ResourceIdentifier<TResource>>
9-
where TResource : IIdentifiable;
10+
internal sealed class ToOneRelationshipInRequest<TResource>
11+
where TResource : IIdentifiable
12+
{
13+
[Required]
14+
[JsonPropertyName("data")]
15+
public ResourceIdentifier<TResource> Data { get; set; } = null!;
16+
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/Relationships/ToOneRelationshipInResponse.cs

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using System.Text.Json.Serialization;
23
using JetBrains.Annotations;
34
using JsonApiDotNetCore.OpenApi.JsonApiObjects.Links;
@@ -7,13 +8,17 @@
78
namespace JsonApiDotNetCore.OpenApi.JsonApiObjects.Relationships;
89

910
[UsedImplicitly(ImplicitUseTargetFlags.Members)]
10-
internal sealed class ToOneRelationshipInResponse<TResource> : SingleData<ResourceIdentifier<TResource>>
11+
internal sealed class ToOneRelationshipInResponse<TResource>
1112
where TResource : IIdentifiable
1213
{
1314
// Non-required because the related controller may be unavailable when used in an include.
1415
[JsonPropertyName("links")]
1516
public RelationshipLinks Links { get; set; } = null!;
1617

18+
[Required]
19+
[JsonPropertyName("data")]
20+
public ResourceIdentifier<TResource> Data { get; set; } = null!;
21+
1722
[JsonPropertyName("meta")]
1823
public IDictionary<string, object> Meta { get; set; } = null!;
1924
}

src/JsonApiDotNetCore.OpenApi/JsonApiObjects/SingleData.cs

Lines changed: 0 additions & 15 deletions
This file was deleted.

src/JsonApiDotNetCore.OpenApi/JsonApiPropertyName.cs

Lines changed: 0 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,5 @@ internal static class JsonApiPropertyName
1111
public const string Id = "id";
1212
public const string Attributes = "attributes";
1313
public const string Relationships = "relationships";
14-
public const string Errors = "errors";
15-
public const string Included = "included";
1614
public const string Meta = "meta";
1715
}

src/JsonApiDotNetCore.OpenApi/OpenApiSchemaExtensions.cs

Lines changed: 0 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -4,29 +4,6 @@ namespace JsonApiDotNetCore.OpenApi;
44

55
internal static class OpenApiSchemaExtensions
66
{
7-
public static void ReorderProperties(this OpenApiSchema fullSchema, IEnumerable<string> propertyNamesInOrder)
8-
{
9-
ArgumentGuard.NotNull(fullSchema);
10-
ArgumentGuard.NotNull(propertyNamesInOrder);
11-
12-
var propertiesInOrder = new Dictionary<string, OpenApiSchema>();
13-
14-
foreach (string propertyName in propertyNamesInOrder)
15-
{
16-
if (fullSchema.Properties.TryGetValue(propertyName, out OpenApiSchema? schema))
17-
{
18-
propertiesInOrder.Add(propertyName, schema);
19-
}
20-
}
21-
22-
if (fullSchema.Properties.Count != propertiesInOrder.Count)
23-
{
24-
throw new UnreachableCodeException();
25-
}
26-
27-
fullSchema.Properties = propertiesInOrder;
28-
}
29-
307
public static OpenApiSchema UnwrapExtendedReferenceSchema(this OpenApiSchema source)
318
{
329
ArgumentGuard.NotNull(source);

0 commit comments

Comments
 (0)