diff --git a/src/api/v1/tasks.py b/src/api/v1/tasks.py index b6651d0..d4ef4dd 100644 --- a/src/api/v1/tasks.py +++ b/src/api/v1/tasks.py @@ -1,22 +1,19 @@ from typing import Annotated from fastapi import APIRouter, Depends -from sqlalchemy import select from src.api.dependacies.db_dep import sessionDep from src.api.dependacies.user_dep import ActiveUser -from src.models.tasks import TasksORM from src.schemas.tasks import TaskADDRequest from src.services.tasks import TaskService +from src.services.users import UserService router = APIRouter(prefix="/tasks", tags=["Tasks"]) @router.get("/") async def get_tasks(session: sessionDep, user: ActiveUser): - query = select(TasksORM.id, TasksORM.description).where(TasksORM.user_id == user.id) - tasks = await session.session.execute(query) - result = tasks.scalars().all() + 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 1d8c54d..535f038 100644 --- a/src/repository/users.py +++ b/src/repository/users.py @@ -1,6 +1,8 @@ -from sqlalchemy import update +from sqlalchemy import select, update +from sqlalchemy.orm import selectinload from src.models import UsersORM +from src.models.tasks import TasksORM from src.repository.base import BaseRepo @@ -17,3 +19,17 @@ class UsersRepo(BaseRepo): result = await self.session.execute(stmt) model = result.scalar_one() return model + + async def get_one_with_load(self, user_id: int) -> UsersORM | None: + quary = ( + select(self.model) + .where(self.model.id == user_id) + .options( + selectinload(self.model.tasks).load_only( + TasksORM.id, TasksORM.title, TasksORM.due_date + ) + ) + ) + result = await self.session.execute(quary) + obj = result.scalar_one_or_none() + return obj diff --git a/src/schemas/tasks.py b/src/schemas/tasks.py index cae041d..e862c5d 100644 --- a/src/schemas/tasks.py +++ b/src/schemas/tasks.py @@ -16,5 +16,5 @@ class Task(TaskADDRequest): user_id: int status: Literal["open", "closed", "in_progress", "todo"] time_spent: int - - model_config = ConfigDict(from_attributes=True) \ No newline at end of file + + model_config = ConfigDict(from_attributes=True) diff --git a/src/services/base.py b/src/services/base.py index 0de2a50..6c092c9 100644 --- a/src/services/base.py +++ b/src/services/base.py @@ -2,7 +2,7 @@ from src.core.interfaces import IUOWDB class BaseService: - session: IUOWDB + session: IUOWDB def __init__(self, session: "IUOWDB"): self.session = session diff --git a/src/services/users.py b/src/services/users.py index c75a4ca..2093aa3 100644 --- a/src/services/users.py +++ b/src/services/users.py @@ -38,3 +38,8 @@ class UserService(BaseService): ) await self.session.commit() return User.model_validate(user) + + async def get_user_with_tasks(self, user_id: int): + user = await self.session.user.get_one_with_load(user_id) + if user is None: + raise HTTPException(status_code=404, detail="User not found.")