Exemplo n.º 1
0
 private IEnumerable <Tuple <string, OpenApiOperation> > GetOperations(OpenApiPath value)
 {
     if (value.Get != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("GET", value.Get));
     }
     if (value.Post != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("POST", value.Post));
     }
     if (value.Put != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("PUT", value.Put));
     }
     if (value.Patch != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("PATCH", value.Patch));
     }
     if (value.Delete != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("DELETE", value.Delete));
     }
     if (value.Head != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("HEAD", value.Head));
     }
     if (value.Options != null)
     {
         yield return(new Tuple <string, OpenApiOperation>("OPTIONS", value.Options));
     }
 }
Exemplo n.º 2
0
        public OpenApiPath GetOpenApi([FromBody] Entities.OpenApi data)
        {
            var openApi = new OpenApiPath();

            OpenApiDiagnostic diagnostic = new OpenApiDiagnostic();

            //var specData = new StreamReader(@"C:\Users\Naveen\Desktop\UI from Open API Doc\Demo\Petstore.yml").ReadToEnd();
            using (MemoryStream ms = new MemoryStream(Encoding.UTF8.GetBytes(data.Data)))
            {
                var openApiDocument = new OpenApiStreamReader().Read(ms, out diagnostic);
                foreach (var tag in openApiDocument.Tags)
                {
                    openApi.Tags.Add(new OpenApiTag()
                    {
                        Tag         = tag.Name,
                        Description = tag.Description
                    });
                }
                if (openApi.Tags.Count == 0)
                {
                    openApi.Tags.Add(new OpenApiTag()
                    {
                        Tag = "Default"
                    });
                }

                foreach (var path in openApiDocument.Paths)
                {
                    foreach (var operation in path.Value.Operations)
                    {
                        var objOperation = new OpenApiOperation()
                        {
                            Id   = operation.Value.OperationId,
                            Name = path.Key,
                            Verb = operation.Key.ToString()
                        };

                        foreach (var param in operation.Value.Parameters)
                        {
                            var objparam = new OpenApiOperationParam()
                            {
                                Name        = param.Name,
                                Type        = param.Schema.Type,
                                IsRequired  = param.Required,
                                Description = param.Description
                            };

                            if (param.Schema.Enum != null && param.Schema.Enum.Count > 0)
                            {
                                foreach (var val in param.Schema.Enum)
                                {
                                    objparam.Values.Add((val as Microsoft.OpenApi.Any.OpenApiString).Value);
                                }
                            }

                            if (param.Schema.Type == "array")
                            {
                                //objparam.Type = "string"; // hard code
                                foreach (var val in param.Schema.Items.Enum)
                                {
                                    objparam.Values.Add((val as Microsoft.OpenApi.Any.OpenApiString).Value);
                                }
                            }

                            objOperation.ParamTree.Add(new ParameterTree()
                            {
                                Name     = objparam.Name,
                                Type     = objparam.Type,
                                Node     = 1,
                                Position = "query",
                                Values   = objparam.Values
                            });

                            objOperation.Params.Add(objparam);
                        }

                        if (operation.Value.RequestBody != null && operation.Value.RequestBody.Content.Count > 0)
                        {
                            var content = operation.Value.RequestBody.Content.FirstOrDefault();
                            objOperation.BodyParams = GetBodyParam(content.Value.Schema, null, null, objOperation.ParamTree, 0)[0].Property;
                        }

                        foreach (var server in openApiDocument.Servers)
                        {
                            objOperation.Server.Add(server.Url);
                        }

                        if (objOperation.ParamTree.Count > 0)
                        {
                            var paramTree = objOperation.ParamTree.ToList();
                            objOperation.ParamTree.Clear();
                            foreach (var item in paramTree)
                            {
                                if (objOperation.ParamTree.Count > 0 &&
                                    objOperation.ParamTree.Last().Type == "array" &&
                                    objOperation.ParamTree.Last().Node < item.Node)
                                {
                                    objOperation.ParamTree.Last().Items.Add(item);
                                }
                                else
                                {
                                    objOperation.ParamTree.Add(item);
                                }
                            }
                        }

                        if (operation.Value.Tags != null && operation.Value.Tags.Count > 0)
                        {
                            openApi.Tags.Where(x => x.Tag == operation.Value.Tags[0].Name).FirstOrDefault().Operations.Add(objOperation);
                        }
                        else
                        {
                            openApi.Tags.Where(x => x.Tag == "Default").FirstOrDefault().Operations.Add(objOperation);
                        }
                    }
                }
            }

            return(openApi);
        }
Exemplo n.º 3
0
        private OrderedDictionary <string, OpenApiPath> ParseOperations(List <RestPath> restPaths, Dictionary <string, OpenApiSchema> schemas, Dictionary <string, OpenApiTag> tags)
        {
            var apiPaths = new OrderedDictionary <string, OpenApiPath>();

            foreach (var restPath in restPaths)
            {
                var verbs   = new List <string>();
                var summary = restPath.Summary ?? restPath.RequestType.GetDescription();

                verbs.AddRange(restPath.AllowsAllVerbs
                    ? AnyRouteVerbs
                    : restPath.Verbs);

                var routePath   = restPath.Path.Replace("*", "");
                var requestType = restPath.RequestType;

                OpenApiPath curPath;

                if (!apiPaths.TryGetValue(restPath.Path, out curPath))
                {
                    curPath = new OpenApiPath()
                    {
                        Parameters = new List <OpenApiParameter> {
                            new OpenApiParameter {
                                Ref = "#/parameters/Accept"
                            }
                        }
                    };
                    apiPaths.Add(restPath.Path, curPath);
                }

                var op      = HostContext.Metadata.OperationsMap[requestType];
                var actions = HostContext.Metadata.GetImplementedActions(op.ServiceType, op.RequestType);

                var authAttrs = new[] { op.ServiceType, op.RequestType }
                .SelectMany(x => x.AllAttributes().OfType <AuthenticateAttribute>()).ToList();

                authAttrs.AddRange(
                    actions.Where(x => x.Name.ToUpperInvariant() == "ANY")
                    .SelectMany(x => x.AllAttributes <AuthenticateAttribute>())
                    );

                var annotatingTagAttributes = requestType.AllAttributes <TagAttribute>();

                foreach (var verb in verbs)
                {
                    var needAuth = authAttrs.Count > 0 ||
                                   actions.Where(x => x.Name.ToUpperInvariant() == verb)
                                   .SelectMany(x => x.AllAttributes <AuthenticateAttribute>())
                                   .Count() > 0;

                    var     userTags = new List <string>();
                    ApplyTo applyToVerb;
                    if (ApplyToUtils.VerbsApplyTo.TryGetValue(verb, out applyToVerb))
                    {
                        userTags = annotatingTagAttributes.Where(x => x.ApplyTo.HasFlag(applyToVerb)).Select(x => x.Name).ToList();
                    }

                    var operation = new OpenApiOperation
                    {
                        Summary     = summary,
                        Description = restPath.Notes ?? summary,
                        OperationId = GetOperationName(requestType.Name, routePath, verb),
                        Parameters  = ParseParameters(schemas, requestType, routePath, verb),
                        Responses   = GetMethodResponseCodes(restPath, schemas, requestType),
                        Consumes    = new List <string> {
                            "application/json"
                        },
                        Produces = new List <string> {
                            "application/json"
                        },
                        Tags       = userTags.Count > 0 ? userTags : GetTags(restPath.Path),
                        Deprecated = requestType.HasAttribute <ObsoleteAttribute>(),
                        Security   = needAuth ? new List <Dictionary <string, List <string> > > {
                            new Dictionary <string, List <string> > {
                                { "basic", new List <string>() }
                            }
                        } : null
                    };

                    foreach (var tag in operation.Tags)
                    {
                        if (!tags.ContainsKey(tag))
                        {
                            tags.Add(tag, new OpenApiTag {
                                Name = tag
                            });
                        }
                    }

                    switch (verb)
                    {
                    case "GET": curPath.Get = operation; break;

                    case "POST": curPath.Post = operation; break;

                    case "PUT": curPath.Put = operation; break;

                    case "DELETE": curPath.Delete = operation; break;

                    case "PATCH": curPath.Patch = operation; break;

                    case "HEAD": curPath.Head = operation; break;

                    case "OPTIONS": curPath.Options = operation; break;
                    }
                }
            }

            return(apiPaths);
        }
Exemplo n.º 4
0
        private OrderedDictionary <string, OpenApiPath> ParseOperations(List <RestPath> restPaths, Dictionary <string, OpenApiSchema> schemas, Dictionary <string, OpenApiTag> tags)
        {
            var feature  = HostContext.GetPlugin <OpenApiFeature>();
            var apiPaths = new OrderedDictionary <string, OpenApiPath>();

            foreach (var restPath in restPaths)
            {
                var verbs   = new List <string>();
                var summary = restPath.Summary ?? restPath.RequestType.GetDescription();

                verbs.AddRange(restPath.AllowsAllVerbs
                    ? AnyRouteVerbs
                    : restPath.Verbs);

                var routePath   = restPath.Path.Replace("*", "");
                var requestType = restPath.RequestType;

                if (!apiPaths.TryGetValue(restPath.Path, out var curPath))
                {
                    curPath = new OpenApiPath
                    {
                        Parameters = new List <OpenApiParameter>
                        {
                            new OpenApiParameter {
                                Ref = "#/parameters/Accept"
                            }
                        }
                    };
                    apiPaths.Add(restPath.Path, curPath);
                }

                var op = HostContext.Metadata.OperationsMap[requestType];

                var annotatingTagAttributes = requestType.AllAttributes <TagAttribute>();

                foreach (var verb in verbs)
                {
                    var needAuth = op.RequiresAuthentication;

                    var userTags = new List <string>();
                    if (ApplyToUtils.VerbsApplyTo.TryGetValue(verb, out var applyToVerb))
                    {
                        userTags = annotatingTagAttributes.Where(x => x.ApplyTo.HasFlag(applyToVerb)).Select(x => x.Name).ToList();
                    }

                    var operation = new OpenApiOperation
                    {
                        RequestType = requestType.Name,
                        Summary     = summary,
                        Description = restPath.Notes ?? summary,
                        OperationId = GetOperationName(requestType.Name, routePath, verb),
                        Parameters  = ParseParameters(schemas, requestType, routePath, verb),
                        Responses   = GetMethodResponseCodes(restPath, schemas, requestType),
                        Consumes    = new List <string> {
                            "application/json"
                        },
                        Produces = new List <string> {
                            "application/json"
                        },
                        Tags       = userTags.Count > 0 ? userTags : GetTags(restPath.Path),
                        Deprecated = requestType.HasAttribute <ObsoleteAttribute>(),
                        Security   = needAuth ? new List <Dictionary <string, List <string> > > {
                            OperationSecurity
                        } : null
                    };

                    if (HasFormData(verb, operation.Parameters))
                    {
                        operation.Consumes = new List <string> {
                            "application/x-www-form-urlencoded"
                        }
                    }
                    ;

                    foreach (var tag in operation.Tags)
                    {
                        if (!tags.ContainsKey(tag))
                        {
                            var tagObject = feature.Tags.FirstOrDefault(x => x.Name == tag)
                                            ?? new OpenApiTag {
                                Name = tag
                            };

                            tags.Add(tag, tagObject);
                        }
                    }

                    switch (verb)
                    {
                    case HttpMethods.Get: curPath.Get = operation; break;

                    case HttpMethods.Post: curPath.Post = operation; break;

                    case HttpMethods.Put: curPath.Put = operation; break;

                    case HttpMethods.Delete: curPath.Delete = operation; break;

                    case HttpMethods.Patch: curPath.Patch = operation; break;

                    case HttpMethods.Head: curPath.Head = operation; break;

                    case HttpMethods.Options: curPath.Options = operation; break;
                    }
                }
            }

            return(apiPaths);
        }
Exemplo n.º 5
0
        private OrderedDictionary <string, OpenApiPath> ParseOperations(List <RestPath> restPaths, Dictionary <string, OpenApiSchema> schemas, List <OpenApiTag> tags)
        {
            var apiPaths = new OrderedDictionary <string, OpenApiPath>();

            foreach (var restPath in restPaths)
            {
                var verbs   = new List <string>();
                var summary = restPath.Summary ?? restPath.RequestType.GetDescription();

                verbs.AddRange(restPath.AllowsAllVerbs
                    ? AnyRouteVerbs
                    : restPath.Verbs);

                var routePath   = restPath.Path.Replace("*", "");
                var requestType = restPath.RequestType;

                OpenApiPath curPath;

                if (!apiPaths.TryGetValue(restPath.Path, out curPath))
                {
                    curPath = new OpenApiPath()
                    {
                        Parameters = new List <OpenApiParameter> {
                            GetAcceptHeaderParameter()
                        }
                    };
                    apiPaths.Add(restPath.Path, curPath);

                    tags.Add(new OpenApiTag {
                        Name = restPath.Path, Description = summary
                    });
                }

                foreach (var verb in verbs)
                {
                    var operation = new OpenApiOperation
                    {
                        Summary     = summary,
                        Description = restPath.Notes ?? summary,
                        OperationId = requestType.Name + GetOperationNamePostfix(verb),
                        Parameters  = ParseParameters(schemas, requestType, verb, routePath),
                        Responses   = GetMethodResponseCodes(restPath, schemas, requestType),
                        Consumes    = new List <string> {
                            "application/json"
                        },
                        Produces = new List <string> {
                            "application/json"
                        },
                        Tags = new List <string> {
                            restPath.Path
                        },
                        Deprecated = requestType.HasAttribute <ObsoleteAttribute>()
                    };

                    switch (verb)
                    {
                    case "GET": curPath.Get = operation; break;

                    case "POST": curPath.Post = operation; break;

                    case "PUT": curPath.Put = operation; break;

                    case "DELETE": curPath.Delete = operation; break;

                    case "PATCH": curPath.Patch = operation; break;

                    case "HEAD": curPath.Head = operation; break;

                    case "OPTIONS": curPath.Options = operation; break;
                    }
                }
            }

            return(apiPaths);
        }