< Summary

Information
Line coverage
0%
Covered lines: 0
Uncovered lines: 51
Coverable lines: 51
Total lines: 85
Line coverage: 0%
Branch coverage
0%
Covered branches: 0
Total branches: 2
Branch coverage: 0%
Method coverage

Feature is only available for sponsors

Upgrade to PRO version

Metrics

MethodBranch coverage Crap Score Cyclomatic complexity Line coverage
<Main>$(...)0%620%

File(s)

/home/runner/work/ClientManagerDemo/ClientManagerDemo/src/ClientManager/ClientManager.Worker/Program.cs

#LineLine coverage
 1using ClientManager.Shared.Configuration;
 2using ClientManager.Shared.Data;
 3using ClientManager.Shared.Messaging;
 4using ClientManager.Worker;
 5using ClientManager.Worker.Administration;
 6using ClientManager.Worker.Messaging;
 7using ClientManager.Worker.Repositories;
 8using Microsoft.EntityFrameworkCore;
 9using Microsoft.Extensions.Options;
 10using Serilog;
 11
 012var builder = Host.CreateApplicationBuilder(args);
 13
 14// Load .env file if it exists
 015ConfigurationHelper.LoadDotEnvFile();
 016builder.Configuration.AddEnvironmentVariables();
 17
 18// Map configuration sections to strongly typed classes
 019builder.Services.Configure<PostgresConnectionConfiguration>(builder.Configuration.GetSection("POSTGRES"));
 020builder.Services.Configure<RabbitMQConnectionConfiguration>(builder.Configuration.GetSection("RABBITMQ"));
 21
 022Directory.CreateDirectory(Path.Combine(AppContext.BaseDirectory, "Logs"));
 23
 24// Configure Serilog
 025Log.Logger = new LoggerConfiguration()
 026    .MinimumLevel.Information()
 027    .Enrich.WithProperty("Service", "Worker")
 028    .WriteTo.Console(outputTemplate: "[{Timestamp:HH:mm:ss} {Level:u3}] [{Service}] {Message:lj}{NewLine}{Exception}")
 029    .WriteTo.File(Path.Combine(AppContext.BaseDirectory, "Logs", "worker.log"))
 030    .CreateLogger();
 31
 32// Hook Serilog into .NET logging
 033builder.Logging.ClearProviders();
 034builder.Logging.AddSerilog();
 35
 036builder.Services.AddHostedService<Worker>();
 037builder.Services.AddScoped<IMessageContextAccessor, MessageContextAccessor>();
 038builder.Services.AddScoped<IRoutingConvention, RoutingConvention>();
 039builder.Services.AddScoped<IClientRepository, ClientRepository>();
 040builder.Services.AddScoped<IMessagePublisher, MessagePublisher>();
 041builder.Services.AddSingleton<MessagePublishPipeline>();
 042builder.Services.AddSingleton<IMessageConsumer, RabbitMQMessageConsumer>();
 043builder.Services.AddSingleton<IMessageBrokerFactory>(sp =>
 044{
 045    // Get RabbitMQ connection configuration from DI
 046    var connectionConfiguration = sp.GetRequiredService<IOptions<RabbitMQConnectionConfiguration>>().Value;
 047    return new MessageBrokerFactory(connectionConfiguration);
 048});
 049builder.Services.AddDbContext<AppDbContext>(
 050    (sp, options) =>
 051    {
 052        // Get Postgres connection configuration from DI
 053        var postgresConfig = sp.GetRequiredService<IOptions<PostgresConnectionConfiguration>>().Value;
 054        options.UseNpgsql(postgresConfig.ToConnectionString(), b => b.MigrationsAssembly("ClientManager.Worker"));
 055    }
 056);
 57
 058builder.Services.AddMessageHandlers(AppDomain.CurrentDomain.GetAssemblies());
 59
 060var host = builder.Build();
 61
 062using (var scope = host.Services.CreateScope())
 63{
 064    var db = scope.ServiceProvider.GetRequiredService<AppDbContext>();
 065    var retries = 0;
 66    const int maxRetries = 10;
 67
 068    while (retries < maxRetries)
 69    {
 70        try
 71        {
 072            db.Database.Migrate();
 073            Console.WriteLine("Database migration successful");
 074            break;
 75        }
 076        catch (Exception ex)
 77        {
 078            retries++;
 079            Console.WriteLine($"Database not ready (attempt {retries}/{maxRetries}): {ex.Message}");
 080            Thread.Sleep(TimeSpan.FromSeconds(5));
 081        }
 82    }
 083}
 84
 085host.Run();

Methods/Properties

<Main>$(System.String[])