редактирование сообщения авторизации

This commit is contained in:
Artem Tsyrulnikov
2026-01-19 19:16:13 +03:00
parent a90c8b7df6
commit 2a4e694ca4
10 changed files with 150 additions and 8 deletions

View File

@@ -227,6 +227,12 @@ class Postgres(DatabaseBase):
if updated == 0:
raise domain.LoginTokenAlreadyUsed() # либо нет токена, либо он уже использован
@staticmethod
async def update_login_token_message_id(token: str, message_id: int) -> None:
updated = await domain.LoginToken.filter(token=token).update(message_id=message_id)
if updated == 0:
raise domain.LoginTokenNotFound()
@staticmethod
async def get_channel(
channel_id: uuid.UUID | None = None, telegram_id: int | None = None, username: str | None = None

View File

@@ -22,5 +22,8 @@ class TelegramBot(TelegramBase, TelegramBotWriter):
keyboard = InlineKeyboardMarkup(inline_keyboard=buttons)
await self.bot.send_message(chat_id=chat_id, text=text, reply_markup=keyboard)
async def edit_message_text(self, text: str, chat_id: int, message_id: int) -> None:
await self.bot.edit_message_text(chat_id=chat_id, message_id=message_id, text=text, reply_markup=None)
async def edit_message_reply_markup(self, chat_id: int, message_id: int) -> None:
await self.bot.edit_message_reply_markup(chat_id=chat_id, message_id=message_id, reply_markup=None)

View File

@@ -8,19 +8,19 @@ from src import deps, dto
internal_router = APIRouter(prefix='/internal', tags=['internal'])
class CreateLoginTokenResponse(BaseModel):
token: str
@internal_router.post('/auth/login-token')
async def create_login_token(input: dto.CreateLoginTokenRequest) -> str:
return await deps.get_usecase().create_telegram_login_token(telegram_id=input.telegram_id)
class ValidateTokenRequest(BaseModel):
class AttachLoginTokenMessageRequest(BaseModel):
token: str
telegram_id: int
username: str | None = None
message_id: int
@internal_router.post('/auth/login-token/message')
async def attach_login_token_message(input: AttachLoginTokenMessageRequest) -> None:
await deps.get_usecase().attach_login_token_message(token=input.token, message_id=input.message_id)
@internal_router.get('/auth/jwt')

View File

@@ -16,6 +16,7 @@ class LoginToken(TimestampedModel):
)
expires_at = fields.DatetimeField()
used_at = fields.DatetimeField(null=True)
message_id = fields.IntField(null=True)
class Meta:
table = 'login_token'

View File

@@ -15,6 +15,7 @@ from .analytics.get_overview_analytics import get_overview_analytics
from .analytics.get_placements_analytics import get_placements_analytics
from .analytics.get_projects_analytics import get_projects_analytics
from .analytics.get_spending_analytics import get_spending_analytics
from .auth.attach_login_token_message import attach_login_token_message
from .auth.create_telegram_login_token import create_telegram_login_token
from .auth.get_jwt_by_telegram_id import get_jwt_by_telegram_id
from .auth.get_me import get_me
@@ -62,6 +63,8 @@ class TelegramBotWriter(typing.Protocol):
self, text: str, chat_id: int, buttons: list[list['InlineKeyboardButton']]
) -> None: ...
async def edit_message_text(self, text: str, chat_id: int, message_id: int) -> None: ...
async def edit_message_reply_markup(self, chat_id: int, message_id: int) -> None: ...
async def create_chat_invite_link(self, chat_id: int, requires_approval: bool = False) -> str: ...
@@ -145,6 +148,7 @@ class Usecase:
validate_login_token = validate_login_token
create_telegram_login_token = create_telegram_login_token
attach_login_token_message = attach_login_token_message
get_jwt_by_telegram_id = get_jwt_by_telegram_id
get_me = get_me
tg_add_project = tg_add_project

View File

@@ -0,0 +1,8 @@
import typing
if typing.TYPE_CHECKING:
from .. import Usecase
async def attach_login_token_message(self: 'Usecase', token: str, message_id: int) -> None:
await self.database.update_login_token_message_id(token=token, message_id=message_id)

View File

@@ -1,3 +1,4 @@
import logging
import typing
from tortoise import timezone
@@ -30,6 +31,16 @@ async def validate_login_token(self: 'Usecase', input: dto.ValidateLoginTokenInp
if telegram_user is None:
raise domain.UserNotFound(login_token.user_id)
if login_token.message_id is not None:
try:
await self.telegram_bot.edit_message_text(
text='✅ Вы успешно авторизованы',
chat_id=telegram_user.telegram_id,
message_id=login_token.message_id,
)
except Exception:
logging.getLogger(__name__).exception("Failed to update login message")
access_token = self.jwt_encoder.encode_access_token(
user_id=user.id,
telegram_id=telegram_user.telegram_id,