Blog
Catatan teknis seputar web development, DevOps, dan integrasi AI.
500 artikel
- 23.04testing
Menulis E2E untuk Halaman yang Menunda Fetch-nya
Spesifikasi E2E 52 baris untuk halaman daftar ber-debounce 350 ms: nol waitForTimeout, assertion retry sendiri, lima hook data-testid, dan index QA bertambah.
TL;DR: Tes untuk halaman daftar dibuat dengan 52 baris kode. Tes ini menggunakan Playwright untuk menguji elemen berulang kali sampai kondisinya terpenuhi. Timeout assertion dinaikkan menjadi 10 detik untuk mengakomodasi jaringan yang lambat.
#playwright#testing#typescript - 22.46frontend
Tiga Halaman 7 Baris, Satu Komponen 471 Baris
Modul Kelembagaan di admin CMS: tiga route server 7-14 baris, satu editor klien 471 baris, dan guard id yang melempar 404 sebelum fetch.
TL;DR: Halaman 404 muncul karena id organisasi tidak valid. Validasi id dilakukan di route sunting sebelum komponen dimuat. Komponen klien melakukan validasi tambahan untuk kenyamanan pengguna.
#nextjs#react#typescript - 20.28frontend
Server yang Menulis Judul, Klien yang Mengisi Daftar
Cangkang halaman, metadata, dan judul datang dari server; daftar, tab, dan pencarian debounce 350 ms hidup di satu island klien.
TL;DR: Halaman informasi olahraga baru dibuat. Server hanya menulis metadata dan judul, isi daftarnya diambil di browser. Judul dan metadata dihasilkan di server untuk mesin telusur.
#nextjs#react#seo - 20.08backend
Empat Baris Bernama Sama: Kunci Import yang Tidak Boleh Menebak
Kunci idempoten yang ikut memuat nama_panjang, supaya empat cabang FASI tidak melebur jadi satu baris.
TL;DR: Saya menulis CLI kecil untuk memindahkan data. Kunci import awalnya hanya nama dan kategori. Kemudian saya tambahkan nama panjang untuk menghindari duplikat.
#go#mysql#data-import - 19.29backend
Kontrak Status yang Menempel pada Query, Bukan Parameter
Detail organisasi publik kini memakai method GetActiveByID dengan klausa status di query: baris hilang dan baris non-AKTIF sama-sama 404.
TL;DR: Organisasi dengan id 17 berstatus NONAKTIF. Permintaan GET /organizations/17 membalas 404. Endpoint admin masih bisa membuka organisasi tersebut.
#go#mysql#rest-api - 19.09backend
Rute Terbuka, Rute Terjaga: Public List dan Admin CRUD
Guard izin terpasang di rute admin, tetapi baris permission belum ada di database: semua admin kecuali superadmin kena 403. Migrasi seed menutup celah itu.
TL;DR: Admin dapat akses dashboard tapi tidak bisa akses menu organisasi karena 403. Akun admin tidak punya izin organisasi:read dan organisasi:write. Perbaikan dilakukan dengan migrasi yang menambahkan izin tersebut.
#go#security#mysql - 16.08backend
Satu Transaksi atau Data Setengah Jadi: BeginTxx di sqlx
Tulis organisasi dan anggota berjalan sebagai statement terpisah; gagal di tengah meninggalkan data setengah jadi. Satu BeginTxx menutup lubang itu.
TL;DR: Kesalahan terjadi karena penulisan organisasi dan anggota dilakukan sebagai statement terpisah. Penyebabnya adalah tidak ada transaksi eksplisit sehingga paket database/sql menjalankan setiap statement sebagai transaksi implisit tersendiri. Perbaikannya adalah menggabungkan penulisan ke dalam satu transaksi.
#go#sqlx#mysql - 16.00backend
400 atau 404: Status Error Tepat dari Service Layer Go
Permintaan create dengan category_slug tak dikenal dijawab 400, bukan 404: sentinel error memisahkan nilai input yang salah dari resource yang hilang.
TL;DR: Permintaan Create mengembalikan HTTP 400. Kesalahan itu karena nilai category_slug tidak dikenal. Service mengembalikan 400 karena validasi input gagal.
#go#error-handling#validation - 14.17backend
Pola Repository Go: Model Null, Satu List, Satu Escaper
Model database dan DTO JSON tidak pernah berbagi struct: kolom nullable di-scan ke sql.NullX, respons memakai pointer, satu List melayani admin dan publik.
TL;DR: Struct untuk database dan JSON dibuat terpisah. Satu fungsi konversi memetakan keduanya. Pola ini menghindari bug null dan query yang divergen.
#go#mysql#sqlx