Контекст
Текущий модуль User перегружен инфраструктурными деталями (ORM-декораторы, специфичные для базы данных типы) и выполняет слишком много задач одновременно. Необходимо выделить «Чистую доменную модель» пользователя, которая будет содержать только бизнес-правила (например, правила смены имени, верификации профиля и управления статусами), изолировав её от методов доступа к данным.
Технические требования
- Локация логики:
src/modules/user/
- Инструменты: TypeScript, паттерны
Value Objects (для Email, FullName), Domain Events.
- Логика работы:
- Domain Entities: Определение корня агрегата
User. Поля сущности должны быть приватными, изменение состояния — только через публичные методы (например, updateProfile(), deactivate()).
- Value Objects: Вынос логики валидации формата email и сложных строковых полей в отдельные неизменяемые объекты.
- Application Services: Создание обработчиков команд (Command Handlers) для действий:
UpdateUserCommand, ChangeUserRoleCommand.
- Infrastructure: Реализация репозитория на базе Drizzle ORM/NestJS, который преобразует доменную сущность в схему БД и обратно.
Цель и критерии приемки (Definition of Done)
Важные указания
- Производительность: Избегать загрузки всего профиля пользователя (включая связанные таблицы), если для выполнения бизнес-операции достаточно только базовых полей агрегата.
- Ошибки: Выбрасывать
UserDomainException при попытке нарушения бизнес-правил (например, активация уже активного пользователя).
- Безопасность: Доменная модель не должна содержать методов, позволяющих массово изменять чувствительные поля без соответствующих проверок разрешений в слое Application.
Контекст
Текущий модуль
Userперегружен инфраструктурными деталями (ORM-декораторы, специфичные для базы данных типы) и выполняет слишком много задач одновременно. Необходимо выделить «Чистую доменную модель» пользователя, которая будет содержать только бизнес-правила (например, правила смены имени, верификации профиля и управления статусами), изолировав её от методов доступа к данным.Технические требования
src/modules/user/Value Objects(для Email, FullName),Domain Events.User. Поля сущности должны быть приватными, изменение состояния — только через публичные методы (например,updateProfile(),deactivate()).UpdateUserCommand,ChangeUserRoleCommand.Цель и критерии приемки (Definition of Done)
AggregateRootи сущностьUserбез зависимостей от внешних библиотек (кроме типов).UserStatusChanged.UserDomainModelиUserPersistenceModelв слое инфраструктуры.Важные указания
UserDomainExceptionпри попытке нарушения бизнес-правил (например, активация уже активного пользователя).