SIP_GoldBees_Database/db_migrations/20260119_admin_hard_delete.sql
2026-02-01 14:14:57 +00:00

87 lines
2.1 KiB
PL/PgSQL

BEGIN;
ALTER TABLE app_user ADD COLUMN IF NOT EXISTS is_super_admin boolean NOT NULL DEFAULT false;
CREATE INDEX IF NOT EXISTS idx_app_user_is_super_admin ON app_user (is_super_admin);
CREATE TABLE IF NOT EXISTS admin_audit_log (
id bigserial PRIMARY KEY,
ts timestamptz NOT NULL DEFAULT now(),
actor_user_hash text NOT NULL,
target_user_hash text NOT NULL,
target_username_hash text,
action text NOT NULL,
meta jsonb
);
CREATE OR REPLACE FUNCTION prevent_super_admin_delete()
RETURNS trigger AS $$
BEGIN
IF OLD.is_super_admin THEN
RAISE EXCEPTION 'cannot delete super admin user';
END IF;
RETURN OLD;
END;
$$ LANGUAGE plpgsql;
DO $$
BEGIN
IF NOT EXISTS (SELECT 1 FROM pg_trigger WHERE tgname = 'trg_prevent_super_admin_delete') THEN
CREATE TRIGGER trg_prevent_super_admin_delete
BEFORE DELETE ON app_user
FOR EACH ROW
EXECUTE FUNCTION prevent_super_admin_delete();
END IF;
END $$;
DO $$
DECLARE
tbl text;
c record;
fk_name text;
BEGIN
FOREACH tbl IN ARRAY ARRAY[
'app_session',
'user_broker',
'zerodha_session',
'zerodha_request_token',
'strategy_run',
'strategy_config',
'strategy_log',
'engine_status',
'engine_state',
'engine_state_paper',
'engine_event',
'paper_broker_account',
'paper_position',
'paper_order',
'paper_trade',
'paper_equity_curve',
'mtm_ledger',
'event_ledger'
]
LOOP
IF to_regclass(tbl) IS NOT NULL THEN
FOR c IN
SELECT conname
FROM pg_constraint
WHERE contype = 'f'
AND conrelid = tbl::regclass
AND confrelid = 'app_user'::regclass
LOOP
EXECUTE format('ALTER TABLE %I DROP CONSTRAINT %I', tbl, c.conname);
END LOOP;
fk_name := format('fk_%s_user', tbl);
IF NOT EXISTS (SELECT 1 FROM pg_constraint WHERE conname = fk_name) THEN
EXECUTE format(
'ALTER TABLE %I ADD CONSTRAINT %I FOREIGN KEY (user_id) REFERENCES app_user(id) ON DELETE CASCADE',
tbl,
fk_name
);
END IF;
END IF;
END LOOP;
END $$;
COMMIT;