using System.Reflection; using CvMatcher.Models.Settings; using CvSearch.Data; using CvSearchJob.Clients; using CvSearchJob.Services; using CvSearchJob.Tasks; using JobScheduler.Scheduling; using JobScheduler.Tasks; using Microsoft.EntityFrameworkCore; using Microsoft.Extensions.DependencyInjection; using Microsoft.Extensions.Hosting; using MyAi.Data; using MyAi.Data.Services; using Refit; using Serilog; using Common.Settings; using StartupHelpers; const string ServiceName = "cv-search-job"; StartupExtensions.LoadDotEnvFile(); var appVersion = StartupExtensions.GetApplicationVersion(Assembly.GetExecutingAssembly()); try { var builder = Host.CreateApplicationBuilder(args); builder.ConfigureJsonSerilog(ServiceName, appVersion); Log.Information("Starting {Service} version {AppVersion}", ServiceName, appVersion); builder.Services.Configure(builder.Configuration.GetSection("JobSearch")); builder.Services.Configure(builder.Configuration.GetSection("Database")); builder.Services.AddDbContext(options => { var connectionString = builder.Services.GetConfiguredDbConnectionString(builder.Configuration); options.UseSqlServer(connectionString, sql => { sql.MigrationsAssembly("cv-search-data"); sql.MigrationsHistoryTable(CvSearchDbContext.MigrationTableName, CvSearchDbContext.SchemaName); }); }); builder.Services.AddRefitClient() .ConfigureHttpClient((sp, client) => { var config = sp.GetRequiredService(); var baseUrl = config["CvMatcherApi:BaseUrl"] ?? string.Empty; if (!string.IsNullOrWhiteSpace(baseUrl)) client.BaseAddress = new Uri(baseUrl.TrimEnd('/') + "/"); var key = config["CvMatcherApi:InternalApiKey"]; if (!string.IsNullOrWhiteSpace(key)) client.DefaultRequestHeaders.Add("X-Internal-Api-Key", key); }); builder.Services.AddDbContext(options => { var connectionString = builder.Services.GetConfiguredDbConnectionString(builder.Configuration); options.UseSqlServer(connectionString, sql => { sql.MigrationsAssembly("myai-data"); sql.MigrationsHistoryTable(MyAiDbContext.MigrationTableName, MyAiDbContext.SchemaName); }); }); builder.Services.AddSingleton(); builder.Services.AddHttpClient(); builder.Services.AddSingleton(); builder.Services.AddSingleton(); builder.Services.AddSingleton>(sp => new IJobTask[] { sp.GetRequiredService(), }); builder.Services.AddHostedService(); var host = builder.Build(); host.LogHostStartupDiagnostics(ServiceName); Log.Information("Running EF Core migrations"); using (var scope = host.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); db.Database.Migrate(); } using (var scope = host.Services.CreateScope()) { var db = scope.ServiceProvider.GetRequiredService(); db.Database.Migrate(); } Log.Information("{Service} startup complete. Background scheduler is running.", ServiceName); await host.RunAsync(); } catch (Exception ex) { Log.Fatal(ex, "{Service} terminated unexpectedly", ServiceName); } finally { Log.CloseAndFlush(); }