BR 1.4 → User Service

Репозиторий: erp-user-service Контракты: API, Data Model

Задачи

Инфраструктура

  • Liquibase миграция: таблица employees (id, franchise_id, first_name, last_name, email, password_hash, phone, pin_hash, role, status, is_courier, created_at, updated_at)
  • Liquibase миграция: таблица employee_stores (employee_id, store_id)
  • Liquibase миграция: seed admin employee (email: admin@erp.local, password: admin123, role: franchise)
  • Entity Employee + EmployeeStore (JPA)
  • Repository EmployeeRepository

Бизнес-логика

  • Password bcrypt (cost 12)
  • PIN bcrypt + uniqueness per store validation
  • Role-based access: franchise all, franchisee own stores, manager own store view-only
  • Franchisee cannot create franchise/franchisee roles (ROLE_ESCALATION)
  • Role immutable on update (ROLE_IMMUTABLE)
  • Store validation via Store Service client (existing)

Эндпоинты

  • GET /api/v1/employees — список (пагинация, search, фильтры role/store/status, сортировка)
  • GET /api/v1/employees/{id} — детали (включая список ТТ)
  • POST /api/v1/employees — создание (валидация email/PIN, ролевые ограничения)
  • PATCH /api/v1/employees/{id} — обновление (role immutable, password optional)
  • POST /api/v1/employees/{id}/deactivate — деактивация (завершение сессий)
  • POST /api/v1/employees/{id}/reactivate — реактивация
  • POST /internal/users/validate-credentials — валидация email + bcrypt-пароль, возврат данных для JWT
  • GET /internal/users/by-email — получение сотрудника по email
  • POST /internal/users/validate-pin — валидация PIN для POS-авторизации

Docker

  • Update docker-compose.yml

JWT валидируется локально (HS256 + shared secret). Auth Service отложен.