Add broadcast scheduling features: implement Show and Channel entities, enhance AppDbContext and DependencyInjection for broadcasting, and update API routing. Include migration for new database schema and update documentation for broadcast-related functionalities.
This commit is contained in:
@@ -0,0 +1,51 @@
|
||||
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
|
||||
);
|
||||
})
|
||||
.ToList();
|
||||
|
||||
return Result.Success(
|
||||
new ShowDto(show.Id, show.Name, show.Kind, show.Description, episodeDtos)
|
||||
);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user