using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Errors; 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 = await _dbContextFactory.CreateDbContextAsync(cancellationToken); Option maybeProgramSchedule = await ProgramScheduleMustExist( dbContext, request, cancellationToken); return await maybeProgramSchedule.Match( Some: programSchedule => DoDeletion(dbContext, programSchedule).Map(Right), None: () => Task.FromResult>( new NotFoundError($"ProgramSchedule {request.ProgramScheduleId} does not exist."))); } private static Task DoDeletion(TvContext dbContext, ProgramSchedule programSchedule) { dbContext.ProgramSchedules.Remove(programSchedule); return dbContext.SaveChangesAsync().ToUnit(); } private static Task> ProgramScheduleMustExist( TvContext dbContext, DeleteProgramSchedule request, CancellationToken cancellationToken) => dbContext.ProgramSchedules .SelectOneAsync(ps => ps.Id, ps => ps.Id == request.ProgramScheduleId, cancellationToken) .Map(identity); }