D
Engineering

Database

MongoDB adalah datastore primer (DB dazo + crm_dazo). URI dibangun per GO_ENV. GORM/MySQL dormant — ConnectDB dikomentari. PK field id string, bukan _id.

backend-go memakai MongoDB sebagai datastore primer via go.mongodb.org/mongo-driver. Koneksi MySQL/GORM masih ada tapi dormant — ConnectDB() dikomentari di main.go:43.

Koneksi MongoDB

mongo/mongo.go:16 — ConnectMongoDB() mengembalikan *mongo.Database sekaligus men-set global mongo.MongoClient.

URI dibangun berdasarkan config.Env.GoEnv:

GO_ENVURISumber kredensial
productionmongodb://<user>:<pass>@<host>:<port>/<dbname>?authSource=admin&directConnection=true.env (DB_*)
developmentmongodb://<user>:<pass>@localhost:27017/<dbname>?authSource=admin&directConnection=true.env (DB_*)
lainnyamongodb://127.0.0.1:27017/dazohardcoded

Dua database, dua client

DatabaseClient globalStatusDipakai oleh
dazo (default)mongo.MongoClient✅ aktifhandler default + _admin
crm_dazo (CRM)mongo.MongoClientCrm❌ nilhandler _crm

ConnectCrmDB() ada di mongo.go:64, tapi pemanggilannya dikomentari di main.go:50-53. Artinya MongoClientCrm nil — setiap route _crm yang menyentuh CRM DB akan panic.

Pola akses koleksi

Handler tidak memakai repository abstraction (kecuali satu — lihat Conventions). Pola dominan:

go
collection := mongo.MongoClient.Database(DBname).Collection("chat_inbox")
filter := bson.M{"id": someId}
var result models.ChatInboxStruct
err := collection.FindOne(context.TODO(), filter).Decode(&result)

DBname adalah konstanta "dazo" dari handlers/environtment.go:6 — bukan dari .env. Ini menimbulkan split-brain: service rotator memakai config.Env.DbName, handler memakai const. Lihat Tech Debt.

Primary key

Tidak seperti MongoDB _id default, koleksi Dazo memakai field id (string UUID) sebagai primary key logis:

go
filter := bson.M{"id": deviceId}   // bukan _id

_id Mongo tetap ada (auto-generated ObjectId), tapi handler query berdasarkan id string. Pola ini konsisten dengan dazoapp Laravel yang generate Str::uuid() di model boot().

Koleksi utama

KoleksiModel GoDipakai untuk
chat_inboxmodels/mongo_chatinbox.goPesan masuk + status ACK
chat_outboxmodels/mongo_chatoutbox.goAntrian pesan keluar (di-poll Node engine)
chat_listmodels/mongo_chatlist.goDaftar percakapan per customer
chat_historiesmodels/mongo_chathistory.goRiwayat lifecycle chat (move/finish/pending)
chat_ordersmodels/mongo_chatorder.goOrder yang dibuat dari chat
chat_checkoutsmodels/mongo_chat_checkout.goCheckout dari chat
devicesmodels/mongo_device.goDevice WhatsApp terdaftar
settingsmodels/mongo_settings.goSetting store + CS distribution
customersmodels/mongo_customer.goData customer
productsmodels/mongo_product.goProduk + shipping form
ordersmodels/mongo_order.goOrder + order_items
notificationsmodels/mongo_notif.goNotif chat/order/subscription
broadcast_scedulersmodels/mongo_broadcast_sceduler.goBroadcast terjadwal (typo “scedulers” preserved)
broadcast_messagesmodels/mongo_broadcast.goPesan broadcast + tag
handle_gudangmodels/mongo_handlegudang.goEskalasi ke warehouse
pixelsmodels/mongo_pixel.goTracking pixel ads
livechat_tickets—Tiket live chat
usersmodels/mongo_user.goUser

Detail per-koleksi ada di Schema.

Shared collections dengan Node engine

Go API dan Node engine berbagi koleksi yang sama — tidak ada kontrak API antar keduanya, hanya konvensi field:

KoleksiGo menulisNode membacaNode menulisGo membaca
chat_outbox✅ insert pesan keluar✅ poll/dispatch—✅
chat_inbox✅ insert callback—✅ update status_ack✅
chat_list✅—✅ update-chatlist via WA gateway✅
devices✅✅—✅
broadcast_scedulers✅✅ cron_broadcast—✅

GORM/MySQL — dormant

database/database.go:ConnectDB() membangun DSN MySQL dan memanggil gorm.Open. Tapi:

  • Pemanggilan dikomentari di main.go:43
  • Model legacy GORM masih ada di models/ (chat_inbox.go, chat_list.go, chat_outbox.go, user.go, paket.go, pbk.go, pbk_group.go, team.go, group.go, order.go, order_paket.go, label.go, livechat_ticket.go)
  • Handler legacy yang memakai GORM (handlers/auth.go, handlers/contact.go, handlers/user.go, handlers/label.go) adalah dead code

Jangan menulis kode baru yang memakai GORM — semua data aktif ada di MongoDB.

Konteks vs Laravel dazoapp

Aspekdazoapp (Laravel)backend-go
ODM/ORMMongoDB Laravel Eloquentmongo-driver langsung
Migrasiseeders (bukan migration)tidak ada — schema implicit
Multi-DB4 koneksi (mongodb, mysql, mysql_aspire, mongodb_session)2 koneksi (dazo, crm_dazo)
PKUUID string via Str::uuid()field id string (shared dari dazoapp)
Tenant scopestore_id (795 pemakaian)store_id (lihat Multi-tenant)

Langkah berikutnya