Перейти до контенту

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