using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.MediaCollections; public class DeleteSmartCollectionHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; public DeleteSmartCollectionHandler(IDbContextFactory dbContextFactory) => _dbContextFactory = dbContextFactory; public async Task> Handle( DeleteSmartCollection request, CancellationToken cancellationToken) { await using TvContext dbContext = _dbContextFactory.CreateDbContext(); Validation validation = await SmartCollectionMustExist(dbContext, request); return await validation.Apply(c => DoDeletion(dbContext, c)); } private static Task DoDeletion(TvContext dbContext, SmartCollection smartCollection) { dbContext.SmartCollections.Remove(smartCollection); return dbContext.SaveChangesAsync().ToUnit(); } private static Task> SmartCollectionMustExist( TvContext dbContext, DeleteSmartCollection request) => dbContext.SmartCollections .SelectOneAsync(c => c.Id, c => c.Id == request.SmartCollectionId) .Map(o => o.ToValidation($"SmartCollection {request.SmartCollectionId} does not exist.")); }