D
Engineering

chat_outbox

Koleksi chat_outbox — antrian pesan keluar. Go API insert, Node engine poll/change stream lalu kirim ke WA gateway. Sukses: status_ack=sent, row dihapus.

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:

FieldBSON keyTipeNullableCatatan
IDidstring❌Primary key (UUID)
Pesanpesanstring❌Konten pesan
Captioncaption*string✅Untuk media
Nohpnohpstring❌Nomor tujuan
Waktuwaktustring❌Timestamp (string)
Jenisjenisstring❌Selalu "keluar" (outbound)
Statusstatusint❌Read status
IdUserid_userstring❌User ID pengirim
IdCsid_csstring❌CS pengirim
Instanceinstancestring❌Device instance
Namanamastring❌Nama kontak tujuan
Rolerolestring❌Role pengirim
Tipetipestring❌text/image/video/document/audio/link/location
Latlat*string✅Latitude
Lnglng*string✅Longitude
StatusAckstatus_ackstring❌pending (initial)
Prosesprosesint❌Flag proses
Jalurjalurstring❌"API" (via API)
Pttptt*string✅Push-to-talk
Isbcisbcint❌Broadcast flag
InboxIDinbox_idstring❌Link ke chat_inbox row
PesanIdpesan_id*string✅ID pesan WA
Notednoted*string✅Catatan
TempIdtemp_id*string✅Temp ID
QuotedMessageIdquoted_message_idstring❌ID pesan yang di-quote

Cara akses di handler

handlers/chat_submit.go:856 — saveMessageMongo:

go
errCOBX := CreateChatOutbox(chatOutbox)

Field ditulis di chat_submit.go:820-844 — lihat Message Flow untuk daftar lengkap field yang di-set.

Lifecycle

text
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:

FieldDipakai untuk
idTracking
pesanKonten yang dikirim
nohpNomor tujuan
instanceDevice yang mengirim
tipeJenis pesan (menentukan endpoint WA gateway)
captionCaption media
lat, lngKoordinat location

Tenant variants

TenantCollectionHelper
defaultchat_outboxCreateChatOutbox
admin(admin variant)CreateChatOutboxAdmin
crm(CRM variant)CreateChatOutboxCrm — panic (MongoClientCrm nil)

Catatan

  • InboxID link ke chat_inbox.id — relasi implicit, tidak ada foreign key enforcement
  • Jenis selalu "keluar" — field redundant di outbox, tapi konsisten dengan chat_inbox
  • QuotedMessageId beda dari chat_inbox — di outbox pakai string (nullable implicit), di inbox pakai struct QuotedMessage

Kembali ke