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 Contact

Model Contact

Entitas Contact merepresentasikan pelanggan akhir (end-user) yang berkomunikasi dengan organisasi melalui channel manapun. Definisinya ada di crates/omni-common/src/models/contact.rs dan skema tabelnya berasal dari migrasi awal migrations/20260218000001_initial_schema.sql.

Struct Rust

Code
pub struct Contact { pub id: Uuid, pub phone_number: Option<String>, pub name: Option<String>, pub email: Option<String>, pub channel_source: String, pub tags: serde_json::Value, pub created_at: DateTime<Utc>, pub updated_at: DateTime<Utc>, }

Sumber: crates/omni-common/src/models/contact.rs:7-16.

Field penjelasan

FieldTipeNullableCatatan
iduuidnoPrimary key, UUID v4 yang di-generate saat insert
phone_numbertextyesNomor WhatsApp/Instagram. Bisa kosong untuk contact email-only
nametextyesNama display; diambil dari metadata webhook kalau tersedia
emailtextyesAlamat email (untuk channel email-SMTP)
channel_sourcetextnoChannel asal: whatsapp, instagram, email — salah satu harus ada
tagsjsonbnoArray string; defaultnya []
created_attimestamptznoSet otomatis oleh Postgres (DEFAULT now())
updated_attimestamptznoDi-update oleh trigger saat row berubah

Kunci unik & upsert

Contact di-upsert saat inbound message datang. Aturan upsert di chat-engine memakai kombinasi (channel_source, phone_number) untuk WhatsApp/Instagram dan (channel_source, email) untuk channel email. Konsekuensi: satu nomor HP yang sama di WhatsApp dan Instagram akan menghasilkan dua contact row yang berbeda karena channel_source juga jadi bagian dari kunci.

Payload API

Endpoint REST memakai dua payload tambahan di file yang sama:

Code
pub struct CreateContact { pub phone_number: Option<String>, pub name: Option<String>, pub email: Option<String>, pub channel_source: Option<String>, } pub struct UpdateContact { pub name: Option<String>, pub email: Option<String>, pub tags: Option<serde_json::Value>, }

Detail parameter filter (search, tag, page, per_page) ada di ContactListQuery (crates/omni-common/src/models/contact.rs:36-43). Endpoint HTTP-nya dikonsumsi lewat tag Contacts di API Reference.

Query list contacts

Endpoint list di crates/api-gateway/src/routes/contacts.rs memakai daftar kolom eksplisit (bukan SELECT *). Jika anda menambahkan kolom baru di tabel contacts, jangan lupa memperbarui query di file itu — aturan ini juga disebut di CLAUDE.md pada bagian "Key Conventions".

Last modified on June 8, 2026
Model AgentModel Conversation
On this page
  • Struct Rust
  • Field penjelasan
  • Kunci unik & upsert
  • Payload API
  • Query list contacts
Rust
Rust