Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
502 artikel
- 11.21backend
Filter bidang tanpa menelan baris global
Nambah parameter ?bidang= di endpoint publik bukan cuma soal satu klausa WHERE. Baris global harus tetap tayang di semua scope.
TL;DR: Awalnya filter bidang cuma pakai WHERE biasa jadi konten global yang NULL malah kelewat nggak muncul. Akhirnya querynya dibenerin jadi ikut nampilin yang NULL sama ALL terus ditambah validasi 400 kalau bidangnya ngaco. Sekalian cache key ditambahin bidang dan teks intro pilar dipindah ke tabel settings biar gampang diatur.
#go#mysql#api - 10.47frontend
Pindah Route /wisata: 308, Menu Tak Tertimpa
Rename route publik itu tiga langkah sekaligus: pindah folder route, redirect 308, dan migrasi baris menu yang hormati editan admin.
TL;DR: Kukira mindahin route wisata ke pariwisata tinggal git mv doang, ternyata harus tiga hal bareng biar nggak berantakan. Di Nextjs dipasang redirect 308 wildcard jadi bookmark lama tetap nyambung tanpa ngubah method POST. Di database migrasi cuma geser data menu yang masih bawaan, yang udah diedit admin nggak ditimpa.
#nextjs#redirect#mysql - 21.37testing
Guard yang Bilang Tidak dan Jalan Pulang Migrasi
Commit test-only: pembuktian guard global via httptest dan jalur down migrasi di MySQL 5.7 beneran mundur lalu pulih.
TL;DR: Ternyata file down migration sama middleware penolak nggak pernah ditest beneran. Sekarang guard-nya diuji pakai table-driven test, yang ALL lolos 200 tapi bidang lain kena 403 kecuali konteks kosong yang sengaja fail-open. Terus jalur down juga dibuktiin lewat tes integrasi yang nurunin migrasi ke 56 sampai kolomnya hilang lalu naik lagi sampai balik.
#go#testing#mysql - 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 - 12.58backend
Save Tanpa Perubahan Kok 404? Kala RowsAffected Menipu
Simpan form tanpa perubahan kok dibalas 404? Ternyata RowsAffected MySQL menghitung baris berubah, bukan baris cocok. Fix: cek eksistensi saat nol.
TL;DR: QA nemu bug, pencet save tanpa ubah data malah 404 padahal datanya ada. Ternyata MySQL ngitung RowsAffected itu yang beneran berubah, bukan yang kecocok, jadi kalo nilainya sama hasilnya nol dan kekira nggak ketemu. Fix-nya sekarang kalo hasilnya nol dicek dulu pake SELECT biar tau beneran nggak ada atau cuma nggak ada yang berubah.
#mysql#go#debugging - 11.31devops
Jangan Pakai URL Absolut untuk Embed Gambar Komentar Plane
Embed gambar di komentar Plane API gagal total pakai URL absolut (401). Pipeline terverifikasi: helper dalam container, node image-component, asset_id mentah.
TL;DR: Gambar di Plane emang sengaja nggak bisa dibuka lewat URL publik, makanya selalu error 401. Jadi harus bikin komentar dulu, upload file lewat helper di container plane-api, terus tempel pakai node image-component dengan src isi asset_id mentah aja. Jangan lupa ambil HTML lama dulu sebelum update biar nggak kehapus, dan ceknya lewat baca ulang komentar bukan curl anonim.
#plane#mcp#docker - 10.58backend
Jangan Percaya omitempty Saat Ekspos Kolom JSON-TEXT Publik
Kolom JSON-TEXT yang nullable tidak cukup ditutup omitempty: omitempty hanya kenal kekosongan Go, bukan NULL versi SQL. Ini cerita empat lapisan eksposnya.
TL;DR: Gue kira cukup tambah field attributes pakai omitempty, eh malah zonk karena kosong versi SQL dan Go beda. Ternyata data harus lewat empat lapis dan kuncinya di mapper yang ubah NULL, string kosong atau 'null' jadi nil. Frontend tinggal pakai ?? {} biar aman kalau fieldnya hilang.
#go#mysql#api - 09.00backend
Pindah Kategori Antar-Modul: Dua Tempat yang Diubah Sekalian
Satu UPDATE terdengar selesai. Nyatanya, mapping importer harus ikut berubah, atau data lama akan bangkit kembali di import berikutnya.
TL;DR: Gw kira mindahin kategori oleh-oleh Depok cuma butuh query UPDATE doang, ternyata bahaya kalo kodenya nggak diubah juga. Jadi gw bikin migrasi idempoten pake WHERE guard plus update moduleMap di importer go dalam satu commit biar nggak balik lagi. Soalnya DDL MySQL nggak bisa diandalkan pake transaksi, jadi guard ini yang jaga aman.
#mysql#database-migration#golang - 08.59frontend
Category Picker Salah Modul Saat Edit: Tri-State yang Benar
Dropdown kategori yang benar untuk create ternyata salah untuk edit. Tri-state moduleScope dan effect yang menunggu scope resolve.
TL;DR: Gue kira dropdown ngaco karena loading lemot, ternyata fetch-nya kecepetan sebelum tau modulnya apa. Solusinya pake tri-state buat moduleScope, jadi kalo masih undefined ditahan dulu jangan fetch. Begitu modul udah jelas baru fetch kategori, hasilnya jadi akurat nggak ketuker lagi.
#react#typescript#openapi