Compare commits

...

2 Commits

Author SHA1 Message Date
IluaAir
a9997b1207 get one with load 2025-08-15 15:47:58 +03:00
IluaAir
9e5cde8e28 fix token data 2025-08-15 01:06:25 +03:00
6 changed files with 29 additions and 11 deletions

View File

@@ -1,22 +1,19 @@
from typing import Annotated from typing import Annotated
from fastapi import APIRouter, Depends from fastapi import APIRouter, Depends
from sqlalchemy import select
from src.api.dependacies.db_dep import sessionDep from src.api.dependacies.db_dep import sessionDep
from src.api.dependacies.user_dep import ActiveUser from src.api.dependacies.user_dep import ActiveUser
from src.models.tasks import TasksORM
from src.schemas.tasks import TaskADDRequest from src.schemas.tasks import TaskADDRequest
from src.services.tasks import TaskService from src.services.tasks import TaskService
from src.services.users import UserService
router = APIRouter(prefix="/tasks", tags=["Tasks"]) router = APIRouter(prefix="/tasks", tags=["Tasks"])
@router.get("/") @router.get("/")
async def get_tasks(session: sessionDep, user: ActiveUser): async def get_tasks(session: sessionDep, user: ActiveUser):
query = select(TasksORM.id, TasksORM.description).where(TasksORM.user_id == user.id) result = await UserService(session).get_user_with_tasks(user.id)
tasks = await session.session.execute(query)
result = tasks.scalars().all()
return result return result

View File

@@ -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 import UsersORM
from src.models.tasks import TasksORM
from src.repository.base import BaseRepo from src.repository.base import BaseRepo
@@ -17,3 +19,17 @@ class UsersRepo(BaseRepo):
result = await self.session.execute(stmt) result = await self.session.execute(stmt)
model = result.scalar_one() model = result.scalar_one()
return model 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

View File

@@ -7,6 +7,6 @@ class Token(BaseModel):
class TokenData(BaseModel): class TokenData(BaseModel):
id: int | None = None id: int
sub: str | None = None sub: str
is_active: bool is_active: bool

View File

@@ -16,5 +16,5 @@ class Task(TaskADDRequest):
user_id: int user_id: int
status: Literal["open", "closed", "in_progress", "todo"] status: Literal["open", "closed", "in_progress", "todo"]
time_spent: int time_spent: int
model_config = ConfigDict(from_attributes=True) model_config = ConfigDict(from_attributes=True)

View File

@@ -2,7 +2,7 @@ from src.core.interfaces import IUOWDB
class BaseService: class BaseService:
session: IUOWDB session: IUOWDB
def __init__(self, session: "IUOWDB"): def __init__(self, session: "IUOWDB"):
self.session = session self.session = session

View File

@@ -38,3 +38,8 @@ class UserService(BaseService):
) )
await self.session.commit() await self.session.commit()
return User.model_validate(user) 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.")