using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Search; using ErsatzTV.Infrastructure.Data; using ErsatzTV.Infrastructure.Extensions; using Microsoft.EntityFrameworkCore; namespace ErsatzTV.Application.MediaCollections; public class DeleteMultiCollectionHandler : IRequestHandler> { private readonly IDbContextFactory _dbContextFactory; private readonly ISearchTargets _searchTargets; public DeleteMultiCollectionHandler(IDbContextFactory dbContextFactory, ISearchTargets searchTargets) { _dbContextFactory = dbContextFactory; _searchTargets = searchTargets; } public async Task> Handle( DeleteMultiCollection request, CancellationToken cancellationToken) { await using TvContext dbContext = await _dbContextFactory.CreateDbContextAsync(cancellationToken); Validation validation = await MultiCollectionMustExist( dbContext, request, cancellationToken); return await validation.Apply(c => DoDeletion(dbContext, c, cancellationToken)); } private async Task DoDeletion( TvContext dbContext, MultiCollection multiCollection, CancellationToken cancellationToken) { dbContext.MultiCollections.Remove(multiCollection); await dbContext.SaveChangesAsync(cancellationToken); _searchTargets.SearchTargetsChanged(); return Unit.Default; } private static Task> MultiCollectionMustExist( TvContext dbContext, DeleteMultiCollection request, CancellationToken cancellationToken) => dbContext.MultiCollections .SelectOneAsync(c => c.Id, c => c.Id == request.MultiCollectionId, cancellationToken) .Map(o => o.ToValidation($"MultiCollection {request.MultiCollectionId} does not exist.")); }