Skip to content

[OpenAPI] Add @responseBody directive - #10130

Merged
tobias-tengler merged 6 commits into
mainfrom
tte/openapi-hoist-directive
Jul 27, 2026
Merged

[OpenAPI] Add @responseBody directive#10130
tobias-tengler merged 6 commits into
mainfrom
tte/openapi-hoist-directive

Conversation

@tobias-tengler

Copy link
Copy Markdown
Member

No description provided.

@github-actions

github-actions Bot commented Jul 21, 2026

Copy link
Copy Markdown
Contributor

Patch coverage

98.8% of changed lines covered (329/333)

File Covered Changed Patch %
…/Rules/Endpoints/EndpointSingleResponseBodyDirectiveRule.cs 96 100 96.0% 🟡
…/DynamicOpenApiDocumentTransformer.cs 5 5 100.0% 🟢
…/Definitions/OpenApiEndpointDefinition.cs 11 11 100.0% 🟢
…/Adapters.OpenApi.Core/Definitions/OpenApiModelDefinition.cs 7 7 100.0% 🟢
…/Execution/OpenApiEndpointDefinitionExtensions.cs 69 69 100.0% 🟢
…/Adapters.OpenApi.Core/Execution/OpenApiEndpointDescriptor.cs 1 1 100.0% 🟢
…/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs 25 25 100.0% 🟢
…/Execution/ResponseBodyDirectiveRewriter.cs 13 13 100.0% 🟢
…/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs 14 14 100.0% 🟢
…/Validation/OpenApiDefinitionValidator.cs 3 3 100.0% 🟢
…/Endpoints/EndpointNoResponseBodyDirectiveInFragmentsRule.cs 15 15 100.0% 🟢
…/Validation/Rules/Models/ModelNoResponseBodyDirectiveRule.cs 12 12 100.0% 🟢
…/Validation/Rules/ResponseBodyDirectiveFinder.cs 28 28 100.0% 🟢
…/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs 15 15 100.0% 🟢
…/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs 15 15 100.0% 🟢
Uncovered changed lines (JSON)
{
  "sha": "42942479567a640987acbd2600383ca47b934ed4",
  "files": [
    { "path": "src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/Rules/Endpoints/EndpointSingleResponseBodyDirectiveRule.cs", "ranges": [[69, 70], [100, 101]] }
  ]
}

Project coverage: 53.9% (232103/430883 lines)

@tobias-tengler tobias-tengler changed the title [OpenAPI] Add @hoist directive [OpenAPI] Add @responseBody directive Jul 21, 2026
@tobias-tengler
tobias-tengler marked this pull request as ready for review July 22, 2026 08:22
Copilot AI review requested due to automatic review settings July 22, 2026 08:22

Copilot AI left a comment

Copy link
Copy Markdown
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

Pull request overview

Adds OpenAPI adapter support for a new @responseBody directive that lets an endpoint designate a nested field selection as the HTTP response body, including corresponding validation and test coverage.

Changes:

  • Introduces OpenApiResponseBodySelection (name path + selection set + resolved field type) and uses it for OpenAPI schema generation and HTTP result formatting.
  • Adds validation rules to constrain @responseBody usage (models disallow it; endpoints restrict it in fragments, typed inline fragments, and to a single occurrence).
  • Adds integration/validation tests plus snapshots covering schema output, duplicate-route promotion, and runtime endpoint behavior.

Reviewed changes

Copilot reviewed 32 out of 32 changed files in this pull request and generated 3 comments.

Show a summary per file
File Description
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Validation/ValidationTestBase.cs Adds validation tests for invalid @responseBody placements/usages.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/OpenApiIntegrationTestBase.cs Adds OpenAPI document snapshot tests for @responseBody and duplicate-route selection behavior.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OperationDocument_With_ResponseBody_Field_NET9_0.json Snapshot for OpenAPI 3.0 output when @responseBody is used.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OperationDocument_With_ResponseBody_Field_NET10_0.json Snapshot for OpenAPI 3.1 output when @responseBody is used.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.OperationDocument_With_ResponseBody_Field_NET11_0.json Snapshot for OpenAPI 3.2 output when @responseBody is used.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.Duplicated_Routes_FirstInvalidSecondValid_UsesValidResponseBodySelection_NET9_0.json Snapshot ensuring duplicate-route promotion uses the valid endpoint’s response body selection (OpenAPI 3.0).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.Duplicated_Routes_FirstInvalidSecondValid_UsesValidResponseBodySelection_NET10_0.json Snapshot ensuring duplicate-route promotion uses the valid endpoint’s response body selection (OpenAPI 3.1).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/OpenApi/snapshots/OpenApiIntegrationTestBase.Duplicated_Routes_FirstInvalidSecondValid_UsesValidResponseBodySelection_NET11_0.json Snapshot ensuring duplicate-route promotion uses the valid endpoint’s response body selection (OpenAPI 3.2).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/HttpEndpointIntegrationTestBase.cs Adds endpoint runtime tests for @responseBody extraction and error handling.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Http_Post_ResponseBody_Field_Returns_InternalServerError.snap Snapshot for POST behavior with @responseBody (expected 500).
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Http_Get_With_ResponseBody_And_Unrelated_Type_Refinements.snap Snapshot for GET response extraction when unrelated inline fragments exist.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Http_Get_Skipped_ResponseBody_Field_Returns_InternalServerError.snap Snapshot for skipped @responseBody field leading to 500.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Http_Get_ResponseBody_Field_Returns_NotFound.snap Snapshot for GET returning 404 when response body field is null/not found.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Http_Get_ResponseBody_Ancestor_Returns_NotFound.snap Snapshot for GET returning 404 when an ancestor on the response path is null.
src/HotChocolate/Adapters/test/Adapters.OpenApi.Tests/Endpoints/snapshots/HttpEndpointIntegrationTestBase.Duplicated_Routes_FirstInvalidSecondValid_PrefersValid.snap Snapshot verifying runtime route promotion prefers valid endpoint output.
src/HotChocolate/Adapters/src/Fusion.Adapters.OpenApi/FusionOpenApiResultFormatter.cs Updates Fusion formatter to extract and write nested response body values.
src/HotChocolate/Adapters/src/Adapters.OpenApi/OpenApiResultFormatter.cs Updates non-Fusion formatter to extract and write nested response body values.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/WellKnownDirectiveNames.cs Adds ResponseBody directive name constant.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/Rules/ResponseBodyDirectiveFinder.cs Adds visitor to count @responseBody and detect typed-inline-fragment containment.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/Rules/Models/ModelNoResponseBodyDirectiveRule.cs Disallows @responseBody in model documents.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/Rules/Endpoints/EndpointSingleResponseBodyDirectiveRule.cs Enforces a single @responseBody per operation and disallows it inside typed inline fragments.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/Rules/Endpoints/EndpointNoResponseBodyDirectiveInFragmentsRule.cs Disallows @responseBody in endpoint named fragments.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Validation/OpenApiDefinitionValidator.cs Registers new model/endpoint validation rules.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/OpenApiDefinitionRegistry.cs Fixes duplicate-route promotion by pairing definitions and descriptors consistently.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/IDynamicOpenApiDocumentTransformer.cs Changes transformer interface visibility.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/ResponseBodyDirectiveRewriter.cs Adds rewriter to strip @responseBody from executable documents before execution.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointFactory.cs Computes response body selection, composes execution document, and strips @responseBody.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointDescriptor.cs Replaces ResponseNameToExtract with OpenApiResponseBodySelection.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Execution/OpenApiEndpointDefinitionExtensions.cs Adds selection discovery and type resolution for @responseBody.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Definitions/OpenApiModelDefinition.cs Refactors model definition into a positional record.
src/HotChocolate/Adapters/src/Adapters.OpenApi.Core/Definitions/OpenApiEndpointDefinition.cs Refactors endpoint definition into a positional record.
src/HotChocolate/Adapters/src/Adapters.OpenApi.AspNetCore/DynamicOpenApiDocumentTransformer.cs Uses @responseBody selection/type to generate OpenAPI response schemas.

💡 Add Copilot custom instructions for smarter, more guided reviews. Learn how to get started.

@tobias-tengler
tobias-tengler merged commit ebe8b48 into main Jul 27, 2026
147 checks passed
@tobias-tengler
tobias-tengler deleted the tte/openapi-hoist-directive branch July 27, 2026 07:19
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Projects

None yet

Development

Successfully merging this pull request may close these issues.

2 participants