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 Agent

Model Agent

Agent adalah user internal yang login ke CRM — bukan pelanggan eksternal. Semua hak akses (RBAC), routing conversation, dan quota concurrent chat dipegang oleh entity ini. Sumber: crates/omni-common/src/models/agent.rs.

Struct Rust

Code
pub struct Agent { pub id: Uuid, pub email: String, #[serde(skip_serializing)] pub password_hash: String, pub full_name: String, pub role: AgentRole, pub is_online: bool, pub can_broadcast: bool, pub max_concurrent_chats: i32, pub last_seen_at: Option<DateTime<Utc>>, pub created_at: DateTime<Utc>, pub updated_at: DateTime<Utc>, }

Sumber: crates/omni-common/src/models/agent.rs:17-30.

Perhatikan password_hash dipasang #[serde(skip_serializing)] — artinya field ini tidak pernah muncul di response HTTP, hanya di log internal. Untuk response publik selalu dipakai AgentPublic (agent.rs:69-79).

Enum AgentRole

Code
pub enum AgentRole { Admin, // akses penuh; manajemen user, integrasi, RBAC Supervisor, // dashboard, analytics, semua conversation Agent, // hanya conversation yang di-assign ke dia }

Detail aturan akses ada di developer/autentikasi/rbac. Enum ini juga dipakai oleh Postgres via sqlx::Type dengan tipe agent_role (lihat migrasi initial).

Hashing password

Password di-hash dengan argon2 via argon2::PasswordHasher saat create/update. Verifikasi dilakukan lewat argon2::PasswordVerifier; error argon2::password_hash::Error::Password otomatis dipetakan ke ApiError::Unauthorized("Invalid email or password") (crates/api-gateway/src/errors.rs:112-121).

Field tambahan

FieldSumber migrasiKeterangan
is_online20260218000001_initial_schema.sqlDi-update oleh ws-server saat connect/disconnect
can_broadcast20260225000009_divisions_and_agent_management.sqlIzin menjalankan campaign broadcast
max_concurrent_chats20260225000009_divisions_and_agent_management.sqlBatas routing otomatis
last_seen_at20260305000017_agent_last_seen.sqlTimestamp terakhir aktif (untuk indikator UI)

Payload API

Code
pub struct CreateAgent { pub email: String, pub password: String, pub full_name: String, pub role: Option<AgentRole>, pub can_broadcast: Option<bool>, pub max_concurrent_chats: Option<i32>, } pub struct UpdateAgent { pub email: Option<String>, pub full_name: Option<String>, pub role: Option<AgentRole>, pub password: Option<String>, pub can_broadcast: Option<bool>, pub max_concurrent_chats: Option<i32>, } pub struct LoginRequest { pub email: String, pub password: String, } pub struct LoginResponse { pub token: String, pub agent: AgentPublic, }

LoginResponse.token adalah JWT yang wajib dikirim ulang di header Authorization: Bearer <token> untuk request berikutnya. Lihat developer/autentikasi/jwt untuk detail klaim JWT.

Keanggotaan divisi

Relasi many-to-many disimpan di tabel agent_divisions (migrasi 20260225000009_divisions_and_agent_management.sql). Satu agent bisa berada di banyak divisi; routing memakai relasi ini saat memilih agent untuk auto-assign.

Last modified on June 8, 2026
Redis Pub/SubModel Contact
On this page
  • Struct Rust
  • Enum AgentRole
  • Hashing password
  • Field tambahan
  • Payload API
  • Keanggotaan divisi
Rust
Rust
Rust