Files
TeleWave/backend/src/TeleWave.Application/Library/GetShow/GetShowQueryHandler.cs
T

69 lines
2.2 KiB
C#

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<GetShowQuery, Result<ShowDto>>
{
public async Task<Result<ShowDto>> 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<ShowDto>(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
)
);
}
}