Initial commit of akmon project
This commit is contained in:
47
doc_mall/subscription_guard_trigger.sql
Normal file
47
doc_mall/subscription_guard_trigger.sql
Normal file
@@ -0,0 +1,47 @@
|
||||
-- Optional guard to restrict non-admin updates on ml_user_subscriptions
|
||||
-- Purpose: Allow normal users to toggle auto_renew and cancel_at_period_end only.
|
||||
-- Admins can update any fields.
|
||||
-- Dependencies: public.is_admin() from subscription_rls_policies.sql
|
||||
|
||||
begin;
|
||||
|
||||
-- Create or replace the guard function
|
||||
create or replace function public.enforce_user_sub_update()
|
||||
returns trigger
|
||||
language plpgsql
|
||||
as $$
|
||||
begin
|
||||
-- Admin can change anything
|
||||
if public.is_admin() then
|
||||
return new;
|
||||
end if;
|
||||
|
||||
-- Owner can only toggle limited fields
|
||||
if new.user_id = auth.uid() then
|
||||
-- Revert disallowed fields to old values
|
||||
new.status := old.status;
|
||||
new.plan_id := old.plan_id;
|
||||
new.start_date := old.start_date;
|
||||
new.end_date := old.end_date;
|
||||
new.next_billing_date := old.next_billing_date;
|
||||
new.metadata := old.metadata;
|
||||
-- Allow: auto_renew, cancel_at_period_end (and updated_at will be set by trigger)
|
||||
return new;
|
||||
end if;
|
||||
|
||||
-- Neither admin nor owner
|
||||
raise exception 'Forbidden (not owner)';
|
||||
end;
|
||||
$$;
|
||||
|
||||
-- Recreate trigger (idempotent)
|
||||
drop trigger if exists trg_enforce_user_sub_update on public.ml_user_subscriptions;
|
||||
create trigger trg_enforce_user_sub_update
|
||||
before update on public.ml_user_subscriptions
|
||||
for each row execute function public.enforce_user_sub_update();
|
||||
|
||||
commit;
|
||||
|
||||
-- Usage:
|
||||
-- 1) Ensure subscription tables and RLS policies are created (see create_mall_subscription_tables.sql, subscription_rls_policies.sql)
|
||||
-- 2) Run this script to enforce column-level restrictions for non-admins
|
||||
Reference in New Issue
Block a user