feat: Add filtering, searching, and sorting to user extractions retrieval
This commit is contained in:
@@ -2,7 +2,7 @@
|
|||||||
|
|
||||||
from typing import Annotated
|
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 sqlmodel.ext.asyncio.session import AsyncSession
|
||||||
|
|
||||||
from app.core.database import get_db
|
from app.core.database import get_db
|
||||||
@@ -91,6 +91,10 @@ async def get_extraction(
|
|||||||
async def get_user_extractions(
|
async def get_user_extractions(
|
||||||
current_user: Annotated[User, Depends(get_current_active_user_flexible)],
|
current_user: Annotated[User, Depends(get_current_active_user_flexible)],
|
||||||
extraction_service: Annotated[ExtractionService, Depends(get_extraction_service)],
|
extraction_service: Annotated[ExtractionService, Depends(get_extraction_service)],
|
||||||
|
search: Annotated[str | None, Query(description="Search in title, URL, or service")] = None,
|
||||||
|
sort_by: Annotated[str, Query(description="Sort by field")] = "created_at",
|
||||||
|
sort_order: Annotated[str, Query(description="Sort order (asc/desc)")] = "desc",
|
||||||
|
status_filter: Annotated[str | None, Query(description="Filter by status")] = None,
|
||||||
) -> dict[str, list[ExtractionInfo]]:
|
) -> dict[str, list[ExtractionInfo]]:
|
||||||
"""Get all extractions for the current user."""
|
"""Get all extractions for the current user."""
|
||||||
try:
|
try:
|
||||||
@@ -100,7 +104,13 @@ async def get_user_extractions(
|
|||||||
detail="User ID not available",
|
detail="User ID not available",
|
||||||
)
|
)
|
||||||
|
|
||||||
extractions = await extraction_service.get_user_extractions(current_user.id)
|
extractions = await extraction_service.get_user_extractions(
|
||||||
|
user_id=current_user.id,
|
||||||
|
search=search,
|
||||||
|
sort_by=sort_by,
|
||||||
|
sort_order=sort_order,
|
||||||
|
status_filter=status_filter,
|
||||||
|
)
|
||||||
|
|
||||||
except Exception as e:
|
except Exception as e:
|
||||||
raise HTTPException(
|
raise HTTPException(
|
||||||
|
|||||||
@@ -1,6 +1,6 @@
|
|||||||
"""Extraction repository for database operations."""
|
"""Extraction repository for database operations."""
|
||||||
|
|
||||||
from sqlalchemy import desc
|
from sqlalchemy import asc, desc, or_
|
||||||
from sqlmodel import select
|
from sqlmodel import select
|
||||||
from sqlmodel.ext.asyncio.session import AsyncSession
|
from sqlmodel.ext.asyncio.session import AsyncSession
|
||||||
|
|
||||||
@@ -55,3 +55,39 @@ class ExtractionRepository(BaseRepository[Extraction]):
|
|||||||
.order_by(desc(Extraction.created_at)),
|
.order_by(desc(Extraction.created_at)),
|
||||||
)
|
)
|
||||||
return list(result.all())
|
return list(result.all())
|
||||||
|
|
||||||
|
async def get_user_extractions_filtered(
|
||||||
|
self,
|
||||||
|
user_id: int,
|
||||||
|
search: str | None = None,
|
||||||
|
sort_by: str = "created_at",
|
||||||
|
sort_order: str = "desc",
|
||||||
|
status_filter: str | None = None,
|
||||||
|
) -> list[Extraction]:
|
||||||
|
"""Get extractions for a user with filtering, search, and sorting."""
|
||||||
|
query = select(Extraction).where(Extraction.user_id == user_id)
|
||||||
|
|
||||||
|
# Apply search filter
|
||||||
|
if search:
|
||||||
|
search_pattern = f"%{search}%"
|
||||||
|
query = query.where(
|
||||||
|
or_(
|
||||||
|
Extraction.title.ilike(search_pattern),
|
||||||
|
Extraction.url.ilike(search_pattern),
|
||||||
|
Extraction.service.ilike(search_pattern),
|
||||||
|
)
|
||||||
|
)
|
||||||
|
|
||||||
|
# Apply status filter
|
||||||
|
if status_filter:
|
||||||
|
query = query.where(Extraction.status == status_filter)
|
||||||
|
|
||||||
|
# Apply sorting
|
||||||
|
sort_column = getattr(Extraction, sort_by, Extraction.created_at)
|
||||||
|
if sort_order.lower() == "asc":
|
||||||
|
query = query.order_by(asc(sort_column))
|
||||||
|
else:
|
||||||
|
query = query.order_by(desc(sort_column))
|
||||||
|
|
||||||
|
result = await self.session.exec(query)
|
||||||
|
return list(result.all())
|
||||||
|
|||||||
@@ -545,9 +545,22 @@ class ExtractionService:
|
|||||||
"updated_at": extraction.updated_at.isoformat(),
|
"updated_at": extraction.updated_at.isoformat(),
|
||||||
}
|
}
|
||||||
|
|
||||||
async def get_user_extractions(self, user_id: int) -> list[ExtractionInfo]:
|
async def get_user_extractions(
|
||||||
"""Get all extractions for a user."""
|
self,
|
||||||
extractions = await self.extraction_repo.get_by_user(user_id)
|
user_id: int,
|
||||||
|
search: str | None = None,
|
||||||
|
sort_by: str = "created_at",
|
||||||
|
sort_order: str = "desc",
|
||||||
|
status_filter: str | None = None,
|
||||||
|
) -> list[ExtractionInfo]:
|
||||||
|
"""Get all extractions for a user with filtering, search, and sorting."""
|
||||||
|
extractions = await self.extraction_repo.get_user_extractions_filtered(
|
||||||
|
user_id=user_id,
|
||||||
|
search=search,
|
||||||
|
sort_by=sort_by,
|
||||||
|
sort_order=sort_order,
|
||||||
|
status_filter=status_filter,
|
||||||
|
)
|
||||||
|
|
||||||
return [
|
return [
|
||||||
{
|
{
|
||||||
|
|||||||
Reference in New Issue
Block a user