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