Профиль — агрегат, представляющий публичные и контактные данные пользователя.
| Свойства/Действия | Тип | Комментарий |
|---|---|---|
| Id | UUID | Агрегатный ключ. Назначается один раз и неизменяем. |
| User Id | UUID | Ссылка на пользователя из User Management. Инварианты: 1:1 (ровно один Profile на один User Id), обязателен, уникальный индекс по User Id. |
| First Name | Profile Name <Value Object> | Обязателен. 2–100 символов, буквы и пробелы; trim; нормализация по локали. |
| Middle Name | Profile Name <Value Object> | Необязателен. Если задан — те же правила валидации, что и для имени. |
| Last Name | Profile Name <Value Object> | Обязателен. 2–100 символов, буквы и пробелы; trim; нормализация по локали. |
| Phone | Phone Number <Value Object> | Необязателен. Value должен быть валидным номером в формате E.164. Хранить в каноническом виде. |
| string | Необязателен. Требуется подтверждение для каналов уведомлений. | |
| Language | Enum | Обязателен. Разрешённые значения: поддерживаемые локали (например, ru-RU, en-US). Смена локали не должна нарушать форматирование данных профиля. |
| Time zone | Enum (IANA) | Обязателен. Только валидные IANA идентификаторы (например, Europe/Moscow). Используется для расписаний и «тихих часов». |
| Avatar | url | Необязателен. Допустимые форматы и максимальный размер — согласно политике хранения медиа. |
| Status | Status | Состояния: Active, Suspended, Deactivated. При Deactivated — запрещены изменения, кроме реактивации; уведомления не отправляются. |
| createdAt / updatedAt / updatedBy | datetime / datetime / UUID | Заполняются системой. updatedBy — инициатор последнего изменения. |
| version | number | Оптимистическая блокировка. Увеличивается при каждой успешной транзакции изменения агрегата. |
| Поведения | methods | create(userId, defaults); changeName(...); changePhone(...); setLocale(...); setTimeZone(...); updateNotificationPreferences(...); deactivate(). Каждое поведение валидирует инварианты и порождает доменное событие. |
| Доменные события | events | ProfileCreated, ProfileNameChanged, PhoneChanged, LocaleChanged, TimeZoneChanged, ContactPreferencesChanged, ProfileDeactivated. Служат для интеграций (например, Social media). |
| Property | Comment |
|---|---|
| value | 2–100 символов, буквы и пробелы; trim; сравнение без лишних пробелов, с учётом правил локали |
| Property | Comment |
|---|---|
| value | Обязателен. Должен быть валидным номером в формате E.164, хранится в каноническом виде. |
<aside> 🛡️
Перед правками создана резервная копия: Aggregate Profile — backup 2025-11-09 19:06 MSK.
</aside>