backend
Catatan teknis seputar web development, DevOps, dan integrasi AI.
151 artikel
- 00.06backend
Koma yang Memotong Deskripsi: Parsing YAML di Balik Lint OpenAPI
Delapan dari sepuluh error lint OpenAPI bukan soal kontrak: koma tak berkurung di dalam flow mapping memotong deskripsi jadi entri null.
TL;DR: Error linting OpenAPI itu ternyata bukan contract drift, cuma koma di deskripsi YAML yang gak dikasih tanda kutip. Parser motong nilai di koma pertama, jadi deskripsi kepotong tanpa warning. Solusinya gampang, quote semua deskripsi, terus regenerate tipe buat mastiin hasilnya identik byte-per-byte.
#openapi#yaml#api - 23.29backend
Rekonsiliasi Data Impor: Entitas yang Hilang dari Sumber
Database masih 65, sumber tinggal 63. Penghapusan lewat importer yang sama, kunci idempotensi pindah ke nomor baris sumber.
TL;DR: Database punya 65 entitas padahal JSON sumber cuma 63, dua dobel. Alih-alih hapus manual via SQL, penghapusan dijadiin bagian importer biar ada counter sama test, dan media ikut kehapus lewat CASCADE. Kunci idempotensi pindah dari slug ke nomor sumber, jadi run ulang aman, nol insert nol hapus.
#data-engineering#importer#database - 22.33backend
Tabel Tipe yang Dibaca Manusia, Bukan ENUM
Ketika tipe layanan butuh kategori lintas bidang dan saklar aktif, tabel lookup mengalahkan ENUM.
TL;DR: Awalnya sempat mikir pakai ENUM buat status tipe layanan, tapi ternyata butuh metadata kayak kategori, flag aktif, dan kode unik buat integrasi. Jadinya dibuat tabel lookup, hapus kategori cukup SET NULL biar riwayat data aman. ENUM repot karena nyimpen indeks dan nambah nilai harus ubah skema, validasi tetap dua lapis plus seeding pakai code biar ID stabil.
#mysql#postgresql#skema-database - 22.28backend
Koordinat Tertukar, Enam Belas Terbit
Impor 22 data cagar budaya: kolom lintang-bujur tertukar, typo derajat, dan baris yang jujur ditahan draft.
TL;DR: Import data cagar budaya ternyata berantakan: kolom latitude-longitude tertukar, ada typo derajat, koordinat dobel, bahkan ada yang kosong. Alih-alih dikoreksi diam-diam, importer ngasih status draft plus catatan geo_review buat data meragukan. Hasilnya 16 entitas terbit, 6 nunggu verifikasi manusia dulu.
#data-engineering#importer#geospasial - 19.22backend
Ketika Guard Status Dilepas: Satu Aturan Keras Pengganti Larangan
Pengalaman melepas guard forward-only pada state machine booking, dan mengapa satu aturan keras lebih efektif daripada larangan total.
TL;DR: Gara-gara guard status cuma boleh maju, admin kesulitan mundurin tiket yang salah input, malah bikin tiket sampah buat akal-akalan. Solusinya simpel: guard dibuang, admin bebas ubah status ke mana aja lewat API yang sama. Tapi satu aturan keras tetap: kalau jadi ditolak, wajib isi catatan keputusan dan pemohon otomatis dikirim surel, jadi semua kegiatan tetap ke-audit.
#workflow#backend#state-machine - 00.52backend
Handler Menerima %2C: chi Tidak Mendekode Path Param
Slug dengan koma pulang 404 padahal datanya ada: chi menyimpan path param terenkode dan dekoding jadi kontrak pemilik API.
TL;DR: Slug yang ada koma atau apostrof miring ternyata gagal 404 karena chi nyimpen path param masih terenkode, jadi lookup ke database nyari %2C padahal datanya ada. Solusinya simpel: bikin middleware DecodePathParams buat unescape semua path param sekali jalan. Dipasangnya lewat r.With biar jalan setelah routing tapi sebelum handler.
#go#chi#routing - 00.06devops
Dump Users Tetap Hidup Saat db-push Mengganti Database
db-push mengganti seluruh database staging dari dump dev, akun ikut lenyap. Dua dump kecil dan guard jujur menahaninya.
TL;DR: db-push ternyata nge-replace seluruh database staging pakai dump dev, dan tabel users nggak ikut, jadi akun admin hilang terus. Solusinya: dump data users dari staging dulu sebelum DROP, terus di-restore lagi abis import. Ditambah guard kayak --complete-insert, sanity check sebelum DROP, dan chmod 600 biar aman.
#mysql#mysqldump#ssh - 00.05frontend
Tanggal di Form Mundur Satu Hari: Payload Ikut Jenis Datanya
Input date mengirim string, payload lama membawa instan UTC. Begini satu hari hilang begitu saja dan kontrak yang menahannya.
TL;DR: Tanggal input mundur satu hari gara-gara toISOString ngubah midnight WIB jadi UTC, jadi 20 Desember nyasar jadi 19 di payload. Salahnya bukan backend, tapi cara lama yang bungkus string input jadi objek Date lokal dulu. Fixnya simpel: tempel T00:00:00Z eksplisit ke string input biar tanggalnya utuh pas round-trip.
#javascript#golang#api - 23.11backend
Strategi Hapus Permanen Bersihkan Media di Database KotaPortal
Baris media ikut terhapus bersama recordnya, tetapi file di server tetap ada. Delete permanen yang benar mengumpulkan referensi sebelum baris dihapus.
TL;DR: Di KotaPortal file media sering nyangkut di server padahal datanya udah kehapus dari DB. Makanya sekarang URL-nya dikumpulin dulu sebelum hapus, dicek di 7 kolom lewat modul mediausage Unused. Abis DB kehapus baru file yang nggak kepake dibersihin, kalau gagal hapus ya cuma di-log aja.
#golang#mysql#api