< Summary - Syki

Information
Class: Syki.Back.Configs.DocsConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/DocsConfigs.cs
Tag: 56_26538939494
Line coverage
72%
Covered lines: 62
Uncovered lines: 24
Coverable lines: 86
Total lines: 112
Line coverage: 72%
Branch coverage
0%
Covered branches: 0
Total branches: 20
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%232080%
MapScalarDocs(...)100%1129.41%
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                return ["🧱 Cross"];
 245            });
 246            options.DocInclusionPredicate((name, api) => true);
 247
 248            options.SchemaFilter<EnumSchemaFilter>();
 249            options.OperationFilter<AuthOperationsFilter>();
 250            options.OperationFilter<IdParameterExamplesFilter>();
 251            options.OperationFilter<ExamplesOperationsFilterFilter>();
 252            options.DocumentFilter<HttpMethodSorterDocumentFilter>();
 253
 254            options.ExampleFilters();
 255
 256            options.AddSecurityDefinition(
 257                JwtBearerScheme.Name,
 258                new OpenApiSecurityScheme
 259                {
 260                    In = ParameterLocation.Cookie,
 261                    Name = JwtBearerScheme.Cookie,
 262                    Type = SecuritySchemeType.ApiKey,
 263                    Description = "JWT enviado no cookie http only",
 264                });
 265
 266            options.DescribeAllParametersInCamelCase();
 267
 268            var xmlPath = Path.Combine(AppContext.BaseDirectory, "Back.xml");
 269            options.IncludeXmlComments(xmlPath, includeControllerXmlComments: true);
 470        });
 71
 272        builder.Services.AddSwaggerExamplesFromAssemblyOf(typeof(Program));
 273        builder.Services.AddOpenApi();
 274    }
 75
 76    public static void MapScalarDocs(this IEndpointRouteBuilder options)
 77    {
 278        options.MapScalarApiReference("/docs", options =>
 279        {
 080            options.WithModels(false);
 081            options.WithTitle("Syki API Docs");
 082            options.WithDocumentDownloadType(DocumentDownloadType.Json);
 083            options.WithOpenApiRoutePattern("/swagger/{documentName}/swagger.json");
 084            options
 085                .AddPreferredSecuritySchemes("Bearer")
 086                .AddHttpAuthentication("Bearer", x => x.Token = "your.bearer.token");
 287
 088            options.CustomCss = @"
 089                :root {
 090                    --scalar-sidebar-width: 300px;
 091                }
 092            ";
 293        });
 294    }
 95
 96    public static void UseDocs(this IApplicationBuilder app)
 97    {
 298        app.UseStaticFiles();
 299        app.UseSwagger();
 2100    }
 101
 102    private static string ReadResource(string name)
 103    {
 2104        var assembly = Assembly.GetExecutingAssembly();
 4105        var resourcePath = assembly.GetManifestResourceNames().Single(str => str.EndsWith(name));
 106
 2107        using Stream stream = assembly.GetManifestResourceStream(resourcePath)!;
 2108        using StreamReader reader = new(stream);
 109
 2110        return reader.ReadToEnd();
 2111    }
 112}