public void Apply( ApiDescription apiDescription, OperationSpec operationSpec, ModelSpecRegistrar modelSpecRegistrar, ModelSpecGenerator modelSpecGenerator) { var responseTypeAttr = apiDescription.ActionDescriptor.GetCustomAttributes<ResponseTypeAttribute>().FirstOrDefault(); if (responseTypeAttr == null) return; IEnumerable<ModelSpec> complexSpecs; var modelSpec = modelSpecGenerator.TypeToModelSpec(responseTypeAttr.Type, out 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; } modelSpecRegistrar.RegisterMany(complexSpecs); }
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 OperationSpec From(ApiDescription apiDescription, ModelSpecRegistrar modelSpecRegistrar) { var apiPath = apiDescription.RelativePath.Split('?').First(); var paramSpecs = apiDescription.ParameterDescriptions .Select(paramDesc => CreateParameterSpec(paramDesc, apiPath, modelSpecRegistrar)) .ToList(); var operationSpec = new OperationSpec { Method = apiDescription.HttpMethod.Method, Nickname = String.Format("{0}_{1}", apiDescription.ActionDescriptor.ControllerDescriptor.ControllerName, apiDescription.ActionDescriptor.ActionName), Summary = apiDescription.Documentation, Parameters = paramSpecs, ResponseMessages = new List<ResponseMessageSpec>() }; var returnType = apiDescription.ActionDescriptor.ReturnType; if (returnType == null) { operationSpec.Type = "void"; } else { var modelSpec = _modelSpecGenerator.From(returnType, modelSpecRegistrar); 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; }
private ApiSpec CreateApiSpec(IGrouping<string, ApiDescription> apiDescriptionGroup, ModelSpecRegistrar modelSpecRegistrar) { var operationSpecs = apiDescriptionGroup .Select(apiDesc => _operationSpecGenerator.From(apiDesc, modelSpecRegistrar)) .ToList(); return new ApiSpec { Path = "/" + apiDescriptionGroup.Key.Split('?').First(), Operations = operationSpecs }; }
private ApiSpec CreateApiSpec(IGrouping<string, ApiDescription> apiDescriptionGroup, ModelSpecRegistrar modelSpecRegistrar) { var operationSpecs = apiDescriptionGroup .Select(apiDesc => _operationSpecGenerator.ApiDescriptionToOperationSpec(apiDesc, modelSpecRegistrar)) .OrderBy(operationSpec => operationSpec.Method) .ToList(); return new ApiSpec { Path = "/" + apiDescriptionGroup.Key, Operations = operationSpecs }; }
private ApiDeclaration CreateDeclaration(IGrouping<string, ApiDescription> apiDescriptionGroup) { var modelSpecRegistrar = new ModelSpecRegistrar(); // Group further by relative path - each group corresponds to an ApiSpec var apiSpecs = apiDescriptionGroup .GroupBy(apiDesc => apiDesc.RelativePath) .Select(apiDescGrp => CreateApiSpec(apiDescGrp, modelSpecRegistrar)) .ToList(); return new ApiDeclaration { ApiVersion = "1.0", SwaggerVersion = SwaggerVersion, BasePath = _basePathResolver().TrimEnd('/'), ResourcePath = apiDescriptionGroup.Key, Apis = apiSpecs, Models = modelSpecRegistrar.ToDictionary() }; }
private ApiDeclaration CreateDeclaration(IGrouping <string, ApiDescription> apiDescriptionGroup) { var modelSpecRegistrar = new ModelSpecRegistrar(); // Group further by relative path - each group corresponds to an ApiSpec var apiSpecs = apiDescriptionGroup .GroupBy(apiDesc => apiDesc.RelativePathSansQueryString()) .Select(apiDescGrp => CreateApiSpec(apiDescGrp, modelSpecRegistrar)) .OrderBy(apiSpec => apiSpec.Path) .ToList(); return(new ApiDeclaration { ApiVersion = _config.ApiVersion, SwaggerVersion = SwaggerVersion, BasePath = _config.BasePathResolver().TrimEnd('/'), ResourcePath = apiDescriptionGroup.Key, Apis = apiSpecs, Models = modelSpecRegistrar.ToDictionary() }); }
public ModelSpec From(Type type, ModelSpecRegistrar modelSpecRegistrar) { // Complex types are deferred, track progress var deferredMappings = new Dictionary<Type, ModelSpec>(); var rootSpec = CreateSpecFor(type, false, deferredMappings); // All complex specs (including root) should be added to the registrar if (rootSpec.Type == "object") modelSpecRegistrar.Register(rootSpec); while (deferredMappings.ContainsValue(null)) { var deferredType = deferredMappings.First(kvp => kvp.Value == null).Key; var spec = CreateSpecFor(deferredType, false, deferredMappings); deferredMappings[deferredType] = spec; modelSpecRegistrar.Register(spec); } return rootSpec; }
private ParameterSpec CreateParameterSpec(ApiParameterDescription apiParamDesc, string apiPath, ModelSpecRegistrar modelSpecRegistrar) { var paramType = ""; switch (apiParamDesc.Source) { case ApiParameterSource.FromBody: paramType = "body"; break; case ApiParameterSource.FromUri: paramType = apiPath.Contains(apiParamDesc.Name) ? "path" : "query"; break; } var paramSpec = new ParameterSpec { ParamType = paramType, Name = apiParamDesc.Name, Description = apiParamDesc.Documentation, Required = !apiParamDesc.ParameterDescriptor.IsOptional }; var modelSpec = _modelSpecGenerator.From(apiParamDesc.ParameterDescriptor.ParameterType, modelSpecRegistrar); if (modelSpec.Type == "object") { paramSpec.Type = modelSpec.Id; } else { paramSpec.Type = modelSpec.Type; paramSpec.Format = modelSpec.Format; paramSpec.Items = modelSpec.Items; paramSpec.Enum = modelSpec.Enum; } return paramSpec; }
private ApiSpec CreateApiSpec(IGrouping <string, ApiDescription> apiDescriptionGroup, ModelSpecRegistrar modelSpecRegistrar) { var operationSpecs = apiDescriptionGroup .Select(apiDesc => _operationSpecGenerator.ApiDescriptionToOperationSpec(apiDesc, modelSpecRegistrar)) .OrderBy(operationSpec => operationSpec.Method) .ToList(); return(new ApiSpec { Path = "/" + apiDescriptionGroup.Key, Operations = operationSpecs }); }
public ModelSpecMap(ModelSpecRegistrar modelSpecRegistrar, ModelSpecGenerator modelSpecGenerator) { _modelSpecRegistrar = modelSpecRegistrar; _modelSpecGenerator = modelSpecGenerator; }
private ParameterSpec CreateParameterSpec(ApiParameterDescription apiParamDesc, string apiPath, ModelSpecRegistrar modelSpecRegistrar) { var paramType = ""; switch (apiParamDesc.Source) { case ApiParameterSource.FromBody: paramType = "body"; break; case ApiParameterSource.FromUri: paramType = apiPath.Contains(String.Format("{{{0}}}", apiParamDesc.Name)) ? "path" : "query"; break; } var paramSpec = new ParameterSpec { ParamType = paramType, Name = apiParamDesc.Name, Description = apiParamDesc.Documentation, Required = !apiParamDesc.ParameterDescriptor.IsOptional }; IEnumerable <ModelSpec> complexSpecs; var modelSpec = _modelSpecGenerator.TypeToModelSpec(apiParamDesc.ParameterDescriptor.ParameterType, out complexSpecs); modelSpecRegistrar.RegisterMany(complexSpecs); if (modelSpec.Type == "object") { paramSpec.Type = modelSpec.Id; } else { paramSpec.Type = modelSpec.Type; paramSpec.Format = modelSpec.Format; paramSpec.Items = modelSpec.Items; paramSpec.Enum = modelSpec.Enum; } return(paramSpec); }
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); }