public OperationSpec ApiDescriptionToOperationSpec(ApiDescription apiDescription, ModelSpecRegistrar modelSpecRegistrar) { var apiPath = apiDescription.RelativePathSansQueryString(); var paramSpecs = apiDescription.ParameterDescriptions .Select(paramDesc => CreateParameterSpec(paramDesc, apiPath, modelSpecRegistrar)) .ToList(); var operationSpec = new OperationSpec { Method = apiDescription.HttpMethod.Method, Nickname = apiDescription.Nickname(), Summary = apiDescription.Documentation, Parameters = paramSpecs, ResponseMessages = new List<ResponseMessageSpec>() }; var returnType = apiDescription.ActionDescriptor.ReturnType; if (returnType == null) { operationSpec.Type = "void"; } else { IEnumerable<ModelSpec> complexSpecs; var modelSpec = _modelSpecGenerator.TypeToModelSpec(returnType, out complexSpecs); modelSpecRegistrar.RegisterMany(complexSpecs); if (modelSpec.Type == "object") { operationSpec.Type = modelSpec.Id; } else { operationSpec.Type = modelSpec.Type; operationSpec.Format = modelSpec.Format; operationSpec.Items = modelSpec.Items; operationSpec.Enum = modelSpec.Enum; } } foreach (var filter in _operationFilters) { filter.Apply(apiDescription, operationSpec, modelSpecRegistrar, _modelSpecGenerator); } // IOperationSpecFilter is obsolete - below is for back-compat var modelSpecMap = new ModelSpecMap(modelSpecRegistrar, _modelSpecGenerator); foreach (var filter in _operationSpecFilters) { filter.Apply(apiDescription, operationSpec, modelSpecMap); } return operationSpec; }
public Operation ApiDescriptionToOperation(ApiDescription apiDescription, Dictionary<string, DataType> complexModels) { var apiPath = apiDescription.RelativePathSansQueryString(); var parameters = apiDescription.ParameterDescriptions .Select(paramDesc => CreateParameter(paramDesc, apiPath, complexModels)) .ToList(); var operation = new Operation { Method = apiDescription.HttpMethod.Method, Nickname = apiDescription.Nickname(), Summary = apiDescription.Documentation, Parameters = parameters, ResponseMessages = new List<ResponseMessage>() }; var responseType = apiDescription.ActualResponseType(); if (responseType == null) { operation.Type = "void"; } else { IDictionary<string, DataType> complexModelsForResponseType; var dataType = _dataTypeGenerator.TypeToDataType(responseType, out complexModelsForResponseType); complexModels.Merge(complexModelsForResponseType); if (dataType.Type == "object") { operation.Type = dataType.Id; } else { operation.Type = dataType.Type; operation.Format = dataType.Format; operation.Items = dataType.Items; operation.Enum = dataType.Enum; } } foreach (var filter in _operationFilters) { filter.Apply(operation, complexModels, _dataTypeGenerator, apiDescription); } return operation; }
public Operation ApiDescriptionToOperation(ApiDescription apiDescription) { var apiPath = apiDescription.RelativePathSansQueryString(); var parameters = apiDescription.ParameterDescriptions .Select(paramDesc => CreateParameter(paramDesc, apiPath)) .ToList(); var operation = new Operation { Method = apiDescription.HttpMethod.Method, Nickname = apiDescription.Nickname(), Summary = apiDescription.Documentation ?? "", Parameters = parameters, ResponseMessages = new List<ResponseMessage>(), Produces = apiDescription.SupportedResponseFormatters.SelectMany(d => d.SupportedMediaTypes.Select(t => t.MediaType)).ToList(), Consumes = apiDescription.SupportedRequestBodyFormatters.SelectMany(d => d.SupportedMediaTypes.Select(t => t.MediaType)).ToList() }; var responseType = apiDescription.ActualResponseType(); if (responseType == null) { operation.Type = "void"; } else { var dataType = _dataTypeRegistry.GetOrRegister(responseType); if (dataType.Type == "object") { operation.Type = dataType.Id; } else { operation.Type = dataType.Type; operation.Format = dataType.Format; operation.Items = dataType.Items; operation.Enum = dataType.Enum; } } foreach (var filter in _operationFilters) { filter.Apply(operation, _dataTypeRegistry, apiDescription); } return operation; }
private Operation CreateOperation(ApiDescription apiDescription, SchemaRegistry schemaRegistry) { var parameters = apiDescription.ParameterDescriptions .Select(paramDesc => { var inPath = apiDescription.RelativePathSansQueryString().Contains("{" + paramDesc.Name + "}"); return CreateParameter(paramDesc, inPath, schemaRegistry); }) .ToList(); var responses = new Dictionary<string, Response>(); var responseType = apiDescription.ResponseType(); if (responseType == null) responses.Add("204", new Response { description = "No Content" }); else responses.Add("200", new Response { description = "OK", schema = schemaRegistry.GetOrRegister(responseType) }); var operation = new Operation { tags = new [] { _options.GroupingKeySelector(apiDescription) }, operationId = apiDescription.FriendlyId(), produces = apiDescription.Produces().ToList(), consumes = apiDescription.Consumes().ToList(), parameters = parameters.Any() ? parameters : null, // parameters can be null but not empty responses = responses, deprecated = apiDescription.IsObsolete() }; foreach (var filter in _options.OperationFilters) { filter.Apply(operation, schemaRegistry, apiDescription); } return operation; }
private Operation CreateOperation(ApiDescription apiDescription, SchemaRegistry schemaRegistry) { Contract.Requires(apiDescription != null); Contract.Requires(schemaRegistry != null); Contract.Requires(apiDescription.ParameterDescriptions != null); var edmModel = ((ODataRoute)apiDescription.Route).GetEdmModel(); var parameters = apiDescription.ParameterDescriptions .Select(paramDesc => { var inPath = apiDescription.RelativePathSansQueryString().Contains("{" + paramDesc.Name + "}"); var swaggerApiParameterDescription = paramDesc as SwaggerApiParameterDescription; return swaggerApiParameterDescription != null ? CreateParameter(swaggerApiParameterDescription, inPath, schemaRegistry, edmModel) : CreateParameter(paramDesc, inPath, schemaRegistry, edmModel); }) .ToList(); var responses = new Dictionary<string, Response>(); var responseType = apiDescription.ResponseType(); if (responseType == null || responseType == typeof(void)) responses.Add("204", new Response { description = "No Content" }); else responses.Add("200", new Response { description = "OK", schema = schemaRegistry.GetOrRegisterResponseType(edmModel, responseType) }); var operation = new Operation { summary = apiDescription.Documentation, tags = new[] { _options.GroupingKeySelector(apiDescription) }, operationId = apiDescription.OperationId(), produces = apiDescription.Produces()?.ToList(), consumes = apiDescription.Consumes()?.ToList(), parameters = parameters.Any() ? parameters : null, // parameters can be null but not empty responses = responses, deprecated = apiDescription.IsObsolete() }; foreach (var filter in _options.OperationFilters) { Contract.Assume(filter != null); filter.Apply(operation, schemaRegistry, apiDescription); } return operation; }
private string GetParameterLocation(ApiDescription apiDesc, ApiParameterDescription paramDesc) { if (apiDesc.RelativePathSansQueryString().Contains("{" + paramDesc.Name + "}")) return "path"; else if (paramDesc.Source == ApiParameterSource.FromBody && apiDesc.HttpMethod != HttpMethod.Get) return "body"; else return "query"; }