fix(arch): revert WASM proxies, restore CQRS integrity, and add EF migration for Ebook state

This commit is contained in:
2026-05-13 20:18:32 +02:00
parent 92ea11a51a
commit 2c5f769458
9 changed files with 778 additions and 264 deletions
-69
View File
@@ -253,13 +253,6 @@ app.MapGet("/api/epub/{ebookId:guid}/{index:int}", async (Guid ebookId, int inde
return Results.BadRequest(errorMsg);
}).RequireAuthorization();
// Proxy API for AI services (Embeddings)
app.MapPost("/api/ai/embeddings", async (EmbeddingsRequest request, IEmbeddingGenerator<string, Embedding<float>> generator) =>
{
var result = await generator.GenerateAsync(request.Values, request.Options);
return Results.Ok(result);
}).RequireAuthorization();
var knowledgeApi = app.MapGroup("/api/knowledge").RequireAuthorization("HasAvailableTokens");
knowledgeApi.MapPost("/", async (KnowledgeRequest request, ClaimsPrincipal user, IKnowledgeService knowledgeService) =>
@@ -303,63 +296,6 @@ knowledgeApi.MapDelete("/", async (IKnowledgeService knowledgeService) =>
return Results.BadRequest(errorMsg);
});
// Proxy API for WASM Repository calls
var repoApi = app.MapGroup("/api/repository").RequireAuthorization();
repoApi.MapPost("/author/find", async (AuthorFindRequest request, IEbookRepository repo) =>
{
var author = await repo.FindAuthorByNameAsync(request.Name);
return author != null ? Results.Ok(author) : Results.NotFound();
});
repoApi.MapPost("/author/add", (Author author, IEbookRepository repo) =>
{
repo.AddAuthor(author);
return Results.Ok();
});
repoApi.MapPost("/ebook/add", (Ebook ebook, IEbookRepository repo) =>
{
repo.AddEbook(ebook);
return Results.Ok();
});
repoApi.MapPost("/save", async (IEbookRepository repo) =>
{
await repo.SaveChangesAsync();
return Results.Ok();
});
// Proxy API for WASM Broadcaster calls
var broadcasterApi = app.MapGroup("/api/broadcaster").RequireAuthorization();
broadcasterApi.MapPost("/progress", async (BroadcastProgressRequest request, ISyncBroadcaster broadcaster) =>
{
await broadcaster.BroadcastProgressAsync(request.UserId, request.PageId, request.Timestamp, request.ExcludedConnectionId);
return Results.Ok();
});
broadcasterApi.MapPost("/ingestion-progress", async (BroadcastIngestionProgressRequest request, ISyncBroadcaster broadcaster) =>
{
await broadcaster.BroadcastIngestionProgressAsync(request.UserId, request.Message, request.Progress);
return Results.Ok();
});
// Proxy API for WASM Storage calls
var storageApi = app.MapGroup("/api/storage").RequireAuthorization();
storageApi.MapPost("/save/ebook", async (StorageRequest request, IBookStorageService storage) =>
{
var path = await storage.SaveEbookAsync(request.Data, request.FileName);
return Results.Ok(new { Path = path });
});
storageApi.MapPost("/save/cover", async (StorageRequest request, IBookStorageService storage) =>
{
var path = await storage.SaveCoverAsync(request.Data, request.FileName);
return Results.Ok(new { Path = path });
});
app.MapPost("/api/library/ingest", async ([FromBody] IngestEbookRequest request, ClaimsPrincipal user, IMediator mediator) =>
{
var userId = user.FindFirstValue(ClaimTypes.NameIdentifier);
@@ -585,8 +521,3 @@ app.Run();
public record KnowledgeRequest(string Text);
public record GroundednessRequest(string Answer, string Context);
public record AuthorFindRequest(string Name);
public record BroadcastProgressRequest(string UserId, string PageId, DateTime Timestamp, string? ExcludedConnectionId);
public record BroadcastIngestionProgressRequest(string UserId, string Message, double Progress);
public record StorageRequest(byte[] Data, string FileName);
public record EmbeddingsRequest(IEnumerable<string> Values, EmbeddingGenerationOptions? Options);