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_ENV | URI | Sumber kredensial |
|---|---|---|
production | mongodb://<user>:<pass>@<host>:<port>/<dbname>?authSource=admin&directConnection=true | .env (DB_*) |
development | mongodb://<user>:<pass>@localhost:27017/<dbname>?authSource=admin&directConnection=true | .env (DB_*) |
| lainnya | mongodb://127.0.0.1:27017/dazo | hardcoded |
Dua database, dua client
| Database | Client global | Status | Dipakai oleh |
|---|---|---|---|
dazo (default) | mongo.MongoClient | ✅ aktif | handler default + _admin |
crm_dazo (CRM) | mongo.MongoClientCrm | ❌ nil | handler _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:
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:
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
| Koleksi | Model Go | Dipakai untuk |
|---|---|---|
chat_inbox | models/mongo_chatinbox.go | Pesan masuk + status ACK |
chat_outbox | models/mongo_chatoutbox.go | Antrian pesan keluar (di-poll Node engine) |
chat_list | models/mongo_chatlist.go | Daftar percakapan per customer |
chat_histories | models/mongo_chathistory.go | Riwayat lifecycle chat (move/finish/pending) |
chat_orders | models/mongo_chatorder.go | Order yang dibuat dari chat |
chat_checkouts | models/mongo_chat_checkout.go | Checkout dari chat |
devices | models/mongo_device.go | Device WhatsApp terdaftar |
settings | models/mongo_settings.go | Setting store + CS distribution |
customers | models/mongo_customer.go | Data customer |
products | models/mongo_product.go | Produk + shipping form |
orders | models/mongo_order.go | Order + order_items |
notifications | models/mongo_notif.go | Notif chat/order/subscription |
broadcast_scedulers | models/mongo_broadcast_sceduler.go | Broadcast terjadwal (typo “scedulers” preserved) |
broadcast_messages | models/mongo_broadcast.go | Pesan broadcast + tag |
handle_gudang | models/mongo_handlegudang.go | Eskalasi ke warehouse |
pixels | models/mongo_pixel.go | Tracking pixel ads |
livechat_tickets | — | Tiket live chat |
users | models/mongo_user.go | User |
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:
| Koleksi | Go menulis | Node membaca | Node menulis | Go 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
| Aspek | dazoapp (Laravel) | backend-go |
|---|---|---|
| ODM/ORM | MongoDB Laravel Eloquent | mongo-driver langsung |
| Migrasi | seeders (bukan migration) | tidak ada — schema implicit |
| Multi-DB | 4 koneksi (mongodb, mysql, mysql_aspire, mongodb_session) | 2 koneksi (dazo, crm_dazo) |
| PK | UUID string via Str::uuid() | field id string (shared dari dazoapp) |
| Tenant scope | store_id (795 pemakaian) | store_id (lihat Multi-tenant) |
Langkah berikutnya
- Cara validasi token? Baca Auth & JWT.
- Cara tenant dipisah? Baca Multi-tenant.
- Detail field koleksi? Baca Schema.