План: Мультифилиальность и роли пользователей
Проблема
Сейчас приложение однофилиальное и одно-user-овое. Нужно поддержать:
- 5-20 филиалов
- Несколько тьюторов/админов
- Филиал студента определяется автоматически через его группу
1. База данных — схема
Новые таблицы
Изменения в существующих таблицах
| Таблица |
Новое поле |
Тип |
Связь |
groups |
branch_id |
INT |
REFERENCES branches(id) |
students |
branch_id |
INT |
REFERENCES branches(id) |
entries |
branch_id |
INT |
REFERENCES branches(id) |
group_photos |
branch_id |
INT |
REFERENCES branches(id) |
Логика определения филиала
- Студент → в группе → группа привязана к филиалу → филиал определён
- При отправке записи
branch_id берётся из группы студента
- Студенту не нужно выбирать филиал — он определяется автоматически
2. Аутентификация
- Вход по имени + пароль (без email)
- Пароли хранятся в
bcrypt хеше
- Токен (JWT) выдаётся при логине, хранится в
sessionStorage
requireAdmin заменяется на requireAuth + проверку роли
3. Роли
| Роль |
Возможности |
| admin |
Всё: управление пользователями, филиалами, настройками, бэкапами + все данные |
| tutor |
Управление записями, группами, студентами, файлами, ссылками — видит все группы |
4. Публичная форма
- Ссылка на форму одна (как сейчас)
- Студент вводит имя → система находит студента → определяет группу → определяет филиал
- Если студент новый (нет в базе) — варианты на обсуждение:
- Не пускать (только зарегистрированные студенты)
- Автоматически создать в группе "Не распределён"
5. Фронтенд — изменения
Страница логина
- Поле "Имя" + "Пароль" вместо одного пароля
Админ-панель
- В хедере/сайдбаре выпадающий список филиалов для фильтрации
- Группы — отображение филиала у каждой группы
- Студенты — отображение филиала у каждого студента
- Журнал — фильтр по филиалу
- Настройки — управление пользователями и филиалами (только для admin)
6. API — новые эндпоинты
| Метод |
Путь |
Описание |
POST |
/api/auth/login |
Вход (имя + пароль → токен) |
GET |
/api/branches |
Список филиалов |
POST |
/api/branches |
Создать филиал (admin) |
DELETE |
/api/branches/:id |
Удалить филиал (admin) |
GET |
/api/users |
Список пользователей (admin) |
POST |
/api/users |
Создать пользователя (admin) |
DELETE |
/api/users/:id |
Удалить пользователя (admin) |
7. Миграция данных
- Существующие группы/студенты/записи автоматически попадут в филиал "Основной" (или первый созданный)
ADMIN_PASSWORD из .env конвертируется в запись users с ролью admin
8. Структура файлов (рефакторинг)
Порядок реализации
- Миграция БД — создать таблицы
branches, users, добавить branch_id к существующим
- Миграция данных — создать филиал "Основной", перенести существующие данные
- Бэкенд: аутентификация —
auth.js (логин, JWT, middleware)
- Бэкенд: CRUD филиалов и пользователей — новые роуты
- Бэкенд: branch scoping — добавить
branch_id ко всем существующим запросам
- Фронтенд: логин — новая страница логина
- Фронтенд: admin panel — добавить фильтр филиалов, страницы управления
- Тестирование — проверить все сценарии