* load movie genres from sidecar metadata * search movie and tv show genres * rebuild all playouts (needed after time zone fix) * code cleanup * fix duplicate tv show search results
36 lines
1.5 KiB
C#
36 lines
1.5 KiB
C#
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<GetSearchCards, Either<BaseError, SearchCardResultsViewModel>>
|
|
{
|
|
private readonly ISearchRepository _searchRepository;
|
|
|
|
public GetSearchCardsHandler(ISearchRepository searchRepository) => _searchRepository = searchRepository;
|
|
|
|
public Task<Either<BaseError, SearchCardResultsViewModel>> Handle(
|
|
GetSearchCards request,
|
|
CancellationToken cancellationToken) =>
|
|
request.Query.StartsWith("genre:")
|
|
? GenreSearch(request.Query.Replace("genre:", string.Empty))
|
|
: TitleSearch(request.Query);
|
|
|
|
private Task<Either<BaseError, SearchCardResultsViewModel>> TitleSearch(string query) =>
|
|
Try(_searchRepository.SearchMediaItemsByTitle(query)).Sequence()
|
|
.Map(ProjectToSearchResults)
|
|
.Map(t => t.ToEither(ex => BaseError.New($"Failed to search: {ex.Message}")));
|
|
|
|
private Task<Either<BaseError, SearchCardResultsViewModel>> GenreSearch(string query) =>
|
|
Try(_searchRepository.SearchMediaItemsByGenre(query)).Sequence()
|
|
.Map(ProjectToSearchResults)
|
|
.Map(t => t.ToEither(ex => BaseError.New($"Failed to search: {ex.Message}")));
|
|
}
|
|
}
|