diff --git a/docs/CODEX_HANDOFF.md b/docs/CODEX_HANDOFF.md index b7b8d57..0226106 100644 --- a/docs/CODEX_HANDOFF.md +++ b/docs/CODEX_HANDOFF.md @@ -1,136 +1,326 @@ # Codex Handoff -Snapshot tanggal: `2026-05-21` +Snapshot tanggal: `2026-05-22` -Dokumen ini dipakai untuk mempercepat pindah sesi kerja Codex tanpa perlu audit ulang dari nol. +Dokumen ini adalah ringkasan kondisi terakhir BizOne Portal supaya sesi Codex berikutnya bisa lanjut tanpa bongkar ulang dari nol. ## Ringkasan Cepat -- Repo: `bizone-portal` -- Branch aktif terakhir yang dicek: `main` -- Worktree tidak bersih -- Backend build: sukses -- Frontend build: sukses, dengan warning CSS compatibility -- Production readiness: belum siap, masih banyak blocker operasional dan integrasi +- Repo lokal: `/home/wira/work/codex/BizOne-portal` +- Repo server: `/srv/bizone-web` +- Branch: `main` +- Domain production: `https://portal.bizone.id` +- Backend production: `127.0.0.1:3001` via systemd `bizone-backend` +- Frontend production: `127.0.0.1:3000` via systemd `bizone-frontend` +- Meta webhook URL: `https://portal.bizone.id/api/webhooks/whatsapp` +- Midtrans notification URL: `https://portal.bizone.id/api/wallet/midtrans/notification` -## Worktree Saat Snapshot - -Hasil `git status --short --branch` saat handoff dibuat: +## Commit Terakhir Lokal ```text -## main...origin/main - M deploy/debian12/app.env.example -?? public/ +cc819ad Accept Midtrans dashboard notification tests +96b326e Fix roles page locale label typing +5144207 Prepare BizOne portal production wallet and UI +36be860 Add Codex handoff and update public assets +46ea32c Refresh session in contacts API proxy routes ``` -File untracked yang terlihat: +Catatan penting: -- `public/favicon.ico` -- `public/bizone.png` +- Push dari environment Codex lokal gagal karena remote HTTPS butuh credential interaktif. +- User perlu menjalankan `git push origin main` dari terminal interaktif yang punya akses Git. +- Server sudah pernah melihat commit `96b326e`, tapi commit `cc819ad` perlu dipastikan sudah masuk remote/server sebelum test ulang Midtrans dashboard. -Jangan asumsi file di atas aman untuk dihapus. Verifikasi dulu apakah memang asset baru yang ingin dipakai. +## Status Git Auth -## Struktur Kerja Utama +Remote saat terakhir dicek: -- `backend/`: NestJS + TypeScript -- `frontend/`: Next.js 15 app router -- `prisma/`: schema dan migration -- `deploy/debian12/`: artefak deploy production Debian 12 -- `PRODUCTION_CHECKLIST.md`: sumber status readiness production +```text +origin https://git.iptek.co/wirabasalamah/BizOne-portal.git +``` -## Status Build Terakhir +Push dari Codex gagal dengan: -Perintah yang sudah diverifikasi: +```text +fatal: could not read Username for 'https://git.iptek.co': No such device or address +``` + +Solusi user: ```bash -cd backend && npm run build -cd frontend && npm run build +cd /home/wira/work/codex/BizOne-portal +git push origin main ``` -Hasil: - -- Backend compile sukses -- Frontend compile sukses dan generate static pages sukses - -Warning frontend yang masih ada berasal dari `autoprefixer` pada [frontend/src/app/globals.css](/Users/wirabasalamah/Documents/Codex/bizone-portal/frontend/src/app/globals.css): - -- line `3868` -- line `4681` -- line `7788` -- line `8399` -- line `8755` - -Masalahnya penggunaan nilai seperti `start` atau `end` pada properti yang lebih aman memakai `flex-start` atau `flex-end`. - -## Status Production Checklist - -Snapshot dari [PRODUCTION_CHECKLIST.md](/Users/wirabasalamah/Documents/Codex/bizone-portal/PRODUCTION_CHECKLIST.md): - -- Selesai: `35` -- Parsial: `5` -- Belum selesai: `39` - -Area blocker utama sebelum production: - -- staging final belum ada -- test Meta end-to-end belum dilakukan -- audit permission belum selesai -- CI/CD deploy flow belum final -- monitoring dan alerting belum aktif -- backup dan restore drill belum dibuktikan -- full smoke test lintas modul belum selesai - -## Dokumen yang Perlu Dibaca Dulu - -Urutan baca yang paling efisien untuk sesi baru: - -1. [PRODUCTION_CHECKLIST.md](/Users/wirabasalamah/Documents/Codex/bizone-portal/PRODUCTION_CHECKLIST.md) -2. [README.md](/Users/wirabasalamah/Documents/Codex/bizone-portal/README.md) -3. [deploy/debian12/README.md](/Users/wirabasalamah/Documents/Codex/bizone-portal/deploy/debian12/README.md) -4. [backend/package.json](/Users/wirabasalamah/Documents/Codex/bizone-portal/backend/package.json) -5. [frontend/package.json](/Users/wirabasalamah/Documents/Codex/bizone-portal/frontend/package.json) - -## Command Cepat Untuk Re-Orientasi +Atau pakai username: ```bash -git status --short --branch -sed -n '1,220p' PRODUCTION_CHECKLIST.md -cd backend && npm run build -cd frontend && npm run build +git push https://wira.irawan%40gmail.com@git.iptek.co/wirabasalamah/BizOne-portal.git main ``` -Kalau perlu cek warning CSS: +Jangan taruh token di command kalau tidak perlu, karena bisa masuk shell history. + +## Fitur Besar Yang Sudah Masuk + +- Redesign login, dashboard shell, sidebar, card spacing, dan halaman utama dashboard. +- Dual bahasa `EN/ID` diperluas ke banyak halaman. +- Global search di header. +- Notification center di header. +- Help page dari icon `?`. +- Profile menu dan halaman profile user. +- Wallet/saldo untuk broadcast. +- Minimum top up `Rp50.000`. +- Preset top up `50rb`, `100rb`, `250rb`, `500rb`, `1jt`. +- Harga broadcast sementara `Rp500` per pesan. +- Broadcast hanya cek saldo sebelum kirim, saldo dipotong setelah worker memproses pesan sukses. +- Integrasi Midtrans Snap API awal. +- Midtrans payment methods: `gopay`, `shopeepay`, `bank_transfer`, `credit_card`. +- Midtrans notification webhook. +- Production deploy docs untuk `portal.bizone.id`. +- Root `/` redirect ke `/login`, tidak lagi menampilkan starter landing page. + +## Midtrans Status Terakhir + +URL final yang harus dipakai di dashboard Midtrans: + +```text +https://portal.bizone.id/api/wallet/midtrans/notification +``` + +Server internal test sudah pernah menghasilkan response ini setelah route aktif: + +```json +{"message":"Invalid Midtrans notification signature.","error":"Bad Request","statusCode":400} +``` + +Itu normal untuk payload kosong. + +Dashboard Midtrans test notification mengirim payload seperti: + +```json +{ + "transaction_status": "settlement", + "status_code": "200", + "signature_key": "...", + "payment_type": "gopay", + "order_id": "payment_notif_test_G311975080_...", + "merchant_id": "G311975080", + "gross_amount": "105000.00" +} +``` + +Karena `order_id` test tidak ada di tabel `payment_orders`, backend awalnya menolak. Commit `cc819ad` memperbaiki ini: + +- Signature tetap divalidasi. +- Kalau `order_id` diawali `payment_notif_test_` dan `merchant_id` cocok dengan `MIDTRANS_MERCHANT_ID`, backend return `200`. +- Transaksi asli tetap wajib punya payment order. + +Setelah commit `cc819ad` dipull ke server, jalankan: ```bash -nl -ba frontend/src/app/globals.css | rg '\b(start|end)\b' +cd /srv/bizone-web + +git pull + +set -a +source .env +set +a + +cd backend +NODE_ENV=development npm ci +npm run db:generate +npm run build +npm run db:migrate:deploy +sudo systemctl restart bizone-backend ``` -## Prioritas Kerja Berikutnya +Lalu test: -Urutan yang paling masuk akal untuk dilanjutkan: +```bash +curl -i -X POST https://portal.bizone.id/api/wallet/midtrans/notification \ + -H "Content-Type: application/json" \ + -d '{}' +``` -1. Rapikan warning CSS di `frontend/src/app/globals.css` lalu build ulang frontend. -2. Audit perubahan di `deploy/debian12/app.env.example` dan putuskan apakah mau di-commit. -3. Putuskan status folder `public/` apakah asset final atau artefak lokal. -4. Pecah `PRODUCTION_CHECKLIST.md` menjadi task implementasi teknis yang bisa dikerjakan satu per satu. -5. Fokuskan sprint berikut ke salah satu jalur: - - jalur infra: staging, backup, monitoring, CI/CD - - jalur product integration: Meta webhook dan outbound live test - - jalur app hardening: permission audit dan smoke test +Payload kosong boleh tetap `400 Invalid Midtrans notification signature`; test dashboard Midtrans yang signed harus `200` setelah commit `cc819ad` aktif di server. -## Catatan Kerja +## Midtrans Env Production/Server -- Root `package.json` hanya dipakai untuk dependency Prisma bersama. -- Backend local run yang disarankan oleh repo: `cd backend && npm run local` -- Frontend local run: `cd frontend && npm run dev` -- Deploy production yang didokumentasikan menargetkan `https://portal.bizone.id` -- Ada perbedaan konsep URL backend di dokumen deploy: browser-facing route memakai `/api`, sementara backend internal juga diekspos lewat `/backend-api`. Jangan ubah ini tanpa cek alur Next route handler lebih dulu. +User menunjukkan dashboard Midtrans `Environment Sandbox`, tapi key formatnya tetap: -## Definition Of Done Untuk Sesi Lanjutan +```text +Mid-client-... +Mid-server-... +``` -Sesi baru sebaiknya selalu menutup kerja dengan: +Jadi jangan lagi mengasumsikan sandbox pasti `SB-Mid-*` untuk akun ini. Yang penting key di `/srv/bizone-web/.env` sama dengan dashboard Midtrans yang dipakai. -- build ulang area yang diubah -- update dokumen status bila ada perubahan readiness -- catat blocker nyata, bukan asumsi -- pastikan `git status` jelas sebelum handoff berikutnya +Contoh env server saat terakhir dibahas: + +```dotenv +MIDTRANS_ENV=sandbox +MIDTRANS_SERVER_KEY=Mid-server-... +MIDTRANS_CLIENT_KEY=Mid-client-... +MIDTRANS_MERCHANT_ID=G311975080 +MIDTRANS_ALLOWED_PAYMENT_TYPES=gopay,shopeepay,bank_transfer,credit_card +``` + +Jangan commit `.env`. + +## Server Deploy Notes + +Jika backend build gagal dengan: + +```text +sh: 1: tsc: not found +``` + +Penyebab: `NODE_ENV=production npm ci` tidak memasang devDependencies. Pakai: + +```bash +NODE_ENV=development npm ci +``` + +Jika backend build gagal dengan banyak error Prisma seperti: + +```text +Property 'sql' does not exist on type 'typeof Prisma' +Module '@prisma/client' has no exported member 'Campaign' +``` + +Penyebab: Prisma client stale setelah `npm ci`. Urutan benar: + +```bash +cd /srv/bizone-web +npm install + +cd backend +NODE_ENV=development npm ci +npm run db:generate +npm run build +``` + +Setelah build: + +```bash +npm run db:migrate:deploy +sudo systemctl restart bizone-backend +``` + +Cek route wallet: + +```bash +sudo journalctl -u bizone-backend -n 200 --no-pager | grep -i wallet +``` + +Harus ada: + +```text +WalletController {/api/wallet} +Mapped {/api/wallet/topups/midtrans, POST} +WalletMidtransWebhookController {/api/wallet/midtrans} +Mapped {/api/wallet/midtrans/notification, POST} +``` + +## Nginx Production + +Config nginx yang user kirim sudah benar untuk Midtrans dan Meta: + +```nginx +location /api/webhooks/ { + proxy_pass http://127.0.0.1:3001/api/webhooks/; +} + +location /api/wallet/midtrans/ { + proxy_pass http://127.0.0.1:3001/api/wallet/midtrans/; +} + +location /backend-api/ { + proxy_pass http://127.0.0.1:3001/api/; +} + +location / { + proxy_pass http://127.0.0.1:3000; +} +``` + +Kalau public endpoint `502`, cek backend/frontend service. Kalau internal backend `404`, berarti backend build belum memuat route baru. + +## Credential Dev/Admin + +Default seed admin: + +```text +Email: admin@bizone.id +Password: ChangeMe123! +``` + +Jika server login gagal, reset seed: + +```bash +cd /srv/bizone-web/backend +set -a +source ../.env +set +a +npm run seed:admin +``` + +Setelah production login pertama, ganti password dan aktifkan 2FA. + +## Files Penting Yang Diubah + +Backend: + +- `backend/src/wallet/*` +- `backend/src/app.module.ts` +- `backend/src/campaigns/campaigns.service.ts` +- `backend/src/campaigns/campaigns.controller.ts` +- `backend/src/common/permission.guard.ts` +- `backend/src/auth/*` +- `prisma/schema.prisma` +- `prisma/migrations/0015_wallet/migration.sql` + +Frontend: + +- `frontend/src/app/dashboard/wallet/page.tsx` +- `frontend/src/components/wallet-topup-form.tsx` +- `frontend/src/components/dashboard-shell.tsx` +- `frontend/src/components/global-search-button.tsx` +- `frontend/src/components/notification-center.tsx` +- `frontend/src/components/profile-menu.tsx` +- `frontend/src/components/profile-forms.tsx` +- `frontend/src/app/dashboard/help/page.tsx` +- `frontend/src/app/dashboard/profile/page.tsx` +- `frontend/src/app/page.tsx` +- `frontend/src/app/globals.css` +- banyak halaman dashboard untuk spacing dan dual bahasa. + +Deploy docs: + +- `deploy/debian12/app.env.example` +- `deploy/debian12/nginx.portal.bizone.id.conf` +- `deploy/debian12/README.md` +- `PRODUCTION_CHECKLIST.md` +- `PRODUCTION_READINESS.md` +- `docs/production-server-checklist.md` + +## Next Steps Paling Dekat + +1. Push commit `cc819ad` ke remote. +2. Pull di server. +3. Rebuild backend dengan urutan Prisma yang benar. +4. Restart `bizone-backend`. +5. Test ulang Midtrans notification URL dari dashboard Midtrans. +6. Rebuild frontend jika ada perubahan UI baru. +7. Jalankan smoke test: + - buka `https://portal.bizone.id` + - login admin + - buka wallet + - buat top up Midtrans + - cek payment order dan saldo setelah notification sukses. + +## Catatan Keamanan + +- `.env` sudah di-ignore dan tidak ikut commit. +- Beberapa credential pernah muncul di chat/screenshot, jadi untuk production live sebaiknya rotate credential final. +- `deploy/debian12/app.env.example` sudah dibersihkan agar hanya berisi placeholder.