using System.Threading.Channels; using ErsatzTV.Application.Channels; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.Playouts; public class UpdateSequentialPlayoutHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; private readonly ChannelWriter _workerChannel; public UpdateSequentialPlayoutHandler( IDbContextFactory dbContextFactory, ChannelWriter workerChannel) { _dbContextFactory = dbContextFactory; _workerChannel = workerChannel; } public async Task> Handle( UpdateSequentialPlayout request, CancellationToken cancellationToken) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); Validation validation = await Validate(dbContext, request, cancellationToken); return await validation.Apply(playout => ApplyUpdateRequest(dbContext, request, playout, cancellationToken)); } private async Task ApplyUpdateRequest( TvContext dbContext, UpdateSequentialPlayout request, Playout playout, CancellationToken cancellationToken) { playout.ScheduleFile = request.ScheduleFile; if (await dbContext.SaveChangesAsync(cancellationToken) > 0) { await _workerChannel.WriteAsync(new RefreshChannelData(playout.Channel.Number), cancellationToken); } return new PlayoutNameViewModel( playout.Id, playout.ScheduleKind, playout.Channel.Name, playout.Channel.Number, playout.Channel.PlayoutMode, playout.ProgramSchedule?.Name ?? string.Empty, playout.ScheduleFile, playout.DailyRebuildTime, playout.BuildStatus); } private static Task> Validate( TvContext dbContext, UpdateSequentialPlayout request, CancellationToken cancellationToken) => PlayoutMustExist(dbContext, request, cancellationToken); private static Task> PlayoutMustExist( TvContext dbContext, UpdateSequentialPlayout updatePlayout, CancellationToken cancellationToken) => dbContext.Playouts .Include(p => p.Channel) .SelectOneAsync(p => p.Id, p => p.Id == updatePlayout.PlayoutId, cancellationToken) .Map(o => o.ToValidation("Playout does not exist.")); }