using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain.Filler; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using LanguageExt; using MediatR; using Microsoft.EntityFrameworkCore; using Unit = LanguageExt.Unit; namespace ErsatzTV.Application.Filler.Commands { public class UpdateFillerPresetHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; public UpdateFillerPresetHandler(IDbContextFactory dbContextFactory) { _dbContextFactory = dbContextFactory; } public async Task> Handle(UpdateFillerPreset request, CancellationToken cancellationToken) { await using TvContext dbContext = _dbContextFactory.CreateDbContext(); Validation validation = await FillerPresetMustExist(dbContext, request); return await validation.Apply(ps => ApplyUpdateRequest(dbContext, ps, request)); } private async Task ApplyUpdateRequest( TvContext dbContext, FillerPreset existing, UpdateFillerPreset request) { existing.Name = request.Name; existing.FillerKind = request.FillerKind; existing.FillerMode = request.FillerMode; existing.Duration = request.Duration; existing.Count = request.Count; existing.PadToNearestMinute = request.PadToNearestMinute; existing.CollectionType = request.CollectionType; existing.CollectionId = request.CollectionId; existing.MediaItemId = request.MediaItemId; existing.MultiCollectionId = request.MultiCollectionId; existing.SmartCollectionId = request.SmartCollectionId; await dbContext.SaveChangesAsync(); return Unit.Default; } private static Task> FillerPresetMustExist( TvContext dbContext, UpdateFillerPreset request) => dbContext.FillerPresets .SelectOneAsync(ps => ps.Id, ps => ps.Id == request.Id) .Map(o => o.ToValidation("FillerPreset does not exist")); } }