Example #1
0
        private void MapEndpoints(OpenApiModel.OpenApiModelBuilder openApiModelBuilder,
                                  Dictionary <string, PathItem> pathItems)
        {
            foreach (var(url, pathItem) in pathItems)
            {
                var path       = $"#/paths/{url}";
                var parameters = new HashSet <IParameter>();

                if (pathItem.Parameters != null)
                {
                    foreach (var versionedParameter in pathItem.Parameters)
                    {
                        var parameterPath = versionedParameter.GetRef() ??
                                            $"{path}/parameters/{versionedParameter.GetObject().Name}";
                        var parameter = openApiModelBuilder.GetParameterForPath(parameterPath);
                        if (parameter == null)
                        {
                            throw new ArgumentException($"Missing parameter object - {parameterPath}");
                        }

                        parameters.Add(parameter);
                    }
                }

                var operationMap = GetOperationMap(pathItem);
                foreach (var(type, operation) in operationMap)
                {
                    var endpointParameters = new HashSet <IParameter>(parameters);

                    if (operation.Security != null)
                    {
                        foreach (var securityDictionary in operation.Security)
                        {
                            foreach (var key in securityDictionary.Keys)
                            {
                                var securityParameter = openApiModelBuilder.GetSecurityParameterForName(key);
                                endpointParameters.Add(securityParameter);
                            }
                        }
                    }

                    if (operation.Parameters != null)
                    {
                        foreach (var operationParameter in operation.Parameters)
                        {
                            var parameterPath = operationParameter.GetRef() ??
                                                $"{path}/{type.ToString().ToLower()}/parameters/{operationParameter.GetObject().Name}";
                            var parameter = openApiModelBuilder.GetParameterForPath(parameterPath);
                            if (parameter == null)
                            {
                                throw new ArgumentException($"Missing parameter object - {parameterPath}");
                            }

                            endpointParameters.Add(parameter);
                        }
                    }

                    var endpointResponses = new List <IHttpResponse>();
                    foreach (var(status, @ref) in operation.Responses)
                    {
                        var responsePath =
                            @ref.GetRef() ?? $"{path}/{type.ToString().ToLower()}/responses/{status}";
                        var response = openApiModelBuilder.GetResponseForPath(responsePath);
                        endpointResponses.Add(new HttpResponse(int.Parse(status),
                                                               response)); // todo: check if parse was successful
                    }

                    IRequestBody requestBody = null;
                    if (operation.RequestBody != null)
                    {
                        var requestBodyPath = operation.RequestBody?.GetRef() ??
                                              $"{path}/{type.ToString().ToLower()}/requestBody";
                        requestBody = openApiModelBuilder.GetRequestBodyForPath(requestBodyPath);
                    }

                    var operationId = operation.OperationId ??
                                      throw new ArgumentException($"Missing operationId - {path}/{type}");
                    openApiModelBuilder.AttachEndpoint(new Endpoint(operationId, url,
                                                                    type,
                                                                    endpointParameters, requestBody, endpointResponses));
                }
            }
        }