using PlotLine.Data; using PlotLine.ViewModels; namespace PlotLine.Services; public interface IStoryIntelligenceGlobalProgressService { Task GetForCurrentUserAsync(); Task GetForUserAsync(int userId); } public sealed class StoryIntelligenceGlobalProgressService( ICurrentUserService currentUser, IStoryIntelligenceResultRepository runs) : IStoryIntelligenceGlobalProgressService { public async Task GetForCurrentUserAsync() { if (currentUser.UserId is not int userId) { return new StoryIntelligenceGlobalProgressViewModel(); } return await GetForUserAsync(userId); } public async Task GetForUserAsync(int userId) { var summaries = await runs.ListActiveBookRunSummariesForUserAsync(userId); return new StoryIntelligenceGlobalProgressViewModel { Books = summaries.Select(summary => new StoryIntelligenceGlobalProgressBookViewModel { ProjectID = summary.ProjectID, BookID = summary.BookID, BookTitle = string.IsNullOrWhiteSpace(summary.BookDisplayTitle) ? "Book" : summary.BookDisplayTitle, RunCount = summary.RunCount, PendingRunCount = summary.PendingRunCount, RunningRunCount = summary.RunningRunCount, CompletedRunCount = summary.CompletedRunCount, FailedRunCount = summary.FailedRunCount, TotalExpectedScenes = summary.TotalExpectedScenes, CompletedScenes = summary.CompletedScenes, FailedScenes = summary.FailedScenes, ActiveScenes = summary.ActiveScenes, Status = summary.Status, TotalDurationMs = summary.TotalDurationMs, UpdatedUtc = summary.UpdatedUtc }) .ToList() }; } }