API Events
Outreach không có Kafka và không có BullMQ. Nó là một nguồn event chỉ qua WebSocket. Emission async duy nhất là một broadcast
INQUIRY_SUBMITTEDreal-time tới room quan sát của admin.
1. Inbound — Kafka
Không. Outreach không chạy Kafka consumer.
2. Outbound — Kafka
Không. Outreach không tạo Kafka event. Hệ thống downstream cần dữ liệu yêu cầu thì poll REST API hoặc subscribe qua WebSocket.
3. Inbound — BullMQ
Không. Không có queue worker.
4. Outbound — BullMQ
Không. Không enqueue job nào.
5. WebSocket Emissions
| Topic (path) | Rooms | Trigger | Emitter |
|---|---|---|---|
observation/outreach/inquiry/submitted | outreach/inquiries, outreach/inquiries/{id} | POST /inquiries/submit thành công | OutreachSocketEventService.notifyInquirySubmitted() |
| Thuộc tính | Giá trị |
|---|---|
| Emitter identifier | outreach-ws-emitter (tên kết nối Redis outreach-ws-redis) |
| Backend | WebSocketEmitter backed bởi Redis (single hoặc cluster qua APP_ENV_WEBSOCKET_REDIS_MODE) |
| Topic builder | WebSocketTopics.build({ paths: ['observation','outreach','inquiry','submitted'] }) |
| Room builder | WebSocketRooms.build({ paths: ['outreach','inquiries'(, id)] }) |
| Delivery | Fire-and-forget; isReady() guard; Promise.allSettled để một room fail không hủy phần còn lại |
6. Payload Schemas
// observation/outreach/inquiry/submitted
export interface InquirySubmittedMessage {
id: string; // inquiry id (Snowflake)
type: string; // giá trị InquiryTypes, vd "200_SALES"
firstName: string;
lastName: string | null;
email: string;
businessName: string | null;
subject: string | null;
createdAt: string; // ISO timestamp
}Nguồn chân lý:
packages/outreach/src/components/websocket/socket-event.service.ts. Không có entrypackages/core/src/models/messages/— đây là payload chỉ-WS.
7. Idempotency & Ordering
| Channel | Delivery | Ordering | Recovery |
|---|---|---|---|
observation/outreach/inquiry/submitted | at-most-once (best-effort, không await) | không | không — client re-fetch qua GET /inquiries nếu lỡ một event |
WS emission cố tình lossy: yêu cầu đã được lưu trước khi notify chạy, nên database là bản ghi bền. Một WS event bị rớt chỉ làm chậm toast real-time của admin, không bao giờ mất dữ liệu.