public void Apply(OpenApiRequestBody requestBody, RequestBodyFilterContext context) { var bodyParameterDescription = context.BodyParameterDescription; if (bodyParameterDescription == null) { return; } var propertyInfo = bodyParameterDescription.PropertyInfo(); if (propertyInfo != null) { ApplyPropertyTags(requestBody, propertyInfo); return; } var parameterInfo = bodyParameterDescription.ParameterInfo(); if (parameterInfo != null) { ApplyParamTags(requestBody, parameterInfo); return; } }
private void ApplyPropertyTags(OpenApiRequestBody requestBody, RequestBodyFilterContext context, PropertyInfo propertyInfo) { var propertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(propertyInfo); var propertyNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']"); if (propertyNode == null) { return; } var summaryNode = propertyNode.SelectSingleNode("summary"); if (summaryNode != null) { requestBody.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); } var exampleNode = propertyNode.SelectSingleNode("example"); if (exampleNode == null) { return; } foreach (var mediaType in requestBody.Content.Values) { var exampleAsJson = (mediaType.Schema?.ResolveType(context.SchemaRepository) == "string") ? $"\"{exampleNode.ToString()}\"" : exampleNode.ToString(); mediaType.Example = OpenApiAnyFactory.CreateFromJson(exampleAsJson); } }
private OpenApiRequestBody GenerateRequestBody( ApiDescription apiDescription, SchemaRepository schemaRepository) { OpenApiRequestBody requestBody = null; RequestBodyFilterContext filterContext = null; var bodyParameter = apiDescription.ParameterDescriptions .FirstOrDefault(paramDesc => paramDesc.IsFromBody()); var formParameters = apiDescription.ParameterDescriptions .Where(paramDesc => paramDesc.IsFromForm()); if (bodyParameter != null) { requestBody = GenerateRequestBodyFromBodyParameter(apiDescription, schemaRepository, bodyParameter); filterContext = new RequestBodyFilterContext( bodyParameterDescription: bodyParameter, formParameterDescriptions: null, schemaGenerator: _schemaGenerator, schemaRepository: schemaRepository); } else if (formParameters.Any()) { requestBody = GenerateRequestBodyFromFormParameters(apiDescription, schemaRepository, formParameters); filterContext = new RequestBodyFilterContext( bodyParameterDescription: null, formParameterDescriptions: formParameters, schemaGenerator: _schemaGenerator, schemaRepository: schemaRepository); } if (requestBody != null) { foreach (var filter in _options.RequestBodyFilters) { filter.Apply(requestBody, filterContext); } } return(requestBody); }
private void ApplyParamTags(OpenApiRequestBody requestBody, RequestBodyFilterContext context, ParameterInfo parameterInfo) { if (!(parameterInfo.Member is MethodInfo methodInfo)) { return; } // If method is from a constructed generic type, look for comments from the generic type method var targetMethod = methodInfo.DeclaringType.IsConstructedGenericType ? methodInfo.GetUnderlyingGenericTypeMethod() : methodInfo; if (targetMethod == null) { return; } var methodMemberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(targetMethod); var paramNode = _xmlNavigator.SelectSingleNode( $"/doc/members/member[@name='{methodMemberName}']/param[@name='{parameterInfo.Name}']"); if (paramNode != null) { requestBody.Description = XmlCommentsTextHelper.Humanize(paramNode.InnerXml); var example = paramNode.GetAttribute("example", ""); if (string.IsNullOrEmpty(example)) { return; } foreach (var mediaType in requestBody.Content.Values) { var exampleAsJson = (mediaType.Schema?.ResolveType(context.SchemaRepository) == "string") ? $"\"{example}\"" : example; mediaType.Example = OpenApiAnyFactory.CreateFromJson(exampleAsJson); } } }