68 lines
2.2 KiB
C#
68 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.StillPath is not null,
|
|
e.AirDate
|
|
);
|
|
})
|
|
.ToList();
|
|
|
|
return Result.Success(
|
|
new ShowDto(
|
|
show.Id,
|
|
show.Name,
|
|
show.Kind,
|
|
show.Description,
|
|
show.MetadataProvider,
|
|
show.MetadataExternalId,
|
|
show.Year,
|
|
show.PosterPath is not null,
|
|
episodeDtos
|
|
)
|
|
);
|
|
}
|
|
}
|