sequenceDiagram
autonumber
actor App as APP (Мобильное приложение)
participant Nginx as Nginx Proxy
participant GW as GATEWAY (backend-api)
participant Auth as AUTH (auth-service)
participant DB as DB_AUTH (PostgreSQL)
App->>Nginx: Шаг 1: POST /api/v1/auth/register (email, password)
activate Nginx
Nginx->>GW: Шаг 2: POST /backend-api/v1/auth/register
activate GW
GW->>Auth: Шаг 3: gRPC: RegisterUser(RegisterRequest)
activate Auth
Auth->>DB: Шаг 4: SQL INSERT INTO users...
activate DB
DB-->>Auth: Шаг 5: Result: user_id
deactivate DB
note over Auth: Шаг 6: Внутренний метод<br/>GenerateTokenPair(user_id)
Auth->>DB: Шаг 7: SQL INSERT INTO user_sessions...
activate DB
DB-->>Auth: Подтверждение записи сессии
deactivate DB
Auth-->>GW: Шаг 8: gRPC: RegisterResponse
deactivate Auth
GW-->>App: Шаг 9: HTTP 201 Created (access, refresh)
deactivate GW
deactivate Nginx
note over App: Шаг 10: Внутренний метод<br/>SecureStorage.write(...)
Метод POST /api/v1/auth/register
Документация API: Регистрация пользователей с инициализацией Multi-Tenancy контуров HOME и OFFICE
- IAD-MIGRATION-116 Backlog — Краткое Описание задачи 1.
- IAD-MIGRATION-117 Refinement (Уточнение) — Краткое Описание задачи 2.
- GW-2 Ready for Development — Подключение эндпоинта в шлюзе.
- AID-012 Ready for Development — создать метож ProcessVoiceStream.
- AID-013 Ready for Development — создать метож ProcessUploadText.
- INV-FRONTEND-222 Refinement (Уточнение) — Экран управления B2B-интеграциями
- INV-FRONTEND-223 Refinement (Уточнение) — Экран управления B2B-интеграциями
1 Функциональное назначение
Метод предназначен для первичной регистрации пользователя в экосистеме.
Помимо стандартного создания учетной записи (хэширования паролей), данный метод решает фундаментальную задачу инициализации инфраструктуры хранения ресурсов:
- Динамическое ветвление пространств: На основе параметра
space_creation_modeметод либо генерирует абсолютно новый изолированный холодильник со своим уникальнымhome_group_id(для семьи или офиса), либо привязывает нового пользователя к уже существующей группе на основе переданного инвайт-кода (invite_token). - Первичная разметка бизнес-логики: Фиксирует для создаваемой группы флаг
account_type(HOMEилиOFFICE), который в дальнейшем определяет, разрешены ли скрытые виртуальные минусы при готовке и утилизации, или система должна работать в режиме строгого складского контроля.
2 Протокол взаимодействия (HTTP Контракт)
- Метод:
POST - Маршрут:
/api/v1/auth/register - Формат данных:
application/json
2.1 Спецификация заголовков (HTTP Headers)
| Заголовок | Обязательный | Описание | Пример значения |
|---|---|---|---|
Content-Type |
Да | Указывает на передачу строго типизированного JSON-пакета | application/json |
X-Request-ID |
Да | Сквозной ID запроса для трассировки создания новой учетной записи | req-auth-reg-001a |
2.2 Спецификация тела запроса (Request Body)
| Поле | Тип | Обязательный | Описание | Пример значения |
|---|---|---|---|---|
email |
String | Да | Уникальный адрес электронной почты (валидируется регулярным выражением) | user@somedomain.kz |
password |
String | Да | Пароль пользователя (строго не менее 8 символов) | SecretSecurePassword123 |
space_creation_mode |
String (Enum) | Да | Режим инициализации складского пространства | "CREATE_NEW_OFFICE" |
invite_token |
String | Нет | UUID инвайт-кода для вступления в уже созданную семью/офис | null (или UUID) |
2.2.1 Допустимые константы space_creation_mode (Enum):
CREATE_NEW_HOME— создать новую семью (разрешены виртуальные минусы).CREATE_NEW_OFFICE— создать новый офис (строгий контроль остатков, блокировка дефицита).JOIN_EXISTING— вступить в готовую группу по инвайт-коду из поляinvite_token.
2.2.2 Пример сырого JSON-запроса (Payload — Сценарий: регистрация компании с созданием нового офисного пространства):
{
"email": "user@somedomain.kz",
"password": "SecretSecurePassword123",
"space_creation_mode": "CREATE_NEW_OFFICE",
"invite_token": null
}3 Схема обработки запроса пользователя (Mermaid)
На диаграмме представлена логика регистрации. Сервис Auth открывает атомарную транзакцию, создаёт запись в таблице пользователей, генерирует уникальный home_group_id для нового пространства (или связывает пользователя с существующим по инвайт-коду) и надёжно хэширует пароль.
4 Расшифровка шагов
| Шаг | Действие | Параметры | Ошибки (Исключения / Статусы) |
|---|---|---|---|
Шаг 1 (APP -> NGINX) |
Сетевой слой мобильного приложения отправляет запрос на создание учетной записи. | HTTP POST /api/v1/auth/registerBody: {"email": "...", "password": "..."} |
DioException: connection timeoutHTTP 502 Bad Gateway |
Шаг 2 (NGINX -> GATEWAY) |
Шлюз Nginx Proxy маршрутизирует запрос во внутренний периметр. |
HTTP POST /backend-api/v1/auth/register |
HTTP 413 Payload Too Large |
Шаг 3 (GATEWAY -> AUTH) |
backend-api (Gateway) валидирует Pydantic-контракт и инициирует внутренний gRPC-метод создания пользователя. |
gRPC: RegisterUser(RegisterRequest) |
HTTP 422 Unprocessable EntitygRPC: INVALID_ARGUMENT |
Шаг 4 (AUTH -> DB_AUTH) |
Микросервис auth-service выполняет атомарную попытку записи нового пользователя в базу данных. |
SQL INSERT INTO users (email, password_hash) VALUES ($1, $2) |
PostgreSQL: users_email_key violationgRPC: ALREADY_EXISTS \(\rightarrow\) HTTP 409 Conflict |
Шаг 5 (DB_AUTH -> AUTH) |
СУБД подтверждает успешное создание записи и возвращает сгенерированный системный ID пользователя. | Result: user_id |
PostgreSQL: connection pool timeout |
Шаг 6 (AUTH -> AUTH) |
Внутреннее действие: Сервис запускает метод генерации токенов для автоматического входа после регистрации. | Вызов: GenerateTokenPair(user_id) |
JWT: SignatureGenerationError |
Шаг 7 (AUTH -> DB_AUTH) |
Сервис регистрирует стартовую долгоживущую сессию в базе данных. | SQL INSERT INTO user_sessions ... |
PostgreSQL: unique_violation |
Шаг 8 (AUTH -> GATEWAY) |
auth-service возвращает сформированный gRPC-ответ с парой токенов на шлюз. |
gRPC: RegisterResponse |
gRPC: INTERNAL |
Шаг 9 (GATEWAY -> APP) |
API Gateway оборачивает данные в REST-контракт и отдает их клиенту через Nginx. | HTTP 201 CreatedBody: {"access_token": "...", "refresh_token": "..."} |
HTTP 500 Internal Server Error |
Шаг 10 (APP -> APP) |
Сетевой перехватчик приложения изолированно записывает полученные ключи в secure storage. | Вызов: SecureStorage.write(...) |
SecureStorageException |
5 Спецификация ответов сервера (Response Body) и ошибок
5.1 Успешный ответ (Success Response)
5.1.1 HTTP 201 Created (Ответ на Шаге 12)
Возвращается мобильному приложению после успешного коммита транзакции. В теле ответа фиксируется сгенерированный идентификатор пользователя и параметры Multi-Tenancy контура.
- Заголовки ответа (Response Headers):
Content-Type: application/json
- Тело ответа (Response Body):
{
"status": "success",
"data": {
"user_id": "usr-8822-fa41",
"home_group_id": "8a71d11e-9500-4b11-9a2c-d2b0d7b3dcba",
"account_type": "OFFICE",
"timestamp": "2026-07-02T02:15:00Z"
}
}5.2 Вилки исключений и обработка ошибок
5.2.1 Ошибка коллизии: Email уже зарегистрирован (HTTP 409 Conflict — Шаг 5)
Выбрасывается на Шаге 5, если проверка в базе данных выявила, что указанный адрес электронной почты уже занят другой учетной записью. Это предотвращает дублирование профилей в СУБД.
- Заголовки ответа (Response Headers):
Content-Type: application/json
- Тело ответа (Response Body):
{
"error_code": "ERR-EMAIL-ALREADY-EXISTS",
"message": "Пользователь с таким email-адресом уже зарегистрирован в системе.",
"details": {
"rejected_email": "manager@bupar-office.kz",
"action": "Redirect user to login screen or trigger password recovery flow."
}
}5.2.2 Ошибка: Невалидный или просроченный инвайт-код (HTTP 410 Gone / 404 Not Found — Шаг 6)
Выбрасывается на Шаге 6 в режиме JOIN_EXISTING, если переданный invite_token отсутствует в таблице инвайтов, аннулирован создателем пространства или истек по времени жизни.
{
"error_code": "ERR-INVITE-TOKEN-INVALID",
"message": "Указанный пригласительный код недействителен, просрочен или аннулирован.",
"details": {
"provided_token": "9b1deb4d-3b7d-4bad-9bdd-2b0d7b3dcb6d",
"action": "Prompt user to request a fresh invite token from the space administrator."
}
}