Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
503 artikel
- 06.25backend
Scope Pengumuman: Menulis Nilai vs Mengubah Baris
Dua fungsi otorisasi pengumuman per bidang: resolveBidang untuk nilai baru, canManage untuk baris eksisting, NULL sebagai global.
TL;DR: Dulu semua admin bebas ubah pengumuman apa aja, sekarang dibatasi per bidang biar nggak tabrakan. Dibuat dua fungsi misah, resolveBidang buat nentuin boleh nulis ke bidang apa dan canManage buat ngecek boleh ngedit baris punya siapa. Konten global ditandai NULL bukan ALL, cuma admin ALL yang bisa ngatur, dan ceknya dipasang sebelum data keubah.
#go#mysql#security - 06.25backend
Atribut Entitas Extensible: Kolom TEXT Berisi JSON
Menambahkan kolom attributes TEXT berisi JSON untuk atribut dinamis per modul, dan validasi pindah ke aplikasi.
TL;DR: Daripada nambah kolom yang ujungnya banyak NULL, mending bikin satu kolom attributes tipe TEXT buat nampung JSON fleksibel. Soalnya di MySQL lama kolom TEXT ini nggak ngecek validasi JSON sama sekali, jadi harus divalidasi manual di aplikasi biar nggak ada data ngaco. Buat sekarang ini solusi paling simpel dan rapi, kalau nanti butuh filter serius baru dipromosi jadi kolom beneran.
#go#mysql#json - 05.35backend
COALESCE di Pintu API: Titip Nilai ALL di Kueri, Bukan di Handler
Super-admin tanpa bidang mengembalikan NULL dari database. Satu COALESCE di kueri login membuat kontrak API tetap total dan lencana admin tampil pas.
TL;DR: Kirain bug sepele soal lencana bidang super-admin yang hilang, ternyata DB ngasih NULL dan token lama belum punya kolom itu. Daripada nambal di tiap handler Go, mending sekalian beres di query pakai COALESCE biar selalu balikin 'ALL'. Di frontend tipenya dibikin opsional biar token lama nggak error, lencana juga cuma muncul kalau bidangnya bukan 'ALL'.
#mysql#golang#typescript - 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.19testing
Test E2E yang Bisa Dipanggil Ulang Pakai Nama Modul
Lupa nama file spec tiap mau nge-test satu halaman? Resolver tipis plus ledger cakupan yang boleh jujur.
TL;DR: Daripada pusing cari file test peta manual, sekarang tinggal pakai run_page.sh buat ngejalanin modulnya langsung. Dia cuma nerjemahin nama jadi file spec Playwright, jadi simpel banget. Terus ada INDEX.md yang jujur nyatet modul mana udah ada test mana belum.
#testing#playwright#e2e - 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