Add filter support to collections, movies, and shows search endpoints

This commit is contained in:
Scott Merchant 2024-06-10 16:16:00 +09:30
parent 9b8fb7596f
commit 7725d2534b
3 changed files with 25 additions and 6 deletions

View File

@ -54,6 +54,7 @@ public interface ISearchManager
public Task<SearchPage<Movie>.SearchResult> SearchMovies( public Task<SearchPage<Movie>.SearchResult> SearchMovies(
string? query, string? query,
Sort<Movie> sortBy, Sort<Movie> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Movie>? include = default Include<Movie>? include = default
); );
@ -69,6 +70,7 @@ public interface ISearchManager
public Task<SearchPage<Show>.SearchResult> SearchShows( public Task<SearchPage<Show>.SearchResult> SearchShows(
string? query, string? query,
Sort<Show> sortBy, Sort<Show> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Show>? include = default Include<Show>? include = default
); );
@ -84,6 +86,7 @@ public interface ISearchManager
public Task<SearchPage<Collection>.SearchResult> SearchCollections( public Task<SearchPage<Collection>.SearchResult> SearchCollections(
string? query, string? query,
Sort<Collection> sortBy, Sort<Collection> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Collection>? include = default Include<Collection>? include = default
); );

View File

@ -65,11 +65,12 @@ public class SearchApi : BaseApi
public async Task<SearchPage<Collection>> SearchCollections( public async Task<SearchPage<Collection>> SearchCollections(
[FromQuery] string? q, [FromQuery] string? q,
[FromQuery] Sort<Collection> sortBy, [FromQuery] Sort<Collection> sortBy,
[FromQuery] Filter<ILibraryItem>? filter,
[FromQuery] SearchPagination pagination, [FromQuery] SearchPagination pagination,
[FromQuery] Include<Collection> fields [FromQuery] Include<Collection> fields
) )
{ {
return SearchPage(await _searchManager.SearchCollections(q, sortBy, pagination, fields)); return SearchPage(await _searchManager.SearchCollections(q, sortBy, filter, pagination, fields));
} }
/// <summary> /// <summary>
@ -91,11 +92,12 @@ public class SearchApi : BaseApi
public async Task<SearchPage<Show>> SearchShows( public async Task<SearchPage<Show>> SearchShows(
[FromQuery] string? q, [FromQuery] string? q,
[FromQuery] Sort<Show> sortBy, [FromQuery] Sort<Show> sortBy,
[FromQuery] Filter<ILibraryItem>? filter,
[FromQuery] SearchPagination pagination, [FromQuery] SearchPagination pagination,
[FromQuery] Include<Show> fields [FromQuery] Include<Show> fields
) )
{ {
return SearchPage(await _searchManager.SearchShows(q, sortBy, pagination, fields)); return SearchPage(await _searchManager.SearchShows(q, sortBy, filter, pagination, fields));
} }
/// <summary> /// <summary>
@ -117,11 +119,12 @@ public class SearchApi : BaseApi
public async Task<SearchPage<Movie>> SearchMovies( public async Task<SearchPage<Movie>> SearchMovies(
[FromQuery] string? q, [FromQuery] string? q,
[FromQuery] Sort<Movie> sortBy, [FromQuery] Sort<Movie> sortBy,
[FromQuery] Filter<ILibraryItem>? filter,
[FromQuery] SearchPagination pagination, [FromQuery] SearchPagination pagination,
[FromQuery] Include<Movie> fields [FromQuery] Include<Movie> fields
) )
{ {
return SearchPage(await _searchManager.SearchMovies(q, sortBy, pagination, fields)); return SearchPage(await _searchManager.SearchMovies(q, sortBy, filter, pagination, fields));
} }
/// <summary> /// <summary>

View File

@ -118,33 +118,36 @@ public class SearchManager : ISearchManager
public Task<SearchPage<Movie>.SearchResult> SearchMovies( public Task<SearchPage<Movie>.SearchResult> SearchMovies(
string? query, string? query,
Sort<Movie> sortBy, Sort<Movie> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Movie>? include = default Include<Movie>? include = default
) )
{ {
return _Search("items", query, $"kind = {nameof(Movie)}", sortBy, pagination, include); return _Search("items", query, _CreateMediaTypeFilter<Movie>(filter), sortBy, pagination, include);
} }
/// <inheritdoc/> /// <inheritdoc/>
public Task<SearchPage<Show>.SearchResult> SearchShows( public Task<SearchPage<Show>.SearchResult> SearchShows(
string? query, string? query,
Sort<Show> sortBy, Sort<Show> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Show>? include = default Include<Show>? include = default
) )
{ {
return _Search("items", query, $"kind = {nameof(Show)}", sortBy, pagination, include); return _Search("items", query, _CreateMediaTypeFilter<Show>(filter), sortBy, pagination, include);
} }
/// <inheritdoc/> /// <inheritdoc/>
public Task<SearchPage<Collection>.SearchResult> SearchCollections( public Task<SearchPage<Collection>.SearchResult> SearchCollections(
string? query, string? query,
Sort<Collection> sortBy, Sort<Collection> sortBy,
Filter<ILibraryItem>? filter,
SearchPagination pagination, SearchPagination pagination,
Include<Collection>? include = default Include<Collection>? include = default
) )
{ {
return _Search("items", query, $"kind = {nameof(Collection)}", sortBy, pagination, include); return _Search("items", query, _CreateMediaTypeFilter<Collection>(filter), sortBy, pagination, include);
} }
/// <inheritdoc/> /// <inheritdoc/>
@ -185,6 +188,16 @@ public class SearchManager : ISearchManager
); );
} }
private string _CreateMediaTypeFilter<T>(Filter<ILibraryItem>? filter) where T : ILibraryItem
{
string filterString = $"kind = {typeof(T).Name}";
if (filter is not null)
{
filterString += $" AND ({filter.CreateMeilisearchFilter()})";
}
return filterString;
}
private class IdResource private class IdResource
{ {
public Guid Id { get; set; } public Guid Id { get; set; }