using System.IO; using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Domain; using ErsatzTV.Core.Interfaces.Metadata; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using static LanguageExt.Prelude; namespace ErsatzTV.Application.MediaItems.Commands { public class RefreshMediaItemMetadataHandler : MediatR.IRequestHandler> { private readonly ILocalMetadataProvider _localMetadataProvider; private readonly IMediaItemRepository _mediaItemRepository; public RefreshMediaItemMetadataHandler( IMediaItemRepository mediaItemRepository, ILocalMetadataProvider localMetadataProvider) { _mediaItemRepository = mediaItemRepository; _localMetadataProvider = localMetadataProvider; } public Task> Handle( RefreshMediaItemMetadata request, CancellationToken cancellationToken) => Validate(request) .MapT(RefreshMetadata) .Bind(v => v.ToEitherAsync()); private Task> Validate(RefreshMediaItemMetadata request) => MediaItemMustExist(request).BindT(PathMustExist); private Task> MediaItemMustExist( RefreshMediaItemMetadata refreshMediaItemMetadata) => _mediaItemRepository.Get(refreshMediaItemMetadata.MediaItemId) .Map( maybeItem => maybeItem.ToValidation( $"[MediaItem] {refreshMediaItemMetadata.MediaItemId} does not exist.")); private Validation PathMustExist(MediaItem mediaItem) => Some(mediaItem) .Filter(item => File.Exists(item.Path)) .ToValidation($"[Path] '{mediaItem.Path}' does not exist on the file system"); private Task RefreshMetadata(MediaItem mediaItem) => _localMetadataProvider.RefreshMetadata(mediaItem).ToUnit(); } }