Pahami halaman konfirmasi donasi: owner lewat RLS, guest lewat token hash dan RPC, 404 untuk akses tidak sah, noindex, force-dynamic, dan state form yang jujur.
35m bacaanKuis WajibMicro Badge Lesson
Konfirmasi & Error Handling
Setelah donasi berhasil disimpan, user tidak cukup diberi pesan “sukses”. Ia butuh halaman konfirmasi: nomor donasi, program, nominal, status, dan metode pembayaran.
Tapi halaman konfirmasi membawa risiko. Data donasi tidak boleh bisa ditebak dari URL lalu dibuka orang lain.
noindex mencegah halaman privat masuk indeks mesin pencari. force-dynamic mencegah halaman yang statusnya bisa berubah diperlakukan seperti konten statis.
Status donasi bisa berubah dari pending ke verified atau rejected. Karena itu halaman konfirmasi tidak boleh mengandalkan cache statis yang menampilkan status lama.
Filter user_id = user.id penting. Login saja tidak cukup. User harus pemilik donasi.
RLS di migration juga mendukung ini dengan policy “Donor reads own donations”. Jadi ada dua lapis: query filter dan RLS.
Jalur guest dengan token
Kalau tidak login tapi ada token:
ts
const { data } = await supabase.rpc('get_donation_by_lookup', { p_token_hash: hashLookupToken(token),});
Guest tidak diberi policy SELECT langsung ke tabel donations. Aksesnya lewat function get_donation_by_lookup, dengan token yang di-hash dulu.
Kenapa hash? Karena database menyimpan lookup_token_hash, bukan token mentah. Kalau database bocor, token asli tidak otomatis ikut bocor.
Function lookup juga hanya mengembalikan kolom yang dibutuhkan halaman konfirmasi, bukan semua data sensitif.
Akses tidak sah menjadi 404
Kalau tidak login dan tidak membawa token:
ts
notFound();
Kalau query tidak menemukan donasi:
ts
if (!donation) notFound();
404 di sini bukan hanya “data tidak ada”. 404 juga dipakai untuk menolak akses tanpa memberi tahu apakah nomor donasi itu valid. Ini mencegah orang menebak nomor donasi lalu mendapat petunjuk bahwa data tersebut ada.
Error handling di form
Form juga harus jujur ketika submit berjalan atau gagal.
State yang jujur membuat user tahu apakah sistem sedang memproses, inputnya salah, atau terjadi error umum. Jangan menampilkan “sukses” kalau insert gagal.
Prompt untuk Antigravity
text
Mulai dari AGENTS.md, DESIGN.md, dan docs/README.md.Tugas analisis dan skenario uji, jangan mengubah kode.Baca:- src/components/donation/donation-form.tsx- src/app/donation/confirmation/[donationNumber]/page.tsx- supabase/migrations/20260829_vertical_slice.sqlJelaskan:1. bagaimana form redirect ke halaman konfirmasi saat state success,2. kenapa URL membawa donationNumber dan token,3. jalur akses user login: query apa dan filter user_id apa yang dipakai,4. jalur akses guest: RPC apa yang dipanggil dan kenapa token di-hash,5. kenapa tanpa token/tanpa login harus notFound(),6. bagaimana pending, validation_error, error, dan success ditampilkan di form,7. skenario uji untuk token sah, token salah, tanpa token, dan bukan pemilik.Untuk tiap klaim penting, kutip kode atau migration yang relevan.
Prompt ini mengarahkan agent untuk membaca akses data, bukan hanya memuji UI konfirmasi.
pastikan tombol berubah menjadi Memproses... saat pending;
setelah success, URL konfirmasi berisi donationNumber dan token;
halaman menampilkan nomor, program, nominal, status, dan metode;
ganti token dengan nilai acak, harus 404;
hapus token di browser incognito tanpa login, harus 404.
Kalau punya dua akun, uji user A dan user B. User B tidak boleh melihat donasi user A hanya karena tahu nomor donasinya.
Prinsip yang perlu dibawa
Halaman konfirmasi adalah halaman privat, walaupun URL-nya bisa dibuka di browser.
Akses yang sehat punya pola:
text
owner login → query dengan user_id + RLSguest token → RPC dengan hash lookuptidak punya akses → 404
Jangan membuka SELECT anon ke seluruh tabel donasi hanya demi membuat guest confirmation bekerja. Itu terlalu luas. Buka akses selebar kebutuhan, bukan selebar kemudahan.
Checkpoint
Kamu bisa menjelaskan jalur owner login.
Kamu bisa menjelaskan jalur guest token.
Token di-hash sebelum dibandingkan.
Tanpa token dan tanpa login menghasilkan 404.
Token salah menghasilkan 404.
Form menampilkan pending/error/success secara jujur.
Halaman konfirmasi noindex dan force-dynamic.
Di sini mulai terasa bedanya fitur yang “jalan” dengan fitur yang bisa dipercaya. Konfirmasi donasi bukan cuma halaman sukses; ia adalah pintu data privat. Kalau pintunya terlalu lebar, donasi orang bisa terintip. Kalau terlalu sempit, guest tidak bisa melihat statusnya sendiri. Keseimbangan itu yang sedang kamu latih.
Checkpoint KuisTarget: 70%
Kuis 04.3 — Konfirmasi & Error Handling
Kuis ini wajib untuk sertifikat. Kamu tetap bisa lanjut ke pelajaran berikutnya dan mengerjakannya nanti.