Skip to content

Commit 17db888

Browse files
committed
Remove unneeded [FromBody] from overridden controller methods, add [Required] so OpenAPI can determine whether parameters are required
1 parent a74a3eb commit 17db888

File tree

5 files changed

+20
-16
lines changed

5 files changed

+20
-16
lines changed

src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using JsonApiDotNetCore.Configuration;
23
using JsonApiDotNetCore.Errors;
34
using JsonApiDotNetCore.Middleware;
@@ -185,7 +186,7 @@ public virtual async Task<IActionResult> GetRelationshipAsync(TId id, string rel
185186
/// POST /articles HTTP/1.1
186187
/// ]]></code>
187188
/// </summary>
188-
public virtual async Task<IActionResult> PostAsync([FromBody] TResource resource, CancellationToken cancellationToken)
189+
public virtual async Task<IActionResult> PostAsync([FromBody] [Required] TResource resource, CancellationToken cancellationToken)
189190
{
190191
_traceWriter.LogMethodStart(new
191192
{
@@ -235,7 +236,7 @@ public virtual async Task<IActionResult> PostAsync([FromBody] TResource resource
235236
/// <param name="cancellationToken">
236237
/// Propagates notification that request handling should be canceled.
237238
/// </param>
238-
public virtual async Task<IActionResult> PostRelationshipAsync(TId id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
239+
public virtual async Task<IActionResult> PostRelationshipAsync(TId id, string relationshipName, [FromBody] [Required] ISet<IIdentifiable> rightResourceIds,
239240
CancellationToken cancellationToken)
240241
{
241242
_traceWriter.LogMethodStart(new
@@ -264,7 +265,7 @@ public virtual async Task<IActionResult> PostRelationshipAsync(TId id, string re
264265
/// PATCH /articles/1 HTTP/1.1
265266
/// ]]></code>
266267
/// </summary>
267-
public virtual async Task<IActionResult> PatchAsync(TId id, [FromBody] TResource resource, CancellationToken cancellationToken)
268+
public virtual async Task<IActionResult> PatchAsync(TId id, [FromBody] [Required] TResource resource, CancellationToken cancellationToken)
268269
{
269270
_traceWriter.LogMethodStart(new
270271
{
@@ -371,8 +372,8 @@ public virtual async Task<IActionResult> DeleteAsync(TId id, CancellationToken c
371372
/// <param name="cancellationToken">
372373
/// Propagates notification that request handling should be canceled.
373374
/// </param>
374-
public virtual async Task<IActionResult> DeleteRelationshipAsync(TId id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
375-
CancellationToken cancellationToken)
375+
public virtual async Task<IActionResult> DeleteRelationshipAsync(TId id, string relationshipName,
376+
[FromBody] [Required] ISet<IIdentifiable> rightResourceIds, CancellationToken cancellationToken)
376377
{
377378
_traceWriter.LogMethodStart(new
378379
{

src/JsonApiDotNetCore/Controllers/BaseJsonApiOperationsController.cs

+3-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using JetBrains.Annotations;
23
using JsonApiDotNetCore.AtomicOperations;
34
using JsonApiDotNetCore.Configuration;
@@ -102,7 +103,8 @@ protected BaseJsonApiOperationsController(IJsonApiOptions options, IResourceGrap
102103
/// }
103104
/// ]]></code>
104105
/// </example>
105-
public virtual async Task<IActionResult> PostOperationsAsync([FromBody] IList<OperationContainer> operations, CancellationToken cancellationToken)
106+
public virtual async Task<IActionResult> PostOperationsAsync([FromBody] [Required] IList<OperationContainer> operations,
107+
CancellationToken cancellationToken)
106108
{
107109
_traceWriter.LogMethodStart(new
108110
{

src/JsonApiDotNetCore/Controllers/JsonApiController.cs

+4-4
Original file line numberDiff line numberDiff line change
@@ -72,22 +72,22 @@ public override Task<IActionResult> GetRelationshipAsync(TId id, string relation
7272

7373
/// <inheritdoc />
7474
[HttpPost]
75-
public override Task<IActionResult> PostAsync([FromBody] TResource resource, CancellationToken cancellationToken)
75+
public override Task<IActionResult> PostAsync(TResource resource, CancellationToken cancellationToken)
7676
{
7777
return base.PostAsync(resource, cancellationToken);
7878
}
7979

8080
/// <inheritdoc />
8181
[HttpPost("{id}/relationships/{relationshipName}")]
82-
public override Task<IActionResult> PostRelationshipAsync(TId id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
82+
public override Task<IActionResult> PostRelationshipAsync(TId id, string relationshipName, ISet<IIdentifiable> rightResourceIds,
8383
CancellationToken cancellationToken)
8484
{
8585
return base.PostRelationshipAsync(id, relationshipName, rightResourceIds, cancellationToken);
8686
}
8787

8888
/// <inheritdoc />
8989
[HttpPatch("{id}")]
90-
public override Task<IActionResult> PatchAsync(TId id, [FromBody] TResource resource, CancellationToken cancellationToken)
90+
public override Task<IActionResult> PatchAsync(TId id, TResource resource, CancellationToken cancellationToken)
9191
{
9292
return base.PatchAsync(id, resource, cancellationToken);
9393
}
@@ -109,7 +109,7 @@ public override Task<IActionResult> DeleteAsync(TId id, CancellationToken cancel
109109

110110
/// <inheritdoc />
111111
[HttpDelete("{id}/relationships/{relationshipName}")]
112-
public override Task<IActionResult> DeleteRelationshipAsync(TId id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
112+
public override Task<IActionResult> DeleteRelationshipAsync(TId id, string relationshipName, ISet<IIdentifiable> rightResourceIds,
113113
CancellationToken cancellationToken)
114114
{
115115
return base.DeleteRelationshipAsync(id, relationshipName, rightResourceIds, cancellationToken);

src/JsonApiDotNetCore/Controllers/JsonApiOperationsController.cs

+1-1
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public abstract class JsonApiOperationsController(
1717
{
1818
/// <inheritdoc />
1919
[HttpPost]
20-
public override Task<IActionResult> PostOperationsAsync([FromBody] IList<OperationContainer> operations, CancellationToken cancellationToken)
20+
public override Task<IActionResult> PostOperationsAsync(IList<OperationContainer> operations, CancellationToken cancellationToken)
2121
{
2222
return base.PostOperationsAsync(operations, cancellationToken);
2323
}

test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs

+6-5
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
1+
using System.ComponentModel.DataAnnotations;
12
using JsonApiDotNetCore.Configuration;
23
using JsonApiDotNetCore.Controllers;
34
using JsonApiDotNetCore.Resources;
@@ -42,28 +43,28 @@ public Task<IActionResult> GetRelationshipAsync(string id, string relationshipNa
4243
}
4344

4445
[HttpPost]
45-
public override Task<IActionResult> PostAsync([FromBody] TResource resource, CancellationToken cancellationToken)
46+
public override Task<IActionResult> PostAsync([FromBody] [Required] TResource resource, CancellationToken cancellationToken)
4647
{
4748
return base.PostAsync(resource, cancellationToken);
4849
}
4950

5051
[HttpPost("{id}/relationships/{relationshipName}")]
51-
public Task<IActionResult> PostRelationshipAsync(string id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
52+
public Task<IActionResult> PostRelationshipAsync(string id, string relationshipName, [FromBody] [Required] ISet<IIdentifiable> rightResourceIds,
5253
CancellationToken cancellationToken)
5354
{
5455
int idValue = _codec.Decode(id);
5556
return base.PostRelationshipAsync(idValue, relationshipName, rightResourceIds, cancellationToken);
5657
}
5758

5859
[HttpPatch("{id}")]
59-
public Task<IActionResult> PatchAsync(string id, [FromBody] TResource resource, CancellationToken cancellationToken)
60+
public Task<IActionResult> PatchAsync(string id, [FromBody] [Required] TResource resource, CancellationToken cancellationToken)
6061
{
6162
int idValue = _codec.Decode(id);
6263
return base.PatchAsync(idValue, resource, cancellationToken);
6364
}
6465

6566
[HttpPatch("{id}/relationships/{relationshipName}")]
66-
public Task<IActionResult> PatchRelationshipAsync(string id, string relationshipName, [FromBody] object rightValue, CancellationToken cancellationToken)
67+
public Task<IActionResult> PatchRelationshipAsync(string id, string relationshipName, [FromBody] object? rightValue, CancellationToken cancellationToken)
6768
{
6869
int idValue = _codec.Decode(id);
6970
return base.PatchRelationshipAsync(idValue, relationshipName, rightValue, cancellationToken);
@@ -77,7 +78,7 @@ public Task<IActionResult> DeleteAsync(string id, CancellationToken cancellation
7778
}
7879

7980
[HttpDelete("{id}/relationships/{relationshipName}")]
80-
public Task<IActionResult> DeleteRelationshipAsync(string id, string relationshipName, [FromBody] ISet<IIdentifiable> rightResourceIds,
81+
public Task<IActionResult> DeleteRelationshipAsync(string id, string relationshipName, [FromBody] [Required] ISet<IIdentifiable> rightResourceIds,
8182
CancellationToken cancellationToken)
8283
{
8384
int idValue = _codec.Decode(id);

0 commit comments

Comments
 (0)