OmniStream Docs
  • Panduan Pengguna
  • Developer
  • API Reference
Developer Hub
Pendahuluan
Autentikasi
Model Data
    Ikhtisar Model DataSchema PostgreSQLKoleksi MongoDBRedis Pub/SubModel AgentModel ContactModel ConversationModel MessageRoles & Permissions
Webhook
WebSocket
Self-Hosting
Error & Rate Limit
Model Data

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
pub struct Message { #[serde(rename = "_id", skip_serializing_if = "Option::is_none")] pub id: Option<bson::oid::ObjectId>, pub conversation_id: Uuid, pub external_id: Option<String>, pub direction: MessageDirection, // inbound | outbound pub msg_type: MessageType, // text, image, document, ... pub content: serde_json::Value, pub status: MessageStatus, // pending, sent, delivered, read, failed pub sender_phone: Option<String>, pub sent_by_agent_id: Option<Uuid>, pub sent_by_agent_name: Option<String>, pub created_at: DateTime<Utc>, }

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
text, image, document, template, audio, video, location, sticker, contacts, postback, unknown

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

EnumNilai
MessageDirectioninbound, outbound
MessageStatuspending, 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):

  1. Compound { conversation_id: 1, created_at: 1 } — query utama (ambil histori per conversation, urut waktu).
  2. Sparse { external_id: 1 } — dedup.
  3. Text { "content.body": "text", "content.text": "text", "content.caption": "text" } dengan language_override = "text_search_language" — full-text search pesan. language_override dipakai supaya field language.code di 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
pub struct SendMessageRequest { pub msg_type: MessageType, pub content: serde_json::Value, }

List messages memakai pagination cursor:

Code
pub struct MessageListQuery { pub cursor: Option<String>, // base64(ObjectId) pub limit: Option<i64>, // default 50, max biasanya 100 } pub struct MessageListResponse { pub messages: Vec<Message>, pub next_cursor: Option<String>, pub has_more: bool, }
Last modified on June 8, 2026
Model ConversationRoles & Permissions
On this page
  • Struct Rust
  • Enum MessageType
  • Enum MessageDirection dan MessageStatus
  • Field content
  • Dedup via external_id
  • Indeks MongoDB otomatis
  • Payload API
Rust
Rust
Rust