Files
chatballs/apps/backend/hub_platform/integrations/serializers.py
T
AndreyandClaude Fable 5 b6d281f485 feat(notifications): уведомления сотрудникам в мессенджер через сервисного бота
- MessengerBinding/MessengerBindingCode: привязка сотрудника к боту по
  одноразовому коду (deep-link ?start= для TG и MAX, TTL 10 мин)
- сервисный бот = messenger-интеграция с config.purpose=notifications,
  без канала продаж; worker поллит его отдельно (только коды привязки)
- доставка через outbox: notify() -> notification_created -> handler
  разворачивает аудиторию и шлёт привязанным сотрудникам (best-effort)
- API messenger-bindings (список/код/отвязка); профиль: карточка
  «Уведомления в мессенджер»; форма интеграций: флажок бота уведомлений

Co-Authored-By: Claude Fable 5 <noreply@anthropic.com>
2026-07-11 03:01:01 +03:00

28 lines
1.4 KiB
Python

from hub_platform.integrations.models import Integration
def integration_payload(integration: Integration) -> dict[str, object]:
# Секрет не возвращаем; отдаём только признак его наличия.
return {
"id": integration.id,
"kind": integration.kind,
"provider": integration.provider,
"name": integration.name,
"hasSecret": bool(integration.secret),
"config": {
"baseUrl": integration.config.get("base_url", ""),
"defaultModel": integration.config.get("default_model", ""),
"proxyUrl": integration.config.get("proxy_url", ""),
"botId": integration.config.get("bot_id", ""),
"botUsername": integration.config.get("bot_username", ""),
"botName": integration.config.get("bot_name", ""),
"purpose": integration.config.get("purpose", ""),
},
"channel": {"id": integration.channel.id, "code": integration.channel.code, "name": integration.channel.name} if integration.channel_id else None,
"status": integration.status,
"lastCheckedAt": integration.last_checked_at.isoformat() if integration.last_checked_at else None,
"lastError": integration.last_error,
"createdAt": integration.created_at.isoformat(),
"updatedAt": integration.updated_at.isoformat(),
}