Roles
Admin → Roles (/admin/roles) lista los cinco roles integrados y — en
planes Command+ — permite a un superadmin definir roles personalizados con permisos
de grano fino. La lista de roles integrados es fija; no puedes eliminarlos ni renombrarlos,
solo ver lo que pueden hacer.
Solo superadmin puede abrir esta página. Cualquier otro será redirigido al
dashboard por el guard de ruta.
Los cinco roles integrados
Desde OrgRole en org.ts, en privilegio descendente:
| Rol | Nivel | Insignia | Uso típico |
|---|---|---|---|
superadmin | L1 | rojo | Propietario de la plataforma. Ve cada org, puede cambiar plan, gestionar roles. |
admin | L2 | ámbar | Administrador de org. Invitaciones, facturación, DJI, webhooks, workflows. |
manager | L3 | cian | Líder de equipo/turno. Ejecuta misiones, invita operadores, sin facturación. |
operator | L4 | verde | Piloto / usuario de campo. Se une a misiones, pilota drones, usa PTT. |
observer | L5 | gris | Solo lectura. Observa feeds en vivo, no puede publicar. |
ADMIN_ROLES en el código es ['superadmin', 'admin'] — esos son los dos roles
que las reglas de Firestore comprueban para cualquier escritura a un documento delimitado por org fuera
del perfil propio del usuario.
Matriz de capacidades
| Capacidad | superadmin | admin | manager | operator | observer |
|---|---|---|---|---|---|
| Crear / desactivar orgs, cambiar plan | ✓ | — | — | — | — |
| Invitar miembros, cambiar roles | ✓ | ✓ (≤ propio) | ✓ (op/obs) | — | — |
| Emparejar docks DJI, crear sedes/assets | ✓ | ✓ | — | — | — |
| Configurar webhooks / workflows | ✓ | ✓ | — | — | — |
| Crear misiones, pilotar (DRC), publicar TACLINK | ✓ | ✓ | ✓ | ✓ | — |
| Suscribirse a TACLINK (escuchar/ver) | ✓ | ✓ | ✓ | ✓ | ✓ |
| Crear roles personalizados | ✓ | — | — | — | — |
| Exportar informes de misión | ✓ | ✓ | ✓ | ✓ | — |
El helper roleAtLeast(role, minimum) controla funciones a lo largo del
código — p. ej. roleAtLeast(me.role, 'manager') es el check para “puede iniciar
una misión”.
Editar un rol integrado
Haz clic en cualquier rol integrado a la izquierda para abrir su panel de detalle. Puedes ver la lista de permisos pero Editar está deshabilitado — los integrados son el contrato en el que las reglas de Firestore confían. Si necesitas un ajuste, clónalo en un rol personalizado.
Roles personalizados (planes Command+)
Los roles personalizados se entregan en los planes Command y Sovereign; Guardian y
Tactical ven un banner con candado que dice “Los roles personalizados requieren plan Command o
superior”. El feature flag es PlanFeatures.customRoles y las reglas de Firestore
también lo aplican en tiempo de escritura.
Crear un rol personalizado
Haz clic en Crear rol en la cabecera. El formulario pide:
- Nombre del rol — texto libre, p. ej.
SAR Team Lead. - Descripción — una línea mostrada en el selector de miembros.
- Nivel de jerarquía — entero 5–99. Los números más bajos tienen más privilegio. Los integrados ocupan los niveles 1–5 por lo que los roles personalizados siempre se sitúan debajo.
- Color — elegido de la paleta de 12 muestras. Determina el tinte de la insignia.
- Permisos — cuadrícula de checkboxes multi-select agrupada por módulo
(Misiones, Equipos, DJI, Webhooks, Informes, …). Cada permiso es una
cadena
{action}.{resource}comoread.mission,write.flight_task,approve.workflow_step.
Guardar escribe el rol a
/organizations/{orgId}/customRoles/{roleId} y se vuelve seleccionable en el selector
de rol de la página de Usuarios junto con los integrados.
Asignar un rol personalizado
En Usuarios, el desplegable de rol muestra los integrados, luego un
divisor, luego tus roles personalizados. Asignar uno establece
OrgMember.customRoleId y deja OrgMember.role en la base integrada
(por retrocompatibilidad con las reglas de Firestore). Las reglas comprueban los roles personalizados primero
y recurren al rol base si el documento de rol personalizado falta.
Eliminar un rol personalizado
Confirmado por popover. Cualquier miembro que actualmente tenga el rol es automáticamente
degradado al campo role base. La eliminación se registra como
admin.role.deleted en el stream de auditoría.