Appearance
05_lite_cleanup.sql
Objetivo
Recortar las acciones de un ROL LITE, dejando únicamente un conjunto explícito de acciones permitidas (whitelist).
Este script:
- Parte del supuesto de que el trigger ya asignó TODAS las acciones del módulo al rol LITE.
- Elimina las acciones que el LITE NO debe tener.
Concepto clave
El rol LITE NO se define por lo que se le agrega.
Se define por lo que se le deja.
Patrón recomendado
- El trigger asigna todas las acciones.
- Este script limpia el exceso.
- Se conserva solo una whitelist explícita.
Beneficio
Cuando se agregan nuevas acciones al módulo:
- El rol LITE las recibe automáticamente.
- Este script vuelve a dejarlo en estado esperado.
Es un modelo consistente en el tiempo.
Precondiciones
- El módulo existe.
- El módulo está asignado al rol LITE (
03_roles_modulos.sql). - Las acciones existen (
04_acciones.sql).
Idempotencia
- Ejecutarlo múltiples veces deja siempre el mismo resultado.
- No genera duplicados.
- No rompe estado previo correcto.
Script completo
sql
-- ============================================================
-- 05_lite_cleanup.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Recortar las acciones de un ROL LITE, dejando únicamente
-- un conjunto explícito de acciones permitidas (whitelist).
--
-- IDempotencia:
-- -------------
-- - Ejecutarlo múltiples veces deja siempre el mismo resultado
-- ============================================================
WITH
-- ============================================================
-- PARAMETROS (EDITAR SOLO ACA)
-- ============================================================
params AS (
SELECT
'TRAMOS_GESTION_LITE'::text AS p_rol_lite_codigo,
'gestion'::text AS p_app_id,
'Tramos PP'::text AS p_modulo_nombre
),
-- ============================================================
-- RESOLVER ROL LITE
-- ============================================================
rol_lite AS (
SELECT r.id
FROM public.roles r
JOIN params p
ON r.codigo = p.p_rol_lite_codigo
),
-- ============================================================
-- RESOLVER MODULO
-- ============================================================
modulo_resuelto AS (
SELECT m.id
FROM public.apps_modulos m
JOIN params p
ON m.app_id = p.p_app_id
AND m.nombre = p.p_modulo_nombre
),
-- ============================================================
-- DEFINIR WHITELIST DE ACCIONES PERMITIDAS PARA LITE
-- ============================================================
lite_whitelist AS (
SELECT unnest(ARRAY[
'Ver agentes PP'::text,
'Ver tramitaciones'::text
]) AS nombre_accion
),
-- ============================================================
-- RESOLVER ACCIONES DEL MODULO
-- ============================================================
acciones_modulo AS (
SELECT a.id, a.nombre
FROM public.modulos_acciones a
JOIN modulo_resuelto m ON m.id = a.modulo_id
),
-- ============================================================
-- BORRAR ACCIONES NO PERMITIDAS
-- ============================================================
borrar_acciones_lite AS (
DELETE FROM public.roles_acciones ra
USING rol_lite rl
JOIN acciones_modulo a ON a.id = ra.accion_id
LEFT JOIN lite_whitelist w ON w.nombre_accion = a.nombre
WHERE ra.rol_id = rl.id
AND w.nombre_accion IS NULL
RETURNING ra.rol_id, ra.accion_id
)
-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
r.codigo AS rol_codigo,
m.app_id AS app_id,
m.nombre AS modulo,
a.nombre AS accion
FROM public.roles r
JOIN rol_lite rl ON rl.id = r.id
JOIN public.roles_acciones ra ON ra.rol_id = r.id
JOIN public.modulos_acciones a ON a.id = ra.accion_id
JOIN public.apps_modulos m ON m.id = a.modulo_id
JOIN params p
ON r.codigo = p.p_rol_lite_codigo
AND m.app_id = p.p_app_id
AND m.nombre = p.p_modulo_nombre
ORDER BY a.nombre;