# Интеграция 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.