< Summary - Syki

Information
Class: Syki.Back.Configs.DocsConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/DocsConfigs.cs
Tag: 97_27801654829
Line coverage
83%
Covered lines: 74
Uncovered lines: 15
Coverable lines: 89
Total lines: 115
Line coverage: 83.1%
Branch coverage
0%
Covered branches: 0
Total branches: 26
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddDocsConfigs(...)0%352676.19%
MapScalarDocs(...)100%11100%
UseDocs(...)100%11100%
ReadResource(...)100%11100%

File(s)

/home/runner/work/syki/syki/Back/Configs/DocsConfigs.cs

#LineLine coverage
 1using System.Reflection;
 2using Scalar.AspNetCore;
 3using Microsoft.OpenApi.Any;
 4using Syki.Back.Auth.Schemes;
 5using Microsoft.OpenApi.Models;
 6using Microsoft.OpenApi.Interfaces;
 7
 8namespace Syki.Back.Configs;
 9
 10public static class DocsConfigs
 11{
 12    public static void AddDocsConfigs(this WebApplicationBuilder builder)
 13    {
 214        builder.Services.AddSwaggerGen(options =>
 215        {
 216            options.SwaggerDoc("v1", new OpenApiInfo
 217            {
 218                Title = "Syki API Docs",
 219                Description = ReadResource("api-intro.md"),
 220                Extensions = new Dictionary<string, IOpenApiExtension>
 221                {
 222                    { "x-logo", new OpenApiObject
 223                    {
 224                        { "url", new OpenApiString("/syki-logo.png") },
 225                    }}
 226                },
 227            });
 228
 229            options.EnableAnnotations();
 230
 231            options.TagActionsBy(api =>
 232            {
 033                var group = api.RelativePath.Split("/")[0];
 034                if (group == "campi") return ["🏫 Campi"];
 035                if (group == "courses") return ["📚 Courses"];
 036                if (group == "course-curriculums") return ["📋 Curriculums"];
 037                if (group == "course-offerings") return ["🗓️ Offerings"];
 038                if (group == "disciplines") return ["📖 Disciplines"];
 039                if (group == "periods") return ["📅 Periods"];
 040                if (group == "students") return ["🎓 Students"];
 041                if (group == "teachers") return ["👨‍🏫 Teachers"];
 042                if (group == "identity") return ["🛡️ Identity"];
 043                if (group == "users") return ["👩🏻‍🎓 Users"];
 044                if (group == "webhooks") return ["🪝 Webhooks"];
 045                if (group == "classes") return ["👩🏻‍🏫 Classes"];
 046                if (group == "notifications") return ["🔔 Notifications"];
 047                return ["🧱 Cross"];
 248            });
 249            options.DocInclusionPredicate((name, api) => true);
 250
 251            options.SchemaFilter<EnumSchemaFilter>();
 252            options.OperationFilter<AuthOperationsFilter>();
 253            options.OperationFilter<IdParameterExamplesFilter>();
 254            options.OperationFilter<ExamplesOperationsFilterFilter>();
 255            options.DocumentFilter<HttpMethodSorterDocumentFilter>();
 256
 257            options.ExampleFilters();
 258
 259            options.AddSecurityDefinition(
 260                JwtBearerScheme.Name,
 261                new OpenApiSecurityScheme
 262                {
 263                    In = ParameterLocation.Cookie,
 264                    Name = JwtBearerScheme.Cookie,
 265                    Type = SecuritySchemeType.ApiKey,
 266                    Description = "JWT enviado no cookie http only",
 267                });
 268
 269            options.DescribeAllParametersInCamelCase();
 270
 271            var xmlPath = Path.Combine(AppContext.BaseDirectory, "Back.xml");
 272            options.IncludeXmlComments(xmlPath, includeControllerXmlComments: true);
 473        });
 74
 275        builder.Services.AddSwaggerExamplesFromAssemblyOf(typeof(Program));
 276        builder.Services.AddOpenApi();
 277    }
 78
 79    public static void MapScalarDocs(this IEndpointRouteBuilder options)
 80    {
 281        options.MapScalarApiReference("/docs", options =>
 282        {
 283            options.WithModels(false);
 284            options.WithTitle("Syki API Docs");
 285            options.WithDocumentDownloadType(DocumentDownloadType.Json);
 286            options.WithOpenApiRoutePattern("/swagger/{documentName}/swagger.json");
 287            options
 288                .AddPreferredSecuritySchemes("Bearer")
 489                .AddHttpAuthentication("Bearer", x => x.Token = "your.bearer.token");
 290
 291            options.CustomCss = @"
 292                :root {
 293                    --scalar-sidebar-width: 300px;
 294                }
 295            ";
 496        });
 297    }
 98
 99    public static void UseDocs(this IApplicationBuilder app)
 100    {
 2101        app.UseStaticFiles();
 2102        app.UseSwagger();
 2103    }
 104
 105    private static string ReadResource(string name)
 106    {
 2107        var assembly = Assembly.GetExecutingAssembly();
 10108        var resourcePath = assembly.GetManifestResourceNames().Single(str => str.EndsWith(name));
 109
 2110        using Stream stream = assembly.GetManifestResourceStream(resourcePath)!;
 2111        using StreamReader reader = new(stream);
 112
 2113        return reader.ReadToEnd();
 2114    }
 115}