rest-api
Catatan teknis seputar web development, DevOps, dan integrasi AI.
12 artikel
- 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.06security
Roster Publik Tanpa Bocor PII: Topeng di API, Bukan di Layar
Menyembunyikan kolom sensitif di UI bukan perlindungan. Topeng yang benar ada di lapisan API, dibuktikan asersi negatif E2E.
TL;DR: Sering banget kolom sensitif disembunyiin di layar tapi API tetap kirim semua data, nah itu bocor bahkan ada namanya di OWASP. Solusinya masking di lapisan API pakai DTO yang cuma isinya data publik, sesuai UU PDP soal pengumpulan yang terbatas. Terus diuji pakai asersi negatif biar kebukti data pribadi nggak pernah nyampe ke browser.
#privacy#security#playwright - 01.00backend
Filter Status yang Tidak Dikenal Harus Ditolak, Bukan Diabaikan
Filter status yang nilainya tak dikenal sempat mengembalikan semua baris hidup dengan 200. Kini endpoint itu menolaknya dengan 400 VALIDATION.
TL;DR: Jadi ternyata API-nya nge-drop filter status kalau nilainya nggak dikenal, alias ngasih semua data dengan 200 OK, dan tesnya malah ngunci perilaku salah itu. Penulis ganti ke switch fail-closed: string kosong boleh (tab semua), nilai whitelist lolos, sisanya error ErrValidation jadi 400. Pelajarannya: tes hijau belum tentu kontraknya bener, sesekali baca ulang assertion yang aneh.
#golang#api#rest-api - 17.39backend
Kontrak Endpoint Ingest yang Tahan Kegagalan Parsial
Satu angka sukses untuk seluruh batch menyembunyikan kegagalan parsial. Kontrak per-item created/updated/unchanged/rejected membuatnya terlihat.
TL;DR: Endpoint baru /v1/signals:ingest akhirnya nggak pakai satu status buat se-batch, tapi kasih status per item biar kegagalan parsial kelihatan. Tiap item bisa jadi created, updated, unchanged, atau rejected, plus ada pengaman kayak limit ukuran, jumlah item, dan rate limit. Autentikasi pakai Bearer token juga dibenerin, kalau token belum disetting server ngasih 503 bukan 401, dan semua udah dites live.
#fastapi#api#rest-api - 16.00backend
Fitur Review Dimatikan, Kok Balasnya 404 Bukan 403?
Mematikan fitur rating di portal kota ternyata dibalas 404. Ternyata spesifikasi HTTP memang mendukung pilihan menyembunyikan keberadaan itu.
TL;DR: Awalnya kukira endpoint rating error karena balik 404 bukan 403 pas fiturnya dimatiin. Ternyata emang disengaja lewat gate ensureRatingsAllowed yang ngecek rating_enabled kalau false langsung lempar ErrRatingsUnavailable jadi 404 biar kesannya fitur nggak ada. Cara ini lebih aman soalnya nggak bocorin info, sekaligus nge-cover tiga endpoint sekaligus dengan query enteng.
#http#api#error-handling - 16.00database
Kategori Hapus Lunas: Jebakan State Machine di Layer Database
Menghapus kategori ternyata bukan sekadar ganti DELETE jadi UPDATE. Predikat, RowsAffected, scope guard restore, dan cache ikut jadi tanggung jawab.
TL;DR: Kirain hapus kategori tinggal ganti DELETE jadi UPDATE doang ternyata ribet banget. Semua query lama harus ditambahin filter deleted_at IS NULL biar sampah nggak bocor ke dropdown atau list. Buat delete sama restore harus cek RowsAffected biar bisa kasih 404 dan jangan lupa flush cache biar datanya langsung muncul lagi.
#go#mysql#sql - 14.58backend
Tong Sampah Kategori: Satu Endpoint dan POST Restore
Kontrak API soft delete kategori: query flag trashed, POST restore, dan 404 yang sengaja menggabungkan dua kondisi.
TL;DR: Daripada bikin endpoint sampah baru, daftar kategori admin sekarang cukup pakai query trashed yang defaultnya false jadi aplikasi lama aman aja. Kalau mau balikin data tinggal hit POST restore, kalau kategorinya nggak ada atau belum kehapus bakal dibales 404. Enaknya kontraknya aditif banget jadi frontend baru langsung jalan tanpa ngerusak yang lama.
#api#openapi#rest-api - 14.05devops
Mirror dokumen pindah kantor: dari work item ke Plane Pages
Halaman API Plane bikin mirror dokumen versi work item terasa salah tempat. Kontrak penyimpanannya berubah, desain identitas mirror ikut dibongkar.
TL;DR: Gue kira tinggal ganti endpoint Pages beres, ternyata kontrak storagenya beda total bikin desain mirror harus dibongkar. Di Pages HTML disimpen verbatim jadi marker bisa ngumpet di komen, kalau update itu ngereplace semua bukan nambahin. Halamannya datar tanpa folder, hapus harus diarsip dulu, dan gambar tetep nangkring di git aja.
#plane#self-hosting#git - 23.25devops
Status Done di tracker cuma klaim, buktinya ada di Git
Kartu Done tanpa bukti itu kata-kata. Sekarang work item cuma boleh Done kalau hash commit di baris Buktinya beneran resolve di Git.
TL;DR: Awalnya gue kira status Done di board udah paling bener, ternyata cuma klaim kosong kalau nggak ada bukti commit-nya. Makanya gue bikin gate yang ngunci, kartu baru boleh Done kalau baris "Bukti: hash" di deskripsi beneran ke-resolve di Git. Soalnya hash Git itu nggak bisa bohong, tanggal selesainya juga ngambil dari aktivitas tracker bukan timestamp commit.
#plane#self-hosting#git