Qué puede hacer cada usuario
Cada sección lista los comandos para ejecutar esa capacidad y un ✓ que indica que ya está implementado y verificado en el código.
Tabla de permisos — Distribuidores (Dealer)
Estos roles aplican dentro de la organización de un distribuidor (dealer). Por seguridad, si un usuario no tiene ningún rol asignado en esa organización, no podrá ver ni hacer nada ahí.
| Capacidad | owner | buyer | monitor | integration |
|---|---|---|---|---|
| Ver posiciones de su org | ✓ | — | ✓ | — |
| Crear órdenes | ✓ | ✓ | — | — |
| Ver estado de órdenes | ✓ | ✓ | — | — |
| API de integración | ✓ | — | — | ✓ |
| Gestionar roles | buyer · monitor · integration | — | — | — |
Flujo de asignación de roles
Login de usuario
POST /security/auth/login
Obtén el accessToken con el que se autentican todas las llamadas de membresías.
accessTokenRequest / Response
{ email, password } accessToken · renewToken · expiresIn: 900Ver mis orgs y roles
GET /memberships/me
Descubre tu organizationId, tus roles actuales y si tienes acceso suntech. Necesario antes de asignar.
organizationIdroles[]Request / Response
Bearer {accessToken} organizations[] · suntech · isSuperuserAsignar rol
POST /memberships/assign-role
Concede un rol a uno o varios usuarios. Scope dealer requiere organizationId; scope suntech no.
assigned: trueRequest / Response
{ scope, role, organizationId?, users:[{userEmail, userName}] } assigned · users[{ userId, wasNew }]Revocar rol
POST /memberships/revoke
Elimina la membresía de un usuario. Idempotente — seguro repetir si ya fue revocado.
revoked: trueRequest / Response
{ scope, role, organizationId?, userId } revoked · wasRevoked (false si no existía)Listar miembros
GET /memberships
Lista usuarios y roles de una org o proveedor. Solo accesible para owner / superuser / tagora.
members[]Request / Response
?scope=dealer|suntech &organizationId= members[{ userId, email, roles[], createdAt }]0. Preparación — login + variables
Obtén el accessToken y define las variables base reutilizables en todos los ejemplos.
El Proveedor
Roles sobre el proveedor:
owner
storekeeper
sales
— asignados con
/memberships
(scope suntech, sin organizationId).
1. Owner del Proveedor — ve todos los tags
GET /suntech/devices
devuelve los dispositivos agrupados por dealer (con bucket
unassigned
para inventario sin org). El owner además ve todas las posiciones vía el grant comodín
asset:* viewer provider:#owner.
2. Almacenista — todo lo de envíos. Sin mapa
Recibe el correo de la orden y la surte como un todo (advance status + reporta seriales). Scopeado a las órdenes del proveedor. No ve posiciones
(/live
responde 403).
3. Vendedores — órdenes a nombre de un Dealer
POST /orders.
Puede ordenar para cualquier dealer. Solo-alta: no ve ni cambia el estado de las órdenes (eso es del storekeeper/owner).
Manda exactamente uno de
organizationId /
organizationName.
Cantidad múltiplo de 100.
4. Solo el Owner del Proveedor ve posiciones
/live,
/historical y
/sse
chequean viewer por asset. El owner lo cumple vía el comodín.
storekeeper y
sales
no tienen ningún grant de posiciones →
403.
Distribuidores (Dealer) — minimizar permisos (fail-closed)
Roles sobre la org dealer: owner | buyer | monitor | integration. Un usuario sin rol no puede hacer nada (fail-closed) — el cliente final no tiene acceso hasta que un owner le conceda un rol.
5. Owner del Dealer — crea usuarios de todo
El owner es superset (puede todo lo de buyer/monitor/integration). Da de alta a los usuarios con la macro
/memberships/grant
(find-or-create por email + correo de alta).
5b. Comprador — realiza pedidos para su org
Puede crear órdenes para su propia organización. No gestiona roles ni ve posiciones.
6. Integración — credenciales de API
Al conceder role:"integration",
la macro acuña api-key + secret (el secret se devuelve una sola vez).
Esos usuarios consumen /integration/*
(login api-key → scope=integration).
7. Monitorista — ve posiciones de sus tags
monitor → viewer
está cableado en el motor; los grants por asset apuntan al userset
#viewer
de la org. El monitor alcanza las posiciones de su org (no de otras).
8. Cliente final (sin rol) — no puede nada
Un usuario logueado pero sin tupla ReBAC falla cerrado en todo:
/live → 403,
/orders → 403,
/suntech/* → 403,
/memberships/grant → 403.
No hay acción que pueda ejecutar hasta que un owner le conceda un rol.
Macros de gestión de roles — /memberships
Componen los servicios atómicos (users + permissions + integration). Los owners de cada nivel administran sus propios sub-roles; conceder/revocar owner es sólo superuser/tagora.
| Método y ruta | Para qué |
|---|---|
| GET /memberships/me | mis orgs + roles + nivel (post-login) |
| POST /memberships/assign-role ⭐ | un rol, mismo scope/org, lista de usuarios — el macro recomendado para owners |
| POST /memberships/grant | conceder un rol a un usuario (find-or-create por userEmail, o userId) |
| POST /memberships/grant-bulk | varios roles en una sola llamada (distintos scopes/orgs/roles permitidos) |
| POST /memberships/revoke | revocar un rol (editar = revocar + conceder el nuevo) |
| GET /memberships?scope=&organizationId= | listar miembros + roles de una org/provider (solo owner/su/tagora) |
| POST /memberships/dealer | marcar/quitar una org como dealer del proveedor |
Autorización (callback authorize en el router)
- superuser / tagora owner → todo.
-
owner del dealer → conceder/revocar
buyer|monitor|integrationen su org. -
owner del proveedor → conceder/revocar
storekeeper|salesy manejar links de dealer. -
conceder/revocar
owner→ sólo superuser / tagora.