add telegram username to bd
This commit is contained in:
@ -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
|
||||
|
||||
@ -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):
|
||||
|
||||
@ -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()
|
||||
|
||||
Reference in New Issue
Block a user