From 72a6401c3621b7de0d4a83873689a7bfa347f672 Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 2 Oct 2024 13:46:06 +0300 Subject: [PATCH 1/4] Determine whether all action params are nullable Sets requestBody required property based on this evaluation. If all parameters are nullable, it sets the required value to false, otherwise it sets it to true --- .../Generator/OpenApiRequestBodyGenerator.cs | 6 ++++-- 1 file changed, 4 insertions(+), 2 deletions(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs index 04418da50..686ae78c7 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs @@ -66,15 +66,17 @@ public static OpenApiRequestBody CreateRequestBody(this ODataContext context, IE Properties = new Dictionary() }; + bool allParamsNullable = true; foreach (var parameter in action.Parameters.Skip(skip)) { + allParamsNullable = parameter.Type.IsNullable; parametersSchema.Properties.Add(parameter.Name, context.CreateEdmTypeSchema(parameter.Type)); } - OpenApiRequestBody requestBody = new OpenApiRequestBody + OpenApiRequestBody requestBody = new() { Description = "Action parameters", - Required = true, + Required = !allParamsNullable, Content = new Dictionary() }; From c2f0bd3c5aabddc46ba735ccf8412327e73af6dd Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 2 Oct 2024 14:01:27 +0300 Subject: [PATCH 2/4] Update tests and integration test files --- .../OpenApiRequestBodyGeneratorTests.cs | 33 +++++++++++++++---- .../Resources/TripService.OpenApi.V2.json | 3 -- .../Resources/TripService.OpenApi.V2.yaml | 3 -- .../Resources/TripService.OpenApi.json | 9 ++--- .../Resources/TripService.OpenApi.yaml | 3 -- 5 files changed, 30 insertions(+), 21 deletions(-) diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs index 6abc39ee7..c1ca1a7da 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Generator/OpenApiRequestBodyGeneratorTests.cs @@ -36,6 +36,8 @@ public OpenApiRequestBodyGeneratorTest() var edmAction = new EdmAction("NS", "Checkout", boolType, true, actionEntitySetPath); edmAction.AddParameter(new EdmOperationParameter(edmAction, "bindingParameter", new EdmEntityTypeReference(customer, true))); edmAction.AddParameter("param", EdmCoreModel.Instance.GetString(true)); + edmAction.AddParameter("param2", EdmCoreModel.Instance.GetString(false)); + model.AddElement(edmAction); var actionImportEntitySetPath = new EdmPathExpression("Param1/Nav2"); @@ -89,9 +91,17 @@ public void CreateRequestBodyForActionImportReturnCorrectRequestBody() var schema = content.Value.Schema; Assert.Equal("object", schema.Type); Assert.NotNull(schema.Properties); - var parameter = Assert.Single(schema.Properties); - Assert.Equal("param", parameter.Key); - Assert.Equal("string", parameter.Value.Type); + + var parameters = schema.Properties; + Assert.Equal(2, parameters.Count); + + var parameter1 = parameters.First(p => p.Key == "param"); + Assert.Equal("param", parameter1.Key); + Assert.Equal("string", parameter1.Value.Type); + + var parameter2 = parameters.First(p => p.Key == "param2"); + Assert.Equal("param2", parameter2.Key); + Assert.Equal("string", parameter2.Value.Type); } [Fact] @@ -116,6 +126,9 @@ public void CanSerializeAsJsonFromTheCreatedRequestBody() ""param"": { ""type"": ""string"", ""nullable"": true + }, + ""param2"": { + ""type"": ""string"" } } } @@ -146,9 +159,17 @@ public void CreateRequestBodyForActionReturnCorrectRequestBody() var schema = content.Value.Schema; Assert.Equal("object", schema.Type); Assert.NotNull(schema.Properties); - var parameter = Assert.Single(schema.Properties); - Assert.Equal("param", parameter.Key); - Assert.Equal("string", parameter.Value.Type); + + var parameters = schema.Properties; + Assert.Equal(2, parameters.Count); + + var parameter1 = parameters.First(p => p.Key == "param"); + Assert.Equal("param", parameter1.Key); + Assert.Equal("string", parameter1.Value.Type); + + var parameter2 = parameters.First(p => p.Key == "param2"); + Assert.Equal("param2", parameter2.Key); + Assert.Equal("string", parameter2.Value.Type); } [Fact] diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json index dd93b4649..436fa8a57 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.json @@ -10943,7 +10943,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { @@ -15768,7 +15767,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { @@ -28333,7 +28331,6 @@ "in": "body", "name": "body", "description": "Action parameters", - "required": true, "schema": { "type": "object", "properties": { diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml index d36ed3de6..2fae115d6 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.V2.yaml @@ -7362,7 +7362,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: @@ -10613,7 +10612,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: @@ -19205,7 +19203,6 @@ paths: - in: body name: body description: Action parameters - required: true schema: type: object properties: diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json index 1e3f588ec..60e8e250c 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.json @@ -12080,8 +12080,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { @@ -17516,8 +17515,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { @@ -31640,8 +31638,7 @@ } } } - }, - "required": true + } }, "responses": { "204": { diff --git a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml index 4d17cc15f..42c1086ac 100644 --- a/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml +++ b/test/Microsoft.OpenAPI.OData.Reader.Tests/Resources/TripService.OpenApi.yaml @@ -8095,7 +8095,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success @@ -11734,7 +11733,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success @@ -21275,7 +21273,6 @@ paths: - $ref: '#/components/schemas/Microsoft.OData.Service.Sample.TrippinInMemory.Models.Person' - type: object nullable: true - required: true responses: '204': description: Success From 37820641669212fc1c393ec852c59d18e243ef5d Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 2 Oct 2024 14:05:27 +0300 Subject: [PATCH 3/4] Update release note --- .../Microsoft.OpenAPI.OData.Reader.csproj | 1 + 1 file changed, 1 insertion(+) diff --git a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj index e61a7d0f9..ab383bf1a 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj +++ b/src/Microsoft.OpenApi.OData.Reader/Microsoft.OpenAPI.OData.Reader.csproj @@ -28,6 +28,7 @@ - Adds nullable to double schema conversions #581 - Updates tag names for actions/functions operations #585 - Creates unique operation ids for paths with composable overloaded functions #580 + - Sets request body required property to false when all action parameters are optional #582 Microsoft.OpenApi.OData.Reader ..\..\tool\Microsoft.OpenApi.OData.snk From 4a94a9450b3d597a821265a98b0530ffddaed7ee Mon Sep 17 00:00:00 2001 From: Irvine Sunday Date: Wed, 2 Oct 2024 15:15:28 +0300 Subject: [PATCH 4/4] Use bitwise AND to evaluate nullabity --- .../Generator/OpenApiRequestBodyGenerator.cs | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs index 686ae78c7..a079631d7 100644 --- a/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs +++ b/src/Microsoft.OpenApi.OData.Reader/Generator/OpenApiRequestBodyGenerator.cs @@ -69,7 +69,7 @@ public static OpenApiRequestBody CreateRequestBody(this ODataContext context, IE bool allParamsNullable = true; foreach (var parameter in action.Parameters.Skip(skip)) { - allParamsNullable = parameter.Type.IsNullable; + allParamsNullable &= parameter.Type.IsNullable; parametersSchema.Properties.Add(parameter.Name, context.CreateEdmTypeSchema(parameter.Type)); }