using System.Threading; using System.Threading.Tasks; using ErsatzTV.Core; using ErsatzTV.Core.Interfaces.Repositories; using LanguageExt; using MediatR; using static ErsatzTV.Application.MediaCards.Mapper; using static LanguageExt.Prelude; namespace ErsatzTV.Application.MediaCards.Queries { public class GetSearchCardsHandler : IRequestHandler> { private readonly ISearchRepository _searchRepository; public GetSearchCardsHandler(ISearchRepository searchRepository) => _searchRepository = searchRepository; public Task> Handle( GetSearchCards request, CancellationToken cancellationToken) => request.Query.StartsWith("genre:") ? GenreSearch(request.Query.Replace("genre:", string.Empty)) : TitleSearch(request.Query); private Task> TitleSearch(string query) => Try(_searchRepository.SearchMediaItemsByTitle(query)).Sequence() .Map(ProjectToSearchResults) .Map(t => t.ToEither(ex => BaseError.New($"Failed to search: {ex.Message}"))); private Task> GenreSearch(string query) => Try(_searchRepository.SearchMediaItemsByGenre(query)).Sequence() .Map(ProjectToSearchResults) .Map(t => t.ToEither(ex => BaseError.New($"Failed to search: {ex.Message}"))); } }