/
egopen
/
Lab1
Обзор
Документация
Войти
/
egopen
/
Lab1
Код
Запросы
0
Задачи
Вики
Пакеты
0
Релизы
0
CI/CD
Аналитика
Безопасность
master
Lab4/library/Program.cs
145 строк
6 KB
Egopen
lab 4
01 ноя 2025, 18:03
01 ноя 2025, 18:03
78d017c
Код
Авторство
О чём код?
using library.BackWorkers; using library.DB; using library.DB.Models; using library.Services; using library.Services.library.Services; using Microsoft.AspNetCore.Authentication.JwtBearer; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Logging; using Microsoft.IdentityModel.Tokens; using RabbitMQ.Client; using Serilog; using System; using System.Text; using System.Threading.Channels; using System.Threading.RateLimiting; namespace library { public class Program { public static async Task Main(string[] args) { EnvReader.Load(".env"); var builder = WebApplication.CreateBuilder(args); //Log.Logger = new LoggerConfiguration() //.MinimumLevel.Information() //.WriteTo.Console() //.WriteTo.File("_logs.txt", rollingInterval: RollingInterval.Day) //.CreateLogger(); //builder.Services.AddSerilog(); ConnectionFactory factory = new ConnectionFactory(); IConnection conn = await factory.CreateConnectionAsync(); builder.Services.AddSingleton<IConnection>(conn); builder.Services.AddDbContext<LibraryDBContext>(db => db.UseNpgsql(Environment.GetEnvironmentVariable("DB_CONNECTION"))); builder.Services.AddMemoryCache(); builder.Services.AddSingleton<TokenService>(); builder.Services.AddScoped<AuthService>(); builder.Services.AddScoped<UserService>(); builder.Services.AddScoped<BookManagingService>(); builder.Services.AddScoped<RentService>(); builder.Services.AddHostedService<AuthWorker>(); builder.Services.AddHostedService<UserWorker>(); builder.Services.AddHostedService<BooksWorker>(); builder.Services.AddHostedService<ResponseWorker>(); builder.Services.AddRateLimiter(options => { options.GlobalLimiter = PartitionedRateLimiter.Create<HttpContext, string>(httpContext => RateLimitPartition.GetSlidingWindowLimiter( partitionKey: httpContext.Connection.RemoteIpAddress?.ToString() ?? "unknown", factory: _ => new SlidingWindowRateLimiterOptions { PermitLimit = 5, Window = TimeSpan.FromMinutes(1), SegmentsPerWindow = 6 })); options.OnRejected = async (context, token) => { context.HttpContext.Response.StatusCode = StatusCodes.Status429TooManyRequests; if (context.Lease.TryGetMetadata(MetadataName.RetryAfter, out var retryAfter)) { context.HttpContext.Response.Headers.RetryAfter = ((int)retryAfter.TotalSeconds).ToString(); } await context.HttpContext.Response.WriteAsJsonAsync(new { error = "Too Many Requests", message = "Rate limit exceeded. Please try again later.", retryAfterSeconds = retryAfter.TotalSeconds }, token); }; }); builder.Services.AddAuthentication(JwtBearerDefaults.AuthenticationScheme) .AddJwtBearer(options => { options.TokenValidationParameters = new TokenValidationParameters { ValidateIssuerSigningKey = true, IssuerSigningKey = new SymmetricSecurityKey(Encoding.UTF8.GetBytes(Environment.GetEnvironmentVariable("SECRET_KEY"))), ValidateIssuer = false, ValidateAudience = false, ValidateLifetime = true, ClockSkew = TimeSpan.Zero }; }); builder.Services.AddAuthorization(); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new Microsoft.OpenApi.Models.OpenApiInfo { Title = "Library Service API", Version = "v1", Description = "API ��� ���������� �����������." }); c.AddSecurityDefinition("Bearer", new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Name = "Authorization", Type = Microsoft.OpenApi.Models.SecuritySchemeType.Http, Scheme = "bearer", BearerFormat = "JWT", Description = "������� JWT ����� ��������� �������: Bearer {�����}" }); c.AddSecurityRequirement(new Microsoft.OpenApi.Models.OpenApiSecurityRequirement { { new Microsoft.OpenApi.Models.OpenApiSecurityScheme { Reference = new Microsoft.OpenApi.Models.OpenApiReference { Type = Microsoft.OpenApi.Models.ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty<string>() } }); c.OrderActionsBy((apiDesc) => $"{apiDesc.HttpMethod} {apiDesc.RelativePath}"); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } app.UseHttpsRedirection(); app.UseRateLimiter(); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.Run(); } } }