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
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
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
| Field | Sumber migrasi | Keterangan |
|---|---|---|
is_online | 20260218000001_initial_schema.sql | Di-update oleh ws-server saat connect/disconnect |
can_broadcast | 20260225000009_divisions_and_agent_management.sql | Izin menjalankan campaign broadcast |
max_concurrent_chats | 20260225000009_divisions_and_agent_management.sql | Batas routing otomatis |
last_seen_at | 20260305000017_agent_last_seen.sql | Timestamp terakhir aktif (untuk indikator UI) |
Payload API
Code
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.