using Application; using Application.Abstractions.Chat; using Application.Abstractions.Crypto; using Infrastructure; using SharedKernel; using System.Reflection; using Web.Api; using Web.Api.Extensions; using Web.Api.Hubs; using Web.Api.Services; var builder = WebApplication.CreateBuilder(args); var settings = builder.Configuration.Get()!; Console.Title = settings.App.Name; Console.WriteLine($"ENV={builder.Environment.EnvironmentName}"); Console.WriteLine($"현재 시간: {DateTime.Now} / {TimeZoneInfo.Local.Id}"); builder.Host.UseWindowsService(); builder.Services.Configure(builder.Configuration); builder.Services .AddApplication() .AddPresentation() .AddApiInfrastructure(builder.Configuration); // CORS builder.Services.AddCors(options => { options.AddPolicy(settings.CorsPolicy.Name, policy => { policy .WithOrigins(settings.CorsPolicy.AllowedOrigins.ToArray()) .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials() .SetPreflightMaxAge(TimeSpan.FromSeconds(settings.CorsPolicy.PreflightMaxAgeSeconds)); }); }); // SignalR builder.Services.AddSignalR(); builder.Services.AddSingleton(); // Chat builder.Services.AddSingleton(); builder.Services.AddHostedService(); // Endpoints builder.Services.AddEndpoints(Assembly.GetExecutingAssembly()); builder.Logging.AddConsole(); /** * ======================================================================================================================================================= */ var app = builder.Build(); /** * ======================================================================================================================================================= */ if (app.Environment.IsDevelopment()) { app.UseSwagger(); app.UseSwaggerUI(); } // 상태 확인\ app.MapHealthChecks("/health"); app.UseExceptionHandler(); app.UseCors(settings.CorsPolicy.Name); app.UseStaticFiles(); app.UseAuthentication(); app.UseAuthorization(); app.MapEndpoints(); app.MapHub("/hubs/crypto"); app.MapHub("/hubs/chat"); // 서버 시작 시 이전 채팅 접속자 정보 초기화 (stale 연결 제거) using (var scope = app.Services.CreateScope()) { await scope.ServiceProvider.GetRequiredService().ClearAllAsync(); } app.Run();