/
idalynnn
/
api
Обзор
Документация
Войти
/
idalynnn
/
api
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Program.cs
135 строк
4 KB
idalynnn
Лаба 2: пагинация, опциональные поля, внутренние API, фиксация сериализации
13 дек 2025, 06:36
13 дек 2025, 06:36
494190c
Код
Авторство
О чём код?
using System.Reflection; using System.Text; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.EntityFrameworkCore; using Microsoft.IdentityModel.Tokens; using Microsoft.OpenApi.Models; using TaskTrackerApi.Data; using TaskTrackerApi.Middleware; using TaskTrackerApi.Services; using TaskTrackerApi.Swagger; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers() .AddJsonOptions(opt => { opt.JsonSerializerOptions.ReferenceHandler = System.Text.Json.Serialization.ReferenceHandler.IgnoreCycles; }); builder.Services.AddApiVersioning(opt => { opt.DefaultApiVersion = new ApiVersion(1, 0); opt.AssumeDefaultVersionWhenUnspecified = true; opt.ReportApiVersions = true; }); builder.Services.AddVersionedApiExplorer(opt => { opt.GroupNameFormat = "'v'VVV"; opt.SubstituteApiVersionInUrl = true; }); builder.Services.AddDbContext<AppDbContext>(opt => { opt.UseSqlite(builder.Configuration.GetConnectionString("Default") ?? "Data Source=tasktracker.db"); }); builder.Services.AddScoped<IdempotencyService>(); var jwt = builder.Configuration.GetSection("Jwt"); var issuer = jwt["Issuer"]!; var audience = jwt["Audience"]!; var key = jwt["Key"]!; builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(opt => { opt.TokenValidationParameters = new TokenValidationParameters { ValidateIssuer = true, ValidateAudience = true, ValidateLifetime = true, ValidateIssuerSigningKey = true, ValidIssuer = issuer, ValidAudience = audience, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(key)) }; }); builder.Services.AddAuthorization(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(opt => { // JWT in Swagger UI opt.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Name = "Authorization", Type = SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", In = ParameterLocation.Header, Description = "Paste JWT token here. Format: Bearer {token}" }); opt.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); var xmlName = $"{Assembly.GetExecutingAssembly().GetName().Name}.xml"; var xmlPath = Path.Combine(AppContext.BaseDirectory, xmlName); if (File.Exists(xmlPath)) opt.IncludeXmlComments(xmlPath); }); builder.Services.ConfigureOptions<ConfigureSwaggerOptions>(); var app = builder.Build(); using (var scope = app.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService<AppDbContext>(); db.Database.Migrate(); } app.UseMiddleware<SimpleRateLimitMiddleware>(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(options => { var provider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>(); foreach (var description in provider.ApiVersionDescriptions) { options.SwaggerEndpoint( $"/swagger/{description.GroupName}/swagger.json", description.GroupName.ToUpperInvariant()); } }); } app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run();