chi
Catatan teknis seputar web development, DevOps, dan integrasi AI.
11 artikel
- 00.52backend
Handler Menerima %2C: chi Tidak Mendekode Path Param
Slug dengan koma pulang 404 padahal datanya ada: chi menyimpan path param terenkode dan dekoding jadi kontrak pemilik API.
TL;DR: Slug yang ada koma atau apostrof miring ternyata gagal 404 karena chi nyimpen path param masih terenkode, jadi lookup ke database nyari %2C padahal datanya ada. Solusinya simpel: bikin middleware DecodePathParams buat unescape semua path param sekali jalan. Dipasangnya lewat r.With biar jalan setelah routing tapi sebelum handler.
#go#chi#routing - 16.01backend
Status Antrean Scraper yang Jujur: dari Empty sampai Recheck
Antrean scraper dengan dua status akhir menyembunyikan empat realitas. Pemisahan empty, incomplete, error, plus worklist berbasis umur data menutup celah itu.
TL;DR: Panen data macet gara-gara status cuma ada ok dan error, jadi halaman yang sukses dimuat tapi kosong nganggur di pending terus. Nambahin retry cuma buang jatah kunjungan, ternyata masalahnya bukan jaringan. Solusinya: perbanyak status jadi empty sama incomplete, tandain pas proses jalan, terus susun daftar recheck dari umur data.
#python#scraping#state-machine - 17.07backend
Skeleton FastAPI: Kontrak Lapis, Bukan Sekadar Folder Kosong
Empat folder berisi init.py kosong ternyata memegang kontrak lapisan, unit of work per request, dan titik integrasi multi-tenant yang menjaga skeleton tetap sehat.
TL;DR: Bikin empat folder kosong buat DemandScope keliatan males banget, padahal itu kontrak per lapisan biar logika nggak bocor. Commit-nya pake dependency yield, jadi request gagal auto rollback dan tenant sama user kebikin atomik. Multi-tenancy diatur via JWT, batas bcrypt dijaga Pydantic, terus NoopSource tinggal disambung pas butuh aja.
#fastapi#python#jwt - 16.00database
Kategori Hapus Lunas: Jebakan State Machine di Layer Database
Menghapus kategori ternyata bukan sekadar ganti DELETE jadi UPDATE. Predikat, RowsAffected, scope guard restore, dan cache ikut jadi tanggung jawab.
TL;DR: Kirain hapus kategori tinggal ganti DELETE jadi UPDATE doang ternyata ribet banget. Semua query lama harus ditambahin filter deleted_at IS NULL biar sampah nggak bocor ke dropdown atau list. Buat delete sama restore harus cek RowsAffected biar bisa kasih 404 dan jangan lupa flush cache biar datanya langsung muncul lagi.
#go#mysql#sql - 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 - 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 - 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 - 21.33backend
Satu Query Param, Tiga Lapis: Filter ?module= yang Aman
Nambah filter ?module= bukan cuma urusan WHERE: validasi 400 di handler, subquery parameterized, dan cache key per kombinasi filter.
TL;DR: Cachenya awalnya cuma mappoints:all jadi kalau filter module cuma ditempel di SQL, data bisa ketuker parah. Makanya dibikin tiga lapis pertahanan biar aman. Validasi dulu kalau modulnya ngaco langsung 400, query-nya pakai parameterized, dan cache key-nya dipisah sesuai filter.
#go#api#caching - 15.57backend
Saat Saya Berhenti Memisahkan Kode Berdasarkan Lapisan Teknis
Commit d7f02b2 memperkenalkan aturan wajib vertical slice architecture dan 4-tier testing: setiap fitur dibangun end-to-end dalam satu iterasi, bukan layer-by-layer horizontal. Hasilnya development lebih cepat, bug tertangkap di layer murah via Testcontainers, dan isolasi fitur bersih tanpa efek samping.
TL;DR: Awalnya gue kira pisah kode per layer itu rapi, eh pas fitur nambah malah pusing karena ubah DB dikit API bisa error. Sekarang pakai vertical slice jadi satu fitur ngumpul dari migrasi sampai frontend, lebih aman nggak merembet kemana-mana. Testingnya dibagi empat level pakai Testcontainers dan Playwright buat alur kritis, debuggingnya juga wajib urut biar nggak asal tebak.
#vertical-slice-architecture#testing#testcontainers