Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 03.19backend
Guard yang Menolak Sebelum Payload Diperiksa
Modul Kelembagaan akhirnya punya pemilik: satu guard di lapisan service, satu status 403 tetap, dan satu grup navigasi yang ikut berpindah.
TL;DR: Guard menolak akses sebelum memeriksa payload. Fungsi guardWrite memeriksa bidang pemanggil dan menolak jika bukan olahraga atau global. Peta kepemilikan modul sekarang melayani tiga hal sekaligus.
#go#rbac#authorization - 11.42backend
Satu-satunya Modul Admin Tanpa Write Guard
Audit modul admin menemukan tujuh dari delapan sudah punya write guard per bidang. Satu tertinggal, dan menutupnya berarti menyalin pola modul sebelah.
TL;DR: Tabel audit proyek menunjukkan modul service types belum punya write guard. Modul ini diperbarui dengan menambahkan guard scope. Perbaikan ini membuat akses tulis lebih aman.
#go#security#rbac - 05.56testing
Menjaring baris E2E yang bocor dengan test.afterAll
Jaring pengaman test.afterAll membersihkan baris E2E yang bocor saat test timeout: identitas unik per worker, sapuan terbatas, dan delete idempoten.
TL;DR: Di KotaPortal, grid announcements kebanjiran baris sisa karena test E2E-nya timeout jadi DELETE nggak pernah jalan. Fixnya nambahin hook afterAll di spec informasi-crud: login sekali, terus hapus baris berjudul persis judul run atau yang lebih tua dari awal run, plus delete dua langkah idempoten. Hasilnya baris run lama bersih tanpa ngganggu run lain.
#playwright#testing#e2e - 03.43frontend
Sidebar Empat Grup: Navigasi Ikut Izin, Bukan Jenis Konten
Sidebar admin KotaPortal dipecah jadi empat grup berdasarkan izin: milik sendiri untuk tulis, lintas bidang untuk baca, grup sementara untuk backend belum siap.
TL;DR: Panel admin KotaPortal kini memecah sidebar jadi empat grup yang nunjukkin izin baca atau tulis tiap bidang, tanpa ubah logika auth. Item dikelompokin otomatis dari satu peta kemampuan, plus pill bidang dan banner yang sebut pemilik konten. Navigasi cuma petunjuk, gerbangnya tetap di server, dan semua lolos uji.
#rbac#nextjs#ux - 02.34testing
Satu Akun Admin per Bidang agar Uji RBAC Terbukti
Pemeriksaan izin per bidang mentok karena tidak ada akun admin yang cocok. Satu CLI tertutup membuat satu akun per bidang dan membuktikannya lewat login.
TL;DR: Saya harus membuat akun admin untuk setiap bidang. Akun itu dibuat dengan perintah create-bidang-users yang aman. Perintah itu hanya berjalan di environment development.
#testing#security#go - 01.47tooling
Aturan Deny yang Diam-diam Mati Setelah Upgrade OpenCode V2
Upgrade harness membunuh config permission lama tanpa error. Cara saya menemukan deny yang mati dan membuktikannya dengan aksi nyata.
TL;DR: Setelah upgrade ke V2, saya menemukan masalah dengan frontmatter yang tidak terbaca. Perubahan schema membuat aturan lama tidak berlaku. Sekarang saya harus memeriksa setiap file frontmatter dan melakukan percobaan aksi yang ditarang setelah setiap upgrade.
#opencode#coding-agent#agent-rules - 01.01testing
Token AI Saya Bocor dari Snapshot Browser, Bukan dari Tesnya
Saya kira tesnya yang mahal. Ternyata tiap klik di agent browser mengembalikan satu snapshot accessibility tree, dan konteks habis di situ.
TL;DR: Saya punya masalah dengan QA. Saya tidak perlu biaya token tinggi. Saya ubah cara kerja agent.
#playwright#vitest#mcp - 00.20backend
Batas Kolom Harus Dijaga di Validator, Bukan di MySQL
Validasi panjang harus meniru lebar kolom, bukan diserahkan ke database. Ketika 31 karakter menyentuh query, MySQL strict mode menjawab 500.
TL;DR: API mengalami error 500 Internal Server Error. Error ini disebabkan oleh panjang karakter yang melebihi batas. Validator sudah diperbarui untuk menangani masalah ini.
#go#validation#api - 23.44frontend
Limit 100 Diam-diam Jadi 20, Daftarnya 54
Kontrak limit lebih penting daripada angka yang dikirim klien. Ketika limit 100 diam-diam menjadi 20, daftar 54 kartu hanya menampilkan 20 di layar.
TL;DR: Ada 54 organisasi olahraga. Tapi di layar hanya muncul 20. Perbaikannya adalah mengambil data per halaman penuh.
#react#nextjs#typescript