Remove chapter-level POV character

Character assignment now lives on beats only, per batch-assign. Drops
Chapter.PovCharacterId (entity, contracts, service, agent/import/MCP
tools, web UI) and the backing column via migration.
This commit is contained in:
James Wampler
2026-08-15 20:44:10 -07:00
parent df10b1f99b
commit 7d8dd0c4fd
13 changed files with 973 additions and 117 deletions
+6 -12
View File
@@ -20,7 +20,6 @@ public class ChapterService(
logger.LogInformation("Listing chapters for project {ProjectId}", projectId);
return await db.Chapters
.Include(c => c.PovCharacter)
.Include(c => c.Beats)
.Include(c => c.Tags)
.Where(c => c.ProjectId == projectId)
@@ -40,13 +39,13 @@ public class ChapterService(
{
Guard.Default(projectId, nameof(projectId));
Guard.Null(request, nameof(request));
createValidator.Validate(request).ThrowIfInvalid();
createValidator.Validate(request).ThrowIfInvalid(logger);
logger.LogInformation("Creating chapter {Title} for project {ProjectId}", request.Title, projectId);
if (!await db.Projects.AnyAsync(p => p.Id == projectId, ct))
{
logger.LogInformation("Rejected chapter creation: project {ProjectId} not found", projectId);
logger.LogWarning("Rejected chapter creation: project {ProjectId} not found", projectId);
return null;
}
@@ -56,7 +55,6 @@ public class ChapterService(
Title = request.Title,
Number = request.Number ?? await NextChapterNumberAsync(projectId, ct),
Summary = request.Summary,
PovCharacterId = request.PovCharacterId,
Setting = request.Setting,
Notes = request.Notes,
Status = request.Status,
@@ -80,7 +78,7 @@ public class ChapterService(
{
Guard.Default(id, nameof(id));
Guard.Null(request, nameof(request));
updateValidator.Validate(request).ThrowIfInvalid();
updateValidator.Validate(request).ThrowIfInvalid(logger);
logger.LogInformation("Updating chapter {ChapterId}", id);
@@ -93,7 +91,6 @@ public class ChapterService(
chapter.Title = Patch.Apply(chapter.Title, request.Title) ?? chapter.Title;
chapter.Number = request.Number ?? chapter.Number;
chapter.Summary = Patch.Apply(chapter.Summary, request.Summary);
chapter.PovCharacterId = request.PovCharacterId ?? chapter.PovCharacterId;
chapter.Setting = Patch.Apply(chapter.Setting, request.Setting);
chapter.Notes = Patch.Apply(chapter.Notes, request.Notes);
chapter.Status = request.Status ?? chapter.Status;
@@ -151,7 +148,6 @@ public class ChapterService(
logger.LogDebug("Finding chapter {ChapterId}", id);
var chapter = await db.Chapters
.Include(c => c.PovCharacter)
.Include(c => c.Beats).ThenInclude(b => b.Characters)
.Include(c => c.Beats).ThenInclude(b => b.Tags)
.Include(c => c.Tags)
@@ -159,13 +155,11 @@ public class ChapterService(
if (chapter is null)
{
logger.LogInformation("Chapter {ChapterId} not found", id);
}
else
{
logger.LogDebug("Found chapter {ChapterId}", id);
logger.LogWarning("Chapter {ChapterId} not found", id);
return chapter;
}
logger.LogDebug("Found chapter {ChapterId}", id);
return chapter;
}
}