diff --git a/src/api/dependacies/task_dep.py b/src/api/dependacies/task_dep.py new file mode 100644 index 0000000..cd070cd --- /dev/null +++ b/src/api/dependacies/task_dep.py @@ -0,0 +1,12 @@ +from typing import Annotated + +from fastapi import Depends, Query +from pydantic import BaseModel + + +class Pagination(BaseModel): + page: int | None = Query(default=0, ge=0) + limit: int | None = Query(default=30, ge=0, le=50) + + +PaginationTasks = Annotated[Pagination, Depends()] diff --git a/src/api/v1/tasks.py b/src/api/v1/tasks.py index 82d8399..e9fbd46 100644 --- a/src/api/v1/tasks.py +++ b/src/api/v1/tasks.py @@ -3,6 +3,7 @@ from typing import Annotated from fastapi import APIRouter, Depends from src.api.dependacies.db_dep import sessionDep +from src.api.dependacies.task_dep import PaginationTasks from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep from src.schemas.tasks import TaskADDRequest from src.services.tasks import TaskService @@ -12,7 +13,7 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"]) @router.get("/") -async def get_tasks(session: sessionDep, user: ActiveUser): +async def get_tasks(session: sessionDep, user: ActiveUser, page: PaginationTasks): result = await UserService(session).get_user_with_tasks(user.id) return result diff --git a/src/repository/users.py b/src/repository/users.py index 4fed989..0e0cdc4 100644 --- a/src/repository/users.py +++ b/src/repository/users.py @@ -31,12 +31,7 @@ class UsersRepo(BaseRepo): date_to: Optional[date] = None, date_from: Optional[date] = None, ) -> UsersORM | None: - tasks_subquery = select(TasksORM.id).where(TasksORM.user_id == user_id) - if date_from is not None: - tasks_subquery = tasks_subquery.where(TasksORM.due_date >= date_from) - - if date_to is not None: - tasks_subquery = tasks_subquery.where(TasksORM.due_date <= date_to) + tasks_subquery = self._tasks_subquary(date_from=date_from, date_to=date_to, user_id=user_id) if tasks_limit is not None: tasks_subquery = tasks_subquery.limit(tasks_limit) @@ -67,3 +62,11 @@ class UsersRepo(BaseRepo): def _priority(self, priority: str): priority_map = {"low": 1, "medium": 2, "high": 3, "critical": 4} return priority_map.get(priority, 0) + + def _tasks_subquary(self, date_from: date | None, date_to: date | None, **filter_by): + subq = select(TasksORM.id).filter_by(**filter_by) + if date_from is not None: + subq = subq.filter(TasksORM.due_date >= date_from) + if date_to is not None: + subq = subq.filter(TasksORM.due_date <= date_to) + return subq