using PlotLine.Data; using PlotLine.ViewModels; namespace PlotLine.Services; public interface IStoryIntelligenceGlobalProgressService { Task GetForCurrentUserAsync(); } public sealed class StoryIntelligenceGlobalProgressService( ICurrentUserService currentUser, IStoryIntelligenceResultRepository runs) : IStoryIntelligenceGlobalProgressService { public async Task GetForCurrentUserAsync() { if (currentUser.UserId is not int userId) { return new StoryIntelligenceGlobalProgressViewModel(); } 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, TotalDetectedScenes = summary.TotalDetectedScenes, CompletedScenes = summary.CompletedScenes, FailedScenes = summary.FailedScenes, TotalDurationMs = summary.TotalDurationMs, UpdatedUtc = summary.UpdatedUtc }) .ToList() }; } }