Jerarquía de roles, permisos y cómo restringen los endpoints de la API.
Reten implementa Control de Acceso Basado en Roles (RBAC) jerárquico con permisos granulares agrupados por dominio. Las tablas siguientes listan todos los permisos, agrupados por los mismos dominios que usa la API; un usuario con varios roles tiene los permisos de todos ellos.
Los permisos y los roles se escriben con el valor que la API envía y recibe: activity:view, admin. Ese es el valor que envías en permissions de POST /api/api-keys y en roles de POST /api/auth/register, y el que la API devuelve en un 403 — Required permissions: activity:view.
Cada rol tiene su propia lista explícita de permisos: un rol superior no tiene automáticamente todos los permisos de los roles inferiores (por ejemplo, supervisor tiene activity:force-retry-dispatch y fde no). La jerarquía rige la gestión de usuarios: un usuario solo puede gestionar usuarios cuyo rol sea estrictamente inferior al propio.
Ver AGCs y sus pilares de ciclo de vida (incl. los configHashes por pilar)
super_admin, admin
activity-generation-config:create
Crear una AGC con sus 3 pilares de ciclo de vida
super_admin, admin
activity-generation-config:update
Actualizar metadatos de la AGC, reemplazar pilares de ciclo de vida in-place, publicar y pausar
super_admin, admin
activity-generation-config:delete
Archivar una AGC (cascada a sus lifecycle configs)
super_admin, admin
lifecycle-config:view
Ver los lifecycle configs de solo lectura (activación / engagement / resurrección)
super_admin, admin
lifecycle-config:delete
Interno — habilita el archivado/restauración de lifecycle en la cascada de papelera
super_admin, admin
Los lifecycle configs no tienen permisos standalone de creación/edición/borrado: un lifecycle config se crea y edita solo a través del flujo del AGC, restringido por activity-generation-config:create / activity-generation-config:update.
Editar las definiciones de canal de un proveedor de despacho: mapeo de payload y ajustes recomendados, y si el mapeo es obligatorio (PATCH /api/dispatch-providers/:providerId/channel-definitions/:definitionId)
Ver los registros archivados en la papelera y restaurarlos (/api/trash). Ver el detalle de un registro o la vista previa de su cascada, y restaurarlo, requiere además el permiso que elimina ese tipo de registro (por ejemplo, commerce:delete). Eliminar un registro de la papelera de forma definitiva está reservado a super_admin
super_admin, admin, fde
trash:manage-settings
Ver y cambiar la configuración de retención de la papelera del tenant (GET y PATCH /api/trash/settings)
super_admin, admin
commerce:delete
Eliminar comercios, que pasan a la papelera (DELETE /api/commerces/:id)
super_admin, admin, fde
operator:delete
Eliminar operadores, que pasan a la papelera (DELETE /api/operators/:id)
super_admin, admin, fde
route:delete
Eliminar rutas, que pasan a la papelera (DELETE /api/routes/:id)
super_admin, admin, fde
supervisor:delete
Eliminar supervisores, que pasan a la papelera (DELETE /api/supervisors/:id)
El motor de retención que calcula los estados de ciclo de vida de comercios lee las AGCs de forma programática. Usa una API key (sin mecanismo de auth nuevo) que lleva activity-generation-config:view. Con ese permiso llama a GET /api/activity-generation-configs y GET /api/activity-generation-configs/:id para leer cada pilar y sus configHashes (para detectar de forma barata cuándo cambió una config), y luego escribe los estados calculados vía commerce lifecycle snapshots. Los dos endpoints de AGC son project-scoped: con una clave de tenant, cada llamada envía x-project-id (sin él la API responde 400 — Falta el header obligatorio x-project-id.), y una clave de proyecto solo lee las AGCs de su propio proyecto — ver Alcance de la clave.
Auth JWT y claves de tenant: proporcionar el header x-project-id con el UUID del proyecto. En los endpoints project-optional el header es opcional y acota la solicitud a ese proyecto
Claves de proyecto: la clave siempre trabaja en su propio proyecto, así que el header no hace falta (ver Alcance de la clave)