コード例 #1
0
    public void Apply(IParameter parameter, ParameterFilterContext context)
    {
        var type = context.ParameterInfo?.ParameterType;

        if (type == null)
        {
            return;
        }
        if (type.IsEnum)
        {
            var names  = Enum.GetNames(type);
            var values = Enum.GetValues(type);
            var desc   = "";

            foreach (var value in values)
            {
                var intValue = Convert.ChangeType(value, Enum.GetUnderlyingType(value.GetType()));
                desc += $"{intValue}={value},";
            }
            desc = desc.TrimEnd(',');
            if (!parameter.Extensions.ContainsKey("x-enumNames"))
            {
                parameter.Extensions.Add("x-enumNames", names);
            }
        }
    }
 /// <summary>
 /// Apply filter.
 /// </summary>
 /// <param name="parameter"><see cref="OpenApiParameter"/>.</param>
 /// <param name="context"><see cref="ParameterFilterContext"/>.</param>
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     if (context.PropertyInfo != null)
     {
         ApplyPropertyTags(parameter, context.PropertyInfo);
     }
 }
        /// <summary>
        /// Apply the filter.
        /// </summary>
        /// <param name="parameter"><see cref="OpenApiParameter"/>.</param>
        /// <param name="context"><see cref="ParameterFilterContext"/>.</param>
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            if (!this._applyFiler)
            {
                return;
            }

            var typeInfo = context.ParameterInfo?.ParameterType ?? context.PropertyInfo?.PropertyType;

            if (typeInfo == null)
            {
                return;
            }

            var enumsArray             = new OpenApiArray();
            var enumsDescriptionsArray = new OpenApiArray();

            if (typeInfo.IsEnum)
            {
                var names = Enum.GetNames(typeInfo).Select(name => new OpenApiString(name));
                enumsArray.AddRange(names);
                if (!parameter.Extensions.ContainsKey("x-enumNames") && enumsArray.Any())
                {
                    parameter.Extensions.Add("x-enumNames", enumsArray);
                }

                if (this._includeXEnumDescriptions)
                {
                    enumsDescriptionsArray.AddRange(EnumTypeExtensions.GetEnumValuesDescription(typeInfo, this._descriptionSources, this._xmlNavigators, this._includeXEnumRemarks));
                    if (!parameter.Extensions.ContainsKey("x-enumDescriptions") && enumsDescriptionsArray.Any())
                    {
                        parameter.Extensions.Add("x-enumDescriptions", enumsDescriptionsArray);
                    }
                }
            }
            else if (typeInfo.IsGenericType && !parameter.Extensions.ContainsKey("x-enumNames"))
            {
                foreach (var genericArgumentType in typeInfo.GetGenericArguments())
                {
                    if (genericArgumentType.IsEnum)
                    {
                        var names = Enum.GetNames(genericArgumentType).Select(name => new OpenApiString(name));
                        enumsArray.AddRange(names);
                        if (!parameter.Extensions.ContainsKey("x-enumNames") && enumsArray.Any())
                        {
                            parameter.Extensions.Add("x-enumNames", enumsArray);
                        }

                        if (this._includeXEnumDescriptions)
                        {
                            enumsDescriptionsArray.AddRange(EnumTypeExtensions.GetEnumValuesDescription(genericArgumentType, this._descriptionSources, this._xmlNavigators, this._includeXEnumRemarks));
                            if (!parameter.Extensions.ContainsKey("x-enumDescriptions") && enumsDescriptionsArray.Any())
                            {
                                parameter.Extensions.Add("x-enumDescriptions", enumsDescriptionsArray);
                            }
                        }
                    }
                }
            }
        }
コード例 #4
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var typeInfo   = context.ParameterInfo?.ParameterType ?? context.PropertyInfo.PropertyType;
            var enumsArray = new OpenApiArray();

            if (typeInfo.IsEnum)
            {
                var names = Enum.GetNames(typeInfo).Select(name => new OpenApiString(name));
                enumsArray.AddRange(names);
                if (!parameter.Extensions.ContainsKey("x-enumNames") && enumsArray.Any())
                {
                    parameter.Extensions.Add("x-enumNames", enumsArray);
                }
            }
            else if (typeInfo.IsGenericType && !parameter.Extensions.ContainsKey("x-enumNames"))
            {
                foreach (var genericArgumentType in typeInfo.GetGenericArguments())
                {
                    if (genericArgumentType.IsEnum)
                    {
                        var names = Enum.GetNames(genericArgumentType).Select(name => new OpenApiString(name));
                        enumsArray.AddRange(names);
                        if (!parameter.Extensions.ContainsKey("x-enumNames") && enumsArray.Any())
                        {
                            parameter.Extensions.Add("x-enumNames", enumsArray);
                        }
                    }
                }
            }
        }
コード例 #5
0
        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);
            }

            var exampleNode = propertyNode.SelectSingleNode("example");

            if (exampleNode != null)
            {
                var exampleAsJson = (parameter.Schema?.ResolveType(context.SchemaRepository) == "string")
                    ? $"\"{exampleNode.InnerXml}\""
                    : exampleNode.InnerXml;

                parameter.Example = OpenApiAnyFactory.CreateFromJson(exampleAsJson);
            }
        }
コード例 #6
0
 /// <inheritdoc/>
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     //
     // fix current bug where properties are not added correctly
     // Lookup property schema in schema repo
     //
     if (context.PropertyInfo != null)
     {
         // Query was passed a parameter with properties
         var propertySchema = context.SchemaRepository.Schemas
                              .Where(p => p.Key.EqualsIgnoreCase(context.ParameterInfo.ParameterType.Name))
                              .SelectMany(p => p.Value.Properties)
                              .Where(p => p.Key.EqualsIgnoreCase(context.PropertyInfo.Name))
                              .FirstOrDefault();
         if (propertySchema.Value != null)
         {
             // Replace parameter definition with property schema
             parameter.Name = propertySchema.Key;
             // Quick and dirty clone of the schema for the parameter
             parameter.Schema = JsonConvertEx.DeserializeObject <OpenApiSchema>(
                 JsonConvertEx.SerializeObject(propertySchema.Value));
         }
         parameter.Required = context.PropertyInfo
                              .GetCustomAttributes(typeof(RequiredAttribute), true)
                              .Any();
         AdjustSchema(context.PropertyInfo.PropertyType, parameter.Schema);
     }
     else if (context.ParameterInfo != null)
     {
         // Query was passed a parameter with properties
         AdjustSchema(context.ParameterInfo.ParameterType, parameter.Schema);
     }
 }
コード例 #7
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            if (_swaggerOptions.Schema.NameAndOrderRequestBody)
            {
                // Explicitly specify parameters position
                // Position for store and language is unknown and they should be last, so use int.MaxValue relative values
                if (context.ParameterInfo != null)
                {
                    parameter.Extensions.Add("x-position", new OpenApiInteger(context.ParameterInfo.Position));
                }
                else
                {
                    switch (parameter.Name)
                    {
                    case "store":
                        parameter.Extensions.Add("x-position", new OpenApiInteger(int.MaxValue - 1));
                        break;

                    case "language":
                        parameter.Extensions.Add("x-position", new OpenApiInteger(int.MaxValue));
                        break;
                    }
                }
            }
        }
コード例 #8
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            if (parameter == null)
            {
                throw new ArgumentNullException("parameter");
            }

            if (context == null)
            {
                throw new ArgumentNullException("context");
            }

            var paramType = context?.ParameterInfo?.ParameterType;

            if (paramType == default)
            {
                return;
            }
            if (paramType.IsEnum && paramType.GetCustomAttribute <EnumMemberAttribute>() != null)
            {
                //parameter.Extensions.Add("x-ms-enum", new
                //{
                //    name = paramType.Name,
                //    modelAsString = false,
                //    values = paramType.GetFields(BindingFlags.Static | BindingFlags.Public).Select(x =>
                //    {
                //        var enumMemberAttribute = x.GetCustomAttribute<EnumMemberAttribute>();
                //        return new
                //        {
                //            name = x.Name,
                //            value = enumMemberAttribute.Value,
                //            description = enumMemberAttribute.Value
                //        };
                //    })
                //});
            }

            if ((paramType.IsGenericType &&
                 paramType.GetGenericTypeDefinition() == typeof(Nullable <>) &&
                 paramType.GetGenericArguments()[0].IsEnum))
            {
                var realType = paramType.GetGenericArguments()[0];
                //parameter.Extensions.Add("x-ms-enum", new
                //{
                //    name = realType.Name,
                //    modelAsString = false,
                //    values = realType.GetFields(BindingFlags.Static | BindingFlags.Public).Select(x =>
                //    {
                //        var enumMemberAttribute = x.GetCustomAttribute<EnumMemberAttribute>();
                //        return new
                //        {
                //            name = x.Name,
                //            value = enumMemberAttribute.Value,
                //            description = enumMemberAttribute.Value
                //        };
                //    })
                //});
            }
        }
コード例 #9
0
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     if (context.PropertyInfo == null &&
         context.ApiParameterDescription.RouteInfo?.Constraints != null &&
         context.ApiParameterDescription.RouteInfo.Constraints.Any(c => c is GuidRouteConstraint))
     {
         parameter.Schema.Format = "uuid";
     }
 }
コード例 #10
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var enumType = TryGetEnumType(context.ApiParameterDescription);

            if (enumType != null)
            {
                XmsEnumExtensionApplicator.Apply(parameter.Extensions, enumType, _options);
            }
        }
コード例 #11
0
        public void Apply(IParameter parameter, ParameterFilterContext context)
        {
            var type = context.ApiParameterDescription.Type;

            if (type.IsEnum)
            {
                parameter.Extensions.Add("x-ms-enum", new { name = type.Name, modelAsString = true });
            }
        }
コード例 #12
0
 public void Apply(IParameter parameter, ParameterFilterContext context)
 {
     if (this.options.GrainInterfaceGrainKeyAsName.TryGetValue(context.ParameterInfo.Member.DeclaringType, out GrainKeyDescription keyDescription))
     {
         if (context.ParameterInfo.Name == keyDescription.Name)
         {
             parameter.Description = keyDescription.Description;
         }
     }
 }
コード例 #13
0
 /// <summary>
 /// 应用参数过滤器
 /// </summary>
 /// <param name="parameter"></param>
 /// <param name="context"></param>
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     if (context.ApiParameterDescription.DefaultValue == null)
     {
         if (context.ApiParameterDescription.Type.CanBeNullValue() == false)
         {
             parameter.Required = true;
         }
     }
 }
コード例 #14
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            if (context.ParameterInfo == null)
            {
                return;
            }

            var customAttributes = context.ParameterInfo.GetCustomAttributes(true);

            ApplySwaggerParameterAttribute(parameter, customAttributes);
        }
コード例 #15
0
        public void Apply(IParameter parameter, ParameterFilterContext context)
        {
            var parameterType     = context.ApiParameterDescription.Type;
            var paramDefaultValue = context.ApiParameterDescription.DefaultValue;

            if (paramDefaultValue != null && parameterType.IsEnum)
            {
                var partialSchema = parameter as PartialSchema;
                partialSchema.Default = Enum.GetName(parameterType, paramDefaultValue);
            }
        }
コード例 #16
0
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     if (context.PropertyInfo != null)
     {
         ApplyPropertyAnnotations(parameter, context.PropertyInfo);
     }
     else if (context.ParameterInfo != null)
     {
         ApplyParamAnnotations(parameter, context.ParameterInfo);
     }
 }
コード例 #17
0
 public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
 {
     if (parameter.In != null && parameter.Schema == null)
     {
         var type = context.ApiParameterDescription.Type;
         if (type.IsEnum && !context.SchemaRepository.Schemas.ContainsKey(context.ApiParameterDescription.Type.Name))
         {
             parameter.Schema = context.SchemaRepository.AddDefinition(context.ApiParameterDescription.Type.Name,
                                                                       context.SchemaGenerator.GenerateSchema(context.ApiParameterDescription.Type, context.SchemaRepository));
         }
     }
 }
コード例 #18
0
        public void Apply_SetsDescription_FromPropertySummaryTag()
        {
            var parameter               = new OpenApiParameter();
            var propertyInfo            = typeof(XmlAnnotatedType).GetProperty(nameof(XmlAnnotatedType.StringProperty));
            var apiParameterDescription = new ApiParameterDescription {
            };
            var filterContext           = new ParameterFilterContext(apiParameterDescription, null, null, propertyInfo: propertyInfo);

            Subject().Apply(parameter, filterContext);

            Assert.Equal("Summary for StringProperty", parameter.Description);
        }
コード例 #19
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var type = context.ParameterInfo.ParameterType;

            type.ApplyPrimitiveExtensions(parameter.Extensions);

            var members = type.ApplyEnumExtensions(parameter.Extensions, context.SchemaGenerator, context.SchemaRepository);

            if (members != null)
            {
                parameter.Description = members.Describe();
            }
        }
コード例 #20
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            if (parameter.Name.Equals("event", StringComparison.InvariantCultureIgnoreCase))
            {
                using (var scope = _serviceScopeFactory.CreateScope())
                {
                    var eventsService           = scope.ServiceProvider.GetRequiredService <IEventsService>();
                    IEnumerable <String> events = eventsService.GetEvents().Result.Select(t => t.FullName);

                    parameter.Schema.Enum = events.Select(e => new OpenApiString(e)).ToList <IOpenApiAny>();
                }
            }
        }
コード例 #21
0
 public void Apply(IParameter parameter, ParameterFilterContext context)
 {
     if (parameter is NonBodyParameter nonBodyParameter && string.IsNullOrEmpty(nonBodyParameter.Type))
     {
         var type = context.ApiParameterDescription.Type;
         if (type.IsEnum)
         {
             nonBodyParameter.Type = "string";
             var schema = context.SchemaRegistry.GetOrRegister(context.ApiParameterDescription.Type);
             nonBodyParameter.Extensions.Add("schema", schema);
         }
     }
 }
        /// <summary>
        /// 重写操作处理
        /// </summary>
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var type = context.ParameterInfo?.ParameterType;

            if (type == null)
            {
                return;
            }
            if (type.IsEnum)
            {
                parameter.Description = $"{parameter.Description}{Environment.NewLine}{FormatDescription(type)}";
            }
        }
コード例 #23
0
        /// <summary>
        /// 申请
        /// </summary>
        /// <param name="parameter">参数</param>
        /// <param name="context">上下文</param>
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var apiProperty      = context.PropertyInfo;
            var memberAttributes = apiProperty?.GetInlineOrMetadataTypeAttributes() ?? Enumerable.Empty <object>();

            foreach (var attribute in memberAttributes)
            {
                if (attribute is DataTypeAttribute dataTypeAttribute && !string.IsNullOrWhiteSpace(dataTypeAttribute.CustomDataType))
                {
                    parameter.Schema.Format = dataTypeAttribute.CustomDataType;
                }
            }
        }
コード例 #24
0
        public void Apply_SetsDescription_FromUnderlyingGenericTypeActionParamTag()
        {
            var parameter     = new OpenApiParameter();
            var parameterInfo = typeof(FakeConstructedControllerWithXmlComments)
                                .GetMethod(nameof(FakeConstructedControllerWithXmlComments.ActionWithGenericTypeParameter))
                                .GetParameters()[0];
            var apiParameterDescription = new ApiParameterDescription {
            };
            var filterContext           = new ParameterFilterContext(apiParameterDescription, null, null, parameterInfo: parameterInfo);

            Subject().Apply(parameter, filterContext);

            Assert.Equal("Description for param", parameter.Description);
        }
コード例 #25
0
        public void Apply_EnrichesParameterMetadata_IfPropertyDecoratedWithSwaggerParameterAttribute()
        {
            var parameter     = new OpenApiParameter();
            var propertyInfo  = typeof(SwaggerAnnotatedType).GetProperty(nameof(SwaggerAnnotatedType.StringWithSwaggerParameterAttribute));
            var filterContext = new ParameterFilterContext(
                apiParameterDescription: new ApiParameterDescription(),
                schemaGenerator: null,
                schemaRepository: null,
                propertyInfo: propertyInfo);

            Subject().Apply(parameter, filterContext);

            Assert.Equal("Description for StringWithSwaggerParameterAttribute", parameter.Description);
            Assert.True(parameter.Required);
        }
コード例 #26
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var type = Nullable.GetUnderlyingType(context.ApiParameterDescription.Type) ?? context.ApiParameterDescription.Type;

            if (type.IsEnum)
            {
                AddEnumParamSpec(parameter, type, context);
                parameter.Required = type == context.ApiParameterDescription.Type;
            }
            else if (type.IsArray || (type.IsGenericType && type.GetInterfaces().Contains(typeof(IEnumerable))))
            {
                var itemType = type.GetElementType() ?? type.GenericTypeArguments.First();
                AddEnumSpec(parameter, itemType, context);
            }
        }
コード例 #27
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var type = context.ParameterInfo.ParameterType.UnwrapIfNullable();

            if (!type.IsEnum)
            {
                return;
            }

            // TODO (2020-02-14): Need this hack to work around a serialize issue with the V2 format.
            parameter.Extensions["schema"] = new OpenApiObject
            {
                ["$ref"] = new OpenApiString("#/definitions/" + type.FullName),
            };
        }
コード例 #28
0
        public void Apply(IParameter parameter, ParameterFilterContext context)
        {
            var type = Nullable.GetUnderlyingType(context.ApiParameterDescription.Type) ?? context.ApiParameterDescription.Type;

            if (type.IsEnum)
            {
                AddRef(parameter.Extensions, type, context.SchemaRegistry);
                parameter.Required = type == context.ApiParameterDescription.Type;
            }
            else if (parameter is NonBodyParameter nonBodyParam && (type.IsArray || (type.IsGenericType && type.GetInterfaces().Contains(typeof(IEnumerable)))))
            {
                var itemType = type.GetElementType() ?? type.GenericTypeArguments.First();
                AddRef(nonBodyParam.Items.Extensions, itemType, context.SchemaRegistry);
            }
        }
コード例 #29
0
        public void Apply(OpenApiParameter parameter, ParameterFilterContext context)
        {
            var type = context.ApiParameterDescription.Type;

            if (type.IsEnum)
            {
                // parameter.Extensions.Add( "x-ms-enum", new { name = type.Name, modelAsString = false });
                var obj = new OpenApiObject
                {
                    ["name"]          = new OpenApiString(type.Name),
                    ["modelAsString"] = new OpenApiBoolean(false)
                };
                parameter.Extensions.Add("x-ms-enum", obj);
            }
        }
コード例 #30
0
        private static void AddEnumParamSpec(OpenApiParameter parameter, Type type, ParameterFilterContext context)
        {
            var schema = context.SchemaGenerator.GenerateSchema(type, context.SchemaRepository);

            if (schema.Reference == null)
            {
                return;
            }

            parameter.Schema = schema;

            var enumNames = new OpenApiArray();

            enumNames.AddRange(Enum.GetNames(type).Select(_ => new OpenApiString(_)));
            schema.Extensions.Add("x-enumNames", enumNames);
        }