D
Engineering

Multi-tenant

Tiga tenant paralel — default, _admin, _crm. Dibedakan via suffix route dan koneksi MongoDB terpisah. Tenant CRM saat ini panic karena MongoClientCrm nil.

backend-go melayani tiga tenant paralel dalam satu binary yang sama. Tidak ada tenant resolution dinamis — tenant ditentukan oleh suffix route.

Tiga tenant

TenantSuffix routeDatabaseAuthStatus
default(tidak ada)dazo✅ JWT wajibAktif
admin_admindazo❌ skip authAktif
crm_crmcrm_dazo❌ skip auth❌ panic

Penamaan route

Setiap endpoint punya tiga varian:

text
POST /v1/chat_inbox          # default
POST /v1/chat_inbox_admin    # admin
POST /v1/chat_inbox_crm      # crm

Handler juga mengikuti pola:

text
handlers/chat_live.go         # default
handlers/chat_live_admin.go   # admin
handlers/chat_live_crm.go     # crm

Tenant default

  • Route: POST /v1/* (tanpa suffix)
  • DB: mongo.MongoClient.Database("dazo") via const DBname
  • Auth: JWT wajib (kecuali callback_message)
  • Pemanggil: frontend dazoapp via url_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_dazo via mongo.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:

go
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:

js
// 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_crm

Tidak 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