Метод 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": "Текст не прошел модерацию: обнаружена ненормативная лексика или спам."
}

5. Схема обработки запроса пользователя (Mermaid)

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