Adds SoftDelete/Trash across characters, chapters, locations, beats with a purge schedule and Trash page. Reworks the web client for keyboard-driven navigation (focus helpers, help overlay, keyboard.md doc). Moves the ChapterPage tag editor to the bottom of the page to match CharacterDetailPage.
55 lines
1.7 KiB
C#
55 lines
1.7 KiB
C#
using Microsoft.EntityFrameworkCore;
|
|
using Microsoft.EntityFrameworkCore.Metadata.Builders;
|
|
using Novelly.Api.Beats;
|
|
using Novelly.Api.Common;
|
|
using Novelly.Api.Locations;
|
|
using Novelly.Api.Novels;
|
|
using Novelly.Api.Tags;
|
|
|
|
namespace Novelly.Api.Chapters;
|
|
|
|
public class Chapter : ISoftDeletable
|
|
{
|
|
public Guid Id { get; set; } = Guid.NewGuid();
|
|
public Guid NovelId { get; set; }
|
|
public Novel? Novel { get; set; }
|
|
|
|
public int Number { get; set; }
|
|
|
|
public ChapterKind Kind { get; set; } = ChapterKind.Body;
|
|
|
|
public string Title { get; set; } = string.Empty;
|
|
|
|
public string? Summary { get; set; }
|
|
|
|
public string? Notes { get; set; }
|
|
|
|
public DraftStatus Status { get; set; } = DraftStatus.Planned;
|
|
public int? TargetWordCount { get; set; }
|
|
|
|
public string? Prose { get; set; }
|
|
|
|
public int WordCount { get; set; }
|
|
|
|
public DateTimeOffset CreatedAt { get; set; } = DateTimeOffset.UtcNow;
|
|
public DateTimeOffset UpdatedAt { get; set; } = DateTimeOffset.UtcNow;
|
|
public DateTimeOffset? DeletedAt { get; set; }
|
|
|
|
public List<Beat> Beats { get; set; } = [];
|
|
|
|
public List<Tag> Tags { get; set; } = [];
|
|
public List<Location> Locations { get; set; } = [];
|
|
}
|
|
|
|
public class ChapterEntityTypeConfiguration : IEntityTypeConfiguration<Chapter>
|
|
{
|
|
public void Configure(EntityTypeBuilder<Chapter> entity)
|
|
{
|
|
entity.Property(c => c.Title).IsRequired().HasMaxLength(300);
|
|
entity.Property(c => c.Status).HasConversion<string>().HasMaxLength(32);
|
|
entity.Property(c => c.Kind).HasConversion<string>().HasMaxLength(32);
|
|
entity.HasIndex(c => new { c.NovelId, c.Number });
|
|
entity.HasQueryFilter(c => c.DeletedAt == null);
|
|
}
|
|
}
|