51 lines
1.8 KiB
Python
51 lines
1.8 KiB
Python
"""Вход в админку через deep-link из установленного Telegram."""
|
|
|
|
from __future__ import annotations
|
|
|
|
from aiogram import Router
|
|
from aiogram.filters import Command
|
|
from aiogram.types import InlineKeyboardButton, InlineKeyboardMarkup, Message
|
|
|
|
from common.config import get_settings
|
|
from common.repositories import admin_login_tokens_repo, admins_repo
|
|
from common.texts import system
|
|
|
|
router = Router(name="login")
|
|
|
|
|
|
@router.message(Command("start"))
|
|
async def start_handler(message: Message) -> None:
|
|
"""Обработать /start; payload ``login_<token>`` подтверждает вход в админку."""
|
|
if message.chat.type != "private" or message.from_user is None:
|
|
return
|
|
|
|
parts = (message.text or "").split(maxsplit=1)
|
|
payload = parts[1].strip() if len(parts) > 1 else ""
|
|
if not payload.startswith("login_"):
|
|
await message.answer(system.MSG_START)
|
|
return
|
|
|
|
admin = await admins_repo.get_admin(message.from_user.id)
|
|
if admin is None or not admin["enabled"]:
|
|
await message.answer(system.MSG_LOGIN_DENIED)
|
|
return
|
|
|
|
if not await admin_login_tokens_repo.confirm_token(payload[6:], message.from_user.id):
|
|
await message.answer(system.MSG_LOGIN_INVALID)
|
|
return
|
|
|
|
settings = get_settings()
|
|
markup = None
|
|
if settings.admin_public_url.startswith(("http://", "https://")):
|
|
markup = InlineKeyboardMarkup(
|
|
inline_keyboard=[
|
|
[
|
|
InlineKeyboardButton(
|
|
text="Вернуться в админку",
|
|
url=settings.admin_public_url.rstrip("/") + "/login",
|
|
)
|
|
]
|
|
]
|
|
)
|
|
await message.answer(system.MSG_LOGIN_CONFIRMED, reply_markup=markup)
|