private ApiExplorerData CreateSerializableData(ApiDescription description) { var data = new ApiExplorerData() { GroupName = description.GroupName, HttpMethod = description.HttpMethod, RelativePath = description.RelativePath, ResponseType = description.ResponseType?.FullName, }; foreach (var parameter in description.ParameterDescriptions) { var parameterData = new ApiExplorerParameterData() { Name = parameter.Name, Source = parameter.Source.Id, Type = parameter.Type?.FullName, }; if (parameter.RouteInfo != null) { parameterData.RouteInfo = new ApiExplorerParameterRouteInfo() { ConstraintTypes = parameter.RouteInfo.Constraints?.Select(c => c.GetType().Name).ToArray(), DefaultValue = parameter.RouteInfo.DefaultValue, IsOptional = parameter.RouteInfo.IsOptional, }; } data.ParameterDescriptions.Add(parameterData); } foreach (var response in description.SupportedResponseFormats) { var responseData = new ApiExplorerResponseData() { FormatterType = response.Formatter.GetType().FullName, MediaType = response.MediaType.ToString(), }; data.SupportedResponseFormats.Add(responseData); } return data; }
private static void GenerateUriParameters(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) { ApiDescription apiDescription = apiModel.ApiDescription; foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) { if (apiParameter.Source == ApiParameterSource.FromUri) { HttpParameterDescriptor parameterDescriptor = apiParameter.ParameterDescriptor; Type parameterType = null; ModelDescription typeDescription = null; ComplexTypeModelDescription complexTypeDescription = null; if (parameterDescriptor != null) { parameterType = parameterDescriptor.ParameterType; typeDescription = modelGenerator.GetOrCreateModelDescription(parameterType); complexTypeDescription = typeDescription as ComplexTypeModelDescription; } // Example: // [TypeConverter(typeof(PointConverter))] // public class Point // { // public Point(int x, int y) // { // X = x; // Y = y; // } // public int X { get; set; } // public int Y { get; set; } // } // Class Point is bindable with a TypeConverter, so Point will be added to UriParameters collection. // // public class Point // { // public int X { get; set; } // public int Y { get; set; } // } // Regular complex class Point will have properties X and Y added to UriParameters collection. if (complexTypeDescription != null && !IsBindableWithTypeConverter(parameterType)) { foreach (ParameterDescription uriParameter in complexTypeDescription.Properties) { apiModel.UriParameters.Add(uriParameter); } } else if (parameterDescriptor != null) { ParameterDescription uriParameter = AddParameterDescription(apiModel, apiParameter, typeDescription); if (!parameterDescriptor.IsOptional) { uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Required" }); } object defaultValue = parameterDescriptor.DefaultValue; if (defaultValue != null) { uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Default value is " + Convert.ToString(defaultValue, CultureInfo.InvariantCulture) }); } } else { Debug.Assert(parameterDescriptor == null); // If parameterDescriptor is null, this is an undeclared route parameter which only occurs // when source is FromUri. Ignored in request model and among resource parameters but listed // as a simple string here. ModelDescription modelDescription = modelGenerator.GetOrCreateModelDescription(typeof(string)); AddParameterDescription(apiModel, apiParameter, modelDescription); } } } }
/// <summary> /// Gets the response body samples for a given <see cref="ApiDescription"/>. /// </summary> /// <param name="api">The <see cref="ApiDescription"/>.</param> /// <returns>The samples keyed by media type.</returns> public IDictionary <MediaTypeHeaderValue, object> GetSampleResponses(ApiDescription api) { return(GetSample(api, SampleDirection.Response)); }
public static string OperationId(this ApiDescription apiDescription) { return($"{apiDescription.DefaultGroupingKeySelector()}_{apiDescription.ActionDescriptor.ActionName}"); }
/// <summary> /// Gets the request body samples for a given <see cref="ApiDescription"/>. /// </summary> /// <param name="api">The <see cref="ApiDescription"/>.</param> /// <returns>The samples keyed by media type.</returns> public IDictionary<MediaTypeHeaderValue, object> GetSampleRequests(ApiDescription api) { return GetSample(api, SampleDirection.Request); }
private string DefaultOperationIdSelector(ApiDescription apiDescription) { return(apiDescription.ActionDescriptor.AttributeRouteInfo?.Name); }
private IList <string> DefaultTagsSelector(ApiDescription apiDescription) { return(new[] { apiDescription.ActionDescriptor.RouteValues["controller"] }); }
private bool DefaultDocInclusionPredicate(string documentName, ApiDescription apiDescription) { return(apiDescription.GroupName == null || apiDescription.GroupName == documentName); }
private string DefaultSortKeySelector(ApiDescription apiDescription) { return(TagsSelector(apiDescription).First()); }
/// <summary> /// </summary> /// <typeparam name="TAttribute"></typeparam> /// <param name="apiDesc"></param> /// <returns></returns> public static IEnumerable <TAttribute> GetControllerAndActionAttributes <TAttribute>(this ApiDescription apiDesc) where TAttribute : Attribute { if (!apiDesc.TryGetMethodInfo(out var methodInfo)) { return(new List <TAttribute>()); } if (methodInfo == null) { return(new List <TAttribute>()); } var attrs = methodInfo.GetCustomAttributes <TAttribute>(); if (methodInfo.DeclaringType != null) { attrs = attrs.Concat(methodInfo.DeclaringType.GetCustomAttributes <TAttribute>()); } return(attrs); }
private async Task <bool> RunOperationProcessorsAsync(SwaggerDocument document, ApiDescription apiDescription, Type controllerType, MethodInfo methodInfo, SwaggerOperationDescription operationDescription, List <SwaggerOperationDescription> allOperations, SwaggerGenerator swaggerGenerator, SwaggerSchemaResolver schemaResolver) { // 1. Run from settings var operationProcessorContext = new AspNetCoreOperationProcessorContext(document, operationDescription, controllerType, methodInfo, swaggerGenerator, _schemaGenerator, schemaResolver, Settings, allOperations) { ApiDescription = apiDescription, }; foreach (var operationProcessor in Settings.OperationProcessors) { if (await operationProcessor.ProcessAsync(operationProcessorContext).ConfigureAwait(false) == false) { return(false); } } // 2. Run from class attributes var operationProcessorAttribute = methodInfo.DeclaringType.GetTypeInfo() .GetCustomAttributes() // 3. Run from method attributes .Concat(methodInfo.GetCustomAttributes()) .Where(a => a.GetType().IsAssignableTo("SwaggerOperationProcessorAttribute", TypeNameStyle.Name)); foreach (dynamic attribute in operationProcessorAttribute) { var operationProcessor = ReflectionExtensions.HasProperty(attribute, "Parameters") ? (IOperationProcessor)Activator.CreateInstance(attribute.Type, attribute.Parameters) : (IOperationProcessor)Activator.CreateInstance(attribute.Type); if (await operationProcessor.ProcessAsync(operationProcessorContext) == false) { return(false); } } return(true); }
private static void GenerateUriParameters(HelpPageApiModel apiModel, ModelDescriptionGenerator modelGenerator) { ApiDescription apiDescription = apiModel.ApiDescription; foreach (ApiParameterDescription apiParameter in apiDescription.ParameterDescriptions) { if (apiParameter.Source == ApiParameterSource.FromUri) { HttpParameterDescriptor parameterDescriptor = apiParameter.ParameterDescriptor; Type parameterType = null; ModelDescription typeDescription = null; ComplexTypeModelDescription complexTypeDescription = null; if (parameterDescriptor != null) { parameterType = parameterDescriptor.ParameterType; typeDescription = modelGenerator.GetOrCreateModelDescription(parameterType); complexTypeDescription = typeDescription as ComplexTypeModelDescription; } if (complexTypeDescription != null) { foreach (ParameterDescription uriParameter in complexTypeDescription.Properties) { apiModel.UriParameters.Add(uriParameter); } } else if (parameterDescriptor != null) { ParameterDescription uriParameter = AddParameterDescription(apiModel, apiParameter, typeDescription); if (!parameterDescriptor.IsOptional) { uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Required" }); } object defaultValue = parameterDescriptor.DefaultValue; if (defaultValue != null) { uriParameter.Annotations.Add(new ParameterAnnotation() { Documentation = "Default value is " + Convert.ToString(defaultValue, CultureInfo.InvariantCulture) }); } } else { Debug.Assert(parameterDescriptor == null); // If parameterDescriptor is null, this is an undeclared route parameter which only occurs // when source is FromUri. Ignored in request model and among resource parameters but listed // as a simple string here. ModelDescription modelDescription = modelGenerator.GetOrCreateModelDescription(typeof(string)); AddParameterDescription(apiModel, apiParameter, modelDescription); } } } }