Перейти до вмісту

Зв'язка профіль ↔ Telegram-бот

ПолеЗначення
Статус📝 план (дизайн на гілці; prod-рейл зламаний наскрізно)
Поверхніweb + bot
Доступність
Власник@Vladbandurin
Останнє підтвердження2026-06-14 · код:main (живий частковий рейл) + гілка vladbandurin/vstuplisty-collections (дизайн)

Двонаправлено пов’язати веб-акаунт abitly.org (BaseUser) з користувачем Telegram-бота (TelegramUser), щоб ділити профіль/налаштування і запускати сегментовані розсилки за обраними спеціальностями. Переважно дизайн (ADR+spec на гілці PR #14); у prod рейл існує лише частково й наскрізно не працює.

Поточний стан (prod, за кодом)

Section titled “Поточний стан (prod, за кодом)”
  • Єдиний робочий шлях — bot→web через /auth/telegram-connect?telegramId=POST /telegram-user/connect-to-web-user/:telegramUserId (пряме UPDATE telegram_users.web_user_id, без токена / nonce / conditional-write).
  • Напрямок web→bot (link_<token>) мертвий end-to-end: бот чекає ключ abitly:link:<token> у власному sidecar-Redis (linking_service.py redeem()), а mint-ендпоінт не існує в жодному репо org (пошук abitly:link → порожньо) → redeem завжди отримує nil. Колонки users.telegramLinkToken* додані міграцією 1752329092462 і одразу DROPPED у 1752830665982 — токен-рейл покинуто.
  • UI «Підключити Telegram» у /profile — у CABINET_NAV_ITEMS немає; не підтверджено без браузера (TODO:).

Запланований дизайн (не в prod)

Section titled “Запланований дизайн (не в prod)”
  • Bidirectional, no shared Redis: web→bot — компактний binary-packed HMAC-токен (verify-local + durable telegram.link_nonce CAS); bot→web — Mini App initData → API conditional-UPSERT.
  • Single-writer на web_user_id (conditional UPDATE + link_version, 409 на конфлікт).
  • Подія link.established у Valkey-stream → abitly-marketing сідить channel_identity + consent (межа ADR-0002: marketing-схему пише лише marketing-сервіс).
  • Код Slices A–D не написано — гейт на Phase-0 schema discovery (реальні назви сутностей, чи offer несе speciality_id, живі mint/redeem + SSM-секрети, minors legal opinion).
СтанЕндпоінт / entityПризначення
prodPOST /telegram-user/connect-to-web-user/:idєдиний живий лінк (без перевірок)
prodentity telegram_users (web_user_id uuid UNIQUE FK→users.id)схема abitly (міграція 1752830665982)
prod, botservices/linking_service.py redeem()чекає abitly:link:<token> (mint відсутній)
дизайнPOST /telegram/link/start{deepLink} · /confirm{linked}|409 · DELETE /telegram/linkдвонаправлений рейл (не реалізовано)

Зв’язки з іншими фічами

Section titled “Зв’язки з іншими фічами”
  • bot-deeplinks — рядок link_<token> — саме цей зламаний рейл (chances_/open_day_ працюють, link_ — ні).
  • account-auth — bot→web напрямок через /auth/telegram-connect.
  • vstuplysty · chosen-specialties — джерело specialty-сигналів для сегментації (ADR-0011 дизайну).
  • marketing/blueprint — куди сідить link.established (consent ledger).
РепоШляхПримітка
abitly-api-v2src/api/telegram-user/telegram-user.controller.tsживий connect-to-web-user
abitly-tg-bot-v3services/linking_service.pyredeem() чекає неіснуючий mint
гілка vladbandurin/vstuplisty-collectionsADR-0010/0011 + spec + planповний дизайн (не в main)
  • ⚠️ Наскрізно не працює (web→bot): немає mint-ендпоінта; sidecar-Redis бота ≠ Redis API.
  • Єдиний живий лінк (connect-to-web-user) — без HMAC/nonce/conditional-write: ризик silent overwrite та link-hijack (дизайн ADR-0010 це закриває, поки лише на гілці).
  • ⚠️ Колізія номерів ADR: на гілці PR #14 ADR-0010=bidirectional-linking, ADR-0011=specialty-readmodel; у main ADR-0010=no-supabase, ADR-0011=vstup-knowledge-base. Перенумерувати на 0012/0013 перед мержем PR #14.
  • Дизайн гейтиться на Phase-0 schema discovery; код Slices A–D не написано.
ДатаПодіяДжерело
2026-06-06дизайн (ADR-0010/0011 + spec + plan)гілка vladbandurin/vstuplisty-collections (PR #14)
2026-06-14створено картку; зафіксовано зламаний prod-рейл + колізію ADRPR Wave 2