D
Engineering

Tech Debt Roadmap

7 prioritas dari KNOWN_ISSUES.md — auto-paid proof, auth bypass forwarded IP, tenant authorization, SSRF media, secret handling, transactional checkout, regression tests. Diurutkan risiko.

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)

AspekDetail
Masalahservice/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
Lokasiservice/order.js — proofTransactionHandler / addProofTransaction
TargetSemua manual proof masuk proof_pending_verification; hanya payment gateway, rekonsiliasi bank, atau admin terautentikasi yang boleh menandai paid
RisikoKritis — bukti palsu → fulfillment terbuka → kerugian finansial
PrasyaratPrioritas 6 (test suite)

Prioritas 2 — Perbaiki authentication dan tenant authorization (kritis)

AspekDetail
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
Lokasimiddleware/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
RisikoKritis — auth bypass + cross-tenant data access
PrasyaratPrioritas 6

Prioritas 3 — Amankan media fetch (kritis)

AspekDetail
MasalahImage/audio URL di-fetch tanpa protocol/domain allowlist, private network block, redirect restriction, timeout menyeluruh, atau size limit
Lokasiutils/util.js (vision), controllers/mainController.js (media processing)
TargetRestricted media fetcher dengan HTTPS allowlist, DNS/IP validation, byte limit, dan abort timeout
RisikoKritis — SSRF ke internal network
PrasyaratPrioritas 6

Prioritas 4 — Buat checkout transactional dan tenant-scoped (tinggi)

AspekDetail
MasalahOrder, 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
Lokasiservice/order.js, service/carts.js
TargetAtomic checkout (MongoDB transaction atau idempotent saga), tenant-scoped query konsisten
RisikoTinggi — data parsial, cross-tenant cart access
PrasyaratPrioritas 6

Prioritas 5 — Perbaiki batching/error response dan status cancellation (tinggi)

AspekDetail
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
Lokasicontrollers/mainController.js (buffer/dedup), models/orders.js (status), app.js (Socket.IO, startup)
TargetTenant-safe buffer, error response konsisten, status enum tunggal, Socket.IO auth + tenant room, fail-fast MongoDB, rate limiting
RisikoTinggi — request menggantung, reminder bocor, Socket data leak, service terlihat up walau DB down
PrasyaratPrioritas 6

Prioritas 6 — Tambahkan automated regression tests (foundation)

AspekDetail
Masalahnpm test belum menjalankan test. Tidak ada regression suite untuk tenant isolation, checkout, payment, buffer, webhook, atau scheduler
Lokasi—
TargetTest framework + suite untuk area kritis: functionRouteBot, verifyToken, checkout flow, payment webhook, buffer/dedup, scheduler
RisikoFoundation — tanpa test, semua refactor di atas berisiko
Prasyarat— (prasyarat untuk prioritas 1–5)

Prioritas 7 — Track lockfile dan upgrade dependency (foundation)

AspekDetail
Masalahpackage-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/
TargetTrack lockfile, set working-directory, upgrade dependency secara terukur
RisikoFoundation — install tidak reproducible, deploy tidak deterministik
Prasyarat—

Detail issue terpilih

Auto-paid dari manual proof

service/order.js — proofTransactionHandler:

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

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

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

js
const io = new Server(server, {
  cors: { origin: "*", credentials: true },
  allowEIO3: true,
});

Socket handshake tidak authenticated dan event newMessage dibroadcast global tanpa tenant room.

Fix:

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

js
await ConnectDb();  // fail-fast
server.listen(env.port, () => { ... });

Correctness issues (tidak urut prioritas)

IssueLokasi
Product dipakai tanpa import di salah satu branch getProductCatalogservice/product.js
Order dipakai saat model import bernama Ordersconstraint flow
getServicesShipping dereference order sebelum null checkservice/order.js
qtyProduct dapat undefined pada shipping update fallbackservice/order.js
payment_method dideklarasikan dua kali di order schemamodels/orders.js:203,255
Banyak field order memakai require, bukan Mongoose requiredmodels/orders.js
image.trim() di worker gagal untuk null/non-stringscheduler/worker/worker.js
time_reply tidak divalidasicontrollers/mainController.js
Dedup map tidak memiliki TTL cleanupcontrollers/mainController.js
Error/not-found response chatbot tidak konsisten dengan HTTP status normalcontroller
Booking tool belum diimplementasikantools/booking/tools.js

Performance dan observability

IssueCatatan
Katalog dan history order dapat dimuat tanpa limit/projectionPerformance
Query utama minim indexPerformance
Semua specialist wrappers dibangun setiap requestPerformance
Token/cost tracking hanya mencakup sebagian call OpenAIObservability
Log dapat memuat PII, message history, media URL, dan payment payloadSecurity
Health endpoint tidak memeriksa MongoDBObservability

Delivery dan testing

IssueCatatan
npm test belum menjalankan testCI gate tidak ada
Tidak ada regression suiteTenant isolation, checkout, payment, buffer, webhook, scheduler
package-lock.json di-ignoreInstall tidak reproducible
Workflow install tidak menetapkan deployment working directoryCI
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