Як влаштовано цей MVP
Це робочий стенд, а не макет: під ним база даних, ролі, події та живі оновлення. Дані вигадані й скидаються кожні 6 годин.
Три події замість лічильника
Кожен перехід, реєстрація і рекомендація — окремий рядок у таблиці подій: тип, чий код спрацював, хто зареєструвався, джерело, дата. Статистика в кабінетах і адмінці рахується запитами з цих рядків, тож її неможливо «підкрутити», не зіпсувавши самі події. Це ж дає масштабування: нові звіти — нові запити, а не переробка системи.
Ролі та права
Учасник, партнер, адміністратор. Права перевіряються на кожен запит; блокування діє миттєво: заблокований користувач вилітає з кабінету наступним же кліком, реферальне посилання призупиненого партнера чесно каже «посилання неактивне» і не пише подій.
Живі цифри
Кабінети підписані на потік подій (SSE): відкрийте реферальне посилання в сусідній вкладці — лічильник і лог оновляться без перезавантаження.
Стек демо і бойової версії
Демо: Node.js (Fastify), Prisma ORM, SQLite, серверний рендер без фреймворків. Бойова версія за цією ж схемою: PostgreSQL замість SQLite (одна зміна в конфігурації Prisma — моделі й міграції ті самі), NestJS, Next.js, Docker. Міграції лежать у репозиторії, тож інший розробник продовжить без переписування.
Що ще тут є
- реєстрація з прив'язкою до реферального коду (кука на 7 днів);
- маскування пошти чужим кабінетам — партнер бачить факт, не персональні дані;
- захист від накрутки: повторний перехід з тієї ж сесії за годину не пишеться;
- адаптив від 360px, нуль зовнішніх скриптів, свій CSS.