diff --git a/src/api/dependacies/task_dep.py b/src/api/dependacies/task_dep.py index adde0c4..3b24769 100644 --- a/src/api/dependacies/task_dep.py +++ b/src/api/dependacies/task_dep.py @@ -1,32 +1,13 @@ from datetime import date -from enum import Enum from typing import Annotated from fastapi import Depends, Query from fastapi.exceptions import HTTPException from pydantic import BaseModel, model_validator +from src.schemas.tasks import TaskFilter -class StatEnum(str, Enum): - open = "open" - closed = "closed" - in_progress = "in_progress" - todo = "todo" - - -class Pagination(BaseModel): - page: int | None = Query(default=0, ge=0) - limit: int | None = Query(default=30, ge=0, le=50) - - -PaginationTasksDep = Annotated[Pagination, Depends()] - - -class Status(BaseModel): - status: StatEnum | None = Query(default=None) - - -StatusTaskDep = Annotated[Status, Depends()] +TaskFilterDep = Annotated[TaskFilter, Depends()] class Date(BaseModel): diff --git a/src/api/v1/tasks.py b/src/api/v1/tasks.py index 10f422a..cb4db33 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 DateDep, PaginationTasksDep, StatusTaskDep +from src.api.dependacies.task_dep import TaskFilterDep from src.api.dependacies.user_dep import ActiveUser, TaskOwnerDep from src.schemas.tasks import TaskADDRequest from src.services.tasks import TaskService @@ -16,17 +16,11 @@ router = APIRouter(prefix="/tasks", tags=["Tasks"]) async def get_tasks( session: sessionDep, user: ActiveUser, - page: PaginationTasksDep, - status: StatusTaskDep, - date_filter: DateDep, -): + filter: TaskFilterDep + ): result = await UserService(session).get_user_with_tasks( user_id=user.id, - status=status.status, - limit=page.limit, - offset=page.page, - date_to=date_filter.date_to, - date_from=date_filter.date_from, + **filter.model_dump(exclude_unset=True) ) return result diff --git a/src/schemas/tasks.py b/src/schemas/tasks.py index f32e946..f80c601 100644 --- a/src/schemas/tasks.py +++ b/src/schemas/tasks.py @@ -1,4 +1,5 @@ from datetime import date +from enum import Enum from typing import Literal from pydantic import BaseModel, ConfigDict @@ -20,10 +21,25 @@ class TaskADDRequest(TaskShort): description: str | None = None +class StatusEnum(str, Enum): + open = "open" + closed = "closed" + in_progress = "in_progress" + todo = "todo" + + class Task(TaskADDRequest): id: int user_id: int - status: Literal["open", "closed", "in_progress", "todo"] + status: StatusEnum time_spent: int model_config = ConfigDict(from_attributes=True) + + +class TaskFilter(BaseModel): + status: StatusEnum | None = None + limit: int | None = 30 + offset: int | None = None + date_from: date | None = None + date_to: date | None = None diff --git a/src/services/tasks.py b/src/services/tasks.py index 90580b5..061d823 100644 --- a/src/services/tasks.py +++ b/src/services/tasks.py @@ -20,6 +20,8 @@ class TaskService(BaseService): async def get_task(self, task_id: int): task = await self.session.task.get_one_or_none(id=task_id) + if task is None: + raise HTTPException(status_code=404, detail="Task not found.") return Task.model_validate(task) async def delete_task(self, task_id: int): diff --git a/src/services/users.py b/src/services/users.py index 7c58ea4..9508adb 100644 --- a/src/services/users.py +++ b/src/services/users.py @@ -49,8 +49,8 @@ class UserService(BaseService): offset: int | None, date_to: date | None, date_from: date | None, + ): - print(type(status), status) user = await self.session.user.get_one_with_load( user_id=user_id, status=status,