using FictionArchive.Common.Extensions; using FictionArchive.Service.NovelService.GraphQL; using FictionArchive.Service.NovelService.Models.Configuration; using FictionArchive.Service.NovelService.Models.IntegrationEvents; using FictionArchive.Service.NovelService.Services; using FictionArchive.Service.NovelService.Services.EventHandlers; using FictionArchive.Service.NovelService.Services.SourceAdapters; using FictionArchive.Service.NovelService.Services.SourceAdapters.Novelpia; using FictionArchive.Service.Shared; using FictionArchive.Service.Shared.Extensions; using FictionArchive.Service.Shared.Services.EventBus.Implementations; using FictionArchive.Service.Shared.Services.GraphQL; using Microsoft.EntityFrameworkCore; namespace FictionArchive.Service.NovelService; public class Program { public static void Main(string[] args) { var isSchemaExport = SchemaExportDetector.IsSchemaExportMode(args); var builder = WebApplication.CreateBuilder(args); builder.AddLocalAppsettings(); builder.Services.AddMemoryCache(); #region Event Bus if (!isSchemaExport) { builder.Services.AddRabbitMQ(opt => { builder.Configuration.GetSection("RabbitMQ").Bind(opt); }) .Subscribe() .Subscribe() .Subscribe() .Subscribe(); } #endregion #region GraphQL builder.Services.AddDefaultGraphQl() .AddAuthorization(); #endregion #region Database builder.Services.RegisterDbContext( builder.Configuration.GetConnectionString("DefaultConnection"), skipInfrastructure: isSchemaExport); #endregion #region Source Adapters builder.Services.Configure(builder.Configuration.GetSection("Novelpia")); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri("https://novelpia.com"); }); builder.Services.AddHttpClient(client => { client.BaseAddress = new Uri("https://novelpia.com"); }) .AddHttpMessageHandler(); builder.Services.Configure(builder.Configuration.GetSection("UpdateService")); builder.Services.AddTransient(); #endregion builder.Services.AddHealthChecks(); // Authentication & Authorization builder.Services.AddOidcAuthentication(builder.Configuration); builder.Services.AddFictionArchiveAuthorization(); var app = builder.Build(); // Update database (skip in schema export mode) if (!isSchemaExport) { using var scope = app.Services.CreateScope(); var dbContext = scope.ServiceProvider.GetRequiredService(); dbContext.UpdateDatabase(); } app.UseHttpsRedirection(); app.MapHealthChecks("/healthz"); app.UseAuthentication(); app.UseAuthorization(); app.MapGraphQL(); app.RunWithGraphQLCommands(args); } }