using LiteCqrs; using Microsoft.EntityFrameworkCore; using TeleWave.Application.Common.Interfaces; using TeleWave.Application.Common.Models; namespace TeleWave.Application.Library.GetShow; public sealed class GetShowQueryHandler(IAppDbContext dbContext) : IQueryHandler> { public async Task> Handle(GetShowQuery query, CancellationToken cancellationToken) { var show = await dbContext.Shows.AsNoTracking() .Include(s => s.Episodes) .FirstOrDefaultAsync(s => s.Id == query.Id, cancellationToken); if (show is null) return Result.Failure(ShowErrors.NotFound); var episodes = show.Episodes.OrderBy(e => e.Position).ToList(); var assetIds = episodes.Select(e => e.MediaAssetId).ToList(); var assets = await dbContext.MediaAssets.AsNoTracking() .Where(a => assetIds.Contains(a.Id)) .Select(a => new { a.Id, a.OriginalFileName, a.Status, a.Duration, }) .ToDictionaryAsync(a => a.Id, cancellationToken); var episodeDtos = episodes .Select(e => { assets.TryGetValue(e.MediaAssetId, out var asset); return new EpisodeDto( e.Id, e.MediaAssetId, e.Position, asset?.OriginalFileName, asset?.Status, asset?.Duration?.TotalSeconds, e.Season, e.Episode, e.Title, e.Overview, e.StillImageId, e.AirDate ); }) .ToList(); return Result.Success( new ShowDto( show.Id, show.Name, show.OriginalName, show.Kind, show.Description, show.MetadataProvider, show.MetadataExternalId, show.Year, show.PosterImageId, episodeDtos ) ); } }