using AspNetCoreRateLimit; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.Versioning; using Microsoft.Extensions.Options; using server.Persistence; using server.Persistence.Repositories; using server.SwaggerOptions; using server.SwaggerOptions.Filters; using System.Reflection; namespace server.Setup { public static class Services { public static WebApplicationBuilder SetupDb(this WebApplicationBuilder builder) { builder.Services.Configure( builder.Configuration.GetSection("MongoDBSettings")); builder.Services.AddSingleton(sp => sp.GetRequiredService>().Value); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); return builder; } public static WebApplicationBuilder SetupMvC(this WebApplicationBuilder builder) { builder.Services.AddMemoryCache(); builder.Services.Configure( builder.Configuration.GetSection("IpRateLimiting")); builder.Services.Configure( builder.Configuration.GetSection("IpRateLimitPolicies")); builder.Services.AddInMemoryRateLimiting(); builder.Services.AddSingleton(); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddApiVersioning(config => { config.DefaultApiVersion = new ApiVersion(1, 0); config.AssumeDefaultVersionWhenUnspecified = true; config.ReportApiVersions = true; config.ApiVersionReader = new HeaderApiVersionReader("x-api-version"); }); builder.Services.AddVersionedApiExplorer(config => { config.GroupNameFormat = "'v'VVV"; }); return builder; } public static WebApplicationBuilder SetupSwagger(this WebApplicationBuilder builder) { builder.Services.AddSwaggerGen(options => { var xmlFile = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlFile); options.IncludeXmlComments(xmlPath); options.OperationFilter(); }); builder.Services.ConfigureOptions(); return builder; } } }