# Интеграция Klipy (Klipy Integration Module) — Knot Messager

Модуль Klipy обеспечивает интеграцию с внешним сервисом короткого видеоконтента и GIF. Он позволяет пользователям добавлять динамический контент в свои истории и сообщения, в то время как администратор сохраняет полный контроль над доступом к сервису.

---

## 🛠 Архитектура интеграции

Интеграция построена на принципах **Loose Coupling** (слабой связности):
1.  **Abstractions**: Интерфейс [IKlipyClient](file:///e:/GIT/forkmessager/backend/src/Modules/Stories/Application/Abstractions/IKlipyClient.cs#7-12) находится в модуле `Stories.Application`, что позволяет бизнес-логике не зависеть от конкретной реализации HTTP-вызовов.
2.  **Infrastructure**: Реализация [KlipyClient](file:///e:/GIT/forkmessager/backend/src/Modules/Stories/Infrastructure/External/KlipyClient.cs#14-18) в `Stories.Infrastructure` отвечает за взаимодействие с внешним API `api.klipy.co`.
3.  **Cross-Module Configuration**: Настройки интеграции хранятся в модуле [Admin](file:///e:/GIT/forkmessager/backend/src/Modules/Admin/Presentation/Endpoints/AdminEndpoints.cs#19-94), но считываются модулем [Stories](file:///e:/GIT/forkmessager/backend/src/Shared/Knot.Shared.Kernel/Configuration/SystemSettingsDto.cs#13-27) через [ISettingsService](file:///e:/GIT/forkmessager/backend/src/Shared/Knot.Shared.Kernel/Configuration/ISettingsService.cs#6-12).

---

## ⚙ Настройка через Admin Module

Администратор управляет интеграцией через панель управления (`SystemSettingsDto.Klipy`):
*   **Enabled**: Глобальный переключатель активности. Если выключено — создание контента типа Klipy блокируется на уровне API.
*   **ApiKey**: Уникальный токен доступа к API Klipy.
*   **AppName**: Имя приложения для идентификации в системе Klipy.

---

## 🧪 Валидация и Тестирование (Test Connectivity)

Для обеспечения надежности в [AdminEndpoints](file:///e:/GIT/forkmessager/backend/src/Modules/Admin/Presentation/Endpoints/AdminEndpoints.cs#19-94) реализована ручка проверки:
*   **EndPoint**: `POST /api/admin/settings/test-klipy`
*   **Механизм**: Сервер выполняет реальный сетевой запрос к эндпоинту `trending` API Klipy с использованием настроенного ключа. 
*   **Результат**: Возвращает `200 OK`, если ключ валиден и сервис доступен, или ошибку `Klipy.AuthFailed`, если ключ не прошел авторизацию.

---

## 📽 Использование в Историях (Stories)

Когда пользователь создает историю типа `klipy`:
1.  Система проверяет `parsedType == StoryType.Klipy`.
2.  Выполняется запрос к [SettingsService](file:///e:/GIT/forkmessager/backend/src/Shared/Knot.Shared.Infrastructure/Configuration/SettingsService.cs#11-99).
3.  Если `Klipy.Enabled == false`, возвращается ошибка `Stories.KlipyDisabled`.
4.  Если активно — `MediaUrl` истории будет содержать прямую ссылку на контент Klipy.

---

## 🛡 Безопасность

*   **API Key Isolation**: Ключ API никогда не передается клиенту. Все проверки (Test Connection) и поисковые запросы (Search) выполняются на стороне сервера.
*   **Proxy-Free Media**: Для экономии трафика сервера медиа-файлы Klipy загружаются клиентом напрямую с серверов провайдера (`MediaUrl`), но только после валидации права на создание такой истории.

---

> [!TIP]
> При возникновении ошибок `Klipy.AuthFailed` проверьте сетевые настройки сервера (доступ к `https://api.klipy.co`) и срок действия API-ключа в кабинете Klipy.
