🧩 Kesimpulan Praktis

Kalau kamu mau ringkas dan maintainable, cukup simpan 1 fungsi ini saja πŸ‘‡

-- ============================================================
-- πŸ”’ FUNGSI: Mengecek apakah user punya salah satu dari banyak role
-- ============================================================
create or replace function public.has_any_role(uid uuid, roles text[])
returns boolean
language sql
security definer
as $$
  select exists (
    select 1
    from public.profiles
    where id = uid
      and role = any(roles)
    limit 1
  );
$$;

-- Izin eksekusi
grant execute on function public.has_any_role(uuid, text[]) to authenticated;
grant execute on function public.has_any_role(uuid, text[]) to anon;


πŸ’‘ Contoh Pemakaian di RLS Policy

βœ… Hanya admin

USING (has_any_role(auth.uid(), array['admin']));

βœ… Admin dan kasir

USING (has_any_role(auth.uid(), array['admin', 'kasir']));

βœ… Admin boleh semua, selain itu hanya boleh datanya sendiri

USING (
  has_any_role(auth.uid(), array['admin'])
  OR created_by = auth.uid()
);


Jadi jawabannya:

πŸ”₯ Cukup has_any_role() saja.

has_role() boleh dihapus (tidak wajib, hanya versi β€œpendek” dari fungsi yang sama).

Kalau mau, aku bisa bantu buatkan versi has_any_role() + contoh lengkap 4 policy (SELECT, INSERT, UPDATE, DELETE) untuk admin dan kasir β€” agar kamu tinggal tempel di Supabase. Mau sekalian?

Mantap πŸ’ͺ ini dia β€” versi lengkap & siap tempel di Supabase SQL Editor, hanya pakai 1 fungsi (has_any_role) dan langsung dilengkapi 4 RLS policy (SELECT, INSERT, UPDATE, DELETE).

Role yang diizinkan: admin dan kasir.

Selain itu, user hanya boleh mengelola data miliknya sendiri (misalnya di kolom created_by).