feat: design for emails

This commit is contained in:
3252a8
2026-04-27 23:05:14 +03:00
parent ae4ce43e1c
commit a00bc0f345
8 changed files with 735 additions and 62 deletions
+25 -45
View File
@@ -29,6 +29,7 @@ from bot.app.web.webapp_auth import (
)
from bot.services.crypto_pay_service import CryptoPayService
from bot.services.email_auth_service import EmailAuthService, normalize_email
from bot.services.email_templates import render_account_merged
from bot.services.freekassa_service import FreeKassaService
from bot.services.platega_service import PlategaService
from bot.services.promo_code_service import PromoCodeService
@@ -1019,15 +1020,21 @@ async def account_email_verify_route(request: web.Request) -> web.Response:
email_service: EmailAuthService = request.app.get("email_auth_service")
if email_service and final_email:
email_payload = _build_account_merge_email(
merge_notice.get("language") or settings.DEFAULT_LANGUAGE,
merge_notice,
email_content = render_account_merged(
settings,
language_code=merge_notice.get("language") or settings.DEFAULT_LANGUAGE,
primary_user_id=merge_notice.get("primary_user_id"),
removed_user_id=merge_notice.get("removed_user_id"),
final_end_date_text=str(
merge_notice.get("final_end_date_text")
or merge_notice.get("final_end_date")
or ""
),
)
try:
await email_service.send_custom_email(
await email_service.send_rendered_email(
email=final_email,
subject=email_payload["subject"],
body=email_payload["body"],
content=email_content,
)
except Exception as exc:
logger.warning(
@@ -1143,15 +1150,21 @@ async def account_telegram_link_route(request: web.Request) -> web.Response:
email_service: EmailAuthService = request.app.get("email_auth_service")
if email_service and final_email:
email_payload = _build_account_merge_email(
merge_notice.get("language") or settings.DEFAULT_LANGUAGE,
merge_notice,
email_content = render_account_merged(
settings,
language_code=merge_notice.get("language") or settings.DEFAULT_LANGUAGE,
primary_user_id=merge_notice.get("primary_user_id"),
removed_user_id=merge_notice.get("removed_user_id"),
final_end_date_text=str(
merge_notice.get("final_end_date_text")
or merge_notice.get("final_end_date")
or ""
),
)
try:
await email_service.send_custom_email(
await email_service.send_rendered_email(
email=final_email,
subject=email_payload["subject"],
body=email_payload["body"],
content=email_content,
)
except Exception as exc:
logger.warning(
@@ -1575,39 +1588,6 @@ async def _build_account_merge_notice(
}
def _build_account_merge_email(language: str, merge_info: Dict[str, Any]) -> Dict[str, str]:
lang = _normalize_language(language)
primary_user_id = merge_info.get("primary_user_id")
removed_user_id = merge_info.get("removed_user_id")
final_end_date_text = (
merge_info.get("final_end_date_text")
or merge_info.get("final_end_date")
or "N/A"
)
if lang == "en":
return {
"subject": "Accounts merged",
"body": (
"We merged your accounts into one profile.\n\n"
f"Kept account: #{primary_user_id}\n"
f"Removed account: #{removed_user_id}\n"
f"Paid periods were combined. New subscription end date: {final_end_date_text}.\n"
"Your subscription link stayed the same, and the later account was removed from Remnawave automatically."
),
}
return {
"subject": "Аккаунты объединены",
"body": (
"Мы объединили ваши аккаунты в один профиль.\n\n"
f"Оставлен аккаунт: #{primary_user_id}\n"
f"Удалён аккаунт: #{removed_user_id}\n"
f"Оплаченные периоды сложились. Новая дата окончания подписки: {final_end_date_text}.\n"
"Ссылка на подписку осталась прежней, а более поздний аккаунт был удалён из Remnawave автоматически."
),
}
def _telegram_photo_url_value(telegram_user: Dict[str, Any]) -> Optional[str]:
raw_value = telegram_user.get("photo_url")
if not raw_value: