Flask API/admin backend, aiogram bot with delivery/pickup FSM flows, monobank payment integration, and a Vite/React Telegram Mini App for menu browsing and cart management. |
||
|---|---|---|
| bober_bbq | ||
| bot | ||
| docs | ||
| webapp | ||
| .env.example | ||
| .gitignore | ||
| README.md | ||
| requirements.txt | ||
| run_bot.py | ||
| run_web.py | ||
Bober BBQ — Telegram Bot + Mini App
Реалізація ТЗ на Telegram-бота та Web App для кафе/доставки Bober BBQ: меню, кошик (спільний для бота і Mini App), оформлення доставки/самовивозу, оплата monobank, сповіщення менеджера в Telegram, адмін-панель.
Структура проєкту
bober-bbq-bot/
├── bober_bbq/ # Flask backend: REST API + адмін-панель + БД-моделі
│ ├── api/ # /api/categories, /api/products, /api/cart, /api/settings, monobank webhook
│ ├── admin/ # Адмін-панель (Flask-Login + Jinja2)
│ ├── payments/ # Інтеграція monobank
│ ├── utils/ # Ціноутворення, графік роботи, auth Telegram WebApp, форматування замовлень
│ ├── templates/admin/ # HTML-шаблони адмінки
│ ├── static/ # CSS адмінки + завантажені фото товарів
│ ├── models.py # SQLAlchemy-моделі (users, categories, products, cart, orders, settings)
│ └── app.py # Flask app factory
├── bot/ # Telegram-бот (aiogram 3)
│ ├── handlers/ # /start, меню, кошик, доставка (FSM), самовивіз (FSM), оплата, контакти
│ ├── services/ # Кошик, замовлення, сповіщення менеджеру, оплата
│ ├── keyboards.py # Reply/inline клавіатури
│ └── main.py # Точка входу бота (long polling)
├── webapp/ # Telegram Mini App (Vite + React + TypeScript)
│ └── src/ # Меню, кошик, контакти
├── run_web.py # Продакшн-запуск Flask backend (waitress)
├── run_bot.py # Запуск бота
└── requirements.txt
Як це працює разом
- Кошик єдиний для бота і Web App: обидва читають/пишуть одну таблицю
cart_itemsу БД, прив'язану доtelegram_idкористувача (розділ 4 ТЗ). - Web App (кнопка «🍽 Меню») відповідає лише за перегляд меню та кошик.
Кнопки «Оформити доставку» / «Оформити самовивіз» у кошику Mini App
викликають
Telegram.WebApp.sendData(...)і закривають Web App — далі покроковий діалог (адреса, ім'я, телефон, оплата) веде вже сам бот, як і описано в розділах 5 та 7-10 ТЗ. - Бот і backend використовують одні й ті самі SQLAlchemy-моделі —
бот працює з БД напряму (через спільний Flask app-контекст), без зайвого
HTTP-стрибка. Web App ходить у backend через REST API з підписом
Telegram
initData(розділ 18.4 ТЗ — захист API). - monobank: створення інвойсу, кнопка оплати, перевірка статусу і вебхук
підтвердження оплати — розділ
bober_bbq/payments/monobank.py. БезMONOBANK_TOKENбот не падає, а пропонує оплату при отриманні і просить менеджера зв'язатися з клієнтом.
Швидкий старт (Windows)
- Встановіть залежності (Python 3.11+, Node 18+):
pip install -r requirements.txt
cd webapp && npm install && npm run build && cd ..
-
Скопіюйте
.env.example→.envі заповніть значення (токен бота, чати менеджера, WEBAPP_URL — публічний HTTPS-домен, бо Telegram Mini App вимагає HTTPS). -
Запустіть backend (API + адмінка + роздача зібраного Web App):
python run_web.py
Адмінка: http://localhost:8000/admin (логін/пароль — FLASK_ADMIN_USERNAME
/ FLASK_ADMIN_PASSWORD з .env, дефолт admin / значення з .env.example).
- Запустіть бота (окремий процес):
python run_bot.py
Перше ж підключення до БД автоматично створює таблиці й наповнює їх
демонстративними категоріями/товарами (bober_bbq/seed.py) — заміните
на реальне меню через адмінку.
Локальна розробка Web App окремо (гаряче перезавантаження)
cd webapp
npm run dev
Vite проксує /api/* на http://localhost:8000 (див. webapp/vite.config.ts).
Оскільки поза Telegram немає справжнього initData, API у режимі
debug=True приймає ?dev_user_id=<будь-яке число> як заглушку для
розробки — лише коли FLASK_DEBUG/app.debug увімкнено, у проді цей
обхід вимкнений.
Важливо перед продакшн-запуском
WEBAPP_URLіMONOBANK_WEBHOOK_URLмають бути реальними HTTPS-адресами (Telegram Mini App і monobank webhook не працюють по HTTP).- Додайте бота як адміністратора в чати/групи доставки та самовивозу,
вкажіть їх
chat_idв Налаштуваннях адмінки. - Детальніше —
docs/DEPLOYMENT.md. - Список пунктів, які треба узгодити із замовником до продакшену
(розділ 22 ТЗ) —
docs/OPEN_QUESTIONS.md.