# ProfilesService ## Назначение Сервис управляет пользователями платформы: созданием, поиском, изменением контактных данных (телефон/email), базовыми профайлами (имя, фото, дата рождения) и их доступами. Контроль доступа - по данным текущей сессии (NBSession). Сервис предоставляет единый источник истины по пользовательским записям для остальных доменов. ## Публичные методы * `GetMyUserAsync(): User` - получить текущего пользователя по сессии; при отсутствии - исключение. ### Чтение пользователей * `GetUserAsync(userId): User` - получить пользователя по Id (исключение, если не найден). * `GetUsersAsync(userIds[]): User[]` - получить список пользователей по Id. * `GetUserOrNullAsync(userId): User?` - получить пользователя или `null`, если не найден. ### Поиск * `GetUserOrNullByPhoneAsync(phone): User?` - найти пользователя по номеру телефона. * `SearchUsersAsync(dataParted): User[]` - поиск по части имени или телефона. * `SearchUsersByAccessesAsync(include[], exclude[], includeWithNoAccess): User[]` - фильтрация по доступам (с опцией включать бездоступных). * `GetUsersWithAccessesAsync(): User[]` - выборка всех пользователей с какими-либо доступами. ### Создание и удаление * `CreateUserByPhoneAsync(phone): User` - создать пользователя по номеру телефона. * `DeleteUserAsync(userId): void` - пометить пользователя как удалённого. ### Редактирование профиля * `SetUserData(user: UserData): User` - обновить данные профиля (имя, фото, дата рождения). * `ChangeUserPhoneAsync(userId, phone): User` - изменить телефон. * `ChangeUserEmailAsync(userId, email): User` - изменить email. ### Управление доступами * `SetUserAccess(userId, access): void` - добавить доступ. * `UnsetUserAccess(userId, accessType): void` - удалить доступ. * `SetUserAllAccesses(userId, accesses[]): void` - заменить полный набор доступов. ## Взаимодействие с другими сервисами ProfilesService не является инициатором взаимодействий с другими сервисами. Другие сервисы (как и пользователи), у которых есть соответвующие права доступа могут вызывать любые методы. Справочно: AuthService может создавать пользователя, получать данные пользователя, менять номер телефона. ## Модели ### User ``` long Id //Идентификатор, ключевое поле DateTimeOffset Created //Когда создан bool IsDeleted //Флаг удаления string Name //Имя пользователя string PhotoFile //Наименование файла иконки DateTimeOffset? BirthDay //Дата рождения Authenticator[] Auths //Набор аутентификаторов (телефон, емайл), более подробнее см. код Access[] Accesses //Набор доступов ([доступ](/common/accessTypeEnum.md) и на сколько выдан) ``` ### UserData Лёгкая DTO для обновления основных полей пользователя: `Id`, `Name`, `PhotoFile`, `BirthDay`. Содержит фабрику `FromUser(User user)` для удобного маппинга из полной модели. Используется в API `SetUserData(UserData user)`. ``` long Id //Идентификатор, ключевое поле string Name //Имя пользователя string PhotoFile //Наименование файла иконки DateTimeOffset? BirthDay //Дата рождения ``` --- # Поведение и инварианты * **Единый источник истины:** все изменения профиля выполняются через ProfilesService; другие сервисы не модифицируют `User` напрямую. * **Idempotency при регистрации по телефону:** вызов пары `GetUserOrNullByPhoneAsync` → `CreateUserByPhoneAsync`, как в AuthService, гарантирует отсутствие дублей по номеру. * **Мягкое удаление:** `DeleteUserAsync` помечает пользователя как удалённого (`IsDeleted = true` в модели), что позволяет сохранять историю операций и ссылочную целостность. (Поле `IsDeleted` есть в `User`.) * **Актуальность контактов:** `ChangeUserPhoneAsync`/`ChangeUserEmailAsync` обновляют каналы аутентификации и связи, чтобы `GetPhone()`/`GetEmail()` возвращали корректные данные. ## DB Содержит таблицы и индексы ``` -- Migration 1 users ( Id INTEGER PRIMARY KEY AUTOINCREMENT, Created NUMBER NOT NULL, IsDeleted BOOLEAN NOT NULL DEFAULT FALSE, Name TEXT NOT NULL, PhotoFile TEXT NOT NULL, BirthDay NUMBER DEFAULT NULL, Auths TEXT NOT NULL, Accesses TEXT NOT NULL ) ``` [Назад](/index.md)