internal static void ResolveOperations(this SwaggerService swaggerService, ref SwaggerOperations swaggerOperations, ref SwaggerParserContext context) { if (swaggerOperations.Ref != null) { const string refPrefix = "#/paths/"; if (!swaggerOperations.Ref.StartsWith(refPrefix, StringComparison.Ordinal)) { throw new ServiceDefinitionException("Operations $ref must start with '#/paths/'.", context.CreatePosition()); } string name = UnescapeRefPart(swaggerOperations.Ref.Substring(refPrefix.Length)); if (!swaggerService.Paths.TryGetValue(name, out swaggerOperations)) { throw new ServiceDefinitionException($"Missing path named '{name}'.", context.CreatePosition()); } context = context.Root.CreateContext("paths/" + name); } }
private static void AddMethodToPaths(IDictionary <string, SwaggerOperations> paths, ServiceInfo service, HttpMethodInfo httpMethodInfo) { var methodInfo = httpMethodInfo.ServiceMethod; SwaggerOperations operations; if (!paths.TryGetValue(httpMethodInfo.Path, out operations)) { paths[httpMethodInfo.Path] = operations = new SwaggerOperations(); } var operation = new SwaggerOperation { Summary = GetSummaryOrNull(methodInfo), Description = GetRemarksOrNull(methodInfo), OperationId = methodInfo.Name, Deprecated = GetObsoleteOrNull(methodInfo), }; if (httpMethodInfo.RequestNormalFields.Count != 0 || httpMethodInfo.RequestBodyField != null) { operation.Consumes = new[] { "application/json" } } ; if (httpMethodInfo.ValidResponses.Any(x => (x.NormalFields != null && x.NormalFields.Count != 0) || (x.BodyField != null && service.GetFieldType(x.BodyField.ServiceField).Kind != ServiceTypeKind.Boolean))) { operation.Produces = new[] { "application/json" } } ; var parameters = new List <SwaggerParameter>(); foreach (var httpPathInfo in httpMethodInfo.PathFields) { parameters.Add(CreateSwaggerParameter(service, httpPathInfo.ServiceField, SwaggerParameterKind.Path, httpPathInfo.Name)); } foreach (var httpQueryInfo in httpMethodInfo.QueryFields) { parameters.Add(CreateSwaggerParameter(service, httpQueryInfo.ServiceField, SwaggerParameterKind.Query, httpQueryInfo.Name)); } foreach (var httpHeaderInfo in httpMethodInfo.RequestHeaderFields) { parameters.Add(CreateSwaggerParameter(service, httpHeaderInfo.ServiceField, SwaggerParameterKind.Header, httpHeaderInfo.Name)); } var requestBodyFieldType = httpMethodInfo.RequestBodyField == null ? null : service.GetFieldType(httpMethodInfo.RequestBodyField.ServiceField); if (requestBodyFieldType != null && requestBodyFieldType.Kind != ServiceTypeKind.Boolean) { parameters.Add(CreateSwaggerRequestBodyParameter(requestBodyFieldType, "request", httpMethodInfo.RequestBodyField.ServiceField.Summary)); } else if (httpMethodInfo.RequestNormalFields.Count != 0) { parameters.Add(CreateSwaggerRequestBodyParameter(TryCreateMethodRequestBodyType(httpMethodInfo), "request")); } if (parameters.Count != 0) { operation.Parameters = parameters; } var responses = new OurDictionary <string, SwaggerResponse>(); foreach (var validResponse in httpMethodInfo.ValidResponses) { string statusCodeString = ((int)validResponse.StatusCode).ToString(CultureInfo.InvariantCulture); var bodyField = validResponse.BodyField; var bodyFieldType = bodyField == null ? null : service.GetFieldType(bodyField.ServiceField); if (bodyField != null) { responses[statusCodeString] = CreateSwaggerResponse(bodyFieldType, bodyField.ServiceField.Name, bodyField.ServiceField.Summary); } else if (validResponse.NormalFields != null && validResponse.NormalFields.Count != 0) { responses[statusCodeString] = CreateSwaggerResponse(TryCreateMethodResponseBodyType(httpMethodInfo, validResponse)); } else { responses[statusCodeString] = CreateSwaggerResponse(); } } operation.Responses = responses; string httpMethod = httpMethodInfo.Method.ToString().ToLowerInvariant(); switch (httpMethod) { case "get": operations.Get = operation; break; case "post": operations.Post = operation; break; case "put": operations.Put = operation; break; case "delete": operations.Delete = operation; break; case "options": operations.Options = operation; break; case "head": operations.Head = operation; break; case "patch": operations.Patch = operation; break; default: throw new InvalidOperationException("Unexpected HTTP method: " + httpMethod); } }