From 93b0315b4aa256ee36e090f37903a4233daaad38 Mon Sep 17 00:00:00 2001 From: fakz9 Date: Mon, 5 Aug 2024 01:46:22 +0300 Subject: [PATCH] feat: create user --- routers/user.py | 12 ++++++++++++ schemas/user.py | 20 +++++++++++++++++--- services/user.py | 26 ++++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 3 deletions(-) diff --git a/routers/user.py b/routers/user.py index 6dfcadd..670f9a6 100644 --- a/routers/user.py +++ b/routers/user.py @@ -31,3 +31,15 @@ async def update( request: UpdateUserRequest ): return await UserService(session).update(request) + + +@user_router.post( + '/create', + response_model=CreateUserResponse, + operation_id='create_user' +) +async def create( + session: SessionDependency, + request: CreateUserRequest +): + return await UserService(session).create(request) diff --git a/schemas/user.py b/schemas/user.py index a48a170..6a54ee2 100644 --- a/schemas/user.py +++ b/schemas/user.py @@ -8,9 +8,7 @@ from schemas.role import RoleSchema # region Entities - -class BaseUser(BaseSchema): - id: int +class BasicUser(BaseSchema): telegram_id: int phone_number: str | None = None first_name: str @@ -24,6 +22,10 @@ class BaseUser(BaseSchema): pay_rate: Optional[PayRateSchema] = None +class BaseUser(BasicUser): + id: int + + class UserSchema(BaseUser): role: RoleSchema position: Optional[PositionSchema] = None @@ -33,6 +35,10 @@ class UserUpdate(BaseUser): position_key: Optional[str] = None +class UserCreate(BasicUser): + position_key: Optional[str] = None + + # endregion # region Requests @@ -40,6 +46,10 @@ class UpdateUserRequest(BaseSchema): data: UserUpdate +class CreateUserRequest(BaseSchema): + data: UserCreate + + # endregion # region Responses @@ -49,4 +59,8 @@ class GetAllUsersResponse(BaseSchema): class UpdateUserResponse(OkMessageSchema): pass + + +class CreateUserResponse(OkMessageSchema): + pass # endregion diff --git a/services/user.py b/services/user.py index 22d4d07..fba6a13 100644 --- a/services/user.py +++ b/services/user.py @@ -19,6 +19,32 @@ class UserService(BaseService): async def get_by_id(self, user_id: int) -> Optional[User]: return await self.session.scalar(select(User).where(User.id == user_id)) + async def create(self, request: CreateUserRequest) -> CreateUserResponse: + try: + base_fields = request.data.model_dump_parent() + del base_fields['pay_rate'] + user = User(**base_fields) + self.session.add(user) + await self.session.flush() + + if request.data.position_key: + stmt = insert(user_position).values(**{ + 'user_id': user.id, + 'position_key': request.data.position_key + }) + await self.session.execute(stmt) + if request.data.pay_rate: + stmt = insert(user_pay_rate).values(**{ + 'user_id': user.id, + 'pay_rate_id': request.data.pay_rate.id + }) + await self.session.execute(stmt) + + await self.session.commit() + return UpdateUserResponse(ok=True, message='Пользователь успешно обновлен') + except Exception as e: + return CreateUserResponse(ok=False, message=str(e)) + async def update(self, request: UpdateUserRequest) -> UpdateUserResponse: try: if not await self.get_by_id(request.data.id):