#Dua kebiasaan yang tidak boleh ditawar
Validasi argumen dengan v.* di SETIAP fungsi publik — jangan percaya input client.
Cek siapa pemanggilnya (auth) di awal handler sebelum membaca/menulis data orang.
export const hapusCatatan = mutation({ args: { id: v.id("catatan") }, handler: async (ctx, args) => { const userId = await getAuthUserId(ctx); // siapa dia? if (!userId) throw new Error("Harus login"); const row = await ctx.db.get(args.id); if (row?.pemilik !== userId) throw new Error("Bukan milikmu"); await ctx.db.delete(args.id); }, });
Tampilan boleh menyembunyikan tombol, tapi KEAMANAN sesungguhnya selalu di server. Platform ini pun dibangun dengan aturan itu.