/
Frozin
/
DIS-3
Обзор
Документация
Войти
/
Frozin
/
DIS-3
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
API_PIR/Program.cs
134 строки
4 KB
Frozin-p
WIP: Project v1
15 дек 2025, 03:05
15 дек 2025, 03:05
da425f5
Код
Авторство
О чём код?
using Microsoft.AspNetCore.Mvc; using Microsoft.AspNetCore.Mvc.ApiExplorer; using Microsoft.OpenApi.Models; using API_PIR.Interfaces; using API_PIR.Middleware; using API_PIR.Services; var builder = WebApplication.CreateBuilder(args); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddLogging(); builder.Services.AddHttpClient<IInternalApiClient, InternalApiClient>(client => { client.Timeout = TimeSpan.FromSeconds(30); }); builder.Services.AddApiVersioning(options => { options.DefaultApiVersion = new ApiVersion(1, 0); options.AssumeDefaultVersionWhenUnspecified = true; options.ReportApiVersions = true; }); builder.Services.AddVersionedApiExplorer(options => { options.GroupNameFormat = "'v'VVV"; options.SubstituteApiVersionInUrl = true; }); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Version = "v1", Title = "Version 1", Description = "API для корпоративных заметок" }); options.SwaggerDoc("v2", new OpenApiInfo { Version = "v2", Title = "Version 2", Description = "API для корпоративных заметок. Улучшенная версия с фильтрацией" }); options.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "ApiKey" } }, Array.Empty<string>() } }); options.AddSecurityDefinition("ApiKey", new OpenApiSecurityScheme { Description = "Введите API ключ", Name = "X-API-Key", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "ApiKey" }); }); builder.Services.AddSingleton<INoteService, NoteService>(); builder.Services.AddSingleton<IUserService, UserService>(); builder.Services.AddSingleton<IApiKeyService, ApiKeyService>(); builder.Services.AddSingleton<IIdempotencyService, IdempotencyService>(); builder.Services.AddSingleton<IStatisticsService, StatisticsService>(); builder.Services.AddSingleton<IInternalApiClient, InternalApiClient>(); builder.Services.AddCors(options => { options.AddPolicy("ApiPolicy", builder => builder .WithOrigins( "http://localhost:5173", "https://localhost:5173", "http://localhost:3000" ) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() .WithExposedHeaders("X-API-Key", "Idempotency-Key", "Content-Disposition") .SetPreflightMaxAge(TimeSpan.FromMinutes(10))); options.AddPolicy("AllowAll", builder => builder .AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader()); }); var app = builder.Build(); app.UseRouting(); app.UseCors("ApiPolicy"); var apiVersionDescriptionProvider = app.Services.GetRequiredService<IApiVersionDescriptionProvider>(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(options => { foreach (var description in apiVersionDescriptionProvider.ApiVersionDescriptions) { options.SwaggerEndpoint( $"/swagger/{description.GroupName}/swagger.json", $"API {description.GroupName.ToUpperInvariant()}"); } }); } app.UseMiddleware<RateLimitingMiddleware>(); app.UseMiddleware<StatisticsLoggingMiddleware>(); app.UseMiddleware<IdempotencyMiddleware>(); app.UseMiddleware<ApiKeyMiddleware>(); app.UseAuthorization(); app.MapControllers(); app.Run();