From 6fec2550fc3a9c726ed215bc575f596ffc60791d Mon Sep 17 00:00:00 2001 From: Bart Koelman <10324372+bkoelman@users.noreply.github.com> Date: Sat, 16 Mar 2024 14:05:23 +0100 Subject: [PATCH] Remove unneeded [FromBody] from overridden controller methods, add [Required] so OpenAPI can determine whether parameters are required --- .../Controllers/BaseJsonApiController.cs | 23 ++++++++++--------- .../BaseJsonApiOperationsController.cs | 4 +++- .../Controllers/JsonApiController.cs | 8 +++---- .../JsonApiOperationsController.cs | 2 +- .../ObfuscatedIdentifiableController.cs | 11 +++++---- 5 files changed, 26 insertions(+), 22 deletions(-) diff --git a/src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs b/src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs index fb3cd2bd2d..1d518c6194 100644 --- a/src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs +++ b/src/JsonApiDotNetCore/Controllers/BaseJsonApiController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Errors; using JsonApiDotNetCore.Middleware; @@ -106,7 +107,7 @@ public virtual async Task GetAsync(CancellationToken cancellation /// GET /articles/1 HTTP/1.1 /// ]]> /// - public virtual async Task GetAsync(TId id, CancellationToken cancellationToken) + public virtual async Task GetAsync([Required] TId id, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -131,7 +132,7 @@ public virtual async Task GetAsync(TId id, CancellationToken canc /// GET /articles/1/revisions HTTP/1.1 /// ]]> /// - public virtual async Task GetSecondaryAsync(TId id, string relationshipName, CancellationToken cancellationToken) + public virtual async Task GetSecondaryAsync([Required] TId id, [Required] string relationshipName, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -160,7 +161,7 @@ public virtual async Task GetSecondaryAsync(TId id, string relati /// GET /articles/1/relationships/revisions HTTP/1.1 /// ]]> /// - public virtual async Task GetRelationshipAsync(TId id, string relationshipName, CancellationToken cancellationToken) + public virtual async Task GetRelationshipAsync([Required] TId id, [Required] string relationshipName, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -185,7 +186,7 @@ public virtual async Task GetRelationshipAsync(TId id, string rel /// POST /articles HTTP/1.1 /// ]]> /// - public virtual async Task PostAsync([FromBody] TResource resource, CancellationToken cancellationToken) + public virtual async Task PostAsync([FromBody] [Required] TResource resource, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -235,8 +236,8 @@ public virtual async Task PostAsync([FromBody] TResource resource /// /// Propagates notification that request handling should be canceled. /// - public virtual async Task PostRelationshipAsync(TId id, string relationshipName, [FromBody] ISet rightResourceIds, - CancellationToken cancellationToken) + public virtual async Task PostRelationshipAsync([Required] TId id, [Required] string relationshipName, + [FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -264,7 +265,7 @@ public virtual async Task PostRelationshipAsync(TId id, string re /// PATCH /articles/1 HTTP/1.1 /// ]]> /// - public virtual async Task PatchAsync(TId id, [FromBody] TResource resource, CancellationToken cancellationToken) + public virtual async Task PatchAsync([Required] TId id, [FromBody] [Required] TResource resource, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -310,7 +311,7 @@ public virtual async Task PatchAsync(TId id, [FromBody] TResource /// /// Propagates notification that request handling should be canceled. /// - public virtual async Task PatchRelationshipAsync(TId id, string relationshipName, [FromBody] object? rightValue, + public virtual async Task PatchRelationshipAsync([Required] TId id, [Required] string relationshipName, [FromBody] object? rightValue, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new @@ -337,7 +338,7 @@ public virtual async Task PatchRelationshipAsync(TId id, string r /// DELETE /articles/1 HTTP/1.1 /// ]]> /// - public virtual async Task DeleteAsync(TId id, CancellationToken cancellationToken) + public virtual async Task DeleteAsync([Required] TId id, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { @@ -371,8 +372,8 @@ public virtual async Task DeleteAsync(TId id, CancellationToken c /// /// Propagates notification that request handling should be canceled. /// - public virtual async Task DeleteRelationshipAsync(TId id, string relationshipName, [FromBody] ISet rightResourceIds, - CancellationToken cancellationToken) + public virtual async Task DeleteRelationshipAsync([Required] TId id, [Required] string relationshipName, + [FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { diff --git a/src/JsonApiDotNetCore/Controllers/BaseJsonApiOperationsController.cs b/src/JsonApiDotNetCore/Controllers/BaseJsonApiOperationsController.cs index 596b22794d..f16a2a6686 100644 --- a/src/JsonApiDotNetCore/Controllers/BaseJsonApiOperationsController.cs +++ b/src/JsonApiDotNetCore/Controllers/BaseJsonApiOperationsController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using JetBrains.Annotations; using JsonApiDotNetCore.AtomicOperations; using JsonApiDotNetCore.Configuration; @@ -102,7 +103,8 @@ protected BaseJsonApiOperationsController(IJsonApiOptions options, IResourceGrap /// } /// ]]> /// - public virtual async Task PostOperationsAsync([FromBody] IList operations, CancellationToken cancellationToken) + public virtual async Task PostOperationsAsync([FromBody] [Required] IList operations, + CancellationToken cancellationToken) { _traceWriter.LogMethodStart(new { diff --git a/src/JsonApiDotNetCore/Controllers/JsonApiController.cs b/src/JsonApiDotNetCore/Controllers/JsonApiController.cs index 19c679404f..82719bfeac 100644 --- a/src/JsonApiDotNetCore/Controllers/JsonApiController.cs +++ b/src/JsonApiDotNetCore/Controllers/JsonApiController.cs @@ -72,14 +72,14 @@ public override Task GetRelationshipAsync(TId id, string relation /// [HttpPost] - public override Task PostAsync([FromBody] TResource resource, CancellationToken cancellationToken) + public override Task PostAsync(TResource resource, CancellationToken cancellationToken) { return base.PostAsync(resource, cancellationToken); } /// [HttpPost("{id}/relationships/{relationshipName}")] - public override Task PostRelationshipAsync(TId id, string relationshipName, [FromBody] ISet rightResourceIds, + public override Task PostRelationshipAsync(TId id, string relationshipName, ISet rightResourceIds, CancellationToken cancellationToken) { return base.PostRelationshipAsync(id, relationshipName, rightResourceIds, cancellationToken); @@ -87,7 +87,7 @@ public override Task PostRelationshipAsync(TId id, string relatio /// [HttpPatch("{id}")] - public override Task PatchAsync(TId id, [FromBody] TResource resource, CancellationToken cancellationToken) + public override Task PatchAsync(TId id, TResource resource, CancellationToken cancellationToken) { return base.PatchAsync(id, resource, cancellationToken); } @@ -109,7 +109,7 @@ public override Task DeleteAsync(TId id, CancellationToken cancel /// [HttpDelete("{id}/relationships/{relationshipName}")] - public override Task DeleteRelationshipAsync(TId id, string relationshipName, [FromBody] ISet rightResourceIds, + public override Task DeleteRelationshipAsync(TId id, string relationshipName, ISet rightResourceIds, CancellationToken cancellationToken) { return base.DeleteRelationshipAsync(id, relationshipName, rightResourceIds, cancellationToken); diff --git a/src/JsonApiDotNetCore/Controllers/JsonApiOperationsController.cs b/src/JsonApiDotNetCore/Controllers/JsonApiOperationsController.cs index 43f75896a0..bacb5b9342 100644 --- a/src/JsonApiDotNetCore/Controllers/JsonApiOperationsController.cs +++ b/src/JsonApiDotNetCore/Controllers/JsonApiOperationsController.cs @@ -17,7 +17,7 @@ public abstract class JsonApiOperationsController( { /// [HttpPost] - public override Task PostOperationsAsync([FromBody] IList operations, CancellationToken cancellationToken) + public override Task PostOperationsAsync(IList operations, CancellationToken cancellationToken) { return base.PostOperationsAsync(operations, cancellationToken); } diff --git a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs index 4f8c5af49b..46391aab7c 100644 --- a/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs +++ b/test/JsonApiDotNetCoreTests/IntegrationTests/IdObfuscation/ObfuscatedIdentifiableController.cs @@ -1,3 +1,4 @@ +using System.ComponentModel.DataAnnotations; using JsonApiDotNetCore.Configuration; using JsonApiDotNetCore.Controllers; using JsonApiDotNetCore.Resources; @@ -42,13 +43,13 @@ public Task GetRelationshipAsync(string id, string relationshipNa } [HttpPost] - public override Task PostAsync([FromBody] TResource resource, CancellationToken cancellationToken) + public override Task PostAsync([FromBody] [Required] TResource resource, CancellationToken cancellationToken) { return base.PostAsync(resource, cancellationToken); } [HttpPost("{id}/relationships/{relationshipName}")] - public Task PostRelationshipAsync(string id, string relationshipName, [FromBody] ISet rightResourceIds, + public Task PostRelationshipAsync(string id, string relationshipName, [FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken) { int idValue = _codec.Decode(id); @@ -56,14 +57,14 @@ public Task PostRelationshipAsync(string id, string relationshipN } [HttpPatch("{id}")] - public Task PatchAsync(string id, [FromBody] TResource resource, CancellationToken cancellationToken) + public Task PatchAsync(string id, [FromBody] [Required] TResource resource, CancellationToken cancellationToken) { int idValue = _codec.Decode(id); return base.PatchAsync(idValue, resource, cancellationToken); } [HttpPatch("{id}/relationships/{relationshipName}")] - public Task PatchRelationshipAsync(string id, string relationshipName, [FromBody] object rightValue, CancellationToken cancellationToken) + public Task PatchRelationshipAsync(string id, string relationshipName, [FromBody] object? rightValue, CancellationToken cancellationToken) { int idValue = _codec.Decode(id); return base.PatchRelationshipAsync(idValue, relationshipName, rightValue, cancellationToken); @@ -77,7 +78,7 @@ public Task DeleteAsync(string id, CancellationToken cancellation } [HttpDelete("{id}/relationships/{relationshipName}")] - public Task DeleteRelationshipAsync(string id, string relationshipName, [FromBody] ISet rightResourceIds, + public Task DeleteRelationshipAsync(string id, string relationshipName, [FromBody] [Required] ISet rightResourceIds, CancellationToken cancellationToken) { int idValue = _codec.Decode(id);