using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.Playouts; public class UpdatePlayoutHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; public UpdatePlayoutHandler(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory; public async Task> Handle( UpdatePlayout 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 static async Task ApplyUpdateRequest( TvContext dbContext, UpdatePlayout request, Playout playout) { playout.DailyRebuildTime = null; foreach (TimeSpan dailyRebuildTime in request.DailyRebuildTime) { playout.DailyRebuildTime = dailyRebuildTime; } await dbContext.SaveChangesAsync(); 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, UpdatePlayout request) => PlayoutMustExist(dbContext, request); private static Task> PlayoutMustExist( TvContext dbContext, UpdatePlayout updatePlayout) => dbContext.Playouts .Include(p => p.Channel) .Include(p => p.ProgramSchedule) .SelectOneAsync(p => p.Id, p => p.Id == updatePlayout.PlayoutId) .Map(o => o.ToValidation("Playout does not exist.")); }