using DramaLing.Application; using DramaLing.Infrastructure; using Microsoft.OpenApi.Models; using Serilog; var builder = WebApplication.CreateBuilder(args); // Configure Serilog Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(builder.Configuration) .CreateLogger(); builder.Host.UseSerilog(); // Add services to the container. builder.Services.AddApplication(); builder.Services.AddInfrastructure(builder.Configuration); builder.Services.AddControllers(); builder.Services.AddEndpointsApiExplorer(); // Configure Swagger/OpenAPI builder.Services.AddSwaggerGen(c => { c.SwaggerDoc("v1", new OpenApiInfo { Title = "Drama Ling API", Version = "v1", Description = "API for Drama Ling language learning application", Contact = new OpenApiContact { Name = "Drama Ling Team", Email = "dev@dramaling.com" } }); // Configure JWT authentication in Swagger c.AddSecurityDefinition("Bearer", new OpenApiSecurityScheme { Description = "JWT Authorization header using the Bearer scheme. Example: \"Bearer {token}\"", Name = "Authorization", In = ParameterLocation.Header, Type = SecuritySchemeType.ApiKey, Scheme = "Bearer" }); c.AddSecurityRequirement(new OpenApiSecurityRequirement { { new OpenApiSecurityScheme { Reference = new OpenApiReference { Type = ReferenceType.SecurityScheme, Id = "Bearer" } }, Array.Empty() } }); // Include XML comments var xmlFile = Path.Combine(AppContext.BaseDirectory, "DramaLing.API.xml"); if (File.Exists(xmlFile)) { c.IncludeXmlComments(xmlFile); } }); // Configure CORS builder.Services.AddCors(options => { options.AddPolicy("DramaLingPolicy", policy => { policy.AllowAnyOrigin() .AllowAnyMethod() .AllowAnyHeader(); }); }); var app = builder.Build(); // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(c => { c.SwaggerEndpoint("/swagger/v1/swagger.json", "Drama Ling API v1"); c.RoutePrefix = string.Empty; // Serve Swagger UI at the app's root }); } app.UseHttpsRedirection(); app.UseCors("DramaLingPolicy"); app.UseAuthentication(); app.UseAuthorization(); app.MapControllers(); app.MapGet("/health", () => new { Status = "Healthy", Timestamp = DateTime.UtcNow }); try { Log.Information("Starting Drama Ling API"); app.Run(); } catch (Exception ex) { Log.Fatal(ex, "Application terminated unexpectedly"); } finally { Log.CloseAndFlush(); }