feat: invite code

This commit is contained in:
2025-03-05 19:34:16 +03:00
parent 6c2698679d
commit 3d9a3cef73
5 changed files with 17 additions and 12 deletions

View File

@@ -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'))

View File

@@ -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)

View File

@@ -82,6 +82,10 @@ class CreateUserRequest(BaseSchema):
data: UserCreate data: UserCreate
class GenerateInviteCodeRequest(BaseSchema):
user_id: int
# endregion # endregion
# region Responses # region Responses

View File

@@ -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='Пользователь не найден')

View File

@@ -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()