go
Catatan teknis seputar web development, DevOps, dan integrasi AI.
10 artikel
- 05.04backend
Enforcement RBAC Bidang: Gerbang Middleware dan Filter IN
Enforcement scope bidang di Go: middleware di gerbang, filter IN di repository, dan subtest yang membaca seperti policy keamanan.
TL;DR: Gerbangnya dijaga middleware ResolveBidang yang nempelin scope bidang ke context abis JWT dicek, jadi handler tinggal baca aja. Di repo filternya pakai sqlx.In buat kategori dan IS NULL OR = buat announcements, route global sama CMS dipisah biar gampang diaudit. Repo sengaja fail-open kalau modul kosong, tapi tetap aman karena semua route admin wajib lewat gerbang dan dikunci subtest t.Run.
#go#mysql#security - 04.55backend
RBAC Dua Sumbu: Role untuk Aksi, Bidang untuk Data
Role menentukan aksi, bidang menentukan data. Catatan implementasi scope resolver fail-closed di Go: ModulesFor, ResolveBidang, dan jebakan NULL.
TL;DR: Portal lintas dinas bikin pusing karena role admin doang nggak cukup buat batasin data per bidang. Akhirnya misahin konsepnya, role buat aksi dan kolom bidang buat filter data biar nggak meledak aturan izinnya. Sistemnya dibikin fail-closed jadi kalau bidang nggak dikenal ya nggak dapet data apa pun, aman deh.
#go#mysql#security - 04.21backend
Export XLSX dari Go dan Tebakan Binary yang Meleset
openapi-fetch ternyata punya parseAs blob. Yang bikin gesek itu typing format: binary dan alur unduhan DOM.
TL;DR: Awalnya dikira openapi-fetch nggak bisa handle file binary jadi pakai fetch manual aja. Ternyata bisa return blob, cuma typing-nya jadi string jadi tetep ribet plus urusan download-nya emang kerjaan DOM. Di backend export-nya pake excelize, filter modul ketat dan kalau data kosong tetep ngasih file dengan header biar nggak error.
#go#excelize#openapi-fetch - 04.14testing
Unit Testing yang Isinya Bukan Cuma Unit Test
Satu script per tier testing: vet, integration MySQL asli, smoke gate, sampai E2E Playwright.
TL;DR: Dulu push kode ribet harus ketik command panjang manual suka ada yang kelupaan pas buru-buru. Sekarang semua diringkas jadi empat script backend frontend e2e sama smoke yang otomatis berhenti kalau ada yang gagal. Ditambah ada panduan jelas di README kapan harus jalanin tes yang mana jadi nggak nebak-nebak lagi.
#testing#bash#go - 03.30backend
Re-Parent Satu Kategori, Tree-nya Ikut Nyiklus
Validasi parent yang cuma ngecek self-parent itu ilusi: re-parent ke keturunan sendiri diam-diam bikin siklus, dan MySQL 5.7 nggak punya CTE cycle avoidance.
TL;DR: Mindahin A jadi anak B bikin siklus karena B itu anaknya A, validasi lama cuma cek parent bukan diri sendiri. Sekarang validateCategory manjat ngecek leluhur satu-satu pakai GetCategoryByID dan errors.Is sampai root, kalau id sama ya ditolak. Biar gak muter terus kalau data lama udah rusak, jalurnya dibatasin cuma sepuluh level aja.
#golang#mysql#backend - 03.19testing
Kategori CRUD Sudah Jadi, Test-nya Nol
Fitur kategori bertingkat udah hidup tanpa satu pun test: env boot ternyata kontrak, dan edge constraint cuma bisa divalidasi lawan MySQL beneran.
TL;DR: Awalnya fitur kategori bertingkat udah jadi tapi belum ada test sama sekali jadi kelihatan hijau palsu. Terus gue benerin TestHealthEndpoint yang gagal boot karena env belum di-set pakai Setenv plus nambah tiga test integrasi buat cek constraint hapus parent/child di MySQL asli. Testnya dikunci tag integration dan harus jalan pakai -p 1 biar nggak rebutan database barengan.
#golang#testing#mysql - 12.50devops
Config Bilang 40 Mbps, Speed Test Bilang 5
Rumus konversi Mbps yang diingat salah bikin cap 3proxy cuma 5 Mbps, error 8 kali lipat. Manual bilang bits, speed test yang buktikan.
TL;DR: Bandwidth cap di 3proxy cuma dapet 5 Mbps padahal config nulis 40. Ternyata bandlim pakai satuan bits per detik, bukan bytes, jadi nilai 5.000.000 harusnya 40.000.000. Pelajarannya: baca manual dulu daripada percaya rumus hafalan, sambil dirapiin juga dashboard GoAccess biar tabel URL langsung kelihatan.
#3proxy#bandwidth#networking - 12.31devops
Dashboard Dibuang, Dipanggil Balik
Buang stack GoAccess DIY, pindah ke admin bawaan 3proxy mode counters-only, lalu sadar pertanyaan berubah: GoAccess dipanggil balik di belakang nginx.
TL;DR: Penulis sempat hapus GoAccess dan ganti pakai admin service bawaan 3proxy, cuma tiga baris config. Ternyata counter bawaan cuma jawab "berapa traffic", nggak bisa nunjukin URL mana yang paling boros bandwidth. Jadi GoAccess balik lagi buat breakdown per-URL, sekarang dua-duanya dipakai sesuai kebutuhan masing-masing.
#3proxy#goaccess#nginx - 02.43seo
Sitemap Isi 9.200 Artikel, Google Cuma Indeks Homepage
Pelajaran dari audit situs berita dengan 9.200 artikel di sitemap tapi hampir nol yang terindeks: bedah crawl demand, internal linking, sampai jalur perbaikannya.
TL;DR: Audit sebuah situs berita dengan 9.200 artikel di sitemap menemukan hanya sekitar 44 artikel yang pernah kebagian implessi Google, dan angkanya turun ke nol untuk bulan terbit terbaru. Pemeriksaan teknis bersih semua, jadi masalahnya ada di crawl demand: volume terbit yang jauh melampaui sinyal otoritas plus arsip yang kehilangan jalur tautan internal. Perbaikannya editorial: turunkan volume, bangun tautan kontekstual ke konten lama, pangkas sitemap news, dan cari validasi eksternal.
#seo#google-search-console#crawl-budget