Daftar bug dan inkonsistensi yang ditemukan saat riset dokumentasi backend-go. Diurutkan per area. Status: 🔴 belum diperbaiki / 🟡 dikonfirmasi / 🟢 diperbaiki.
Konfigurasi & Koneksi
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 1 | MongoClientCrm nil — ConnectCrmDB() dikomentari, semua route _crm akan nil-pointer panic | main.go:50-53, mongo/mongo.go:64 | 🔴 |
| 2 | DB name split-brain — handler pakai const DBname="dazo", service rotator pakai config.Env.DbName. Jika .env DB_NAME diubah, rotator baca DB berbeda | handlers/environtment.go:6 vs internal/service/chat_service.go:84,112 | 🔴 |
| 3 | log.Print(mongoURI) mencetak URI beserta password ke stdout setiap startup | mongo/mongo.go:57 | 🔴 |
| 4 | Kredensial DB hardcoded di source — username, password, host ada langsung di environtment.go (gitignored tapi ada di disk) | handlers/environtment.go:11-15 | 🟡 |
| 5 | GORM/MySQL ConnectDB() dikomentari di main.go:43 — 11 model legacy + 4 handler dead code masih ada tapi tidak terpakai | main.go:43, database/database.go, handlers/auth.go dll | 🟡 |
| 6 | Route GORM era SQL masih dikomentari di routes.go:121-156 — 36 baris dead code | routes/routes.go:121-156 | 🟡 |
Auth & Middleware
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 7 | JWT algoritma tidak di-pin — keyfunc return secret tanpa cek token.Method. Algorithm confusion risk (RS256/none token bisa lolos) | middlewares/authMiddleware.go:94-96 | 🔴 |
| 8 | IP allowlist pakai header spoofable — X-Real-IP/X-Forwarded-For bisa di-set client. Tanpa reverse proxy yang menimpa, attacker bypass auth | middlewares/authMiddleware.go:62-71 | 🔴 |
| 9 | GetJwtClaims type assertion salah — c.Locals("user") simpan jwt.Claims, tapi assertion ke *jwt.Token. Akan panic at runtime bila dipanggil | utils/utils.go:67 | 🔴 |
| 10 | CORS config invalid — AllowOrigins:"*" + AllowCredentials:true = browser reject. config.Env.AllowOrigins (sudah ada) dikomentari | main.go:31,35 | 🔴 |
| 11 | 33 route _admin + _crm skip auth sepenuhnya — tidak ada network-level isolation enforcement | middlewares/authMiddleware.go:15-50 | 🟡 |
Handler — Logika & Validasi
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 12 | Dead validation check di 6 handler send — SubmitImage/Document/Audio/Video cek payload.File == "", SubmitLink cek payload.Link == "", SubmitLocation cek payload.Latitude == "" — semua assign ke errMessage lokal yang tidak pernah di-return. Field kosong lolos ke saveMessageMongo | chat_submit.go:103,153,202,251,300,349 | 🔴 |
| 13 | Response placeholder send_broadcast — return "test submit" terlihat seperti lupa diganti | handlers/broadcast.go:260 | 🟡 |
| 14 | ErrInvalidBobot dideklarasi tapi tidak pernah di-return — strategi percentage saat totalBobot == 0 fall back ke selectBySame, bukan error. Inconsisten | internal/service/chat_service.go:29, 196-199 | 🟡 |
| 15 | submitPoint tidak ada timeout/retry — pakai http.Post default. Jika WA gateway lambat, request blocking tanpa batas | handlers/chat_live.go:2828 | 🟡 |
| 16 | Tidak ada request-ID middleware — handler generate ID sendiri via GetUuid(). Tracking request lintas log sulit | handlers/chat_callback.go:3032 | 🟡 |
| 17 | ErrorHandler Fiber return 400 untuk semua error generic — tidak ada 500 untuk internal error | main.go:21-26 | 🟡 |
Model & Schema
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 18 | Duplicate bson: tag di GlobalAssignationStruct.Distribution — bson:"distribution"bson:"distribution" tanpa pemisah spasi. Go parse tag pertama, tapi typo berbahaya | models/mongo_settings.go:8 | 🔴 |
| 19 | LocationName dan LocationAddress tidak punya bson: tag — tidak di-persist ke Mongo (json only) | models/mongo_chatinbox.go:54-55 | 🟡 |
| 20 | Username punya tag gorm:"" — sisa era GORM, tidak ada bson: tag. Field dead di Mongo | models/mongo_chatinbox.go:69 | 🟡 |
| 21 | Koleksi broadcast_scedulers typo persisten — “scedulers” (harusnya “schedulers”). Merasuk ke nama collection produksi, dipertahankan untuk kompatibilitas | handlers/broadcast.go:57 + models/mongo_broadcast_sceduler.go | 🟡 |
| 22 | Field naming non-standard — IdUser, IdCs, IdGudang, Iduser, Idpaket (camelCase mix) vs store_id, chat_status (snake_case). Tidak konsisten lintas koleksi | models/*.go | 🟡 |
| 23 | Waktu disimpan sebagai string, bukan ISODate — format tidak konsisten antar handler | models/mongo_chatinbox.go:38 dll | 🟡 |
Arsitektur & DI
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 24 | Repo DI di-inject tapi tidak pernah dipakai — chatService.chatRepo/userRepo di constructor, tapi GetRotator akses Mongo langsung (chat_service.go:84,112). DI jadi dekorasi tanpa efek | internal/service/chat_service.go:21-24, 84, 112 | 🔴 |
| 25 | 3x duplikasi handler — chat_live.go + _admin.go + _crm.go hampir identik. Perubahan default harus di-propagasi manual ke 2 varian. Tidak ada shared abstraction | handlers/chat_*.go | 🟡 |
| 26 | Dead code era GORM — handlers/auth.go (Login pakai database.DB dormant), contact.go, user.go, label.go | handlers/auth.go, contact.go, user.go, label.go | 🟡 |
Deploy & CI
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 27 | PM2 first-start bug — $PROJECT_DIR_PRODUCTION dipakai di pm2 start (baris 60) tapi variabel ini GitHub vars, bukan env shell. Saat PM2 first-start (service belum ada), path resolve gagal | .github/workflows/deploy_production.yml:60 | 🔴 |
| 28 | fetch() di handlers/chat.go:95 URL hardcoded produksi https://enginemd.aplikasiwa.com/ — bukan EngineUri const. Meski dead code, kalau di-uncomment akan kirim ke URL produksi dari dev lokal | handlers/chat.go:95 | 🟡 |
Inkonsistensi API Response
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 29 | Error bisnis return 200 dengan "result": false, bukan 4xx. Hanya validasi (422), auth (401), scheduler (400/404/500) yang pakai status code non-200. Tidak ada standardisasi | handlers/*.go | 🟡 |
| 30 | broadcast/scheduler pakai status/message, endpoint lain pakai result/message. Response envelope tidak konsisten | handlers/broadcast.go:231 vs lainnya | 🟡 |
| 31 | HandleChat response result memantul payload.HandleByBot (bisa false), bukan selalu true — tidak intuitif | handlers/chat_live.go:2206 | 🟡 |
Security
| # | Bug | Lokasi | Status |
|---|---|---|---|
| 32 | Route callback_message skip auth — dipanggil WA gateway, tapi tidak ada signature verification. Siapa pun yang tahu URL bisa spoof inbound | middlewares/authMiddleware.go:49, routes.go:38 | 🔴 |
| 33 | handlers/environtment.go berisi kredensial DB plain text — gitignored tapi kalau file bocor, kredensial ter-expose | handlers/environtment.go:11-15 | 🟡 |
Status legenda
| Simbol | Arti |
|---|---|
| 🔴 | Belum diperbaiki |
| 🟡 | Dikonfirmasi / diketahui (mungkin by design, atau risiko rendah) |
| 🟢 | Diperbaiki |
Cara menambah bug baru
Saat menemukan bug baru, tambahkan ke tabel area terkait. Format:
| # | Deskripsi singkat | `file:line` | 🔴 |Jangan hapus entry yang sudah diperbaiki — ubah statusnya jadi 🟢 dan tambahkan catatan commit fix.
Hubungan dengan Tech Debt
Halaman ini mencatat bug spesifik (tempat, gejala). Halaman Tech Debt mencatat rencana pembenahan (urutan, prasyarat, strategi). Bug di sini menjadi input untuk tech debt roadmap.