< Summary

Information
Class: ClutterStock.Api.Extensions.OpenApiServiceExtensions
Assembly: Api
File(s): /home/runner/work/ClutterStock/ClutterStock/backend/src/Api/Extensions/OpenApiServiceExtensions.cs
Tag: 58_25416222083
Line coverage
100%
Covered lines: 55
Uncovered lines: 0
Coverable lines: 55
Total lines: 69
Line coverage: 100%
Branch coverage
N/A
Covered branches: 0
Total branches: 0
Branch coverage: N/A
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
AddOpenApiDocumentation(...)100%11100%

File(s)

/home/runner/work/ClutterStock/ClutterStock/backend/src/Api/Extensions/OpenApiServiceExtensions.cs

#LineLine coverage
 1using System.Reflection;
 2using ClutterStock.Api.Filters;
 3using ClutterStock.Contracts.Items;
 4using Microsoft.OpenApi;
 5
 6namespace ClutterStock.Api.Extensions;
 7
 8internal static class OpenApiServiceExtensions
 9{
 10    public static IServiceCollection AddOpenApiDocumentation(this IServiceCollection services)
 11    {
 312        services.AddOpenApi();
 313        services.AddSwaggerGen(static options =>
 314        {
 315            options.CustomSchemaIds(static type => type.FullName?.Replace("+", ".") ?? type.Name);
 316
 317            const string intro =
 318                "Because \"somewhere in the garage\" isn't a location. Home inventory for your actual clutter—electronic
 319
 320            options.SwaggerDoc("v1",
 321                               new OpenApiInfo
 322                               {
 323                                   Version = "v1",
 324                                   Title = "ClutterStock API",
 325                                   Description = ApiBuildMetadata.BuildOpenApiDescription(intro)
 326                               });
 327
 328            var apiXml = Path.Combine(AppContext.BaseDirectory, $"{Assembly.GetExecutingAssembly().GetName().Name}.xml")
 329            if (File.Exists(apiXml))
 330                options.IncludeXmlComments(apiXml);
 331
 332            var contractsAssembly = typeof(AddItemRequest).Assembly;
 333            var contractsXml = Path.Combine(AppContext.BaseDirectory, $"{contractsAssembly.GetName().Name}.xml");
 334            if (File.Exists(contractsXml))
 335                options.IncludeXmlComments(contractsXml);
 336
 337            options.OperationFilter<GlobalResponsesOperationFilter>();
 338            options.SwaggerGeneratorOptions.XmlCommentEndOfLine = "\n";
 339
 340            options.AddSecurityDefinition("oidc", new OpenApiSecurityScheme
 341            {
 342                Type = SecuritySchemeType.OAuth2,
 343                Flows = new OpenApiOAuthFlows
 344                {
 345                    AuthorizationCode = new OpenApiOAuthFlow
 346                    {
 347                        AuthorizationUrl = new Uri("https://auth.wsh.no/api/oidc/authorization"),
 348                        TokenUrl = new Uri("https://auth.wsh.no/api/oidc/token"),
 349                        Scopes = new Dictionary<string, string>
 350                        {
 351                            ["openid"] = "OpenID",
 352                            ["profile"] = "Profile",
 353                            ["email"] = "Email",
 354                            ["groups"] = "Groups",
 355                            ["offline_access"] = "Offline access",
 356                        }
 357                    }
 358                }
 359            });
 360
 361            options.AddSecurityRequirement(static doc => new OpenApiSecurityRequirement
 362            {
 363                { new OpenApiSecuritySchemeReference("oidc", doc), [] }
 364            });
 365        });
 66
 367        return services;
 68    }
 69}