public void Apply(OpenApiDocument swaggerDoc, DocumentFilterContext context) { // Collect (unique) controller names and types in a dictionary var controllerNamesAndTypes = context.ApiDescriptions .Select(apiDesc => apiDesc.ActionDescriptor as ControllerActionDescriptor) .Where(actionDesc => actionDesc != null) .GroupBy(actionDesc => actionDesc.ControllerName) .Select(group => new KeyValuePair <string, Type>(group.Key, group.First().ControllerTypeInfo.AsType())); foreach (var nameAndType in controllerNamesAndTypes) { var memberName = XmlCommentsNodeNameHelper.GetMemberNameForType(nameAndType.Value); var typeNode = _xmlNavigator.SelectSingleNode(string.Format(MemberXPath, memberName)); if (typeNode != null) { var summaryNode = typeNode.SelectSingleNode(SummaryTag); if (summaryNode != null) { if (swaggerDoc.Tags == null) { swaggerDoc.Tags = new List <OpenApiTag>(); } swaggerDoc.Tags.Add(new OpenApiTag { Name = nameAndType.Key, Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml) }); } } } }
private void ApplyControllerTags(OpenApiOperation operation, Type controllerType) { var typeMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(controllerType); var responseNodes = _xmlNavigator.Select($"/doc/members/member[@name='{typeMemberName}']/response"); ApplyResponseTags(operation, responseNodes); }
private void ApplyMethodTags(OpenApiOperation operation, MethodInfo methodInfo) { var methodMemberName = XmlCommentsNodeNameHelper.GetMemberNameForMethod(methodInfo); var methodNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{methodMemberName}']"); if (methodNode == null) { return; } var summaryNode = methodNode.SelectSingleNode("summary"); if (summaryNode != null) { operation.Summary = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); } var remarksNode = methodNode.SelectSingleNode("remarks"); if (remarksNode != null) { operation.Description = XmlCommentsTextHelper.Humanize(remarksNode.InnerXml); } var responseNodes = methodNode.Select("response"); ApplyResponseTags(operation, responseNodes); }
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 void ApplyPropertyTags(OpenApiParameter parameter, ParameterFilterContext context) { var propertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(context.PropertyInfo); var propertyNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{propertyMemberName}']"); if (propertyNode == null) { return; } var summaryNode = propertyNode.SelectSingleNode("summary"); if (summaryNode != null) { parameter.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); parameter.Schema.Description = null; // no need to duplicate } var exampleNode = propertyNode.SelectSingleNode("example"); if (exampleNode == null) { return; } var exampleAsJson = (parameter.Schema?.ResolveType(context.SchemaRepository) == "string") ? $"\"{exampleNode.ToString()}\"" : exampleNode.ToString(); parameter.Example = OpenApiAnyFactory.CreateFromJson(exampleAsJson); }
private void ApplyMemberTags(OpenApiSchema schema, SchemaFilterContext context) { var fieldOrPropertyMemberName = XmlCommentsNodeNameHelper.GetMemberNameForFieldOrProperty(context.MemberInfo); var fieldOrPropertyNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{fieldOrPropertyMemberName}']"); if (fieldOrPropertyNode == null) { return; } var summaryNode = fieldOrPropertyNode.SelectSingleNode("summary"); if (summaryNode != null) { schema.Description = XmlCommentsTextHelper.Humanize(summaryNode.InnerXml); } var exampleNode = fieldOrPropertyNode.SelectSingleNode("example"); if (exampleNode != null) { var exampleAsJson = (schema.ResolveType(context.SchemaRepository) == "string") && !exampleNode.Value.Equals("null") ? $"\"{exampleNode.ToString()}\"" : exampleNode.ToString(); schema.Example = OpenApiAnyFactory.CreateFromJson(exampleAsJson); } }
private void ApplyTypeTags(OpenApiSchema schema, Type type) { var typeMemberName = XmlCommentsNodeNameHelper.GetMemberNameForType(type); var typeSummaryNode = _xmlNavigator.SelectSingleNode($"/doc/members/member[@name='{typeMemberName}']/summary"); if (typeSummaryNode != null) { schema.Description = XmlCommentsTextHelper.Humanize(typeSummaryNode.InnerXml); } }
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); } } }