NRC Запоріжжя — платформа курсів
Людина без браузера отримує той самий доступ до курсів, що й на сайті — і жодного другого джерела правди
Виклик
Освітній центр мав сайт із курсами й окремо спілкувався з людьми в месенджері. Розклад в одному місці, заявки в іншому, нагадування — вручну. Класична ситуація, коли дві системи розходяться в різні боки, і ніхто не знає, яка з них права.
Рішення
Курси, заявки, черга очікування, нагадування й новини описані в одній базі. Публічний сайт, адмінка та Telegram-бот читають ті самі рядки. Бот не дублює меню сайту — він веде людину діалогом і підбирає курс, який їй підходить, після чого заявка лягає в ту саму таблицю, що й заявка з вебу.
- ✓ Реєстрація на курс повністю в Telegram, без браузера
- ✓ Черга очікування й офери звільнених місць — фонові задачі на BullMQ
- ✓ Двомовний контент як дані: у кожної сутності власна таблиця перекладів
- ✓ Окремий фронт на three.js із GSAP — інтерактивна сцена, а не декоративне полотно
- ✓ Рольовий доступ в адмінці на JWT
Архітектура
- pnpm-монорепо: web, admin, api, bot, experience
- NestJS + Prisma + PostgreSQL
- Redis і BullMQ для нагадувань та оферів
- Sharp для обробки зображень, Zod на межах
- Docker Compose під dev, dev-server і prod
Чому так
Коли бот і сайт мають окремі бази, розбіжність — питання часу, а не ймовірності. Тут вони фізично не можуть розійтися: це один рядок у одній таблиці, показаний двома способами.
Стек
TypeScript · NestJS · Prisma · PostgreSQL · Redis · BullMQ · Next.js · React · three.js · GSAP · grammY · Docker · i18next