Model Message
Model Message
Message adalah satu pesan dalam sebuah conversation. Berbeda dengan
model lain, Message disimpan di MongoDB (bukan PostgreSQL) karena
jumlahnya bisa sangat banyak dan dominan append-only. UUID percakapan
dan agent disimpan sebagai BinData(0) sesuai konvensi di codebase.
Definisi: crates/omni-common/src/models/message.rs.
Indeks MongoDB otomatis: crates/omni-common/src/db/mongodb.rs::setup_indexes.
Struct Rust
Code
Sumber: crates/omni-common/src/models/message.rs:42-62.
Enum MessageType
Semua tipe konten yang dikenali parser (lihat
crates/chat-engine/src/parser/mod.rs):
Code
Saat webhook mengirim tipe yang tidak dikenal, parser jatuh ke
MessageType::Unknown — pesannya tetap disimpan supaya tidak hilang,
tapi tidak ter-render di UI sebagai tipe spesifik.
Enum MessageDirection dan MessageStatus
| Enum | Nilai |
|---|---|
MessageDirection | inbound, outbound |
MessageStatus | pending, sent, delivered, read, failed |
Untuk pesan outbound, status transisi: pending → sent → delivered → read,
atau pending → failed. Status di-update oleh message-sender setelah
menerima response dari Meta Graph API atau event webhook status.
Field content
content adalah serde_json::Value — bentuknya bergantung pada
msg_type:
- text:
{ "body": "hello world" } - image:
{ "url": "https://...", "caption": "optional" } - document:
{ "url": "...", "filename": "invoice.pdf", "caption": "..." } - template (WhatsApp):
{ "name": "...", "language": { "code": "id" }, "components": [...] } - location:
{ "latitude": 1.0, "longitude": 2.0 } - contacts, sticker, audio, video: bentuk spesifik channel
Text search index dibuat pada content.body, content.text, dan
content.caption — lihat indeks di bawah.
Dedup via external_id
external_id menyimpan ID pesan dari platform sumber (mis. WhatsApp
wamid, Instagram Messenger ID). Indeks sparse unique pada field
ini mencegah duplikasi saat Meta mengirim ulang webhook. Field bisa
None untuk pesan sistem internal (mis. pesan terjadwal sebelum terkirim).
Indeks MongoDB otomatis
Dijalankan sekali di startup oleh setup_indexes
(crates/omni-common/src/db/mongodb.rs:31-104):
- Compound
{ conversation_id: 1, created_at: 1 }— query utama (ambil histori per conversation, urut waktu). - Sparse
{ external_id: 1 }— dedup. - Text
{ "content.body": "text", "content.text": "text", "content.caption": "text" }denganlanguage_override = "text_search_language"— full-text search pesan.language_overridedipakai supaya fieldlanguage.codedi payload template WhatsApp tidak salah ditafsir sebagai hint bahasa indeks.
Kalau indeks text lama (tanpa language_override) sudah ada,
setup_indexes otomatis men-drop dan membuat ulang
(mongodb.rs:76-100).
Payload API
Code
List messages memakai pagination cursor:
Code