feat: create user
This commit is contained in:
		@@ -31,3 +31,15 @@ async def update(
 | 
				
			|||||||
        request: UpdateUserRequest
 | 
					        request: UpdateUserRequest
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await UserService(session).update(request)
 | 
					    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)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -8,9 +8,7 @@ from schemas.role import RoleSchema
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
# region Entities
 | 
					# region Entities
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BasicUser(BaseSchema):
 | 
				
			||||||
class BaseUser(BaseSchema):
 | 
					 | 
				
			||||||
    id: int
 | 
					 | 
				
			||||||
    telegram_id: int
 | 
					    telegram_id: int
 | 
				
			||||||
    phone_number: str | None = None
 | 
					    phone_number: str | None = None
 | 
				
			||||||
    first_name: str
 | 
					    first_name: str
 | 
				
			||||||
@@ -24,6 +22,10 @@ class BaseUser(BaseSchema):
 | 
				
			|||||||
    pay_rate: Optional[PayRateSchema] = None
 | 
					    pay_rate: Optional[PayRateSchema] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class BaseUser(BasicUser):
 | 
				
			||||||
 | 
					    id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
class UserSchema(BaseUser):
 | 
					class UserSchema(BaseUser):
 | 
				
			||||||
    role: RoleSchema
 | 
					    role: RoleSchema
 | 
				
			||||||
    position: Optional[PositionSchema] = None
 | 
					    position: Optional[PositionSchema] = None
 | 
				
			||||||
@@ -33,6 +35,10 @@ class UserUpdate(BaseUser):
 | 
				
			|||||||
    position_key: Optional[str] = None
 | 
					    position_key: Optional[str] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class UserCreate(BasicUser):
 | 
				
			||||||
 | 
					    position_key: Optional[str] = None
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Requests
 | 
					# region Requests
 | 
				
			||||||
@@ -40,6 +46,10 @@ class UpdateUserRequest(BaseSchema):
 | 
				
			|||||||
    data: UserUpdate
 | 
					    data: UserUpdate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CreateUserRequest(BaseSchema):
 | 
				
			||||||
 | 
					    data: UserCreate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Responses
 | 
					# region Responses
 | 
				
			||||||
@@ -49,4 +59,8 @@ class GetAllUsersResponse(BaseSchema):
 | 
				
			|||||||
 | 
					
 | 
				
			||||||
class UpdateUserResponse(OkMessageSchema):
 | 
					class UpdateUserResponse(OkMessageSchema):
 | 
				
			||||||
    pass
 | 
					    pass
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class CreateUserResponse(OkMessageSchema):
 | 
				
			||||||
 | 
					    pass
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -19,6 +19,32 @@ class UserService(BaseService):
 | 
				
			|||||||
    async def get_by_id(self, user_id: int) -> Optional[User]:
 | 
					    async def get_by_id(self, user_id: int) -> Optional[User]:
 | 
				
			||||||
        return await self.session.scalar(select(User).where(User.id == user_id))
 | 
					        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:
 | 
					    async def update(self, request: UpdateUserRequest) -> UpdateUserResponse:
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if not await self.get_by_id(request.data.id):
 | 
					            if not await self.get_by_id(request.data.id):
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user