diff --git a/src/IncidentOps.Worker/Program.cs b/src/IncidentOps.Worker/Program.cs new file mode 100644 index 0000000..529db81 --- /dev/null +++ b/src/IncidentOps.Worker/Program.cs @@ -0,0 +1,50 @@ +using Hangfire; +using Hangfire.Redis.StackExchange; +using IncidentOps.Infrastructure; +using IncidentOps.Infrastructure.Auth; +using IncidentOps.Infrastructure.Jobs; +using IncidentOps.Worker.Jobs; +using StackExchange.Redis; + +var builder = Host.CreateApplicationBuilder(args); + +// Configure Infrastructure +var connectionString = builder.Configuration.GetConnectionString("Postgres") + ?? throw new InvalidOperationException("Postgres connection string not configured"); + +var jwtSettings = new JwtSettings +{ + Issuer = builder.Configuration["Jwt:Issuer"] ?? "incidentops", + Audience = builder.Configuration["Jwt:Audience"] ?? "incidentops", + SigningKey = builder.Configuration["Jwt:SigningKey"] ?? "not-needed-for-worker", + AccessTokenExpirationMinutes = 15, + RefreshTokenExpirationDays = 7 +}; + +builder.Services.AddInfrastructure(connectionString, jwtSettings); + +// Configure Hangfire +var redisConnectionString = builder.Configuration["Redis:ConnectionString"] + ?? throw new InvalidOperationException("Redis connection string not configured"); + +builder.Services.AddHangfire(configuration => configuration + .SetDataCompatibilityLevel(CompatibilityLevel.Version_180) + .UseSimpleAssemblyNameTypeSerializer() + .UseRecommendedSerializerSettings() + .UseRedisStorage(ConnectionMultiplexer.Connect(redisConnectionString))); + +builder.Services.AddHangfireServer(options => +{ + options.Queues = ["critical", "default", "low"]; + options.WorkerCount = Environment.ProcessorCount * 2; +}); + +// Register job implementations +builder.Services.AddScoped(); +builder.Services.AddScoped(); +builder.Services.AddScoped(); + +builder.Services.AddHttpClient(); + +var host = builder.Build(); +host.Run();