Skip to content

01_roles.sql

Objetivo

Crear (o asegurar la existencia de) los roles necesarios para un módulo determinado, incluyendo su variante LITE.

Este script:

  • NO crea módulos.
  • NO crea acciones.
  • NO asigna permisos.

Solo define los perfiles (roles) a nivel sistema.


Concepto clave

roles.codigo es la clave humana y estable.

  • Es lo que se usa en scripts posteriores.
  • Es lo que se referencia en la lógica.
  • Los UUIDs son internos y nunca se hardcodean.

Patrón recomendado

Por cada módulo funcional:

  • Un rol FULL (acceso completo).
  • Un rol LITE (acceso reducido, luego recortado).

Ejemplos reales del sistema:

  • CARRERA_GESTION / CARRERA_GESTION_LITE
  • CURSOS_GESTION / CURSOS_GESTION_LITE
  • TRAMOS_GESTION / TRAMOS_GESTION_LITE

Idempotencia

  • Si el rol ya existe (mismo codigo), no se duplica.
  • Puede ejecutarse múltiples veces sin efectos adversos.

Script completo

sql
-- ============================================================
-- 01_roles.sql
-- ============================================================
-- OBJETIVO
-- --------
-- Crear (o asegurar la existencia de) los roles necesarios
-- para un módulo determinado, incluyendo su variante LITE.
--
-- Este script:
-- - NO crea módulos
-- - NO crea acciones
-- - NO asigna permisos
--
-- Solo define los perfiles (roles) a nivel sistema.
--
-- CONCEPTO CLAVE
-- --------------
-- El campo roles.codigo es la clave HUMANA y ESTABLE.
-- Todos los scripts posteriores se apoyan en este valor,
-- nunca en UUIDs hardcodeados.
--
-- PATRÓN RECOMENDADO
-- ------------------
-- Por cada módulo funcional:
--   - un rol FULL  (acceso completo)
--   - un rol LITE  (acceso reducido, luego recortado)
--
-- IDempotencia:
-- -------------
-- - Si el rol ya existe (mismo codigo), NO se duplica.
-- - Se puede ejecutar múltiples veces sin efectos adversos.
-- ============================================================

WITH
-- ============================================================
-- PARAMETROS DEL ROL (EDITAR SOLO ACA)
-- ============================================================
params AS (
  SELECT
    -- Rol FULL
    'TRAMOS_GESTION'::text        AS rol_full_codigo,
    'Tramos Gestión'::text        AS rol_full_nombre,
    'Acceso completo a la gestión de tramos'::text
                                 AS rol_full_descripcion,

    -- Rol LITE
    'TRAMOS_GESTION_LITE'::text   AS rol_lite_codigo,
    'Tramos Gestión (LITE)'::text AS rol_lite_nombre,
    'Acceso de solo consulta a la gestión de tramos'::text
                                 AS rol_lite_descripcion
),

-- ============================================================
-- CREAR / ASEGURAR ROL FULL
-- ============================================================
insert_rol_full AS (
  INSERT INTO public.roles (id, codigo, nombre, descripcion)
  SELECT
    gen_random_uuid(),
    p.rol_full_codigo,
    p.rol_full_nombre,
    p.rol_full_descripcion
  FROM params p
  ON CONFLICT (codigo) DO NOTHING
  RETURNING id, codigo
),

-- ============================================================
-- CREAR / ASEGURAR ROL LITE
-- ============================================================
insert_rol_lite AS (
  INSERT INTO public.roles (id, codigo, nombre, descripcion)
  SELECT
    gen_random_uuid(),
    p.rol_lite_codigo,
    p.rol_lite_nombre,
    p.rol_lite_descripcion
  FROM params p
  ON CONFLICT (codigo) DO NOTHING
  RETURNING id, codigo
)

-- ============================================================
-- SALIDA DE CONTROL / AUDITORIA
-- ============================================================
SELECT
  r.codigo,
  r.nombre,
  r.descripcion
FROM public.roles r
JOIN params p
  ON r.codigo IN (p.rol_full_codigo, p.rol_lite_codigo)
ORDER BY r.codigo;