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: GET /api/v1/auth/error-directory (Headers: X-App-Version, app_lang)
activate Nginx
Nginx->>GW: Шаг 2: GET /backend-api/v1/auth/error-directory
activate GW
GW->>Auth: Шаг 3: gRPC: GetErrorDirectory(DirectoryRequest)
activate Auth
Auth->>DB: Шаг 4: SQL SELECT * FROM error_directory WHERE is_active = true
activate DB
DB-->>Auth: Шаг 5: Возврат реестра кодов и локализованных текстов
deactivate DB
Auth-->>GW: Шаг 6: gRPC: DirectoryResponse (Полный реестр)
deactivate Auth
GW-->>Nginx: Шаг 7: HTTP 200 OK (Трансляция справочника в JSON)
deactivate GW
Nginx-->>App: Шаг 8: Доставка JSON-реестра в приложение
deactivate Nginx
note over App: Шаг 9: Внутренний метод<br/>Парсинг и динамический маппинг токенов ошибок<br/>в локальный стейт-менеджер (без апдейта из App Store)
Метод GET /api/v1/auth/error-directory
Документация API: Аутентификация пользователя (Login) с генерацией JWT, содержащего Multi-Tenancy клеймы
- 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 Функциональное назначение
Метод предназначен для синхронизации и динамического обновления системного справочника ошибок на мобильном клиенте.
В рамках новой архитектуры этот метод выполняет роль поставщика локализации и каноничных кодов (Error Context Provider):
- Извлечение реестра исключений: Вычитывает из СУБД активные связки низкоуровневых ошибок (СУБД, gRPC), каноничных кодов симулятора и их локализованных описаний.
- Обеспечение независимости интерфейса (Zero-Update Client): Позволяет мобильному приложению мгновенно узнавать о новых типах ошибок ИИ-модулей и бизнес-правил бэкенда без необходимости повторной публикации сборки в App Store или Google Play. Локальный стейт-менеджер налету подменяет системные алерты на основе актуального JSON-реестра.
2 Протокол взаимодействия (HTTP Контракт)
- Метод:
GET - Маршрут:
/api/v1/auth/error-directory - Формат данных:
application/json
2.1 Спецификация заголовков (HTTP Headers)
| Заголовок | Обязательный | Описание | Пример значения |
|---|---|---|---|
X-App-Version |
Да | Текущая версия сборки мобильного приложения для фильтрации совместимых кодов | 1.4.2 |
X-Request-ID |
Да | Сквозной ID запроса для трассировки сессии синхронизации справочника | req-err-dir-99aa |
2.2 Спецификация параметров запроса (Query Parameters)
| Параметр | Тип | Обязательный | Описание | Пример значения |
|---|---|---|---|---|
app_lang |
String | Да | Целевой язык локализации возвращаемых сообщений об ошибках | ru |
2.2.1 Пример сырого HTTP-запроса (URL):
GET /api/v1/auth/error-directory?app_lang=ru HTTP/1.1
Host: foodlifecycle.com
X-App-Version: 1.4.2
X-Request-ID: req-err-dir-99aa
2.3 Спецификация успешного ответа (Response Body)
2.3.1 HTTP 200 OK
Возвращается при успешном формировании актуального реестра кодов ошибок для клиента.
{
"status": "success",
"error_directory": [
{
"system_trigger": "PostgreSQL: users_email_key violation",
"grpc_status": "ALREADY_EXISTS (6)",
"http_status": "409 Conflict",
"canonical_code": "IAD_AUTH_EMAIL_DUPLICATE",
"localized_text": "Данный Email уже зарегистрирован.",
"ui_reaction": "Подсветить поле ввода Email красным цветом."
},
{
"system_trigger": "Redis: refresh_token blacklist match",
"grpc_status": "UNAUTHENTICATED (16)",
"http_status": "401 Unauthorized",
"canonical_code": "IAD_JWT_REFRESH_STOLEN",
"localized_text": "Сессия скомпрометирована. Войдите заново.",
"ui_reaction": "Очистить secure storage, принудительный вылет на экран Login."
}
],
"synced_at": 1783309600
}3 Схема обработки запроса пользователя (Mermaid)
На диаграмме представлена логика аутентификации. Сервис Authorization сверяет хэш пароля в PostgreSQL, извлекает параметры привязки к пространству и генерирует JWT-токен, содержащий зашитые JWT Claims.
3.1 Диаграмма последовательности: GetErrorDirectory
4 Расшифровка шагов и Анатомия JWT Payload
| Шаг | Действие | Параметры | Ошибки (Исключения / Статусы) |
|---|---|---|---|
Шаг 1 (APP -> NGINX) |
Мобильное приложение при холодном старте или обновлении сессии отправляет запрос на получение актуального реестра ошибок. | HTTP GET /api/v1/auth/error-directoryHeaders: X-App-Version, app_lang |
DioException: no internet connectionHTTP 502 Bad Gateway |
Шаг 2 (NGINX -> GATEWAY) |
Nginx Proxy выполняет базовую маршрутизацию и пробрасывает системный запрос на API Gateway. |
HTTP GET /backend-api/v1/auth/error-directory |
HTTP 403 Forbidden (если заблокирован IP-диапазон) |
Шаг 3 (GATEWAY -> AUTH) |
API Gateway (backend-api) направляет вызов в мастер-сервис через внутренний gRPC-интерфейс. |
gRPC Метод: GetErrorDirectory(DirectoryRequest)Args: app_version, language |
gRPC: INVALID_ARGUMENTHTTP 400 Bad Request (передан неподдерживаемый app_lang) |
Шаг 4 (AUTH -> DB_AUTH) |
Микросервис auth-service обращается к СУБД для извлечения активных кодов ошибок и соответствующих локализованных текстов. |
SQL SELECT * FROM error_directory WHERE is_active = true |
PostgreSQL: table "error_directory" does not existgRPC: INTERNAL (13) |
Шаг 5 (DB_AUTH -> AUTH) |
База данных возвращает полный реестр кодов, канонических имен и локализованных сообщений. | Result: Набор строк (error_code, canonical_code, ru_text, ...) |
PostgreSQL: connection pool timeout |
Шаг 6 (AUTH -> GATEWAY) |
Сервис формирует структуру данных справочника и возвращает gRPC-ответ на API Gateway. | gRPC Response: DirectoryResponseFields: repeated ErrorItem errors |
gRPC: DEADLINE_EXCEEDED (4) (база отвечала слишком долго) |
Шаг 7 (GATEWAY -> NGINX) |
API Gateway сериализует полученные данные в валидный JSON-контракт и транслирует его через Nginx. | HTTP 200 OKBody: [{"code": "IAD_AUTH_EMAIL_DUPLICATE", "text": "..."}, ...] |
HTTP 500 Internal Server Error (ошибка маппинга JSON структуры) |
Шаг 8 (NGINX -> APP) |
Инфраструктурный шлюз доставляет JSON-реестр кодов ошибок симулятора обратно в мобильный клиент. | Доставка сетевого пакета данных | DioException: receive timeout |
Шаг 9 (APP -> APP) |
Внутреннее действие: Сетевой слой передает JSON в локальный стейт-менеджер. Приложение парсит реестр и динамически обновляет карту соответствий. | Вызов: StateManager.updateErrorDirectory(json) |
JsonUnsupportedObjectError (ошибка парсинга из-за поврежденной структуры JSON) |
4.1 Анатомическая структура элемента реестра ошибок (Error Item Claims):
Когда мобильный клиент или внутренний шлюз парсят элемент массива error_directory, они без хардкода в коде приложения видят следующий стандартизированный JSON-датасет:
{
"system_trigger": "PostgreSQL: users_email_key violation",
"grpc_status": "ALREADY_EXISTS (6)",
"http_status": "409 Conflict",
"canonical_code": "IAD_AUTH_EMAIL_DUPLICATE",
"localized_text": "Данный Email уже зарегистрирован.",
"ui_reaction": "Подсветить поле ввода Email красным цветом."
}system_trigger— исходное системное или платформенное исключение (низкоуровневый лог СУБД или gRPC).grpc_status— стандартизированный gRPC статус-код внутренней межсервисной ошибки для трассировки.http_status— HTTP REST статус, возвращаемый API шлюзом на мобильный клиент.canonical_code— уникальный строковый токен ошибки симулятора, служащий ключом для стейт-менеджера.localized_text— готовая для вывода на экран пользователя фраза на целевом языке (app_lang).ui_reaction— инструкция-подсказка для фронтенд-команды, определяющая логику поведения интерфейса (алерт, подсветка поля, вылет).
5 Спецификация вилок исключений и обработки ошибок
При синхронизации справочника ошибок система обрабатывает критические инфраструктурные сбои, защищая стабильность интерфейса при холодном старте.
5.2 2. Ошибка валидации параметров запроса языка (HTTP 422 Unprocessable Entity)
Возвращается на Шаге 3 бэкенд-шлюзом, если переданная строка локализации в Query-параметре app_lang отсутствует в реестре поддерживаемых языков системы FoodLifeCycle.
{
"error_code": "ERR-VALIDATION-FAILED",
"message": "Передан некорректный или неподдерживаемый код локализации приложения.",
"details": [
{
"loc": ["query", "app_lang"],
"msg": "value is not a valid supported language code (ru, kz)",
"type": "value_error.language"
}
]
}