using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.ProgramSchedules; public class DeleteProgramScheduleHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; public DeleteProgramScheduleHandler(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory; public async Task> Handle( DeleteProgramSchedule request, CancellationToken cancellationToken) { await using TvContext dbContext = _dbContextFactory.CreateDbContext(); Validation validation = await ProgramScheduleMustExist(dbContext, request); return await LanguageExtensions.Apply(validation, ps => DoDeletion(dbContext, ps)); } private static Task DoDeletion(TvContext dbContext, ProgramSchedule programSchedule) { dbContext.ProgramSchedules.Remove(programSchedule); return dbContext.SaveChangesAsync().ToUnit(); } private Task> ProgramScheduleMustExist( TvContext dbContext, DeleteProgramSchedule request) => dbContext.ProgramSchedules .SelectOneAsync(ps => ps.Id, ps => ps.Id == request.ProgramScheduleId) .Map(o => o.ToValidation($"ProgramSchedule {request.ProgramScheduleId} does not exist.")); }