- Integrate @krona/tokens, @krona/themes, and @krona/ui from krona-library without code duplication - Support three official V3 themes: noble-green, parchment-light, and graphite-forest-dark - Rebuild Communications module with 5 interactive views: Messengers, Email, Channels, Contacts, Settings - Implement mobile-first drill-down, tablet 2-column, and desktop 3-column responsive layouts - Connect Telegram, WhatsApp, VK, MAX, and Email connector pills with real-time filters - Implement simulated incoming replies, quick replies manager, CRM deal/task creation, Sing-box VPN status monitor - Add comprehensive test suite in communicationsDesignSystem.test.tsx (11/11 passing) - Add IMPLEMENTATION_REPORT.md, UI_LIBRARY_USAGE.md, and COMMUNICATIONS_HANDOFF.md
6.5 KiB
6.5 KiB
Техническая спецификация передачи (Handoff) для бэкенда krona-omnichannel
1. Введение и назначение
Данный документ описывает архитектурный контракт взаимодействия между клиентским интерфейсом krona-front (модуль /communications) и микросервисной бэкенд-платформой krona-omnichannel.
Интерфейс спроектирован по принципу контрактного разделения: UI обращается к слою communicationsService, который в текущей версии предоставляет надёжную локальную модель с реактивным состоянием, полностью совместимую с будущими REST / WebSocket эндпоинтами.
2. Сопоставление доменных моделей (Domain Mapping)
Модель krona-front |
Сущность в krona-omnichannel |
Описание и соответствие полей |
|---|---|---|
| Conversation | ChatSession / Thread |
id: ULID, contactId, primaryConnector (enum: telegram, whatsapp, vk, max, email), unreadCount: int, lastMessage: Message, isFavorite: bool, assignedUserId: UUID |
| Message | MessageRecord |
id: ULID, conversationId, direction (incoming / outgoing), text: str, timestamp: ISO8601, status (sent / delivered / read), senderName, attachments: Attachment[], isInternal: bool |
| Channel | CorporateChannel |
id: ULID, name: str, description: str, isPrivate: bool, membersCount: int, pinnedMessageId: ULID, unreadCount: int |
| ContactOmnichannel | CustomerProfile / Party |
id: ULID, name: str, avatarUrl: str, phone: str, email: str, company: str, role: str, isVip: bool, isClient: bool, linkedDealsCount: int, linkedOrdersCount: int, channels: ChannelAccount[] |
| RoutingRule | OmnichannelRoutingRule |
id: ULID, title: str, condition: str, assigneeDepartment: str, assigneeUser: str, enabled: bool |
| QuickReply | CannedResponse |
id: ULID, title: str, text: str, shortcut: str, category: str |
| Connector | ConnectorIntegration |
id: enum, name: str, status (connected / degraded / disconnected), pingMs: int, accountsCount: int, uptimePercent: float |
3. Спецификация REST API эндпоинтов
Базовый префикс: /api/v1/omnichannel
3.1. Мессенджеры и диалоги
GET /conversations?connector={type}&filter={unread|favorite}&search={query}&limit=50&cursor={ulid}- Возвращает список диалогов с пагинацией по курсору ULID.
GET /conversations/{id}/messages?limit=100&before={messageId}- Возвращает историю сообщений чата.
POST /conversations/{id}/messages- Тело запроса:
{ "text": "Здравствуйте, коммерческое предложение во вложении", "attachments": [ { "name": "offer_2026.pdf", "url": "https://storage.krona.ru/...", "size": "2.4 MB" } ], "isInternal": false }
- Тело запроса:
PATCH /conversations/{id}/read- Сброс счётчика непрочитанных для пользователя.
POST /conversations/{id}/actions/crm-deal- Создание быстрой сделки в CRM из контекста переписки.
3.2. Внутрикорпоративные каналы
GET /channels— список каналов компании.POST /channels— создание нового канала.GET /channels/{id}/messages— получение ленты канала.POST /channels/{id}/messages/{messageId}/reactions- Тело запроса:
{ "emoji": "👍" }(добавить или снять реакцию).
- Тело запроса:
3.3. Корпоративная почта (Email)
GET /email/messages?mailbox={id}&folder={inbox|sent|trash}&search={query}POST /email/messages/send- Тело:
{ "from": "...", "to": "...", "subject": "...", "body": "...", "attachments": [] }
- Тело:
3.4. Диагностика коннекторов и VPN Gateway
POST /connectors/{id}/ping- Запускает проверку связи с шлюзом соответствующей платформы, возвращает
{ "status": "connected", "latencyMs": 42 }.
- Запускает проверку связи с шлюзом соответствующей платформы, возвращает
GET /gateway/status- Возвращает статус VPN / Sing-box тоннеля (node, uptime, protocol, totalTraffic).
4. Спецификация событий реального времени (WebSocket)
Подключение: wss://krona-platform.ru/ws/omnichannel?token={jwt}
Входящие события с бэкенда на фронтенд:
message.received— поступление нового сообщения от клиента из внешнего мессенджера (Telegram, WhatsApp, VK, MAX, Email).{ "event": "message.received", "data": { "conversationId": "01J9...", "message": { "id": "01J9...", "direction": "incoming", "text": "Подтверждаю оплату счета", "senderName": "Иван Петров", "connector": "telegram", "timestamp": "2026-09-11T16:20:00Z" } } }message.status_updated— обновление статуса доставки/прочтения (delivered,read).channel.reaction_updated— синхронизация реакций в каналах в реальном времени.connector.health_changed— изменение статуса коннектора или сетевого шлюза.
5. Webhook-контракты внешних коннекторов
Бэкенд krona-omnichannel принимает вебхуки от внешних систем:
POST /webhooks/telegram/{botToken}POST /webhooks/whatsapp/{tenantId}POST /webhooks/vk/{communityId}POST /webhooks/max/{gatewaySecret}POST /webhooks/mail/{inboundKey}
Все вебхуки преобразуются нормализатором krona-omnichannel в каноническую структуру MessageRecord и транслируются в UI через WebSocket.