[OpenAPI] Add @responseBody directive - #10130
Merged
Merged
Conversation
Contributor
@responseBody directive
Contributor
There was a problem hiding this comment.
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
@responseBodyusage (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.
This was referenced Aug 9, 2026
Merged
Open
This file contains hidden or bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment
Add this suggestion to a batch that can be applied as a single commit.This suggestion is invalid because no changes were made to the code.Suggestions cannot be applied while the pull request is closed.Suggestions cannot be applied while viewing a subset of changes.Only one suggestion per line can be applied in a batch.Add this suggestion to a batch that can be applied as a single commit.Applying suggestions on deleted lines is not supported.You must change the existing code in this line in order to create a valid suggestion.Outdated suggestions cannot be applied.This suggestion has been applied or marked resolved.Suggestions cannot be applied from pending reviews.Suggestions cannot be applied on multi-line comments.Suggestions cannot be applied while the pull request is queued to merge.Suggestion cannot be applied right now. Please check back later.
No description provided.