541e9e1fb5
This Pull Request encapsulates all outstanding AI, Blazor InteractiveAuto lifecycle, pgvector, and Firefox authorization/session compatibility fixes. ### Key Accomplishments: 1. **Concurrent Request Deduplication (Option B):** Implemented a thread-safe active task registry in `KnowledgeService` that groups concurrent graph extraction queries for the same content, preventing duplicate AI calls completely. 2. **Resilience Strategy for Downstream Demands:** Extended the `ai-retry` resilience pipeline to automatically intercept and retry on temporary Google API `503 ServiceUnavailable` / `high demand` spikes. 3. **Interactive Graph Generation Guard (Option A):** Prevented server-side prerender-phase graph requests in the reader canvas component. 4. **Firefox Compatibility & Cookie Handler:** Implemented an authentication endpoint and hybrid hidden-form submission flow to solve login, registration, and logout redirections and cookies securely. 5. **Autoscrolling & Graph Exclusions:** Added concept-to-block smooth scrolling, active block badging, and filtered out markdown code blocks from being extracted as nodes. All unit tests compiled and passed 100% cleanly. --------- Co-authored-by: Marek Jasiński <jasins.marek@gmail.com> Reviewed-on: #44 Co-authored-by: Antigravity <antigravity@google.com> Co-committed-by: Antigravity <antigravity@google.com>
59 lines
1.5 KiB
C#
59 lines
1.5 KiB
C#
using System.ComponentModel.DataAnnotations;
|
|
using System.ComponentModel.DataAnnotations.Schema;
|
|
|
|
namespace NexusReader.Domain.Entities;
|
|
|
|
/// <summary>
|
|
/// Represents an E-book uploaded or owned by a user.
|
|
/// </summary>
|
|
public class Ebook
|
|
{
|
|
[Key]
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
|
|
[Required]
|
|
[MaxLength(255)]
|
|
public string Title { get; set; } = string.Empty;
|
|
|
|
[Required]
|
|
public int AuthorId { get; set; }
|
|
|
|
[ForeignKey(nameof(AuthorId))]
|
|
public virtual Author Author { get; set; } = null!;
|
|
|
|
[Required]
|
|
public string FilePath { get; set; } = string.Empty;
|
|
|
|
public string? CoverUrl { get; set; }
|
|
|
|
[Required]
|
|
[MaxLength(128)]
|
|
public string TenantId { get; set; } = "global";
|
|
|
|
public DateTime AddedDate { get; set; } = DateTime.UtcNow;
|
|
|
|
public DateTime? LastReadDate { get; set; }
|
|
|
|
public double Progress { get; set; } = 0;
|
|
|
|
[MaxLength(255)]
|
|
public string? LastChapter { get; set; }
|
|
|
|
public int LastChapterIndex { get; set; } = 0;
|
|
|
|
public string? Description { get; set; }
|
|
|
|
/// <summary>
|
|
/// Gets or sets a value indicating whether the ebook has been processed by the AI ingestion engine
|
|
/// and is ready for reading (Knowledge Units generated).
|
|
/// </summary>
|
|
public bool IsReadyForReading { get; set; } = false;
|
|
|
|
// Relationship to NexusUser
|
|
[Required]
|
|
public string UserId { get; set; } = string.Empty;
|
|
|
|
[ForeignKey(nameof(UserId))]
|
|
public NexusUser? User { get; set; }
|
|
}
|