using NexusReader.Web.Components; using NexusReader.Application; using NexusReader.Infrastructure; using NexusReader.Application.Abstractions.Services; using NexusReader.Web.Client.Services; using NexusReader.UI.Shared.Services; var builder = WebApplication.CreateBuilder(args); // Add services to the container. builder.Services.AddRazorComponents() .AddInteractiveServerComponents() .AddInteractiveWebAssemblyComponents(); // Enable detailed circuit errors for Server‑Side Blazor components builder.Services.AddServerSideBlazor() .AddCircuitOptions(options => { options.DetailedErrors = true; }); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddScoped(); builder.Services.AddApplication(); builder.Services.AddInfrastructure(builder.Configuration); var app = builder.Build(); // Ensure Database is initialized using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService(); dbContext.Database.EnsureCreated(); } // Configure the HTTP request pipeline. if (app.Environment.IsDevelopment()) { app.UseWebAssemblyDebugging(); } else { app.UseExceptionHandler("/Error", createScopeForErrors: true); app.UseHsts(); } app.UseStatusCodePagesWithReExecute("/not-found", createScopeForStatusCodePages: true); if (!app.Environment.IsDevelopment()) { app.UseHttpsRedirection(); } app.UseAntiforgery(); app.MapStaticAssets(); // API endpoint for WASM client to fetch EPUB content app.MapGet("/api/epub/{index}", async (int index, IEpubService epubService) => { var result = await epubService.GetEpubContentAsync(index); if (result.IsSuccess) return Results.Ok(result.Value); var errorMsg = result.Errors.FirstOrDefault()?.Message ?? "Unknown server error"; return Results.BadRequest(errorMsg); }); app.MapPost("/api/knowledge", async (KnowledgeRequest request, IKnowledgeService knowledgeService) => { var result = await knowledgeService.GetKnowledgeAsync(request.Text); if (result.IsSuccess) return Results.Ok(result.Value); var errorMsg = result.Errors.FirstOrDefault()?.Message ?? "Unknown server error"; return Results.BadRequest(errorMsg); }); app.MapDelete("/api/knowledge", async (IKnowledgeService knowledgeService) => { var result = await knowledgeService.ClearCacheAsync(); if (result.IsSuccess) return Results.Ok(); var errorMsg = result.Errors.FirstOrDefault()?.Message ?? "Unknown server error"; return Results.BadRequest(errorMsg); }); app.MapRazorComponents() .AddInteractiveServerRenderMode() .AddInteractiveWebAssemblyRenderMode() .AddAdditionalAssemblies(typeof(NexusReader.UI.Shared.Services.IKnowledgeGraphService).Assembly); app.Run(); public record KnowledgeRequest(string Text);