feat: Implement search and sorting functionality for playlists in API and repository
Some checks failed
Backend CI / lint (push) Failing after 4m54s
Backend CI / test (push) Failing after 4m25s

This commit is contained in:
JSC
2025-08-10 19:30:14 +02:00
parent aa9a73ac1d
commit 357fbcecac
3 changed files with 227 additions and 7 deletions

View File

@@ -2,7 +2,7 @@
from typing import Annotated
from fastapi import APIRouter, Depends, HTTPException, status
from fastapi import APIRouter, Depends, HTTPException, Query, status
from sqlmodel.ext.asyncio.session import AsyncSession
from app.core.database import get_db
@@ -19,6 +19,7 @@ from app.schemas.playlist import (
PlaylistUpdateRequest,
)
from app.services.playlist import PlaylistService
from app.repositories.playlist import PlaylistSortField, SortOrder
router = APIRouter(prefix="/playlists", tags=["playlists"])
@@ -34,10 +35,38 @@ async def get_playlist_service(
async def get_all_playlists(
current_user: Annotated[User, Depends(get_current_active_user_flexible)], # noqa: ARG001
playlist_service: Annotated[PlaylistService, Depends(get_playlist_service)],
) -> list[PlaylistResponse]:
"""Get all playlists from all users."""
playlists = await playlist_service.get_all_playlists()
return [PlaylistResponse.from_playlist(playlist) for playlist in playlists]
search: Annotated[
str | None,
Query(description="Search playlists by name"),
] = None,
sort_by: Annotated[
PlaylistSortField | None,
Query(description="Sort by field"),
] = None,
sort_order: Annotated[
SortOrder,
Query(description="Sort order (asc or desc)"),
] = SortOrder.ASC,
limit: Annotated[
int | None,
Query(description="Maximum number of results", ge=1, le=1000),
] = None,
offset: Annotated[
int,
Query(description="Number of results to skip", ge=0),
] = 0,
) -> list[dict]:
"""Get all playlists from all users with search and sorting."""
playlists = await playlist_service.search_and_sort_playlists(
search_query=search,
sort_by=sort_by,
sort_order=sort_order,
user_id=None,
include_stats=True,
limit=limit,
offset=offset,
)
return playlists
@router.get("/user")