using EnvelopeGenerator.Application.ThirdPartyModules.Queries; using EnvelopeGenerator.DependencyInjection; using EnvelopeGenerator.Finalizer; using EnvelopeGenerator.Finalizer.Models; using EnvelopeGenerator.Infrastructure; using MediatR; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.Options; using Quartz; using Serilog; // Load Serilog from appsettings.json Log.Logger = new LoggerConfiguration() .ReadFrom.Configuration(new ConfigurationBuilder() .AddJsonFile("appsettings.Logging.json", optional: false, reloadOnChange: true) .Build()) .CreateLogger(); try { Log.Information("Application is starting..."); var builder = Host.CreateApplicationBuilder(args); // add serilog builder.Logging.ClearProviders(); builder.Logging.AddSerilog(); var config = builder.Configuration; Directory .GetFiles(builder.Environment.ContentRootPath, "appsettings.*.json", SearchOption.TopDirectoryOnly) .Where(file => Path.GetFileName(file) != $"appsettings.Development.json") .Where(file => Path.GetFileName(file) != $"appsettings.migration.json") .ToList() .ForEach(file => config.AddJsonFile(file, true, true)); #region Worker builder.Services.AddQuartz(q => { var name = $"{typeof(Worker).FullName}-{Guid.NewGuid():N}"; var jobKey = new JobKey(name); q.AddJob(opts => opts.WithIdentity(jobKey)); q.AddTrigger(opts => opts .ForJob(jobKey) .WithIdentity(name + "-trigger") .WithCronSchedule("* * * * * ?")); }); builder.Services.AddQuartzHostedService(opt => { opt.WaitForJobsToComplete = true; }); builder.Services.Configure(config.GetSection("Worker")); #endregion #region Add DB Context, EG Inf. and Services var cnnStrName = "Default"; var connStr = config.GetConnectionString(cnnStrName) ?? throw new InvalidOperationException($"Connection string '{cnnStrName}' is missing in the application configuration."); builder.Services.AddEnvelopeGenerator(egOptions => egOptions .AddLocalization() .AddDistributedSqlServerCache(options => { options.ConnectionString = connStr; options.SchemaName = "dbo"; options.TableName = "TBDD_CACHE"; }) .AddInfrastructure(opt => { opt.AddDbTriggerParams(config); opt.AddDbContext((provider, options) => { var logger = provider.GetRequiredService>(); var useInMemoryDb = config.GetValue("UseInMemoryDb"); var dbCtxOpt = useInMemoryDb ? options.UseInMemoryDatabase("EGInMemoryDb") : options.UseSqlServer(connStr); dbCtxOpt.LogTo(log => logger.LogInformation("{log}", log), LogLevel.Trace) .EnableSensitiveDataLogging() .EnableDetailedErrors(); }); }) .AddServices(config) ); #endregion Add DB Context, EG Inf. and Services builder.Services.AddOptions() .Configure((GdPictureOptions opt, IServiceProvider sp) => { var licenseKey = "GDPICTURE"; using var scope = sp.CreateScope(); var mediator = scope.ServiceProvider.GetRequiredService(); opt.License = config["GdPictureLicenseKey"] ?? mediator.ReadThirdPartyModuleLicenseAsync(licenseKey).GetAwaiter().GetResult() ?? throw new InvalidOperationException($"License record not found for key: {licenseKey}"); }); var host = builder.Build(); var licence = host.Services.GetRequiredService>().Value; host.Run(); Log.Information("The worker was stopped."); } catch (Exception ex) { Log.Fatal(ex, "Worker could not be started!"); } finally { Log.CloseAndFlush(); }