first commit
This commit is contained in:
35
backend/app/repositories/case_repo.py
Normal file
35
backend/app/repositories/case_repo.py
Normal file
@@ -0,0 +1,35 @@
|
||||
from sqlalchemy import select, func, or_
|
||||
from sqlalchemy.ext.asyncio import AsyncSession
|
||||
|
||||
from app.models.case import Case, CaseStatus
|
||||
from app.repositories.base import BaseRepository
|
||||
|
||||
|
||||
class CaseRepository(BaseRepository[Case]):
|
||||
def __init__(self, session: AsyncSession):
|
||||
super().__init__(Case, session)
|
||||
|
||||
async def list_cases(
|
||||
self,
|
||||
offset: int = 0,
|
||||
limit: int = 50,
|
||||
status: CaseStatus | None = None,
|
||||
search: str | None = None,
|
||||
) -> tuple[list[Case], int]:
|
||||
query = select(Case).where(Case.deleted_at.is_(None))
|
||||
count_query = select(func.count()).select_from(Case).where(Case.deleted_at.is_(None))
|
||||
|
||||
if status:
|
||||
query = query.where(Case.status == status)
|
||||
count_query = count_query.where(Case.status == status)
|
||||
|
||||
if search:
|
||||
pattern = f"%{search}%"
|
||||
search_filter = or_(Case.case_no.ilike(pattern), Case.title.ilike(pattern))
|
||||
query = query.where(search_filter)
|
||||
count_query = count_query.where(search_filter)
|
||||
|
||||
total = (await self.session.execute(count_query)).scalar() or 0
|
||||
query = query.order_by(Case.created_at.desc()).offset(offset).limit(limit)
|
||||
result = await self.session.execute(query)
|
||||
return list(result.scalars().all()), total
|
||||
Reference in New Issue
Block a user