# Сервисный слой

Сервисный слой управляет подготовкой задач и координирует взаимодействие API, очереди и провайдеров. Раздел описывает основные обязанности и правила контроля целостности данных.

## Подготовка задач

- Принимает сырой текст запроса, разбирает его на индикаторы и удаляет только пустые совпадения, сохраняя прочие значения без дополнительной нормализации.
- Проставляет UUID для каждой задачи, сохраняет исходный текст запроса без изменений и возвращает итоговый набор извлечённых индикаторов.
- Не хранит устаревший признак `cacheable` в метаданных: в очереди остаются только идентификатор, список индикаторов и исходный текст.
- При создании и обновлениях задач синхронизирует состояние очереди с таблицей `tasks` в базе данных, чтобы статус всегда отражал фактический прогресс.

## Проверка доступности провайдеров

- Анализирует активные сервисы по настройкам `settings.providers` и прекращает обработку при отсутствии токена для обязательных интеграций.
- Фиксирует недоступных провайдеров и исключает их из выполнения, чтобы предотвратить многократные ошибки при постановке задач.

## Контроль дубликатов

- Поддерживает снимок активных задач в памяти и блокирует создание нового задания с тем же идентификатором до завершения текущего процесса.
- При повторных запросах использует БД как источник правды по прогрессу, даже если очередь уже закрыла обработку индикаторов.

## Агрегация результатов

- Собирает промежуточные статусы из очереди и воркеров: количество обработанных и ожидающих индикаторов, вердикты, текст ошибок.
- Обновляет итоговый статус задачи до `queued`, `processing`, `done` или `error` в зависимости от прогресса и наличия исключений.
- Формирует ответ API со всеми сопутствующими полями, включая исходный список индикаторов, сохранённый текст и диагностическую информацию анализа, считанную из таблицы задач.
