sequenceDiagram
autonumber
actor User as Mobile Client (App)
participant App as Moderation Tab
participant GW as FastAPI Gateway
participant DB as DB / Read Model
participant K as Apache Kafka Cluster
%% STEP 1-4: FETCH DRAFTS
App->>GW: GET /api/v1/fridge/drafts
GW->>DB: Fetch group drafts (confidence < 0.85)
DB-->>GW: Array of drafts from DB
GW-->>App: HTTP 200 OK (Array with draft_id and trace_id)
Note over App: Local card rendering on screen
%% STEP 5-7: REUSE MANUAL INPUT
User->>App: Fixes text manually and taps "Save"
Note over App: Existing manual entry method is reused!<br/>The draft trace_id is forwarded in the X-Request-ID header.
App->>GW: POST /api/v1/fridge/items/upload-text
Note over GW: Step 6: String length validation via Pydantic model
GW->>K: Push to topic: bpds.inventory.in.receipt.upload
GW-->>App: HTTP 202 Accepted
Метод GET /api/v1/fridge/drafts
Домен: INVENTORY | Сервис: backend-api (Gateway) | Получение списка черновиков для модерации
В открытом доступе представлена демонстрационная версия метода. В настоящей публичной документации отображены не все шаги, технические сценарии и приватные эндпоинты для системы цифровых симуляторов бизнес-процессов.
- Полная спецификация метода: Будет доступна только во внутреннем контуре разработки (Confluence / Swagger Enterprise).
Функциональное назначение
The GET /api/v1/fridge/drafts method is a synchronous REST API entry point used by the mobile client. It retrieves a list of ambiguous text entries (drafts) for a specific user or home group that failed automatic AI censorship due to a low neural network confidence level (confidence < 0.85) and require manual reconciliation.
After editing the text on the frontend, the mobile application reuses the existing POST /api/v1/fridge/items/upload-text method, forwarding the original draft ID within the X-Request-ID header. This ensures the end-to-end history of the censorship process is preserved and the violation counter is properly tracked.
Interaction Protocol (HTTP Contract)
- Method:
GET - Route:
/api/v1/fridge/drafts - Data Format:
application/json
Headers Specification (HTTP Headers)
| Header | Required | Description | Example Value |
|---|---|---|---|
Authorization |
Yes | Access Token. The gateway extracts user_id and home_group_id from this token. |
Bearer eyJhbGciOiJIUzI1Ni... |
Response Body Specification (HTTP Response Body)
200 OK (Successful List Retrieval)
Returns an array of active drafts awaiting moderation.
{
"success": true,
"drafts": [
{
"draft_id": "uuid-draft-555",
"trace_id": "req-manual-text-99aa",
"raw_text_input": "Молоко Юрта в ауле сомнительныйконтекст 3.2%",
"app_lang": "ru",
"created_at": "2026-08-07T10:23:00Z"
}
]
}Метод GET /api/v1/fridge/drafts является синхронной входной точкой (HTTP REST API) для мобильного клиента. Он возвращает список сомнительных текстовых записей (черновиков) конкретного пользователя или домашней группы, которые не прошли автоматическую ИИ-цензуру из-за низкого уровня уверенности нейросети (confidence < 0.85) и требуют ручной корректировки.
После редактирования текста на фронтенде, мобильное приложение повторно использует метод POST /api/v1/fridge/items/upload-text, пробрасывая в заголовке X-Request-ID оригинальный ID этого черновика для сохранения сквозной истории цензуры.
Протокол взаимодействия (HTTP Контракт)
- Метод:
GET - Маршрут:
/api/v1/fridge/drafts - Формат данных:
application/json
Спецификация заголовков (HTTP Headers)
| Заголовок | Обязательный | Описание | Пример значения |
|---|---|---|---|
Authorization |
Да | Токен доступа (Access Token). Шлюз извлекает user_id и home_group_id. |
Bearer eyJhbGciOiJIUzI1Ni... |
Спецификация ответа (HTTP Response Body)
200 OK (Успешное получение списка)
Возвращает массив активных черновиков, ожидающих модерации.
{
"success": true,
"drafts": [
{
"draft_id": "uuid-draft-555",
"trace_id": "req-manual-text-99aa",
"raw_text_input": "Молоко Юрта в ауле сомнительныйконтекст 3.2%",
"app_lang": "ru",
"created_at": "2026-08-07T10:23:00Z"
}
]
}Диаграмма последовательности (Mermaid)
sequenceDiagram
autonumber
actor User as Пользователь (App)
participant App as Вкладка модерации
participant GW as FastAPI Gateway
participant DB as DB / Read Model
%% ШАГ 6: ПОЛУЧЕНИЕ ЧЕРНОВИКОВ
App->>GW: GET /api/v1/fridge/drafts
GW->>DB: Выборка черновиков группы с confidence < 0.85
DB-->>GW: Массив черновиков
GW-->>App: HTTP 200 OK (Массив с draft_id и trace_id)
Note over App: Рендеринг карточки на экране
%% ШАГ 7: ПЕРЕИСПОЛЬЗОВАНИЕ РУЧНОГО ВВОДА
User->>App: Исправляет текст руками и жмет "Сохранить"
Note over App: Переиспользование существующего метода!<br/>В заголовок X-Request-ID передается trace_id черновика.
App->>GW: POST /api/v1/fridge/items/upload-text
Note over GW: Валидация длины строки (Шаг 1 общей таблицы)<br/>и пуш в Kafka под старым trace_id
GW-->>App: HTTP 202 Accepted
Расшифровка шагов метода
| Step | Action | Parameters / Requests / DTO | Errors (Exceptions / Statuses) |
|---|---|---|---|
1 (App -> GW) |
The user opens the moderation tab. The app sends a request to retrieve all ambiguous entries associated with the user’s home group. | HTTP GET /api/v1/fridge/draftsHeaders: Authorization: Bearer <Access_JWT> |
HTTP 401 Unauthorized (access token is modified, forged, expired, or missing; code IAD-AUTH-401) |
2 (GW -> DB) |
The API Gateway extracts the home_group_id from the token payload and queries the moderation drafts database replica. |
SQL Query:SELECT draft_id, trace_id, raw_text_input, app_lang FROM moderation_drafts WHERE home_group_id = 'group_abc123' AND confidence < 0.85; |
No business errors |
3 (DB -> GW) |
The database returns the up-to-date array of draft objects that match the filtering criteria. | Database response: Array of rows or an empty set [] if no ambiguous entries exist. |
No business errors |
4 (GW -> App) |
The gateway formats the final JSON response, delivering the draft list to the mobile app for rendering and local state management. | HTTP Status: 200 OKResponse Body: The structured JSON array of drafts specified above. |
No business errors |
5 (App -> GW) |
Tapping a card opens the text locally. The user edits it and hits “Save”. The app calls the standard manual entry method, passing the draft’s trace_id into the X-Request-ID header. |
HTTP POST /api/v1/fridge/items/upload-textHeaders: X-Request-ID: "req-manual-text-99aa", AuthorizationPayload ( UploadTextRequestDTO):{ "raw_text_input": "Молоко Юрта 3.2% 1.5 л", "app_lang": "ru" } |
No business errors |
6 (GW -> GW) |
Internal Validation: The backend gateway validates the modified string against the Pydantic model, checking the critical length restriction. | Internal check:len(payload.raw_text_input) <= 120 |
HTTP 422 Unprocessable Entity (edited text is empty or exceeds the 120-character limit; code IAD-VAL-422) |
7 (GW -> K) |
The gateway publishes the event to the message broker for repeated censorship. Reusing the old trace_id ensures the worker tracks the limit history. |
Kafka Message (Topic: bpds.inventory.in.receipt.upload):Key: "usr_9876"Payload: { "trace_id": "req-manual-text-99aa", "source_type": "USER_EDIT", "raw_text_input": "Молоко Юрта..." } |
No business errors |
7 Continuation (GW -> App) |
The gateway immediately terminates the synchronous connection with the client, confirming the task has been queued in the asynchronous processing pipeline. | HTTP Output Status: 202 AcceptedResponse Body: { "success": true, "message": "Request accepted for processing", "trace_id": "req-manual-text-99aa" } |
No business errors |
| Шаг | Действие | Параметры / Запросы / DTO | Ошибки (Исключения / Статусы) |
|---|---|---|---|
1 (App -> GW) |
Пользователь открывает вкладку модерации. Приложение отправляет запрос для получения всех сомнительных записей домашней группы пользователя. | HTTP GET /api/v1/fridge/draftsHeaders: Authorization: Bearer <Access_JWT> |
HTTP 401 Unauthorized (токен доступа изменен, просрочен или отсутствует, код IAD-AUTH-401) |
2 (GW -> DB) |
API-шлюз извлекает home_group_id из полезной нагрузки токена и выполняет запрос к реплике базы данных черновиков. |
SQL-запрос:SELECT draft_id, trace_id, raw_text_input, app_lang FROM moderation_drafts WHERE home_group_id = 'group_abc123' AND confidence < 0.85; |
Бизнес-ошибки отсутствуют |
3 (DB -> GW) |
База данных возвращает актуальный массив объектов черновиков, соответствующих критериям фильтрации. | Ответ СУБД: Массив строк или пустой сет [], если сомнительные записи отсутствуют. |
Бизнес-ошибки отсутствуют |
4 (GW -> App) |
Шлюз формирует финальный JSON-ответ, возвращая список черновиков мобильному приложению для рендеринга и локального сохранения в стейт. | HTTP Статус: 200 OKResponse Body: Специфицированный выше JSON с массивом drafts. |
Бизнес-ошибки отсутствуют |
5 (App -> GW) |
По клику на карточку текст открывается локально. Пользователь правит его и жмет «Сохранить». Приложение вызывает стандартный метод добавления, подставляя trace_id черновика в заголовок X-Request-ID. |
HTTP POST /api/v1/fridge/items/upload-textHeaders: X-Request-ID: "req-manual-text-99aa", AuthorizationPayload ( UploadTextRequestDTO):{ "raw_text_input": "Молоко Юрта 3.2% 1.5 л", "app_lang": "ru" } |
Бизнес-ошибки отсутствуют |
6 (GW -> GW) |
Внутренняя валидация: Бэкенд-шлюз пропускает измененную строку через Pydantic-модель, проверяя критическое ограничение длины. | Внутренняя проверка:len(payload.raw_text_input) <= 120 |
HTTP 422 Unprocessable Entity (отредактированный текст пустой или превысил лимит, код IAD-VAL-422) |
7 (GW -> K) |
Шлюз публикует событие в брокер сообщений для повторной цензуры. Использование старого trace_id гарантирует, что воркер сохранит историю лимитов. |
Kafka Message (Topic: bpds.inventory.in.receipt.upload):Key: "usr_9876"Payload: { "trace_id": "req-manual-text-99aa", "source_type": "USER_EDIT", "raw_text_input": "Молоко Юрта..." } |
Бизнес-ошибки отсутствуют |
7 Продолжение (GW -> App) |
Шлюз возвращает клиенту статус 202, подтверждая успешную постановку задачи в асинхронную очередь обработки. | HTTP Статус на выходе: 202 AcceptedResponse Body: { "success": true, "message": "Request accepted for processing", "trace_id": "req-manual-text-99aa" } |
Бизнес-ошибки отсутствуют |