private OpenApiParameter GenerateParameter( ApiParameterDescription apiParameter, SchemaRepository schemaRepository) { var name = _options.DescribeAllParametersInCamelCase ? apiParameter.Name.ToCamelCase() : apiParameter.Name; var location = (apiParameter.Source != null && ParameterLocationMap.ContainsKey(apiParameter.Source)) ? ParameterLocationMap[apiParameter.Source] : ParameterLocation.Query; var isRequired = (apiParameter.IsFromPath()) || apiParameter.CustomAttributes().Any(attr => RequiredAttributeTypes.Contains(attr.GetType())); var schema = (apiParameter.ModelMetadata != null) ? _schemaGenerator.GenerateSchema(apiParameter.ModelMetadata.ModelType, schemaRepository) : new OpenApiSchema { Type = "string" }; // If it's NOT a reference schema, apply contextual metadata (i.e. from custom attributes) if (schema.Reference == null) { // Honor default value for optional action parameters var parameterInfo = apiParameter.ParameterInfo(); if (parameterInfo != null && parameterInfo.HasDefaultValue) { schema.Default = OpenApiAnyFactory.TryCreateFor(schema, parameterInfo.DefaultValue, out IOpenApiAny openApiAny) ? openApiAny : null; } schema.ApplyCustomAttributes(apiParameter.CustomAttributes()); } var parameter = new OpenApiParameter { Name = name, In = location, Required = isRequired, Schema = schema }; var filterContext = new ParameterFilterContext( apiParameter, _schemaGenerator, schemaRepository, apiParameter.ParameterInfo(), apiParameter.PropertyInfo()); foreach (var filter in _options.ParameterFilters) { filter.Apply(parameter, filterContext); } return(parameter); }
private OpenApiParameter GenerateParameter( ApiParameterDescription apiParameter, SchemaRepository schemaRepository) { var name = _options.DescribeAllParametersInCamelCase ? apiParameter.Name.ToCamelCase() : apiParameter.Name; var location = ParameterLocationMap.ContainsKey(apiParameter.Source) ? ParameterLocationMap[apiParameter.Source] : ParameterLocation.Query; var isRequired = (apiParameter.IsFromPath()) || apiParameter.CustomAttributes().Any(attr => RequiredAttributeTypes.Contains(attr.GetType())); var schema = (apiParameter.ModelMetadata != null) ? _schemaGenerator.GenerateSchema(apiParameter.ModelMetadata.ModelType, schemaRepository) : new OpenApiSchema { Type = "string" }; var defaultValue = apiParameter.CustomAttributes().OfType <DefaultValueAttribute>().FirstOrDefault()?.Value ?? apiParameter.ParameterInfo()?.DefaultValue; // NOTE: Oddly, ParameterInfo.DefaultValue returns DBNull if not optional, hence the additional check below if (schema.Reference == null && defaultValue != null && defaultValue != DBNull.Value) { schema.Default = OpenApiAnyFactory.TryCreateFor(schema, defaultValue, out IOpenApiAny openApiAny) ? openApiAny : null; } var parameter = new OpenApiParameter { Name = name, In = location, Required = isRequired, Schema = schema }; var filterContext = new ParameterFilterContext( apiParameter, _schemaGenerator, schemaRepository, apiParameter.ParameterInfo(), apiParameter.PropertyInfo()); foreach (var filter in _options.ParameterFilters) { filter.Apply(parameter, filterContext); } return(parameter); }
private OpenApiRequestBody GenerateRequestBodyFromBodyParameter( ApiDescription apiDescription, SchemaRepository schemaRepository, ApiParameterDescription bodyParameter) { var contentTypes = InferRequestContentTypes(apiDescription); var isRequired = bodyParameter.CustomAttributes().Any(attr => RequiredAttributeTypes.Contains(attr.GetType())); var schema = _schemaGenerator.GenerateSchema( bodyParameter.ModelMetadata.ModelType, schemaRepository, bodyParameter.PropertyInfo(), bodyParameter.ParameterInfo()); return(new OpenApiRequestBody { Content = contentTypes .ToDictionary( contentType => contentType, contentType => new OpenApiMediaType { Schema = schema } ), Required = isRequired }); }
private OpenApiRequestBody GenerateRequestBodyFromBodyParameter( ApiDescription apiDescription, SchemaRepository schemaRepository, ApiParameterDescription bodyParameter) { var contentTypes = InferRequestContentTypes(apiDescription); var isRequired = bodyParameter.IsRequiredParameter(); var schema = GenerateSchema( bodyParameter.ModelMetadata.ModelType, schemaRepository, bodyParameter.PropertyInfo(), bodyParameter.ParameterInfo()); return(new OpenApiRequestBody { Content = contentTypes .ToDictionary( contentType => contentType, contentType => new OpenApiMediaType { Schema = schema } ), Required = isRequired }); }
private OpenApiParameter GenerateParameter( ApiParameterDescription apiParameter, SchemaRepository schemaRepository) { var name = _options.DescribeAllParametersInCamelCase ? apiParameter.Name.ToCamelCase() : apiParameter.Name; var location = (apiParameter.Source != null && ParameterLocationMap.ContainsKey(apiParameter.Source)) ? ParameterLocationMap[apiParameter.Source] : ParameterLocation.Query; var isRequired = (apiParameter.IsFromPath()) || apiParameter.CustomAttributes().Any(attr => RequiredAttributeTypes.Contains(attr.GetType())); var schema = (apiParameter.ModelMetadata != null) ? _schemaGenerator.GenerateSchema( apiParameter.ModelMetadata.ModelType, schemaRepository, apiParameter.PropertyInfo(), apiParameter.ParameterInfo()) : new OpenApiSchema { Type = "string" }; var parameter = new OpenApiParameter { Name = name, In = location, Required = isRequired, Schema = schema }; var filterContext = new ParameterFilterContext( apiParameter, _schemaGenerator, schemaRepository, apiParameter.PropertyInfo(), apiParameter.ParameterInfo()); foreach (var filter in _options.ParameterFilters) { filter.Apply(parameter, filterContext); } return(parameter); }
public static IEnumerable <object> CustomAttributes(this ApiParameterDescription apiParameter) { var parameterInfo = apiParameter.ParameterInfo(); var parameterAttributes = (parameterInfo != null) ? parameterInfo.GetCustomAttributes(true) : Enumerable.Empty <object>(); var propertyInfo = apiParameter.PropertyInfo(); var propertyAttributes = (propertyInfo != null) ? propertyInfo.GetCustomAttributes(true) : Enumerable.Empty <object>(); return(parameterAttributes.Union(propertyAttributes)); }
internal static void GetAdditionalMetadata( this ApiParameterDescription apiParameter, ApiDescription apiDescription, out ParameterInfo parameterInfo, out PropertyInfo propertyInfo, out IEnumerable <object> parameterOrPropertyAttributes) { parameterInfo = apiParameter.ParameterInfo(); propertyInfo = apiParameter.PropertyInfo(); parameterOrPropertyAttributes = apiParameter.CustomAttributes(); }
public static IEnumerable <object> CustomAttributes(this ApiParameterDescription apiParameter) { var propertyInfo = apiParameter.PropertyInfo(); if (propertyInfo != null) { return(propertyInfo.GetCustomAttributes(true)); } var parameterInfo = apiParameter.ParameterInfo(); if (parameterInfo != null) { return(parameterInfo.GetCustomAttributes(true)); } return(Enumerable.Empty <object>()); }