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 DeleteFillerPresetHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; public DeleteFillerPresetHandler(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory; public async Task> Handle( DeleteFillerPreset request, CancellationToken cancellationToken) { await using TvContext dbContext = _dbContextFactory.CreateDbContext(); Validation validation = await FillerPresetMustExist(dbContext, request); return await validation.Apply(ps => DoDeletion(dbContext, ps)); } private static Task DoDeletion(TvContext dbContext, FillerPreset fillerPreset) { dbContext.FillerPresets.Remove(fillerPreset); return dbContext.SaveChangesAsync().ToUnit(); } private Task> FillerPresetMustExist( TvContext dbContext, DeleteFillerPreset request) => dbContext.FillerPresets .SelectOneAsync(fp => fp.Id, ps => ps.Id == request.FillerPresetId) .Map(o => o.ToValidation($"FillerPreset {request.FillerPresetId} does not exist.")); } }