diff --git a/src/api/dependacies/task_dep.py b/src/api/dependacies/task_dep.py index de56b78..bf17953 100644 --- a/src/api/dependacies/task_dep.py +++ b/src/api/dependacies/task_dep.py @@ -1,8 +1,10 @@ +from datetime import date from enum import Enum from typing import Annotated from fastapi import Depends, Query -from pydantic import BaseModel +from fastapi.exceptions import HTTPException +from pydantic import BaseModel, model_validator class StatEnum(str, Enum): @@ -24,4 +26,18 @@ class Status(BaseModel): status: StatEnum | None = Query(default=None) -StatusTaskDep = Annotated[Status, Depends()] \ No newline at end of file +StatusTaskDep = Annotated[Status, Depends()] + + +class Date(BaseModel): + date_from: date | None = Query(default=None) + date_to: date | None = Query(default=None) + + @model_validator(mode="after") + def check_dates(self): + if self.date_from and self.date_to and self.date_to < self.date_from: + raise HTTPException(status_code=422, detail="date_to cannot be less than date_from") + return self + + +DateDep = Annotated[Date, Depends()] diff --git a/src/api/v1/tasks.py b/src/api/v1/tasks.py index 0e050fe..e663ef9 100644 --- a/src/api/v1/tasks.py +++ b/src/api/v1/tasks.py @@ -3,7 +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 PaginationTasksDep, StatusTaskDep +from src.api.dependacies.task_dep import DateDep, PaginationTasksDep, StatusTaskDep from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep from src.schemas.tasks import TaskADDRequest from src.services.tasks import TaskService @@ -13,7 +13,13 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"]) @router.get("/") -async def get_tasks(session: sessionDep, user: ActiveUser, page: PaginationTasksDep, status: StatusTaskDep): +async def get_tasks( + session: sessionDep, + user: ActiveUser, + page: PaginationTasksDep, + status: StatusTaskDep, + date: DateDep, +): 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 fbcca27..5b6f8d8 100644 --- a/src/repository/users.py +++ b/src/repository/users.py @@ -31,7 +31,9 @@ class UsersRepo(BaseRepo): date_to: Optional[date] = None, date_from: Optional[date] = None, ) -> UsersORM | None: - tasks_subquery = self._tasks_subquary(date_from=date_from, date_to=date_to, user_id=user_id) + 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) @@ -59,17 +61,21 @@ class UsersRepo(BaseRepo): ) return obj - async def get_tasks_count(self, date_from: date | None, date_to: date | None, **filter_by) -> int: + async def get_tasks_count( + self, date_from: date | None, date_to: date | None, **filter_by + ) -> int: subq = self._tasks_subquary(date_from, date_to, **filter_by).subquery() stmt = select(func.count()).select_from(subq) result = await self.session.execute(stmt) return result.scalar_one() - + 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): + 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)