diff --git a/api/src/api/v1/users.py b/api/src/api/v1/users.py index 76b46c9..741862a 100644 --- a/api/src/api/v1/users.py +++ b/api/src/api/v1/users.py @@ -121,7 +121,7 @@ async def get_user( -@router.put("/", response_model=UserResponse) +@router.post("/", response_model=BaseSingleResponse[UserAdminListResponse]) async def create_user( user_data: UserCreate, db: AsyncSession = Depends(get_db), @@ -129,10 +129,15 @@ async def create_user( ): user_service = UserService(db) user = await user_service.create_user(user_data=user_data, creator=current_user) - return UserResponse(success=True, message="Пользователь создан", result=user) + + result = UserAdminListResponse.model_validate(user) + if user_data.load_orgs: + result.org_units = [] + + return BaseSingleResponse(success=True, message="Пользователь создан", result=result) -@router.patch("/{user_id}", response_model=UserResponse) +@router.patch("/{user_id}", response_model=BaseSingleResponse[UserAdminListResponse]) async def update_user( user_id: int, user_data: UserUpdate, @@ -145,7 +150,8 @@ async def update_user( user_data=user_data, user=current_user, ) - return UserResponse(success=True, message="Пользователь обновлен", result=user) + result = UserAdminListResponse.model_validate(user) + return UserResponse(success=True, message="Пользователь обновлен", result=result) @router.delete("/{user_id}", response_model=UserResponse) diff --git a/api/src/domain/schemas.py b/api/src/domain/schemas.py index d6f46c3..d843b8e 100644 --- a/api/src/domain/schemas.py +++ b/api/src/domain/schemas.py @@ -85,6 +85,7 @@ class UserBase(BaseModel): class UserCreate(UserBase): password: str | None = Field(default=None, examples=["pass123"]) + load_orgs: bool = Field(default=False) model_config = ConfigDict( json_schema_extra={ @@ -94,6 +95,7 @@ class UserCreate(UserBase): "full_name": "Иван Иванов", "role_id": 3, "password": "pass123", + "load_orgs": True, } } ) @@ -116,6 +118,7 @@ class UserUpdate(BaseModel): ) role_id: Optional[int] = None is_active: Optional[bool] = True + load_orgs: bool = Field(default=False) class UserInDB(UserBase): diff --git a/api/src/repository/user_repository.py b/api/src/repository/user_repository.py index 851d24f..5ee7413 100644 --- a/api/src/repository/user_repository.py +++ b/api/src/repository/user_repository.py @@ -195,10 +195,15 @@ class UserRepository: }, ) ).scalar_one() - await self.db.commit() + await self.db.flush() return await self.get(user_id) - async def update(self, user_id: int, user_data: dict) -> Optional[AppUser]: + async def update( + self, + user_id: int, + user_data: dict, + load_orgs: bool = False, + ) -> Optional[AppUser]: user = await self.get(user_id) if not user: return None @@ -231,5 +236,7 @@ class UserRepository: "is_active": user_data.get("is_active"), }, ) - await self.db.commit() - return await self.get(user_id) + await self.db.flush() + self.db.expire(user) + result = await self.get(user_id, load_orgs=load_orgs) + return result diff --git a/api/src/services/user_service.py b/api/src/services/user_service.py index 9658e7f..e356313 100644 --- a/api/src/services/user_service.py +++ b/api/src/services/user_service.py @@ -90,7 +90,11 @@ class UserService: if conflict: raise UsernameConflictException() - updated = await self.user_repo.update(user_id, update_payload) + updated = await self.user_repo.update( + user_id=user_id, + user_data=update_payload, + load_orgs=user_data.load_orgs, + ) if role_id is not None and role is not None: had_many_ssp_role = previous_role_id in ( @@ -107,7 +111,11 @@ class UserService: ) if (had_many_ssp_role and not has_many_ssp_role_now) or is_executor_to_dfip_transition: await self.user_repo.clear_many_ssp(user_id) - + if user_data.load_orgs: + updated = self.user_repo.get( + user_id=user_id, + load_orgs=user_data.load_orgs, + ) return updated async def delete_user(self, user_id: int, user: AppUser):