From 7725d2534bed4e512e65836c0bc8fdf868e109cf Mon Sep 17 00:00:00 2001 From: Scott Merchant Date: Mon, 10 Jun 2024 16:16:00 +0930 Subject: [PATCH] Add filter support to collections, movies, and shows search endpoints --- .../Controllers/ISearchManager.cs | 3 +++ .../Kyoo.Core/Views/Resources/SearchApi.cs | 9 ++++++--- back/src/Kyoo.Meilisearch/SearchManager.cs | 19 ++++++++++++++++--- 3 files changed, 25 insertions(+), 6 deletions(-) diff --git a/back/src/Kyoo.Abstractions/Controllers/ISearchManager.cs b/back/src/Kyoo.Abstractions/Controllers/ISearchManager.cs index ed210a52..d3985c6e 100644 --- a/back/src/Kyoo.Abstractions/Controllers/ISearchManager.cs +++ b/back/src/Kyoo.Abstractions/Controllers/ISearchManager.cs @@ -54,6 +54,7 @@ public interface ISearchManager public Task.SearchResult> SearchMovies( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ); @@ -69,6 +70,7 @@ public interface ISearchManager public Task.SearchResult> SearchShows( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ); @@ -84,6 +86,7 @@ public interface ISearchManager public Task.SearchResult> SearchCollections( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ); diff --git a/back/src/Kyoo.Core/Views/Resources/SearchApi.cs b/back/src/Kyoo.Core/Views/Resources/SearchApi.cs index d34af5ef..f4eea079 100644 --- a/back/src/Kyoo.Core/Views/Resources/SearchApi.cs +++ b/back/src/Kyoo.Core/Views/Resources/SearchApi.cs @@ -65,11 +65,12 @@ public class SearchApi : BaseApi public async Task> SearchCollections( [FromQuery] string? q, [FromQuery] Sort sortBy, + [FromQuery] Filter? filter, [FromQuery] SearchPagination pagination, [FromQuery] Include fields ) { - return SearchPage(await _searchManager.SearchCollections(q, sortBy, pagination, fields)); + return SearchPage(await _searchManager.SearchCollections(q, sortBy, filter, pagination, fields)); } /// @@ -91,11 +92,12 @@ public class SearchApi : BaseApi public async Task> SearchShows( [FromQuery] string? q, [FromQuery] Sort sortBy, + [FromQuery] Filter? filter, [FromQuery] SearchPagination pagination, [FromQuery] Include fields ) { - return SearchPage(await _searchManager.SearchShows(q, sortBy, pagination, fields)); + return SearchPage(await _searchManager.SearchShows(q, sortBy, filter, pagination, fields)); } /// @@ -117,11 +119,12 @@ public class SearchApi : BaseApi public async Task> SearchMovies( [FromQuery] string? q, [FromQuery] Sort sortBy, + [FromQuery] Filter? filter, [FromQuery] SearchPagination pagination, [FromQuery] Include fields ) { - return SearchPage(await _searchManager.SearchMovies(q, sortBy, pagination, fields)); + return SearchPage(await _searchManager.SearchMovies(q, sortBy, filter, pagination, fields)); } /// diff --git a/back/src/Kyoo.Meilisearch/SearchManager.cs b/back/src/Kyoo.Meilisearch/SearchManager.cs index ae7fc133..058b949f 100644 --- a/back/src/Kyoo.Meilisearch/SearchManager.cs +++ b/back/src/Kyoo.Meilisearch/SearchManager.cs @@ -118,33 +118,36 @@ public class SearchManager : ISearchManager public Task.SearchResult> SearchMovies( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ) { - return _Search("items", query, $"kind = {nameof(Movie)}", sortBy, pagination, include); + return _Search("items", query, _CreateMediaTypeFilter(filter), sortBy, pagination, include); } /// public Task.SearchResult> SearchShows( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ) { - return _Search("items", query, $"kind = {nameof(Show)}", sortBy, pagination, include); + return _Search("items", query, _CreateMediaTypeFilter(filter), sortBy, pagination, include); } /// public Task.SearchResult> SearchCollections( string? query, Sort sortBy, + Filter? filter, SearchPagination pagination, Include? include = default ) { - return _Search("items", query, $"kind = {nameof(Collection)}", sortBy, pagination, include); + return _Search("items", query, _CreateMediaTypeFilter(filter), sortBy, pagination, include); } /// @@ -185,6 +188,16 @@ public class SearchManager : ISearchManager ); } + private string _CreateMediaTypeFilter(Filter? filter) where T : ILibraryItem + { + string filterString = $"kind = {typeof(T).Name}"; + if (filter is not null) + { + filterString += $" AND ({filter.CreateMeilisearchFilter()})"; + } + return filterString; + } + private class IdResource { public Guid Id { get; set; }