Koleksi chat_outbox adalah antrian pesan keluar. Go API menulis row, Node engine membaca (poll atau change stream) lalu mengirim ke WA gateway.
Model
models/mongo_chatoutbox.go:3 — ChatOutboxStruct:
| Field | BSON key | Tipe | Nullable | Catatan |
|---|---|---|---|---|
ID | id | string | ❌ | Primary key (UUID) |
Pesan | pesan | string | ❌ | Konten pesan |
Caption | caption | *string | ✅ | Untuk media |
Nohp | nohp | string | ❌ | Nomor tujuan |
Waktu | waktu | string | ❌ | Timestamp (string) |
Jenis | jenis | string | ❌ | Selalu "keluar" (outbound) |
Status | status | int | ❌ | Read status |
IdUser | id_user | string | ❌ | User ID pengirim |
IdCs | id_cs | string | ❌ | CS pengirim |
Instance | instance | string | ❌ | Device instance |
Nama | nama | string | ❌ | Nama kontak tujuan |
Role | role | string | ❌ | Role pengirim |
Tipe | tipe | string | ❌ | text/image/video/document/audio/link/location |
Lat | lat | *string | ✅ | Latitude |
Lng | lng | *string | ✅ | Longitude |
StatusAck | status_ack | string | ❌ | pending (initial) |
Proses | proses | int | ❌ | Flag proses |
Jalur | jalur | string | ❌ | "API" (via API) |
Ptt | ptt | *string | ✅ | Push-to-talk |
Isbc | isbc | int | ❌ | Broadcast flag |
InboxID | inbox_id | string | ❌ | Link ke chat_inbox row |
PesanId | pesan_id | *string | ✅ | ID pesan WA |
Noted | noted | *string | ✅ | Catatan |
TempId | temp_id | *string | ✅ | Temp ID |
QuotedMessageId | quoted_message_id | string | ❌ | ID pesan yang di-quote |
Cara akses di handler
handlers/chat_submit.go:856 — saveMessageMongo:
errCOBX := CreateChatOutbox(chatOutbox)Field ditulis di chat_submit.go:820-844 — lihat Message Flow untuk daftar lengkap field yang di-set.
Lifecycle
1. Handler Go insert row ke chat_outbox
└─ StatusAck = "pending"
2. Node engine membaca:
├─ Beta devices: MongoDB change stream → dispatcher.js → BullMQ queue
└─ Legacy devices: cron_mdv2.js polls chat_outbox
3. worker_message.js POST ke WA gateway :5002
4. On success:
├─ chat_inbox.status_ack = "sent" (update inbox row, bukan outbox)
└─ delete chat_outbox row (outbox *dihapus* setelah sukses)Express mode — bypass outbox
Jika payload.Express == true, saveMessageMongo (chat_submit.go:505-518) memanggil sendNotif(...) synchronous — langsung POST ke WA gateway tanpa lewat outbox. status_ack di-set langsung di chat_inbox (pending/sent/error).
Tidak ada row chat_outbox dibuat untuk express mode.
Kontrak field untuk Node engine
Node engine (worker_message.js) membaca field berikut dari chat_outbox row:
| Field | Dipakai untuk |
|---|---|
id | Tracking |
pesan | Konten yang dikirim |
nohp | Nomor tujuan |
instance | Device yang mengirim |
tipe | Jenis pesan (menentukan endpoint WA gateway) |
caption | Caption media |
lat, lng | Koordinat location |
Tenant variants
| Tenant | Collection | Helper |
|---|---|---|
| default | chat_outbox | CreateChatOutbox |
| admin | (admin variant) | CreateChatOutboxAdmin |
| crm | (CRM variant) | CreateChatOutboxCrm — panic (MongoClientCrm nil) |
Catatan
InboxIDlink kechat_inbox.id— relasi implicit, tidak ada foreign key enforcementJenisselalu"keluar"— field redundant di outbox, tapi konsisten denganchat_inboxQuotedMessageIdbeda darichat_inbox— di outbox pakai string (nullable implicit), di inbox pakai structQuotedMessage
Kembali ke
- Schema Index — daftar semua koleksi
- Message Flow — alur pesan lengkap