D
Engineering

Database

MongoDB adalah datastore primer via Mongoose. DB dazo lokal / dazodev remote. Startup tidak fail-fast — ConnectDb menangkap error tapi server tetap listen. Primary key field id string UUID.

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.envURIDatabase
localmongodb://127.0.0.1:27017/dazodazo
lainnyamongodb://<user>:<pass>@<host>:27017/dazodev?authSource=admindazodev

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:

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

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

KoleksiModelDipakai untuk
customersmodels/customers.jsCustomer per store — WA, nama, metadata, tags
Productsmodels/products.jsKatalog, harga, variant, stock, shipping, digital attachment
cartsmodels/carts.jsStaging item sebelum checkout
Ordersmodels/orders.jsOrder state, shipping, payment, address, follow-up
Order_Itemsmodels/orderItems.jsSnapshot produk/variant/price per order
agentsmodels/agents.jsPrompt, personality, QnA, follow-up config
settingsmodels/settings.jsOrigin, payment methods, couriers, store settings
banksmodels/banks.jsRekening transfer
devicesmodels/devices.jsToken device messaging
OpenAI logsmodels/log_request_openai.jsToken, cost, latency main calls
conversationmodels/conversation.jsRiwayat percakapan (embedding)
chat_inboxmodels/chatInbox.jsPesan masuk
chat_outboxmodels/chatOutbox.jsAntrian pesan keluar
chat_listmodels/chat_list.jsDaftar percakapan per customer
notificationsmodels/notifications.jsNotif chat/order
promptmodels/prompt.jsPrompt template
warehousemodels/warehouse.jsGudang
categoriesmodels/categories.jsKategori produk
cities, province, sub_districtsmodels/cities.js, dll.Data wilayah untuk ongkir
user_stores, usersmodels/user_stores.js, models/users.jsUser + 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:

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

KoleksiEngine Bot menulisEngine Bot membacaDibagi 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

MasalahDetail
Orders vs ordersNama model Orders (capital), tapi dazoapp menulis ke orders — Mongoose auto-pluralize. Verifikasi nama collection aktual
payment_method duplikatField payment_method dideklarasikan dua kali di order schema (models/orders.js:203 dan :255) — Mongoose mengambil yang terakhir
require vs requiredBanyak field order memakai require: true (typo) — bukan Mongoose required. Validasi tidak aktif
cancel vs cancelledWriter memakai cancel, scheduler/worker memeriksa cancelled — cancelled order dapat tetap menerima reminder
Katalog tanpa limit/projectiongetProductCatalog dapat memuat seluruh produk tanpa pagination
Minim indexQuery 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

Aspekdazoapp (Laravel)backend-goengine-bot
ODM/ORMMongoDB Laravel Eloquentmongo-driver langsungMongoose
Migrasiseederstidak ada — schema implicitMongoose schema
Multi-DB4 koneksi2 koneksi (dazo, crm_dazo)1 koneksi (dazo/dazodev)
PKUUID string via Str::uuid()field id stringfield id string
Tenant scopestore_id (795 pemakaian)store_idstore_id
Startup fail-fast✅❌ (listen walau DB down)❌ (listen walau DB down)

Langkah berikutnya