From 1a2fee18381b4ab473c723ede4493dfbaf95d5d2 Mon Sep 17 00:00:00 2001 From: Thi1ef Date: Sun, 20 Jul 2025 00:37:43 +0300 Subject: [PATCH] =?UTF-8?q?=E2=9C=A8=20Implement=20user=20retrieval=20by?= =?UTF-8?q?=20IDs=20and=20update=20related=20service=20methods?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- backend/app/routes/api/tag/router.py | 4 ++-- backend/app/routes/api/tag/service.py | 4 ++-- backend/app/routes/api/user/data_access.py | 6 ++++++ backend/app/routes/api/user/router.py | 13 +++++++++++-- backend/app/routes/api/user/schemas.py | 9 +++++++++ backend/app/routes/api/user/service.py | 11 +++++++++-- 6 files changed, 39 insertions(+), 8 deletions(-) diff --git a/backend/app/routes/api/tag/router.py b/backend/app/routes/api/tag/router.py index 9435be4..8f087a1 100644 --- a/backend/app/routes/api/tag/router.py +++ b/backend/app/routes/api/tag/router.py @@ -11,11 +11,11 @@ async def get_tags_by_description( project_id: int, service: TagServiceDep ) -> GeneratedTagsResponse: - return await service.get_tags(project_id) + return await service.get_generated_tags(project_id) @router.post("/add/{project_id}") async def add_project_tags( project_id: int, service: TagServiceDep, user: AuthUserDep, tags: list[TagSchema] ) -> list[TagSchema]: - return await service.add_project_tags(project_id, tags, user) + return await service.add_tags_to_project(project_id, tags, user) diff --git a/backend/app/routes/api/tag/service.py b/backend/app/routes/api/tag/service.py index a429e93..9e8e9f2 100644 --- a/backend/app/routes/api/tag/service.py +++ b/backend/app/routes/api/tag/service.py @@ -19,7 +19,7 @@ def __init__( self.ai_agent = ai_agent self.tag_data_access = tag_data_access - async def get_tags(self, project_id: int) -> GeneratedTagsResponse: + async def get_generated_tags(self, project_id: int) -> GeneratedTagsResponse: project = await self.data_access.get_project_by_id(project_id) if project is None: raise HTTPException(status_code=404, detail="Project not found") @@ -27,7 +27,7 @@ async def get_tags(self, project_id: int) -> GeneratedTagsResponse: return result - async def add_project_tags( + async def add_tags_to_project( self, project_id: int, tags: list[TagSchema], user: UserInDB ) -> list[TagSchema]: project = await self.data_access.get_project_by_id(project_id) diff --git a/backend/app/routes/api/user/data_access.py b/backend/app/routes/api/user/data_access.py index 80d8b7c..8f49873 100644 --- a/backend/app/routes/api/user/data_access.py +++ b/backend/app/routes/api/user/data_access.py @@ -4,6 +4,7 @@ from sqlalchemy import select, update from models import User from models.users import UserRole +from routes.api.user.schemas import GetUserSchema class UserDataAccess: @@ -21,5 +22,10 @@ async def set_user_role(self, username: str, role: UserRole) -> None: update(User).where(User.username == username).values(role=role) ) + async def get_users_by_ids(self, users_ids: list[int]) -> list[GetUserSchema]: + res = await self.db_session.execute(select(User).where(User.id.in_(users_ids))) + users = res.scalars().all() + return [GetUserSchema.model_validate(user) for user in users] + UserDataAccessDep = Annotated[UserDataAccess, Depends(UserDataAccess)] diff --git a/backend/app/routes/api/user/router.py b/backend/app/routes/api/user/router.py index 1fb84fb..2b9e7a5 100644 --- a/backend/app/routes/api/user/router.py +++ b/backend/app/routes/api/user/router.py @@ -1,7 +1,8 @@ -from fastapi import APIRouter, Depends +from fastapi import APIRouter, Depends, Query +from typing import Annotated from dependencies.auth import get_current_user from routes.api.user.service import UserServiceDep -from routes.api.user.schemas import SetUserRoleSchema +from routes.api.user.schemas import SetUserRoleSchema, GetUserSchema from schemas.user import User router = APIRouter(prefix="/user", tags=["user"]) @@ -22,3 +23,11 @@ async def get_me( current_user=Depends(get_current_user), ) -> User: return current_user + + +@router.get("/get_users") +async def get_users_by_ids( + service: UserServiceDep, + users_ids: Annotated[list[int], Query(description="List of user IDs")], +) -> list[GetUserSchema]: + return await service.get_users_by_ids(users_ids) diff --git a/backend/app/routes/api/user/schemas.py b/backend/app/routes/api/user/schemas.py index 7421a9d..74f3a9b 100644 --- a/backend/app/routes/api/user/schemas.py +++ b/backend/app/routes/api/user/schemas.py @@ -4,3 +4,12 @@ class SetUserRoleSchema(BaseModel): role: UserRole + + +class GetUserSchema(BaseModel): + id: int + username: str + role: UserRole + + class Config: + from_attributes = True diff --git a/backend/app/routes/api/user/service.py b/backend/app/routes/api/user/service.py index e4a6ad8..741c76c 100644 --- a/backend/app/routes/api/user/service.py +++ b/backend/app/routes/api/user/service.py @@ -1,9 +1,8 @@ from typing import Annotated from fastapi import Depends, HTTPException - from models.users import UserRole from routes.api.user.data_access import UserDataAccessDep, UserDataAccess -from routes.api.user.schemas import SetUserRoleSchema +from routes.api.user.schemas import SetUserRoleSchema, GetUserSchema from schemas.user import User @@ -28,5 +27,13 @@ async def set_user_role(self, user_role: SetUserRoleSchema, current_user: User): "message": f"User '{user.username}' role set to {user_role.role.value}." } + async def get_users_by_ids(self, users_ids: list[int]) -> list[GetUserSchema]: + users = await self.user_repository.get_users_by_ids(users_ids) + if not users: + raise HTTPException( + status_code=404, detail="No users found with the provided IDs." + ) + return users + UserServiceDep = Annotated[UserService, Depends(UserService)]