Skip to content

Commit ed90662

Browse files
authored
Fix generating XML doc comments for query parameters in gRPC JSON transcoding (#55482)
1 parent 2bcfbd7 commit ed90662

File tree

3 files changed

+37
-2
lines changed

3 files changed

+37
-2
lines changed

src/Grpc/JsonTranscoding/src/Microsoft.AspNetCore.Grpc.Swagger/Internal/GrpcJsonTranscodingDescriptionProvider.cs

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -146,12 +146,18 @@ private static ApiDescription CreateApiDescription(RouteEndpoint routeEndpoint,
146146
var queryParameters = ServiceDescriptorHelpers.ResolveQueryParameterDescriptors(routeParameters, methodDescriptor, bodyDescriptor?.Descriptor, bodyDescriptor?.FieldDescriptor);
147147
foreach (var queryDescription in queryParameters)
148148
{
149-
var fieldType = MessageDescriptorHelpers.ResolveFieldType(queryDescription.Value);
149+
var field = queryDescription.Value;
150+
var propertyInfo = field.ContainingType.ClrType.GetProperty(field.PropertyName);
151+
152+
// If from a property, create model as property to get its XML comments.
153+
var identity = propertyInfo != null
154+
? ModelMetadataIdentity.ForProperty(propertyInfo, MessageDescriptorHelpers.ResolveFieldType(field), field.ContainingType.ClrType)
155+
: ModelMetadataIdentity.ForType(MessageDescriptorHelpers.ResolveFieldType(field));
150156

151157
apiDescription.ParameterDescriptions.Add(new ApiParameterDescription
152158
{
153159
Name = queryDescription.Key,
154-
ModelMetadata = new GrpcModelMetadata(ModelMetadataIdentity.ForType(fieldType)),
160+
ModelMetadata = new GrpcModelMetadata(identity),
155161
Source = BindingSource.Query,
156162
DefaultValue = string.Empty
157163
});

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/Proto/xmldoc.proto

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -35,6 +35,12 @@ service XmlDoc {
3535
delete: "/v1/greeter/{name}"
3636
};
3737
}
38+
// QueryGet!
39+
rpc QueryGet (StringRequestWithDetail) returns (StringReply) {
40+
option (google.api.http) = {
41+
get: "/v1/greeter/query/{name}"
42+
};
43+
}
3844
}
3945

4046
// StringRequest!

src/Grpc/JsonTranscoding/test/Microsoft.AspNetCore.Grpc.Swagger.Tests/XmlComments/XmlDocumentationIntegrationTests.cs

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -108,6 +108,29 @@ public void RequestDescription_Nested_ProtoFieldDocs()
108108
Assert.Equal("Detail field!", path.Operations[OperationType.Post].RequestBody.Description);
109109
}
110110

111+
[Fact]
112+
public void Parameters_QueryParameters_ProtoFieldDocs()
113+
{
114+
// Arrange & Act
115+
var swagger = OpenApiTestHelpers.GetOpenApiDocument<XmlDocService>(_testOutputHelper);
116+
117+
// Assert
118+
var path = swagger.Paths["/v1/greeter/query/{name}"];
119+
Assert.Collection(path.Operations[OperationType.Get].Parameters,
120+
p =>
121+
{
122+
Assert.Equal(ParameterLocation.Path, p.In);
123+
Assert.Equal("name", p.Name);
124+
Assert.Equal("Name field!", p.Description);
125+
},
126+
p =>
127+
{
128+
Assert.Equal(ParameterLocation.Query, p.In);
129+
Assert.Equal("detail.age", p.Name);
130+
Assert.Equal("Age field!", p.Description);
131+
});
132+
}
133+
111134
[Fact]
112135
public void Message_UseProtoDocs()
113136
{

0 commit comments

Comments
 (0)