< Summary - Syki

Information
Class: Syki.Back.Configs.DocsConfigs
Assembly: Back
File(s): /home/runner/work/syki/syki/Back/Configs/DocsConfigs.cs
Tag: 4_16869239191
Line coverage
92%
Covered lines: 77
Uncovered lines: 6
Coverable lines: 83
Total lines: 108
Line coverage: 92.7%
Branch coverage
0%
Covered branches: 0
Total branches: 8
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%8889.47%
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 Microsoft.OpenApi.Models;
 5using Microsoft.OpenApi.Interfaces;
 6
 7namespace Syki.Back.Configs;
 8
 9public static class DocsConfigs
 10{
 11    public static void AddDocsConfigs(this WebApplicationBuilder builder)
 12    {
 213        builder.Services.AddSwaggerGen(options =>
 214        {
 215            options.SwaggerDoc("v1", new OpenApiInfo
 216            {
 217                Title = "Syki API Docs",
 218                Description = ReadResource("api-intro.md"),
 219                Extensions = new Dictionary<string, IOpenApiExtension>
 220                {
 221                    { "x-logo", new OpenApiObject
 222                    {
 223                        { "url", new OpenApiString("/syki-logo.png") },
 224                    }}
 225                },
 226            });
 227
 228            options.EnableAnnotations();
 229
 230            options.TagActionsBy(api =>
 231            {
 032                var group = api.RelativePath.Split("/")[0];
 033                if (group == "academic") return ["🏫 Academic"];
 034                if (group == "student") return ["👩🏻‍🎓 Student"];
 035                if (group == "teacher") return ["👨🏻‍🏫 Teacher"];
 036                if (group == "adm") return ["🛡️ Adm"];
 037                return ["🧱 Cross"];
 238            });
 239            options.DocInclusionPredicate((name, api) => true);
 240
 241            options.SchemaFilter<EnumSchemaFilter>();
 242            options.OperationFilter<AuthOperationsFilter>();
 243            options.OperationFilter<IdParameterExamplesFilter>();
 244            options.OperationFilter<ExamplesOperationsFilterFilter>();
 245            options.DocumentFilter<HttpMethodSorterDocumentFilter>();
 246
 247            options.ExampleFilters();
 248
 249            options.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme
 250            {
 251                In = ParameterLocation.Header,
 252                Description = "Please enter a valid token",
 253                Name = "Authorization",
 254                Type = SecuritySchemeType.Http,
 255                BearerFormat = "JWT",
 256                Scheme = "bearer",
 257            });
 258
 259            options.DescribeAllParametersInCamelCase();
 260
 261            var xmlPath = Path.Combine(AppContext.BaseDirectory, "Back.xml");
 262            options.IncludeXmlComments(xmlPath, includeControllerXmlComments: true);
 263
 264            var xmlPath2 = Path.Combine(AppContext.BaseDirectory, "Shared.xml");
 265            options.IncludeXmlComments(xmlPath2, includeControllerXmlComments: true);
 466        });
 67
 268        builder.Services.AddSwaggerExamplesFromAssemblyOf(typeof(Program));
 269        builder.Services.AddOpenApi();
 270    }
 71
 72    public static void MapScalarDocs(this IEndpointRouteBuilder options)
 73    {
 274        options.MapScalarApiReference("/docs", options =>
 275        {
 276            options.WithModels(false);
 277            options.WithTitle("Syki API Docs");
 278            options.WithDocumentDownloadType(DocumentDownloadType.Json);
 279            options.WithOpenApiRoutePattern("/swagger/{documentName}/swagger.json");
 280            options
 281                .AddPreferredSecuritySchemes("Bearer")
 482                .AddHttpAuthentication("Bearer", x => x.Token = "your.bearer.token");
 283
 284            options.CustomCss = @"
 285                :root {
 286                    --scalar-sidebar-width: 300px;
 287                }
 288            ";
 489        });
 290    }
 91
 92    public static void UseDocs(this IApplicationBuilder app)
 93    {
 294        app.UseStaticFiles();
 295        app.UseSwagger();
 296    }
 97
 98    private static string ReadResource(string name)
 99    {
 2100        var assembly = Assembly.GetExecutingAssembly();
 4101        var resourcePath = assembly.GetManifestResourceNames().Single(str => str.EndsWith(name));
 102
 2103        using Stream stream = assembly.GetManifestResourceStream(resourcePath)!;
 2104        using StreamReader reader = new(stream);
 105
 2106        return reader.ReadToEnd();
 2107    }
 108}