engine-bot memakai MongoDB sebagai datastore primer via Mongoose 8.7. Tidak ada migration — bentuk dokumen diturunkan dari Mongoose schema di models/.
Koneksi MongoDB
config/db.js:4 — ConnectDb() async, membangun URI berdasarkan env.env:
env.env | URI | Database |
|---|---|---|
local | mongodb://127.0.0.1:27017/dazo | dazo |
| lainnya | mongodb://<user>:<pass>@<host>:27017/dazodev?authSource=admin | dazodev |
Kredensial remote di-hardcode di config/db.js (redacted — jangan commit).
Primary key
Sama seperti dazoapp dan backend-go, koleksi Dazo memakai field id (string UUID) sebagai primary key logis — bukan _id Mongo default:
const customer = await Customer.findOne({ id: customerId, store_id: storeId });_id Mongo tetap ada (auto ObjectId), tapi query bisnis berdasarkan id string.
Pola akses koleksi
Engine Bot memakai Mongoose model — ada layer ODM tipis dibanding backend-go yang memakai mongo-driver langsung:
// models/customers.js
const CustomerSchema = new mongoose.Schema({ id: { type: String, required: true }, ... });
export default mongoose.model("customers", CustomerSchema);
// service/customer.js
const customer = await Customer.findOne({ id: customerId, store_id: storeId });Koleksi utama
| Koleksi | Model | Dipakai untuk |
|---|---|---|
customers | models/customers.js | Customer per store — WA, nama, metadata, tags |
Products | models/products.js | Katalog, harga, variant, stock, shipping, digital attachment |
carts | models/carts.js | Staging item sebelum checkout |
Orders | models/orders.js | Order state, shipping, payment, address, follow-up |
Order_Items | models/orderItems.js | Snapshot produk/variant/price per order |
agents | models/agents.js | Prompt, personality, QnA, follow-up config |
settings | models/settings.js | Origin, payment methods, couriers, store settings |
banks | models/banks.js | Rekening transfer |
devices | models/devices.js | Token device messaging |
OpenAI logs | models/log_request_openai.js | Token, cost, latency main calls |
conversation | models/conversation.js | Riwayat percakapan (embedding) |
chat_inbox | models/chatInbox.js | Pesan masuk |
chat_outbox | models/chatOutbox.js | Antrian pesan keluar |
chat_list | models/chat_list.js | Daftar percakapan per customer |
notifications | models/notifications.js | Notif chat/order |
prompt | models/prompt.js | Prompt template |
warehouse | models/warehouse.js | Gudang |
categories | models/categories.js | Kategori produk |
cities, province, sub_districts | models/cities.js, dll. | Data wilayah untuk ongkir |
user_stores, users | models/user_stores.js, models/users.js | User + tenant pivot |
Detail per-koleksi ada di Schema.
Relasi custom
Relasi order ke item memakai custom string orders.id dan order_items.order_id, bukan MongoDB _id:
const order = await Order.findOne({ id: orderNumber, store_id: storeId });
const items = await OrderItem.find({ order_id: order.id });Shared dengan backend-go dan dazoapp
Engine Bot berbagi koleksi dengan dazoapp (Laravel) dan backend-go — semua memakai DB dazo yang sama di lokal:
| Koleksi | Engine Bot menulis | Engine Bot membaca | Dibagi dengan |
|---|---|---|---|
customers | ✅ | ✅ | dazoapp, backend-go |
Products | (read-only) | ✅ | dazoapp (writer) |
Orders | ✅ create/update | ✅ | dazoapp, backend-go |
carts | ✅ create/delete | ✅ | — (engine-bot only) |
agents | (read-only) | ✅ | dazoapp (writer) |
settings | (read-only) | ✅ | dazoapp (writer) |
devices | (read-only) | ✅ | dazoapp, backend-go |
Inkonsistensi yang diketahui
| Masalah | Detail |
|---|---|
Orders vs orders | Nama model Orders (capital), tapi dazoapp menulis ke orders — Mongoose auto-pluralize. Verifikasi nama collection aktual |
payment_method duplikat | Field payment_method dideklarasikan dua kali di order schema (models/orders.js:203 dan :255) — Mongoose mengambil yang terakhir |
require vs required | Banyak field order memakai require: true (typo) — bukan Mongoose required. Validasi tidak aktif |
cancel vs cancelled | Writer memakai cancel, scheduler/worker memeriksa cancelled — cancelled order dapat tetap menerima reminder |
| Katalog tanpa limit/projection | getProductCatalog dapat memuat seluruh produk tanpa pagination |
| Minim index | Query utama minim index — multi-tenant scoping via store_id hanya di layer aplikasi |
Lihat Tech Debt untuk daftar lengkap.
Konteks vs dazoapp dan backend-go
| Aspek | dazoapp (Laravel) | backend-go | engine-bot |
|---|---|---|---|
| ODM/ORM | MongoDB Laravel Eloquent | mongo-driver langsung | Mongoose |
| Migrasi | seeders | tidak ada — schema implicit | Mongoose schema |
| Multi-DB | 4 koneksi | 2 koneksi (dazo, crm_dazo) | 1 koneksi (dazo/dazodev) |
| PK | UUID string via Str::uuid() | field id string | field id string |
| Tenant scope | store_id (795 pemakaian) | store_id | store_id |
| Startup fail-fast | ✅ | ❌ (listen walau DB down) | ❌ (listen walau DB down) |
Langkah berikutnya
- Cara validasi token? Baca Auth & JWT.
- Cara tenant dipisah? Baca Multi-tenant.
- Detail field koleksi? Baca Schema.