sql
Catatan teknis seputar web development, DevOps, dan integrasi AI.
29 artikel
- 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 - 07.30database
Kosmetik yang Memaksa Rombak Kontrak Data
Minta huruf kecil kelihatan sepele; padahal nilai enum dibandingkan literal di enforcement scope, jadi DDL, baris, konstanta, spec, dan map label pindah bareng.
TL;DR: Kirain cuma ganti huruf kapital jadi kecil, ternyata ribet karena casing itu ngaruh ke izin akses. Jadinya harus migrasi bareng-bareng di database, backend sampai frontend biar nggak error dan user kekunci. Pengecualian cuma ALL yang tetap kapital karena itu buat superadmin.
#mysql#go#migration - 07.26testing
Ketika Tabel Migrasi Berbohong di Test Integrasi Bidang
Suite hijau padahal skema test DB basi: schema_migrations cuma catat file migrasi, volume Docker lama diam-diam bawa skema lama.
TL;DR: Test ijo semua tapi gue curiga kolom bidang belum kebawa di DB beneran. Ternyata volume MySQL lama masih kepake, migrate ngeliat versi 58 jadi skip padahal skema basi. Sekarang tiap test dibersihin total pake down --volumes biar migrasi jalan dari nol dan hasilnya beneran valid.
#go#mysql#testing - 06.25backend
Set Bidang User Lain: Aksi Istimewa, Bukan Field Biasa
Hanya superadmin boleh menentukan bidang user lain; default ALL bikin 19 user lama lolos migrasi tanpa terkunci.
TL;DR: Nambah kolom bidang ke users sih gampang, yang ribet tuh nentuin siapa boleh atur scope orang lain. Akhirnya diputus cuma superadmin yang boleh set bidang lewat resolveBidang, kalau admin/editor maksa kirim bakal kena 403 tapi kalau nggak kirim tetap bisa edit field lain. Default-nya dibikin ALL biar 19 user lama nggak kekunci pas deploy dan semua aman terkunci test.
#go#mysql#security - 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