Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
502 artikel
- 13.18backend
Pengaduan Lahir Tanpa Jejak: Timeline yang Kosong Sejak Awal
Timeline pengaduan kosong bukan bug tampilan. Baris history pertamanya memang tidak pernah di-INSERT, karena fungsi kembar CreateRegistration dan CreateReport
TL;DR: Buka timeline pengaduan di dashboard admin kosong padahal laporan udah masuk, kirain query-nya error. Ternyata pas dicek DB emang baris awal history dari NULL ke pengajuan gak pernah dibikin, beda sama fitur pendaftaran yang udah bener. Akhirnya diperbaiki pakai transaksi biar laporan dan history kecreate barengan plus ditambahin test biar gak kejadian lagi.
#golang#mysql#audit-trail - 13.16testing
Gate yang Dites dari Luar: Submit Tanpa Pilar Nggak Sampai Server
Nulis test e2e yang assertion-nya bukan isi halaman, tapi jumlah request yang keluar: form pendaftaran tanpa pilar harus diblokir di klien. Plus satu edge tan
TL;DR: Form daftar layanan wajib pilih pilar, kalau kosong harus keblok di browser bukan server, jadi test Playwright ngecek error muncul dan request gak kekirim sama sekali. Agak ribet karena harus login dev dulu, beresin wizard, isi semua field kecuali pilar baru submit. Sekalian ada fix filter tanggal biar data hari ini tetap muncul pas pilih rentang hari ini.
#playwright#testing#e2e - 12.20frontend
Label yang Bisa Bohong: Saat Vocab Status Hidup di Dua Tempat
Satu lib jadi rumah label enam status; nilai tak dikenal tampil jujur sebagai teks mentah dengan gaya netral, bukan label salah.
TL;DR: Gue liat status di halaman publik cuma jadi teks polos gara-gara kamusnya masih versi lama 4 status padahal backend udah 6. Akhirnya kamus dipusatin di lib layanan-flow biar jadi satu sumber kebenaran dan dijaga TypeScript biar nggak ketinggalan. Kalau ada status asing tinggal fallback netral jadi tetap jujur nggak ngarang label.
#react#typescript#ui - 12.20frontend
Counter Per-Status di Stats Admin: Angka dari Kontrak
Kartu dan tab dashboard admin KotaPortal akhirnya punya angka dari counter per-status stats admin, aditif dan bebas trik UI.
TL;DR: Dashboard KotaPortal ngaco karena API cuma ngirim dua counter jadi banyak kartu kosong melompong. Akhirnya ditambahin enam counter snapshot baru tanpa ngerusak kontrak lama terus frontend dirapiin lewat codegen biar angka konsisten. Counter-nya juga nurut scope bidang dan badge antrean direfresh tiap menit pake polling aja.
#go#api#openapi - 11.19frontend
Stepper Status Tiket yang Jujur: Belajar dari Array History
Stepper tiket nggak nebak lagi dari satu string status: waktunya diambil dari riwayat transisi, satu baris pertama per status.
TL;DR: Awalnya stepper tiket cuma nebak progres dari satu string status jadi sering ngaco. Sekarang progress diambil dari array history pakai Map buat nyimpen timestamp pertama tiap status, dengan empat tahap aja dan fallback kalau data kosong. Form pilar juga dibenerin pakai as const biar TypeScript ngejaga inputnya tetep valid.
#react#typescript#ux - 11.16frontend
Mirror Peta Transisi Status di Frontend
Peta transisi status di frontend bikin opsi mustahil mati sebelum diklik. Backend tetap satu-satunya penjaga; kodenya cuma union type dan satu map.
TL;DR: Awalnya flowStageOf isinya ternary berlapis dan tombol admin masih nawarin status yang udah gak ada sampai backend nolak pakai 409. Akhirnya dibikin union type buat enam status plus map NEXT_STATUSES biar UI cuma nyalain opsi yang boleh, sisanya biar backend yang mutusin. Ternary diganti switch, label dipisah, aria-disabled ternyata cuma semantik jadi validasi tetap dobel di handler sama backend.
#frontend#typescript#state-machine - 10.18devops
Login Kilat Dev yang Nggak Jadi Pintu Belakang
Otomatisasi login development lewat submit form asli plus guard env fail-closed: cepat tanpa menyisakan pintu belakang di production.
TL;DR: Capek login manual 30 kali pas ngetest, bypass token malah bikin UI error dan test jadi flaky. Solusinya tetap otomatisin submit form asli tapi dikunci ketat pakai environment variable opt-in biar defaultnya mati. User dev-nya juga harus role terbatas dan data terpisah biar aman nggak kebuka di production.
#security#authentication#testing - 10.00backend
Counter yang Bohong: Filter Tanggal dan Dua Jam
Counter bilang 12, tabel bilang 15: filter tanggal ngitung jam yang salah. Perbaikannya hitung dari riwayat transisi, bukan kolom status.
TL;DR: Awalnya angka di dashboard admin nggak sinkron, header bilang 12 tapi tabel malah 15. Ternyata bukan cache error, tapi querynya salah pakai created_at padahal harusnya ngitung dari riwayat changed_at. Akhirnya querynya diganti join ke ticket_history biar hitungannya jujur sesuai kapan status beneran berubah.
#postgresql#dashboard#reporting - 09.34backend
Loncat Status, Email Ganda, dan Batas Transaksi
Satu tiket loncat dua status, warga dapat email dobel: akarnya dual-write. Perbaikannya peta transisi, 409, riwayat, dan outbox.
TL;DR: Awalnya tiket komplain bisa loncat status dan ngirim dobel email gara-gara dual-write bug. Ternyata ngirim email langsung di dalam transaksi itu rawan ghost email kalo rollback atau crash. Akhirnya dibenerin pake peta transisi yang nolak pake 409, riwayat append-only satu transaksi, dan outbox biar email kekirim eventual lewat worker.
#postgresql#http#outbox