using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using MediatR; namespace ErsatzTV.Application.MediaItems.Commands { public class DeleteMediaItemHandler : IRequestHandler> { private readonly IMediaItemRepository _mediaItemRepository; public DeleteMediaItemHandler(IMediaItemRepository mediaItemRepository) => _mediaItemRepository = mediaItemRepository; public async Task> Handle( DeleteMediaItem request, CancellationToken cancellationToken) => (await MediaItemMustExist(request)) .Map(DoDeletion) .ToEither(); private Task DoDeletion(int mediaItemId) => _mediaItemRepository.Delete(mediaItemId); private async Task> MediaItemMustExist(DeleteMediaItem deleteMediaItem) => (await _mediaItemRepository.Get(deleteMediaItem.MediaItemId)) .ToValidation($"MediaItem {deleteMediaItem.MediaItemId} does not exist.") .Map(c => c.Id); } }