예제 #1
0
        public Endpoint GenerateEndpoint(OpenApiEndpointModel inputModel,
                                         IObjectsProcessingKeyStore keyStore)
        {
            var output = new Endpoint()
            {
                Path             = inputModel.Path,
                ShortName        = inputModel.ShortName,
                Method           = inputModel.Method,
                PathParameters   = SelectParameterByLocation(inputModel, ParameterIn.path),
                QueryParameters  = SelectParameterByLocation(inputModel, ParameterIn.query),
                HeaderParameters = SelectParameterByLocation(inputModel, ParameterIn.header),
                RequestBody      = inputModel.RequestBody == null ?
                                   null :
                                   ConvertContent(inputModel.RequestBody,
                                                  $"{inputModel.ShortName}Request",
                                                  keyStore),
                SuccessResponseBody = inputModel.SuccessStatusResponse == null ?
                                      null :
                                      ConvertContent(inputModel.SuccessStatusResponse,
                                                     $"{inputModel.ShortName}Result",
                                                     keyStore)
            };

            output.SuccessContentExpected = output.SuccessResponseBody != null;
            return(output);
        }
예제 #2
0
 private IEnumerable <Parameter> SelectParameterByLocation(OpenApiEndpointModel parentEndpoint,
                                                           ParameterIn paramIn)
 {
     return(parentEndpoint.Parameters?
            .Where(p => p.In == paramIn)
            .Select(p => new Parameter()
     {
         Name = p.Name,
         Required = p.Required,
         Type = _primitiveService.GetType(p.Schema,
                                          parentEndpoint.ShortName + p.Name)
     }));
 }
        public IEnumerable <OpenApiEndpointModel> Parse(IDictionary <string, IDictionary <string, JsonEndpointModel> > paths)
        {
            var endpoints = new List <OpenApiEndpointModel>();

            foreach (var path in paths)
            {
                foreach (var method in path.Value)
                {
                    var jsonEndpoint = method.Value;

                    var returnedEndpoint = new OpenApiEndpointModel()
                    {
                        Path        = path.Key,
                        Method      = _enumService.ConvertStringTo <Method>(method.Key.ToUpperInvariant()),
                        Tags        = jsonEndpoint.Tags,
                        Description = jsonEndpoint.Description,
                        ShortName   = jsonEndpoint.OperationId
                    };

                    var bodyParameter = jsonEndpoint.Parameters?
                                        .FirstOrDefault(p => p.In == JsonParameterIn.body);
                    if (bodyParameter != null)
                    {
                        returnedEndpoint.RequestBody = new OpenApiRequestOrResponseModel()
                        {
                            Type = jsonEndpoint.Consumes != null && jsonEndpoint.Consumes.Any() ?
                                   GetContentType(jsonEndpoint.Consumes) :
                                   "application/json",
                            Content = _typeParser.Parse(_objectParser,
                                                        bodyParameter.Schema)
                        };
                    }

                    if ((jsonEndpoint.Produces != null && jsonEndpoint.Produces.Any()) ||
                        jsonEndpoint.Responses.Any())
                    {
                        var successStatusResponse = jsonEndpoint.Responses
                                                    .FirstOrDefault(r => Regex.IsMatch(r.Key, "2[0-9]{2}"));

                        if (successStatusResponse.Value != null)
                        {
                            returnedEndpoint.SuccessStatusResponse = new OpenApiRequestOrResponseModel()
                            {
                                Type    = GetContentType(jsonEndpoint.Produces),
                                Content = successStatusResponse.Value.Schema != null?
                                          _typeParser.Parse(_objectParser,
                                                            successStatusResponse.Value.Schema) :
                                              null
                            };
                        }
                    }

                    if (jsonEndpoint.Parameters != null && jsonEndpoint.Parameters.Any())
                    {
                        var parameters = new List <OpenApiParameter>();
                        foreach (var param in jsonEndpoint.Parameters)
                        {
                            if (param.In != JsonParameterIn.body)
                            {
                                parameters.Add(new OpenApiParameter()
                                {
                                    In     = _enumService.ConvertStringTo <ParameterIn>(param.In.ToString().ToLower()),
                                    Schema = _typeParser.Parse(_objectParser,
                                                               param) as OpenApiPrimitiveType,
                                    Name     = param.Name,
                                    Required = param.Required
                                });
                            }
                        }
                        returnedEndpoint.Parameters = parameters;
                    }

                    endpoints.Add(returnedEndpoint);
                }
            }

            return(endpoints);
        }
예제 #4
0
        private OpenApiEndpointModel ParseIndividualEndpoint(YamlEndpointModel yamlEndpoint,
                                                             IEnumerable <OpenApiParameter> pathLevelParams,
                                                             string methodName,
                                                             string path)
        {
            var returnedEndpoint = new OpenApiEndpointModel()
            {
                Path        = path,
                Method      = _enumService.ConvertStringTo <Method>(methodName.ToUpperInvariant()),
                Tags        = yamlEndpoint.Tags,
                Description = yamlEndpoint.Description
            };

            var bodySchemaDictEntry = yamlEndpoint.RequestBody?
                                      .Content?
                                      .FirstOrDefault();

            if (bodySchemaDictEntry != null)
            {
                returnedEndpoint.RequestBody = new OpenApiRequestOrResponseModel()
                {
                    Type    = bodySchemaDictEntry.Value.Key,
                    Content = _typeParser.Parse(_objectParser,
                                                bodySchemaDictEntry.Value
                                                .Value
                                                .Schema)
                };
            }

            var responseSchemaDictEntry = yamlEndpoint.Responses?
                                          .FirstOrDefault(r => Regex.IsMatch(r.Key, "^2[0-9]{2}$"))
                                          .Value?
                                          .Content?
                                          .FirstOrDefault();

            if (responseSchemaDictEntry != null)
            {
                returnedEndpoint.SuccessStatusResponse = new OpenApiRequestOrResponseModel()
                {
                    Type    = responseSchemaDictEntry.Value.Key,
                    Content = _typeParser.Parse(_objectParser,
                                                responseSchemaDictEntry.Value
                                                .Value
                                                .Schema)
                };
            }

            var endpointHasParams = yamlEndpoint.Parameters != null && yamlEndpoint.Parameters.Any();
            var pathHasParams     = pathLevelParams != null && pathLevelParams.Any();

            if (endpointHasParams || pathHasParams)
            {
                var parametersOut = new List <OpenApiParameter>();

                if (endpointHasParams)
                {
                    parametersOut.AddRange(ParseParameters(yamlEndpoint.Parameters));
                }

                if (pathHasParams)
                {
                    parametersOut.AddRange(pathLevelParams);
                }

                returnedEndpoint.Parameters = parametersOut;
            }

            return(returnedEndpoint);
        }