§01
Обзор
- Что это: Мультиязычный (ru/uz/en) Telegram-бот для e-commerce ресторанной сети. Пользователь оформляет заказ (доставка или самовывоз), выбирает филиал, проходит OTP-авторизацию, смотрит свои заказы, получает штрихкод кэшбэка, оставляет отзывы. Бот — это фронтенд к внешнему Laravel API (
api.restaurant-chain.uz); он не хранит каталог сам, а проксирует и оркестрирует запросы. - Тип / статус / роль: bot / maintained / contributor (репозиторий принадлежит
ShahzodSalimsakov; пользователь — один из 2–3 основных разработчиков, ~50% коммитов). - Активный период: первый коммит 2021-12-08, последний 2026-05-18. Долгоживущая рабочая лошадка: правки приходят волнами под бизнес-изменения (стоимость доставки, типы оплаты, включение/отключение кэшбэка).
§02
Стек
- Языки: JavaScript (Node.js, CommonJS). TypeScript только в devDependencies — по сути не используется (исходники —
.js). - Фреймворки/библиотеки: Telegraf 4 (Scenes / WizardScene + Composer как машина состояний диалога), telegraf-i18n (ru/uz/en), Fastify 3 + fastify-telegraf (webhook), Bull 4 + @bull-board (очереди и админ-UI), ioredis, luxon (даты/таймзоны), hashids (обфускация tg_id), bwip-js / barcode (генерация штрихкодов), axios, lodash.
- Инфра/деплой: PM2 (
pm2.config.js, приложениеles_bot), webhookhttps://newbot.restaurant-chain.uz, Sentry (@sentry/node), сервер Contabo (vmi849112.contaboserver.net/choparpizza.uz). Dev — polling + локальная сессия. - Данные: MongoDB (telegraf-session-mongodb для сессий, коллекция
event_systemsдля трекинга отправленных сообщений), Redis (Bull-очередь рассылок + pub/sub). - Заметный тулинг: agenda (планировщик, отключён в коде), node-cron / sfn-scheduler / cron-converter (частично закомментированы — следы итераций над планированием рассылок).
§03
Что реализовано
Commit-месседжи пользователя в основном мусорные («asd», «asdf», «dsds», «sdsd»), поэтому вехи восстановлены по диффам и коду, а не по тексту коммитов.
- Флоу заказа (доставка/самовывоз) —
controllers/startOrder: WizardScene со шагами адрес → дом → подъезд, геокодинг через API, поиск ближайшего терминала, выбор филиала. - Расчёт часов работы филиала —
startOrder/index.js(luxon), включая ночные смены и логику будни/выходные. - Меню и корзина —
controllers/menu/index.js(~79 КБ, ядро бота): пагинация категорий, корзина, OTP-авторизация, минимальная сумма заказа. - Кэшбэк со штрихкодом —
controllers/cashback: генерация code128 (bwip-js) из номера телефона, PNG отправляется в чат. - Массовые рассылки —
bot.js+util/queue.js: Bull-очередь с повторяемыми cron-джобами, репортинг прогресса обратно в Laravel API, отмена активных джоб через Redis pub/sub. - Бизнес-обновления: цены/веса доставки (
d653fcd,f3d5a1b,02eef03), типы оплаты (85824d1,4d1d9f5 removed payment type uzcard,03fbbb5 turn off payment links), включение/отключение кэшбэка (1373664 cashback disabled,232b9b9), языки/локали. - Последняя веха (`b4f848f`, 2026-05-18): чистый рефакторинг — рантайм-фетч
/api/configs/public(с base64-декодом) заменён на статическийutil/config.jsиз env. Единственный коммит с человекочитаемым описанием и Co-Authored-By: Claude Opus 4.7. - Объём: 257 коммитов всего, 129 от пользователя (Davron Yuldashev
yul.davron.93@gmail.com, алиасы Davron/Davr/Dave93), за ~4.5 года. Со-авторы:shahaa(Shahzod Salimsakov, владелец, 89 коммитов),root(деплой).
§04
Технические челленджи
- Кастомная Bull-очередь с межпроцессной отменой джоб (
util/queue.js):ExtendedQueue extends Queue+ExtendedJob, трекинг промисов активных джоб, отмена через Redis pub/sub (getInternalEventEmitter) с прямой ссылкой на GitHub-issue Bull (#1056/#1067) как обоснование обхода ограничения sandboxed-процессов. → Демонстрирует понимание распределённой обработки задач и инфраструктурных воркэраундов на уровне очереди. Самый нетривиальный кусок кода в репозитории. - Рассылка с репортингом backpressure (
bot.jssendQueue.process): последовательная доставка по спискуtg_id, проверка состояния джобы на каждом шаге (отмена на лету), POST прогресса в API каждые 50 сообщений, удаление отправленных сообщений по событиюremovedчерез коллекциюevent_systems. → Реальная работа с rate limit'ами Telegram и состоянием рассылки. - Логика часов работы филиала через полночь (
startOrder/index.js:169–234, luxon): текущее время сравнивается с открытием/закрытием, коррекция дня приclose.hour < open.hour(ночные смены), отдельные ветки для будней/выходных. → Аккуратная обработка граничных случаев дат/таймзон (Asia/Tashkent). - OTP-авторизация (
menu/index.js): hashids-кодированиеtg_id, сборка bearer-токена (base64 OTP_TOKEN + случайная соль → hex), повторная отправка кода. → Кастомная схема подписи для запросов к бэкенду. - Рефакторинг `b4f848f` (
util/config.js):parsePositiveInt, сохраняющий историческое поведение (fallback 0 при NaN, явно закомментировано). → Редкий пример чистого, осознанного кода в проекте.
§05
AI-разработка
- Найдено сессий: 0 (нет локальной директории сессий Claude Code для этого проекта).
- Что делалось с AI: косвенный след — последний коммит
b4f848fпомеченCo-Authored-By: Claude Opus 4.7 (1M context). Это единственный чистый, задокументированный коммит в репозитории (рефакторинг конфига), что контрастирует с остальной историей и указывает на разовое использование AI для чистки легаси-кода. - Паттерны AI-воркфлоу: данных недостаточно для выводов (одна точка данных).
- Полноценных сессий Claude Code для этого проекта нет.
§06
Достижения и метрики
- Реальный продакшн-продукт: бот для действующей сети доставки еды (
newbot.restaurant-chain.uz), 3 языка интерфейса, интеграция с Laravel API, MongoDB, Redis, Sentry, PM2. - 129 коммитов пользователя за ~4.5 года поддержки (2021–2026) — долгоживущий продукт, а не прототип.
- Функциональность: заказ с доставкой/самовывозом, геокодинг, поиск ближайшего терминала, OTP-авторизация, штрихкод кэшбэка, отзывы, запланированные массовые рассылки с прогрессом.
- Точных бизнес-метрик (DAU, число заказов) в коде нет.