graph TD
User[📱 Пользователь: Ввод текста] --> API["FastAPI: POST /add-by-text"]
API --> gRPC{🧠 gRPC ИИ-Модерация}
gRPC -->|Обнаружен мат/спам| Reject[HTTP 400: ERR-BUPAR-CENSOR]
gRPC -->|Текст чист / Сервер оффлайн| Parse[Парсинг строки и выделение Qty]
Parse --> DB[(PostgreSQL: INSERT ON CONFLICT DO UPDATE)]
DB --> Success[HTTP 201: SUCCESS]
style Reject fill:#fff0f5,stroke:#d63384
style Success fill:#e6ffed,stroke:#28a745
Метод POST /api/v2/fridge/add-by-photo
Документация API: Текстовое добавление номенклатур с автоматической gRPC ИИ-модерацией
1. Функциональное назначение
Эндпоинт реализует логику быстрого добавления продуктов питания в «цифровой холодильник» посредством ввода неструктурированного текста (например, через строку АРМ или интерфейс быстрого подбора мобильного приложения).
2. Протокол взаимодействия (HTTP Контракт)
- Метод:
POST - Маршрут:
/api/v1/fridge/add-by-text - Формат данных:
application/json
2.1. Спецификация тела запроса (Request Body)
| Поле | Тип | Обязательный | Описание |
|---|---|---|---|
raw_text_input |
String | Да | Неструктурированная текстовая строка ввода (например: "Груши 2.5") |
3. Сквозная бизнес-логика и ИИ-модерация
Процесс обработки запроса живого пользователя разделен на три этапа:
Этап 1: gRPC Цензурирование (ИИ-контур модерации)
Строка raw_text_input асинхронно перенаправляется во внутренний gRPC-сервер аналитики на метод CheckProduct для проверки на спам и ненормативную лексику. * Если ИИ-модератор возвращает статус REJECTED, бэкенд прерывает транзакцию и выбрасывает ошибку цензуры ERR-BUPAR-CENSOR (HTTP 400). * Стратегия Fail-Safe: Если gRPC-сервер оффлайн, система пишет предупреждение [Moderation Warning] в системный лог и пропускает запрос по сценарию ограниченного доверия, чтобы не блокировать действия реального человека.
Этап 2: Парсинг строки
Чистый текст разбивается по разделителям (пробелам). Первое слово интерпретируется как наименование продукта, второе — преобразуется в тип float как количество (дефолтное значение = 1.0).
Этап 3: Фиксация в PostgreSQL
Запись вносится в базу данных. В случае коллизии (если такой продукт уже добавлен в рамках этой семьи), срабатывает логика инкремента остатков:
INSERT INTO fridge_inventory (user_id, home_group_id, product_name, quantity, unit)
VALUES (\$1, \$2, \$3, \$4, 'шт')
ON CONFLICT (home_group_id, product_name)
DO UPDATE SET quantity = fridge_inventory.quantity + EXCLUDED.quantity;4. Спецификация ответов сервера
4.1. Успешное добавление (201 Created)
{
"status": "SUCCESS",
"message": "Продукт 'Яблоки' успешно отмодерирован и добавлен текстовым контуром."
}4.2. Ошибка модерации (400 Bad Request)
Возвращается, если ИИ-контур зафиксировал мат или спам в текстовом вводе реального пользователя.
{
"code": "ERR-BUPAR-CENSOR",
"detail": "Текст не прошел модерацию: обнаружена ненормативная лексика или спам."
}