diff --git a/fastapi_book_server/app/filters/genre.py b/fastapi_book_server/app/filters/genre.py new file mode 100644 index 0000000..0c7b1f8 --- /dev/null +++ b/fastapi_book_server/app/filters/genre.py @@ -0,0 +1,10 @@ +from typing import Optional + + +def get_genre_filter(meta: Optional[str] = None) -> dict: + result = {} + + if meta: + result["meta"] = meta + + return result diff --git a/fastapi_book_server/app/views/genre.py b/fastapi_book_server/app/views/genre.py index cb7f51f..3d9da56 100644 --- a/fastapi_book_server/app/views/genre.py +++ b/fastapi_book_server/app/views/genre.py @@ -4,6 +4,7 @@ from fastapi_pagination import Params from fastapi_pagination.ext.ormar import paginate from app.depends import check_token, get_allowed_langs +from app.filters.genre import get_genre_filter from app.models import Genre as GenreDB from app.serializers.genre import Genre from app.services.genre import GenreMeiliSearchService @@ -19,8 +20,18 @@ PREFETCH_RELATED_FIELDS = ["source"] @genre_router.get("/", response_model=CustomPage[Genre], dependencies=[Depends(Params)]) -async def get_genres(): - return await paginate(GenreDB.objects.prefetch_related(PREFETCH_RELATED_FIELDS)) +async def get_genres(genre_filter: dict = Depends(get_genre_filter)): + return await paginate( + GenreDB.objects.prefetch_related(PREFETCH_RELATED_FIELDS) + .filter(**genre_filter) + .order_by("description") + ) + + +@genre_router.get("/metas", response_model=list[str]) +async def get_genre_metas(): + genres = await GenreDB.objects.fields("meta").values_list(flatten=True) + return sorted(list(set(genres))) @genre_router.get("/{id}", response_model=Genre)