diff --git a/app/models/user.py b/app/models/user.py index a527829..e549079 100644 --- a/app/models/user.py +++ b/app/models/user.py @@ -22,7 +22,9 @@ class UserInDB(BaseModel): is_active: bool = True created_at: datetime = datetime.utcnow() code: Optional[str] = None - telegram_id: Optional[str] = None + telegram_chat_id: Optional[int] = None + telegram_user_id: Optional[int] = None + telegram_username: Optional[str] = None is_verified: bool = False code_expires_at: Optional[datetime] = None is_admin: bool = False diff --git a/app/services/auth.py b/app/services/auth.py index f00fac8..42f2c9e 100644 --- a/app/services/auth.py +++ b/app/services/auth.py @@ -58,30 +58,38 @@ class AuthService: else: raise HTTPException(404, "User not found") - async def verify_code(self, username: str, code: str, telegram_chat_id: int): + async def verify_code( + self, + username: str, + code: str, + telegram_chat_id: int, + telegram_user_id: int | None = None, + telegram_username: str | None = None, + ): user = await users_collection.find_one({"username": username}) if not user: raise HTTPException(404, "User not found") - + if user["is_verified"]: raise HTTPException(400, "User already verified") - - # Проверяем код и привязку к Telegram + if user.get("telegram_chat_id") and user["telegram_chat_id"] != telegram_chat_id: raise HTTPException(403, "This account is linked to another Telegram") - + if user.get("code") != code: raise HTTPException(400, "Invalid code") - # Обновляем chat_id при первом подтверждении - await users_collection.update_one( - {"username": username}, - {"$set": { - "is_verified": True, - "telegram_chat_id": telegram_chat_id, - "code": None - }} - ) + update = { + "is_verified": True, + "telegram_chat_id": telegram_chat_id, + "code": None, + } + if telegram_user_id is not None: + update["telegram_user_id"] = telegram_user_id + if telegram_username is not None: + update["telegram_username"] = telegram_username + + await users_collection.update_one({"username": username}, {"$set": update}) return {"status": "success"} async def get_verification_status(self, username: str): diff --git a/app/webhooks/telegram.py b/app/webhooks/telegram.py index 3f4a86b..d7817be 100644 --- a/app/webhooks/telegram.py +++ b/app/webhooks/telegram.py @@ -48,12 +48,16 @@ async def process_code(message: Message, state: FSMContext): data = await state.get_data() username = data["username"] code = message.text.strip() + + tg_user = message.from_user try: await auth_service.verify_code( username=username, code=code, telegram_chat_id=message.chat.id, + telegram_user_id=tg_user.id, + telegram_username=tg_user.username, ) await message.answer("✅ Аккаунт подтвержден!") await state.clear()