backend-go melayani tiga tenant paralel dalam satu binary yang sama. Tidak ada tenant resolution dinamis — tenant ditentukan oleh suffix route.
Tiga tenant
| Tenant | Suffix route | Database | Auth | Status |
|---|---|---|---|---|
default | (tidak ada) | dazo | ✅ JWT wajib | Aktif |
admin | _admin | dazo | ❌ skip auth | Aktif |
crm | _crm | crm_dazo | ❌ skip auth | ❌ panic |
Penamaan route
Setiap endpoint punya tiga varian:
POST /v1/chat_inbox # default
POST /v1/chat_inbox_admin # admin
POST /v1/chat_inbox_crm # crmHandler juga mengikuti pola:
handlers/chat_live.go # default
handlers/chat_live_admin.go # admin
handlers/chat_live_crm.go # crmTenant default
- Route:
POST /v1/*(tanpa suffix) - DB:
mongo.MongoClient.Database("dazo")via constDBname - Auth: JWT wajib (kecuali
callback_message) - Pemanggil: frontend
dazoappviaurl_api
Tenant admin
- Route:
POST /v1/*_admin - DB: sama dengan default (
dazo) — bukan DB terpisah - Auth: skip (excluded paths di
authMiddleware.go:15-32) - Pemangili: admin panel internal
Tenant CRM — saat ini broken
- Route:
POST /v1/*_crm - DB:
crm_dazoviamongo.MongoClientCrm— nil - Auth: skip
- Pemanggil: CRM workspace
store_id — tenant scope data
Selain tenant route, data merchant dipisah via field store_id — sama seperti dazoapp. Handler memfilter:
filter := bson.M{
"store_id": storeId,
"instance_id": instanceId,
}Tidak ada middleware yang otomatis scope store_id — developer harus menambahkan filter manual di tiap query. Berbeda dari dazoapp yang punya pattern 795 pemakaian, di Go API store_id di-pass dari request body atau payload.
Pemilihan tenant di frontend
Frontend dazoapp menentukan tenant via URL:
// global.js
var url_api = 'http://127.0.0.1:8081/v1/'; // default
// Untuk admin panel:
// http://127.0.0.1:8081/v1/chat_inbox_admin
// Untuk CRM workspace:
// http://127.0.0.1:8081/v1/chat_inbox_crmTidak ada header X-Tenant — tenant di-encode di path.
Mengapa tidak satu route dengan tenant param?
Keputusan desain historis. Konsekuensi:
- 3x handler file (chat_live.go, chat_live_admin.go, chat_live_crm.go)
- 3x route registration
- 3x model file (mongo_device.go, mongo_device_admin.go, mongo_device_crm.go)
- Perubahan harus di-propagasi 3x
Cleanup ke route param + tenant resolution dinamis adalah tech debt — lihat Tech Debt.
Langkah berikutnya
- Pola kode handler? Baca Conventions.
- Service lain yang dipanggil? Baca External Services.