Daftar known issues engine-bot dari docs/KNOWN_ISSUES.md. Diurutkan prioritas risiko, bukan berdasarkan seberapa mengganggu. Tujuan: pembenahan tidak menghentikan pengiriman fitur.
Aturan utama: Jangan gabungkan pembenahan dengan fitur dalam satu commit. Pisahkan agar mudah di-revert.
Prioritas 1 — Hapus auto-paid dari manual proof (kritis)
| Aspek | Detail |
|---|---|
| Masalah | service/order.js dapat mengubah payment_status menjadi paid berdasarkan nominal hasil OpenAI vision. Bukti palsu atau hasil vision salah dapat membuka fulfillment tanpa verifikasi bank/admin |
| Lokasi | service/order.js — proofTransactionHandler / addProofTransaction |
| Target | Semua manual proof masuk proof_pending_verification; hanya payment gateway, rekonsiliasi bank, atau admin terautentikasi yang boleh menandai paid |
| Risiko | Kritis — bukti palsu → fulfillment terbuka → kerugian finansial |
| Prasyarat | Prioritas 6 (test suite) |
Prioritas 2 — Perbaiki authentication dan tenant authorization (kritis)
| Aspek | Detail |
|---|---|
| Masalah | (a) middleware/authMiddleware.js mempercayai raw x-forwarded-for — client dapat memalsukan allowlisted IP. (b) JWT diverifikasi, tetapi store_id, agent_id, customer_id, device_id, cart, product, dan order tidak dicocokkan dengan claims |
| Lokasi | middleware/authMiddleware.js:6, controller validation |
| Target | (a) Trusted proxy config yang benar atau hapus bypass IP dari public request path. (b) Bind identity dan resource scope pada boundary sebelum domain logic berjalan |
| Risiko | Kritis — auth bypass + cross-tenant data access |
| Prasyarat | Prioritas 6 |
Prioritas 3 — Amankan media fetch (kritis)
| Aspek | Detail |
|---|---|
| Masalah | Image/audio URL di-fetch tanpa protocol/domain allowlist, private network block, redirect restriction, timeout menyeluruh, atau size limit |
| Lokasi | utils/util.js (vision), controllers/mainController.js (media processing) |
| Target | Restricted media fetcher dengan HTTPS allowlist, DNS/IP validation, byte limit, dan abort timeout |
| Risiko | Kritis — SSRF ke internal network |
| Prasyarat | Prioritas 6 |
Prioritas 4 — Buat checkout transactional dan tenant-scoped (tinggi)
| Aspek | Detail |
|---|---|
| Masalah | Order, order items, cart cleanup, dan totals berubah melalui operasi terpisah. Failure tengah proses dapat meninggalkan data parsial. Beberapa lookup cart/product tidak memfilter customer/store |
| Lokasi | service/order.js, service/carts.js |
| Target | Atomic checkout (MongoDB transaction atau idempotent saga), tenant-scoped query konsisten |
| Risiko | Tinggi — data parsial, cross-tenant cart access |
| Prasyarat | Prioritas 6 |
Prioritas 5 — Perbaiki batching/error response dan status cancellation (tinggi)
| Aspek | Detail |
|---|---|
| Masalah | (a) Buffer dan dedup tidak tenant-safe — key hanya customer_id. (b) Batched request dapat menggantung — timer terakhir memegang satu Express response, shared promise tidak di-await, error timer tidak mengirim HTTP error. (c) Writer memakai cancel, scheduler/worker memeriksa cancelled — cancelled order dapat tetap menerima reminder. (d) Socket.IO tidak terisolasi — handshake tidak authenticated, newMessage dibroadcast global. (e) Startup tidak fail-fast pada MongoDB. (f) Tidak ada rate limiting |
| Lokasi | controllers/mainController.js (buffer/dedup), models/orders.js (status), app.js (Socket.IO, startup) |
| Target | Tenant-safe buffer, error response konsisten, status enum tunggal, Socket.IO auth + tenant room, fail-fast MongoDB, rate limiting |
| Risiko | Tinggi — request menggantung, reminder bocor, Socket data leak, service terlihat up walau DB down |
| Prasyarat | Prioritas 6 |
Prioritas 6 — Tambahkan automated regression tests (foundation)
| Aspek | Detail |
|---|---|
| Masalah | npm test belum menjalankan test. Tidak ada regression suite untuk tenant isolation, checkout, payment, buffer, webhook, atau scheduler |
| Lokasi | — |
| Target | Test framework + suite untuk area kritis: functionRouteBot, verifyToken, checkout flow, payment webhook, buffer/dedup, scheduler |
| Risiko | Foundation — tanpa test, semua refactor di atas berisiko |
| Prasyarat | — (prasyarat untuk prioritas 1–5) |
Prioritas 7 — Track lockfile dan upgrade dependency (foundation)
| Aspek | Detail |
|---|---|
| Masalah | package-lock.json di-ignore sehingga install tidak reproducible. Workflow install tidak menetapkan deployment working directory. Dependency audit: 28 vulnerabilities (1 critical, 12 high) |
| Lokasi | .gitignore, .github/workflows/ |
| Target | Track lockfile, set working-directory, upgrade dependency secara terukur |
| Risiko | Foundation — install tidak reproducible, deploy tidak deterministik |
| Prasyarat | — |
Detail issue terpilih
Auto-paid dari manual proof
service/order.js — proofTransactionHandler:
image URL
-> fetch dan MIME check
-> base64
-> OpenAI vision description
-> proofTransactionHandler
-> addProofTransaction
-> nominal dibandingkan dengan total order
-> payment/order state diperbarui (BISA `paid`)Implementasi saat ini dapat menandai order paid hanya berdasarkan hasil vision dan nominal. Risiko kritis — jangan anggap flow aman sampai diperbaiki.
Fix: Semua manual proof masuk proof_pending_verification: true. Hanya webhook DazoApp (dari DOKU) atau admin terautentikasi yang boleh menandai payment_status: "paid".
Auth bypass via x-forwarded-for
middleware/authMiddleware.js:6:
const clientIP = req.headers["x-forwarded-for"] || req.ip || req.connection.remoteAddress;
if (allowedIPs.includes(clientIP)) {
return next(); // bypass auth
}x-forwarded-for adalah header yang bisa di-set client. Tanpa reverse proxy yang menimpa header ini, attacker bisa spoof IP untuk bypass auth.
Fix: Hanya trust req.ip (yang di-set Express dari trusted proxy config), atau hapus bypass IP dari public request path.
Tenant authorization belum diterapkan
JWT diverifikasi, tetapi req.user (decoded claims) tidak pernah dibandingkan dengan store_id di request body. Client dengan token valid bisa mengirim store_id tenant lain.
Fix: Bind identity dan resource scope pada boundary:
// contoh target
if (req.user.store_id !== req.body.store_id) {
return res.status(403).json({ message: "Tenant mismatch" });
}Socket.IO tidak terisolasi
app.js:15-22:
const io = new Server(server, {
cors: { origin: "*", credentials: true },
allowEIO3: true,
});Socket handshake tidak authenticated dan event newMessage dibroadcast global tanpa tenant room.
Fix:
io.use((socket, next) => {
// verify JWT dari socket.handshake.auth.token
// attach store_id ke socket
});
io.on("connection", (socket) => {
socket.join(`store:${socket.storeId}`);
});
// broadcast:
io.to(`store:${storeId}`).emit("newMessage", data);Startup tidak fail-fast pada MongoDB
app.js:27 memanggil ConnectDb() (async) tapi tidak await. app.js:55 server.listen langsung jalan. ConnectDb menangkap error dan hanya console.error.
Fix:
await ConnectDb(); // fail-fast
server.listen(env.port, () => { ... });Correctness issues (tidak urut prioritas)
| Issue | Lokasi |
|---|---|
Product dipakai tanpa import di salah satu branch getProductCatalog | service/product.js |
Order dipakai saat model import bernama Orders | constraint flow |
getServicesShipping dereference order sebelum null check | service/order.js |
qtyProduct dapat undefined pada shipping update fallback | service/order.js |
payment_method dideklarasikan dua kali di order schema | models/orders.js:203,255 |
Banyak field order memakai require, bukan Mongoose required | models/orders.js |
image.trim() di worker gagal untuk null/non-string | scheduler/worker/worker.js |
time_reply tidak divalidasi | controllers/mainController.js |
| Dedup map tidak memiliki TTL cleanup | controllers/mainController.js |
| Error/not-found response chatbot tidak konsisten dengan HTTP status normal | controller |
| Booking tool belum diimplementasikan | tools/booking/tools.js |
Performance dan observability
| Issue | Catatan |
|---|---|
| Katalog dan history order dapat dimuat tanpa limit/projection | Performance |
| Query utama minim index | Performance |
| Semua specialist wrappers dibangun setiap request | Performance |
| Token/cost tracking hanya mencakup sebagian call OpenAI | Observability |
| Log dapat memuat PII, message history, media URL, dan payment payload | Security |
| Health endpoint tidak memeriksa MongoDB | Observability |
Delivery dan testing
| Issue | Catatan |
|---|---|
npm test belum menjalankan test | CI gate tidak ada |
| Tidak ada regression suite | Tenant isolation, checkout, payment, buffer, webhook, scheduler |
package-lock.json di-ignore | Install tidak reproducible |
| Workflow install tidak menetapkan deployment working directory | CI |
| Dependency audit: 28 vulnerabilities (1 critical, 12 high) | Jalankan npm audit --omit=dev; jangan --force |
Status legend
- ⬜ Belum — belum dikerjakan
- 🔄 Sedang — dalam progress
- ✅ Selesai — selesai
Langkah berikutnya
- Detail per issue? Baca halaman terkait: Database, Auth & JWT, Multi-tenant, Conventions.
- Bug operasional? Lihat juga dazoapp Tech Debt dan backend-go Tech Debt.