/// <summary> /// Creates a new <see cref="IActionMethodDefinition"/> in the context of <paramref name="controllerDefinition"/> /// for <paramref name="method"/>. /// </summary> /// <param name="controllerDefinition">The controller definition in which the method is found.</param> /// <param name="method">The method for which to create a definition.</param> /// <returns>A new <see cref="IActionMethodDefinition"/> instance.</returns> public IActionMethodDefinition Create(IControllerDefinition controllerDefinition, MethodInfo method) { if (controllerDefinition == null) { throw new ArgumentNullException("controllerDefinition"); } if (method == null) { throw new ArgumentNullException("method"); } var definition = new ActionMethodDefinition(); definition.Name = method.GetProxyName(); definition.Type = GetMethodType(method); definition.Url = GetUrl(controllerDefinition, GetExplicitActionName(method) ?? method.Name.ToLower()); var index = 0; var parameters = method.GetParameters(); foreach (var param in parameters) { var record = new ParameterDefinition { Index = index, Name = param.Name, Type = param.ParameterType }; if (param.HasAttribute <FromUriAttribute>()) { definition.UrlParameters.Add(record); } else if (param.HasAttribute <FromBodyAttribute>()) { definition.BodyParameter = record; } else if (definition.Type == HttpVerbs.Get) { definition.UrlParameters.Add(record); } else if (definition.Type == HttpVerbs.Post && parameters.Length == 1) { definition.BodyParameter = record; } else { definition.UrlParameters.Add(record); } index++; } return(definition); }
private ActionMethodDefinition CreateActionMethodDefinition(ApiDescription apiDescription) { //var groupName = _options.GroupNameSelector(apiDescription); var parameters = apiDescription.ParameterDescriptions .Where(paramDesc => paramDesc.Source.IsFromRequest) .Select(paramDesc => CreateParameterDefinition(paramDesc)) .ToList(); //var responses = apiDescription.SupportedResponseTypes // .DefaultIfEmpty(new ApiResponseType { StatusCode = 200 }) // .ToDictionary( // apiResponseType => apiResponseType.StatusCode.ToString(), // apiResponseType => CreateResponse(apiResponseType) // ); var action = ((Microsoft.AspNetCore.Mvc.Controllers.ControllerActionDescriptor)apiDescription.ActionDescriptor); var actionMethodDefinition = new ActionMethodDefinition { Name = action.ActionName, BodyParameter = parameters.SingleOrDefault(_ => _.Source == "body"), //Tags = (groupName != null) ? new[] { groupName } : null, Description = apiDescription.ActionDescriptor.DisplayName, //OperationId = apiDescription.FriendlyId(), //Consumes = apiDescription.SupportedRequestMediaTypes().ToList(), ReturnType = apiDescription.SupportedResponseTypes.FirstOrDefault()?.Type.ToString(), Url = apiDescription.RelativePath, UrlParameters = parameters.Any() ? parameters : new List <ParameterDefinition>(), Type = action.MethodInfo.DeclaringType.ToString() // Produces = apiDescription.SupportedResponseMediaTypes().ToList(), // Parameters = parameters.Any() ? parameters : null, // parameters can be null but not empty // Responses = responses, // Deprecated = apiDescription.IsObsolete() }; //var filterContext = new OperationFilterContext(apiDescription, schemaRegistry); //foreach (var filter in _options.OperationFilters) //{ // filter.Apply(actionMethodDefinition, filterContext); //} return(actionMethodDefinition); }