98 lines
3.2 KiB
C#
98 lines
3.2 KiB
C#
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<IPlatformService, WebPlatformService>();
|
||
builder.Services.AddScoped<IThemeService, ThemeService>();
|
||
builder.Services.AddScoped<IQuizStateService, QuizStateService>();
|
||
builder.Services.AddScoped<IFocusModeService, FocusModeService>();
|
||
builder.Services.AddScoped<IReaderNavigationService, ReaderNavigationService>();
|
||
builder.Services.AddScoped<IKnowledgeGraphService, KnowledgeGraphService>();
|
||
builder.Services.AddScoped<KnowledgeCoordinator>();
|
||
|
||
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<NexusReader.Infrastructure.Persistence.AppDbContext>();
|
||
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<App>()
|
||
.AddInteractiveServerRenderMode()
|
||
.AddInteractiveWebAssemblyRenderMode()
|
||
.AddAdditionalAssemblies(typeof(NexusReader.UI.Shared.Services.IKnowledgeGraphService).Assembly);
|
||
|
||
app.Run();
|
||
|
||
public record KnowledgeRequest(string Text);
|