using ScrapperAPI.Bus; using ScrapperAPI.Factories; using ScrapperAPI.Hub; using ScrapperAPI.Interfaces; using ScrapperAPI.Options; using ScrapperAPI.Repositories; using ScrapperAPI.Services; using ScrapperAPI.Utils; using ScrapperAPI.Workers; var builder = WebApplication.CreateBuilder(args); builder.Services.AddOpenApi(); builder.Services.AddSignalR(); builder.Services.AddControllers(); builder.Services.Configure(builder.Configuration.GetSection("Scraper")); builder.Services.AddSingleton(sp => { var opts = sp.GetRequiredService>().Value; return new DomainRateLimiter(opts.RateLimit.PerDomainMinDelayMs); }); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddHttpClient("scraper", c => c.Timeout = TimeSpan.FromSeconds(30)); builder.Services.AddSingleton(); builder.Services.AddHostedService(sp => (ScrapeCoordinator)sp.GetRequiredService()); builder.Services.AddCors(options => { options.AddPolicy("AllowReact", policy => { policy.WithOrigins("http://localhost:3000") .AllowAnyHeader() .AllowAnyMethod() .AllowCredentials(); }); }); var app = builder.Build(); app.UseCors("AllowReact"); if (app.Environment.IsDevelopment()) { app.MapOpenApi(); } app.MapControllers(); app.MapHub("/ws/scrape"); // app.UseHttpsRedirection(); app.Run();