/
afanasevn
/
PdfEncoder
Обзор
Документация
Войти
/
afanasevn
/
PdfEncoder
Код
Запросы
0
Пакеты
0
Релизы
0
Аналитика
Безопасность
master
src/PdfEncoder.Api/Program.cs
120 строк
3 KB
IBS\NAfanasev
Field validation, integration tests, UI polish
06 июл 2026, 17:18
06 июл 2026, 17:18
0e936b0
Код
Авторство
О чём код?
using Microsoft.EntityFrameworkCore; using Microsoft.OpenApi.Models; using PdfEncoder.Api.Controllers; using PdfEncoder.Application.Options; using PdfEncoder.Infrastructure; using PdfEncoder.Infrastructure.Configuration; using PdfEncoder.Infrastructure.Persistence; using Serilog; EnvLoader.Load(); Log.Logger = new LoggerConfiguration() .WriteTo.Console() .CreateBootstrapLogger(); try { Log.Information("Starting PdfEncoder API"); var builder = WebApplication.CreateBuilder(args); builder.Host.UseSerilog((context, services, configuration) => configuration .ReadFrom.Configuration(context.Configuration) .ReadFrom.Services(services) .Enrich.FromLogContext() .WriteTo.Console()); builder.Services.AddControllers() .AddJsonOptions(options => { options.JsonSerializerOptions.PropertyNamingPolicy = System.Text.Json.JsonNamingPolicy.CamelCase; }); builder.Services.AddPdfEncoderProblemDetails(); builder.Services.AddEndpointsApiExplorer(); builder.Services.AddSwaggerGen(options => { options.SwaggerDoc("v1", new OpenApiInfo { Title = "PdfEncoder API", Version = "v1", Description = "Universal PDF parser with AI. Target: .NET 10." }); var xml = Path.Combine(AppContext.BaseDirectory, "PdfEncoder.Api.xml"); if (File.Exists(xml)) { options.IncludeXmlComments(xml); } }); builder.Services.AddInfrastructure(builder.Configuration); var corsOptions = builder.Configuration .GetSection(CorsOptions.SectionName) .Get<CorsOptions>() ?? new CorsOptions(); builder.Services.AddCors(options => { options.AddDefaultPolicy(policy => { policy.WithOrigins(corsOptions.AllowedOrigins) .AllowAnyHeader() .AllowAnyMethod(); }); }); var app = builder.Build(); if (app.Environment.IsDevelopment()) { await TryApplyDevelopmentMigrationsAsync(app.Services); } app.UseSerilogRequestLogging(); app.UsePdfEncoderExceptionHandling(); if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(options => options.DocumentTitle = "PdfEncoder API"); } app.UseCors(); app.MapControllers(); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "PdfEncoder API terminated unexpectedly"); } finally { Log.CloseAndFlush(); } // Применяет EF migrations в Development; не блокирует старт API при недоступном PostgreSQL. static async Task TryApplyDevelopmentMigrationsAsync(IServiceProvider services) { try { await using var scope = services.CreateAsyncScope(); var dbContext = scope.ServiceProvider.GetRequiredService<PdfEncoderDbContext>(); await dbContext.Database.MigrateAsync(); Log.Information("Database migrations applied."); } catch (Exception ex) { Log.Warning( ex, "Не удалось применить миграции: PostgreSQL недоступен. " + "Запустите `docker compose up -d` в корне репозитория и перезапустите API."); } } /// <summary> /// Точка входа для интеграционных тестов. /// </summary> public partial class Program;