User Service — BR 1.4.2

Контракты: API, Data Model

Миграция БД (Liquibase)

  • Changeset: UPDATE employees SET role = 'admin_franchise' WHERE role = 'franchise'
  • Changeset: UPDATE employees SET role = 'admin_franchisee' WHERE role = 'franchisee'
  • Обновить CHECK constraint на employees.role (если существует): допустимые значения — admin_franchise, admin_franchisee, manager, cashier. Если констрейнт — ENUM/varchar — изменить соответственно.
  • Аналогично — поле role в salary_formulas (переименовать старые значения)

Создание сотрудника — валидация (POST /employees)

  • В CreateEmployeeRequest — разрешены только manager и cashier
  • Новый error code: ADMIN_ROLE_FORBIDDEN (HTTP 400) — “Admin roles cannot be created through this endpoint”
  • Попытка передать admin_franchise/admin_franchisee400 ADMIN_ROLE_FORBIDDEN

Создание ЮЛ Франчайзи с владельцем (POST /legal-entities)

  • Расширить CreateLegalEntityRequest: добавить nested блок owner { first_name, last_name, email, phone?, password? }
  • Убрать приём owner_user_id в request body (теперь заполняется системой)
  • При type=franchisee блок owner обязателен; если отсутствует или неполный → 400 OWNER_FIELDS_REQUIRED
  • При type=franchise — блок owner игнорируется (если передан)
  • Генерация временного пароля, если owner.password не указан (криптостойкий, 8–10 символов)
  • Транзакция: создать legal_entities → создать employees (role=admin_franchisee) → обновить legal_entities.owner_user_id
  • Проверка уникальности owner.email в рамках franchise_id до вставки → 409 OWNER_EMAIL_DUPLICATE
  • В response 201 добавить блок owner { id, email, temporary_password }:
    • temporary_password возвращается только если пароль был сгенерирован системой
    • Для type=franchiseowner: null

Soft delete / reactivate ЮЛ (BR 1.4.2)

  • При soft-delete ЮЛ Франчайзи — деактивировать владельца (employees.status = 'inactive')
  • При восстановлении ЮЛ — реактивировать владельца (status = 'active')

Строковые замены role-checks в коде

  • Grep по репозиторию: "franchise", "franchisee" в контексте сравнения роли
  • Заменить на "admin_franchise" / "admin_franchisee"
  • Обновить enum EmployeeRole (Java)
  • Обновить метод getRoleLevel / иерархию ролей (если есть)
  • Обновить @PreAuthorize / role guard’ы
  • Обновить логи и сообщения ошибок

Тесты

  • Unit-тесты валидации CreateEmployeeRequest (admin_* отвергается)
  • Integration-тест: POST /legal-entities (type=franchisee) создаёт ЮЛ + employee + связывает (1 transaction)
  • Integration-тест: откат транзакции при ошибке в любом шаге
  • Integration-тест: owner.password=null — возвращается temporary_password
  • Integration-тест: owner.password="custom123"temporary_password=null
  • Тест уникальности owner.emailOWNER_EMAIL_DUPLICATE

Связанные изменения

  • Auth Service: Auth Service — JWT с новыми значениями role