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 UpdateExternalJsonPlayoutHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; private readonly ChannelWriter _workerChannel; public UpdateExternalJsonPlayoutHandler( IDbContextFactory dbContextFactory, ChannelWriter workerChannel) { _dbContextFactory = dbContextFactory; _workerChannel = workerChannel; } public async Task> Handle( UpdateExternalJsonPlayout request, CancellationToken cancellationToken) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); Validation validation = await Validate(dbContext, request); return await validation.Apply(playout => ApplyUpdateRequest(dbContext, request, playout)); } private async Task ApplyUpdateRequest( TvContext dbContext, UpdateExternalJsonPlayout request, Playout playout) { playout.ExternalJsonFile = request.ExternalJsonFile; if (await dbContext.SaveChangesAsync() > 0) { await _workerChannel.WriteAsync(new RefreshChannelData(playout.Channel.Number)); } return new PlayoutNameViewModel( playout.Id, playout.ProgramSchedulePlayoutType, playout.Channel.Name, playout.Channel.Number, playout.ProgramSchedule?.Name ?? string.Empty, playout.ExternalJsonFile, Optional(playout.DailyRebuildTime)); } private static Task> Validate( TvContext dbContext, UpdateExternalJsonPlayout request) => PlayoutMustExist(dbContext, request); private static Task> PlayoutMustExist( TvContext dbContext, UpdateExternalJsonPlayout updatePlayout) => dbContext.Playouts .Include(p => p.Channel) .SelectOneAsync(p => p.Id, p => p.Id == updatePlayout.PlayoutId) .Map(o => o.ToValidation("Playout does not exist.")); }