feat: invite code
This commit is contained in:
		@@ -144,8 +144,8 @@ class InviteCode(BaseModel):
 | 
				
			|||||||
    code: Mapped[str] = mapped_column(primary_key=True)
 | 
					    code: Mapped[str] = mapped_column(primary_key=True)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    is_activated: Mapped[bool] = mapped_column(nullable=False, default=False)
 | 
					    is_activated: Mapped[bool] = mapped_column(nullable=False, default=False)
 | 
				
			||||||
    activated_by_id: Mapped[Optional[int]] = mapped_column(ForeignKey('users.id'))
 | 
					    user_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
 | 
				
			||||||
    activated_by: Mapped["User"] = relationship('User', foreign_keys=[activated_by_id])
 | 
					    user: Mapped["User"] = relationship('User', foreign_keys=[user_id])
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    created_at: Mapped[datetime.datetime] = mapped_column(nullable=False)
 | 
					    created_at: Mapped[datetime.datetime] = mapped_column(nullable=False)
 | 
				
			||||||
    created_by_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
 | 
					    created_by_id: Mapped[int] = mapped_column(ForeignKey('users.id'))
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -92,6 +92,7 @@ async def upload_passport_image(
 | 
				
			|||||||
)
 | 
					)
 | 
				
			||||||
async def generate_invite_code(
 | 
					async def generate_invite_code(
 | 
				
			||||||
        session: SessionDependency,
 | 
					        session: SessionDependency,
 | 
				
			||||||
 | 
					        request:GenerateInviteCodeRequest,
 | 
				
			||||||
        user: CurrentUserDependency
 | 
					        user: CurrentUserDependency
 | 
				
			||||||
):
 | 
					):
 | 
				
			||||||
    return await UserService(session).generate_invite_code(user)
 | 
					    return await UserService(session).generate_invite_code(user, request)
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -82,6 +82,10 @@ class CreateUserRequest(BaseSchema):
 | 
				
			|||||||
    data: UserCreate
 | 
					    data: UserCreate
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					class GenerateInviteCodeRequest(BaseSchema):
 | 
				
			||||||
 | 
					    user_id: int
 | 
				
			||||||
 | 
					
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# endregion
 | 
					# endregion
 | 
				
			||||||
 | 
					
 | 
				
			||||||
# region Responses
 | 
					# region Responses
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -38,6 +38,8 @@ async def get_current_user(
 | 
				
			|||||||
        user = await session.get(User, user_id)
 | 
					        user = await session.get(User, user_id)
 | 
				
			||||||
        if not user:
 | 
					        if not user:
 | 
				
			||||||
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid credentials')
 | 
					            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid credentials')
 | 
				
			||||||
 | 
					        if user.is_deleted or user.is_blocked:
 | 
				
			||||||
 | 
					            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Пользователь заблокирован или удален')
 | 
				
			||||||
        return user
 | 
					        return user
 | 
				
			||||||
    except JWTError as e:
 | 
					    except JWTError as e:
 | 
				
			||||||
        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid token')
 | 
					        raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Invalid token')
 | 
				
			||||||
@@ -82,15 +84,12 @@ class AuthService(BaseService):
 | 
				
			|||||||
            delta = datetime.now() - invite_code.created_at
 | 
					            delta = datetime.now() - invite_code.created_at
 | 
				
			||||||
            if delta.seconds >= constants.INVITE_CODE_EXPIRY:
 | 
					            if delta.seconds >= constants.INVITE_CODE_EXPIRY:
 | 
				
			||||||
                raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Код приглашения устарел')
 | 
					                raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Код приглашения устарел')
 | 
				
			||||||
            user = User(
 | 
					            user = await self.session.get(User, invite_code.user_id)
 | 
				
			||||||
                telegram_id=request.id,
 | 
					            if not user:
 | 
				
			||||||
                is_admin=False,
 | 
					                raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Пользователь не найден')
 | 
				
			||||||
                role_key=UserRole.user
 | 
					            user.telegram_id = request.id
 | 
				
			||||||
            )
 | 
					 | 
				
			||||||
            self.session.add(user)
 | 
					 | 
				
			||||||
            await self.session.flush()
 | 
					            await self.session.flush()
 | 
				
			||||||
            invite_code.is_activated = True
 | 
					            invite_code.is_activated = True
 | 
				
			||||||
            invite_code.activated_by_id = user.id
 | 
					 | 
				
			||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
        if not user:
 | 
					        if not user:
 | 
				
			||||||
            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Пользователь не найден')
 | 
					            raise HTTPException(status_code=status.HTTP_401_UNAUTHORIZED, detail='Пользователь не найден')
 | 
				
			||||||
 
 | 
				
			|||||||
@@ -175,7 +175,7 @@ class UserService(BaseService):
 | 
				
			|||||||
        random.shuffle(code)
 | 
					        random.shuffle(code)
 | 
				
			||||||
        return ''.join(code)
 | 
					        return ''.join(code)
 | 
				
			||||||
 | 
					
 | 
				
			||||||
    async def generate_invite_code(self, user: User) -> GenerateInviteCodeResponse:
 | 
					    async def generate_invite_code(self, user: User, request: GenerateInviteCodeRequest) -> GenerateInviteCodeResponse:
 | 
				
			||||||
        MAX_ATTEMPTS = 5
 | 
					        MAX_ATTEMPTS = 5
 | 
				
			||||||
        try:
 | 
					        try:
 | 
				
			||||||
            if not user.is_admin:
 | 
					            if not user.is_admin:
 | 
				
			||||||
@@ -195,7 +195,8 @@ class UserService(BaseService):
 | 
				
			|||||||
            new_invite_code = InviteCode(
 | 
					            new_invite_code = InviteCode(
 | 
				
			||||||
                code=invite_code,
 | 
					                code=invite_code,
 | 
				
			||||||
                created_at=datetime.datetime.now(),
 | 
					                created_at=datetime.datetime.now(),
 | 
				
			||||||
                created_by_id=user.id
 | 
					                created_by_id=user.id,
 | 
				
			||||||
 | 
					                user_id=request.user_id
 | 
				
			||||||
            )
 | 
					            )
 | 
				
			||||||
            self.session.add(new_invite_code)
 | 
					            self.session.add(new_invite_code)
 | 
				
			||||||
            await self.session.commit()
 | 
					            await self.session.commit()
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user