add telegram username to bd
This commit is contained in:
@ -22,7 +22,9 @@ class UserInDB(BaseModel):
|
|||||||
is_active: bool = True
|
is_active: bool = True
|
||||||
created_at: datetime = datetime.utcnow()
|
created_at: datetime = datetime.utcnow()
|
||||||
code: Optional[str] = None
|
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
|
is_verified: bool = False
|
||||||
code_expires_at: Optional[datetime] = None
|
code_expires_at: Optional[datetime] = None
|
||||||
is_admin: bool = False
|
is_admin: bool = False
|
||||||
|
|||||||
@ -58,30 +58,38 @@ class AuthService:
|
|||||||
else:
|
else:
|
||||||
raise HTTPException(404, "User not found")
|
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})
|
user = await users_collection.find_one({"username": username})
|
||||||
if not user:
|
if not user:
|
||||||
raise HTTPException(404, "User not found")
|
raise HTTPException(404, "User not found")
|
||||||
|
|
||||||
if user["is_verified"]:
|
if user["is_verified"]:
|
||||||
raise HTTPException(400, "User already verified")
|
raise HTTPException(400, "User already verified")
|
||||||
|
|
||||||
# Проверяем код и привязку к Telegram
|
|
||||||
if user.get("telegram_chat_id") and user["telegram_chat_id"] != telegram_chat_id:
|
if user.get("telegram_chat_id") and user["telegram_chat_id"] != telegram_chat_id:
|
||||||
raise HTTPException(403, "This account is linked to another Telegram")
|
raise HTTPException(403, "This account is linked to another Telegram")
|
||||||
|
|
||||||
if user.get("code") != code:
|
if user.get("code") != code:
|
||||||
raise HTTPException(400, "Invalid code")
|
raise HTTPException(400, "Invalid code")
|
||||||
|
|
||||||
# Обновляем chat_id при первом подтверждении
|
update = {
|
||||||
await users_collection.update_one(
|
"is_verified": True,
|
||||||
{"username": username},
|
"telegram_chat_id": telegram_chat_id,
|
||||||
{"$set": {
|
"code": None,
|
||||||
"is_verified": True,
|
}
|
||||||
"telegram_chat_id": telegram_chat_id,
|
if telegram_user_id is not None:
|
||||||
"code": 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"}
|
return {"status": "success"}
|
||||||
|
|
||||||
async def get_verification_status(self, username: str):
|
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()
|
data = await state.get_data()
|
||||||
username = data["username"]
|
username = data["username"]
|
||||||
code = message.text.strip()
|
code = message.text.strip()
|
||||||
|
|
||||||
|
tg_user = message.from_user
|
||||||
|
|
||||||
try:
|
try:
|
||||||
await auth_service.verify_code(
|
await auth_service.verify_code(
|
||||||
username=username,
|
username=username,
|
||||||
code=code,
|
code=code,
|
||||||
telegram_chat_id=message.chat.id,
|
telegram_chat_id=message.chat.id,
|
||||||
|
telegram_user_id=tg_user.id,
|
||||||
|
telegram_username=tg_user.username,
|
||||||
)
|
)
|
||||||
await message.answer("✅ Аккаунт подтвержден!")
|
await message.answer("✅ Аккаунт подтвержден!")
|
||||||
await state.clear()
|
await state.clear()
|
||||||
|
|||||||
Reference in New Issue
Block a user