using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; namespace ErsatzTV.Application.MediaCollections.Commands { public class UpdateSimpleMediaCollectionHandler : MediatR.IRequestHandler> { private readonly IMediaCollectionRepository _mediaCollectionRepository; public UpdateSimpleMediaCollectionHandler(IMediaCollectionRepository mediaCollectionRepository) => _mediaCollectionRepository = mediaCollectionRepository; public Task> Handle( UpdateSimpleMediaCollection request, CancellationToken cancellationToken) => Validate(request) .MapT(c => ApplyUpdateRequest(c, request)) .Bind(v => v.ToEitherAsync()); private async Task ApplyUpdateRequest(SimpleMediaCollection c, UpdateSimpleMediaCollection update) { c.Name = update.Name; await _mediaCollectionRepository.Update(c); return Unit.Default; } private async Task> Validate(UpdateSimpleMediaCollection request) => (await SimpleMediaCollectionMustExist(request), ValidateName(request)) .Apply((simpleMediaCollectionToUpdate, _) => simpleMediaCollectionToUpdate); private Task> SimpleMediaCollectionMustExist( UpdateSimpleMediaCollection updateSimpleMediaCollection) => _mediaCollectionRepository.GetSimpleMediaCollection(updateSimpleMediaCollection.MediaCollectionId) .Map(v => v.ToValidation("SimpleMediaCollection does not exist.")); private Validation ValidateName(UpdateSimpleMediaCollection updateSimpleMediaCollection) => updateSimpleMediaCollection.NotEmpty(c => c.Name) .Bind(_ => updateSimpleMediaCollection.NotLongerThan(50)(c => c.Name)); } }