backend
Catatan teknis seputar web development, DevOps, dan integrasi AI.
151 artikel
- 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 - 10.44database
Satu Tabel untuk Banyak Tipe Organisasi
Satu tabel organisasi dengan kolom nullable per tipe lebih murah dirawat daripada satu tabel per tipe, asal tiga konsekuensinya diterima sadar.
TL;DR: Saya membuat portal layanan publik. Tabel organizations memuat semua kolom yang dimiliki tipe mana pun. Saya pilih satu tabel generik dengan kolom tambahan nullable.
#mysql#database-schema#migration - 22.05backend
Dua Bucket dan Satu Tutup: Meredam Endpoint Saran Kritik
Endpoint umpan balik publik butuh dua pertahanan sekaligus: batas ukuran badan permintaan sebelum decode dan dua bucket rate limit per akun setelah autentikasi.
TL;DR: Endpoint form saran lolos tes fungsional, tapi review keamanan nemu dua bolong: body JSON tanpa batas ukuran dan nggak ada rate limit. Fixnya gampang: MaxBytesReader 32 KiB buat ukuran, plus dua bucket limit per akun (1 kirim per 10 menit, 5 per hari) yang dipasang setelah auth biar kuncinya ID user, bukan IP. Terakhir, array kosong admin jangan jadi null.
#go#security#rate-limit - 20.43backend
Batas Upload 8 MiB: Satu Angka, Empat Lapisan
Satu batas upload bukan satu setting: FastAPI ternyata tidak menolak berkas besar. Gerbang aslinya ada di browser, nginx, dan Next.js.
TL;DR: Unggahan 8,5 MiB di KotaPortal gagal nyeleneh, tadinya dikira FastAPI yang nolak. Ternyata FastAPI nggak nolak otomatis, gerbangnya ada di empat tempat: browser, nginx (default 1 MiB), Server Actions Next.js (default 1 MB), dan kode aplikasi. Solusinya gampang: samain konstanta 8 MiB di keempat lapisan biar nggak ada celah.
#file-upload#nginx#fastapi - 04.27backend
Seed Migration dan Status Mapping untuk Import Fasilitas Budaya
Membuat kategori baru lewat seed migration yang idempoten, lalu import data fasilitas budaya dengan pemetaan status eksisting dan rencana.
TL;DR: Artikel ini cerita soal import 8 fasilitas budaya PPKD pas kategori "Sarana Budaya" belum ada di database. Solusinya pakai seed migration idempoten dengan ON DUPLICATE KEY UPDATE, jadi aman dijalankan ulang di environment mana aja. Fasilitas eksisting langsung published, yang rencana masuk draft, dan importernya ada dry-run plus guard development biar gak ada duplikat.
#go#mysql#data-import - 04.22backend
Koreksi Data Cagar Budaya: Pool Matching Tanpa Kunci Unik
Proses korektif data cagar budaya PPKD gagal karena nomor SK bukan kunci unik. Pool kandidat dan overlap coefficient menyelesaikan masalah pencocokan 1:1.
TL;DR: Import data cagar budaya dari PPKD ternyata ribet karena satu nomor SK bisa isinya banyak objek, jadi nggak bisa dipakai sebagai kunci unik. Solusinya, data dicocokin pakai pool kandidat berdasarkan kemiripan nama dengan overlap coefficient, plus guard biar satu entitas nggak ketimpa dua kali. Kolom yang di-update juga dibatesin biar data yang udah bener nggak rusak.
#go#mysql#data-import