private Operation CreateOperation(
            ApiDescription apiDescription,
            ISchemaRegistry schemaRegistry)
        {
            var operation = new Operation
            {
                Tags        = new[] { _settings.TagSelector(apiDescription) },
                OperationId = apiDescription.FriendlyId(),
                Consumes    = apiDescription.SupportedRequestMediaTypes().ToList(),
                Produces    = apiDescription.SupportedResponseMediaTypes().ToList(),
                Parameters  = CreateParameters(apiDescription, schemaRegistry),
                Responses   = CreateResponses(apiDescription, schemaRegistry),
                Deprecated  = apiDescription.IsObsolete() ? true : (bool?)null
            };

            var filterContext = new OperationFilterContext(
                apiDescription,
                schemaRegistry);

            foreach (var filter in _settings.OperationFilters)
            {
                filter.Apply(operation, filterContext);
            }

            return(operation);
        }
        private Operation CreateOperation(ApiDescription apiDescription, ISchemaRegistry schemaRegistry)
        {
            var parameters = apiDescription.ParameterDescriptions
                             .Where(paramDesc =>
            {
                return(paramDesc.Source.IsFromRequest &&
                       (paramDesc.ModelMetadata == null || paramDesc.ModelMetadata.IsBindingAllowed) &&
                       !paramDesc.IsPartOfCancellationToken());
            })
                             .Select(paramDesc => CreateParameter(apiDescription, paramDesc, schemaRegistry))
                             .ToList();

            var responses = apiDescription.SupportedResponseTypes
                            .DefaultIfEmpty(new ApiResponseType {
                StatusCode = 200
            })
                            .ToDictionary(
                apiResponseType => apiResponseType.StatusCode.ToString(),
                apiResponseType => CreateResponse(apiResponseType, schemaRegistry)
                );

            var operation = new Operation
            {
                Tags        = new[] { _settings.TagSelector(apiDescription) },
                OperationId = apiDescription.FriendlyId(),
                Consumes    = apiDescription.SupportedRequestMediaTypes().ToList(),
                Produces    = apiDescription.SupportedResponseMediaTypes().ToList(),
                Parameters  = parameters.Any() ? parameters : null, // parameters can be null but not empty
                Responses   = responses,
                Deprecated  = apiDescription.IsObsolete() ? true : (bool?)null
            };

            var filterContext = new OperationFilterContext(
                apiDescription,
                schemaRegistry);

            foreach (var filter in _settings.OperationFilters)
            {
                filter.Apply(operation, filterContext);
            }

            return(operation);
        }
        private Operation CreateOperation(
            ApiDescription apiDescription,
            ISchemaRegistry schemaRegistry)
        {
            // Try to retrieve additional metadata that's not provided by ApiExplorer
            MethodInfo methodInfo;

            var customAttributes = Enumerable.Empty <object>();

            if (apiDescription.TryGetMethodInfo(out methodInfo))
            {
                customAttributes = methodInfo.GetCustomAttributes(true)
                                   .Union(methodInfo.DeclaringType.GetTypeInfo().GetCustomAttributes(true));
            }

            var isDeprecated = customAttributes.Any(attr => attr.GetType() == typeof(ObsoleteAttribute));

            var operation = new Operation
            {
                Tags        = new[] { _settings.TagSelector(apiDescription) },
                OperationId = apiDescription.FriendlyId(),
                Consumes    = apiDescription.SupportedRequestMediaTypes().ToList(),
                Produces    = apiDescription.SupportedResponseMediaTypes().ToList(),
                Parameters  = CreateParameters(apiDescription, schemaRegistry),
                Responses   = CreateResponses(apiDescription, schemaRegistry),
                Deprecated  = isDeprecated ? true : (bool?)null
            };

            var filterContext = new OperationFilterContext(
                apiDescription,
                schemaRegistry,
                methodInfo);

            foreach (var filter in _settings.OperationFilters)
            {
                filter.Apply(operation, filterContext);
            }

            return(operation);
        }