|
| 1 | +# ADR-0081: Contrato Semantico del Auth Graph para Clientes — Code-First, ID-Optional |
| 2 | + |
| 3 | +**Estado:** Aceptado |
| 4 | +**Fecha:** 2026-06-04 |
| 5 | +**Responsable de Decisión:** Arquitectura |
| 6 | +**Relacionados:** |
| 7 | +- [ADR-0071: Motor de Auth Graph](./0071-auth-graph-engine.es.md) |
| 8 | +- [ADR-0074: Politica de Versionado del Schema del Auth Graph](./0074-auth-graph-schema-versioning.es.md) |
| 9 | +- [ADR-0080: Previsualizacion del Auth Graph — Pipeline Interno vs Externo](./0080-auth-graph-preview-internal-pipeline.es.md) |
| 10 | + |
| 11 | +--- |
| 12 | + |
| 13 | +## Contexto |
| 14 | + |
| 15 | +El objetivo de largo plazo de UMS es actuar como un **proveedor claro de grafo de autorizacion** para los sistemas cliente. Los clientes deben poder activar, desactivar, ejecutar o denegar opciones usando un contrato estable, legible por negocio y semantico. |
| 16 | + |
| 17 | +El grafo actual ya contiene datos ricos de autorizacion, pero tambien expone identificadores tecnicos internos (`Guid`) en varias secciones. Esos identificadores son utiles dentro del backend, para correlacion y para flujos de diagnostico, pero no son ideales como contrato principal para sistemas cliente descendentes. |
| 18 | + |
| 19 | +La direccion del producto es volver el grafo expuesto al cliente: |
| 20 | + |
| 21 | +1. Semantico |
| 22 | +2. Estable a traves de la evolucion del schema |
| 23 | +3. Independiente de identificadores internos de base de datos |
| 24 | +4. Seguro para integraciones de larga duracion |
| 25 | +5. Facil de consumir por codigo de producto, guards de UI y politicas del lado del servicio |
| 26 | + |
| 27 | +--- |
| 28 | + |
| 29 | +## Decision |
| 30 | + |
| 31 | +UMS tratara el grafo de autorizacion para clientes como el contrato semantico actual y mantendra los IDs fuera de la superficie cliente por defecto. |
| 32 | + |
| 33 | +### 1. El contrato cliente por defecto es code-first |
| 34 | + |
| 35 | +El grafo expuesto a sistemas cliente debe apoyarse principalmente en: |
| 36 | + |
| 37 | +- `code` |
| 38 | +- `value` |
| 39 | +- `description` |
| 40 | +- `effect` |
| 41 | +- `source` |
| 42 | +- `scope` |
| 43 | +- `validUntil` |
| 44 | +- `schemaVersion` |
| 45 | + |
| 46 | +Los GUID tecnicos permanecen como detalles internos de implementacion salvo que un escenario de diagnostico o migracion los requiera. |
| 47 | + |
| 48 | +### 2. Los identificadores internos no forman parte de la superficie normal de integracion |
| 49 | + |
| 50 | +Los siguientes identificadores no deberian ser requeridos por clientes estandar: |
| 51 | + |
| 52 | +- `user.id` |
| 53 | +- `tenant.id` |
| 54 | +- `systemSuite.id` |
| 55 | +- `role.id` |
| 56 | +- `profile.id` |
| 57 | +- `branch.id` |
| 58 | +- GUIDs de permisos y acciones |
| 59 | + |
| 60 | +Estos valores pueden seguir existiendo en modelos internos, registros de auditoria y vistas administrativas internas, pero no deberian ser necesarios para decisiones normales de autorizacion. |
| 61 | + |
| 62 | +### 3. El modo de diagnostico puede incluir IDs de forma explicita |
| 63 | + |
| 64 | +Un contrato diagnostico opcional puede exponer GUIDs solo cuando: |
| 65 | + |
| 66 | +- el llamador es un administrador interno o un operador de soporte autorizado |
| 67 | +- la solicitud se hace mediante un endpoint interno de previsualizacion o diagnostico |
| 68 | +- el llamador solicita explicitamente `includeIds=true` o una bandera equivalente de soporte |
| 69 | + |
| 70 | +Este modo existe para troubleshooting, correlacion y soporte de migracion, no para consumo normal de clientes. |
| 71 | + |
| 72 | +### 4. El significado de negocio se expresa mediante codigos estables |
| 73 | + |
| 74 | +Los sistemas cliente deben usar codigos de negocio estables para interpretar el grafo: |
| 75 | + |
| 76 | +- codigo de tenant |
| 77 | +- codigo de system suite |
| 78 | +- codigo de rol |
| 79 | +- codigo de branch |
| 80 | +- codigo de recurso |
| 81 | +- codigo de accion |
| 82 | +- efecto de permiso |
| 83 | +- string de scope |
| 84 | + |
| 85 | +Esto mantiene la logica del cliente independiente de identificadores generados por la base de datos. |
| 86 | + |
| 87 | +### 5. El refresh sigue siendo por sesion, no por un token de grafo |
| 88 | + |
| 89 | +UMS no introduce un contrato separado de refresh token para el grafo semantico. El grafo sigue siendo valido hasta `validUntil`. Cuando expira, el cliente se autentica de nuevo y recibe un snapshot fresco del grafo. |
| 90 | + |
| 91 | +Esto evita estados parciales donde un token se renueva pero el modelo de autorizacion queda desfasado o inconsistente. |
| 92 | + |
| 93 | +### 6. El grafo semantico es la fuente de verdad del cliente para decisiones de acceso |
| 94 | + |
| 95 | +Para los sistemas cliente, el grafo debe ser la carga util autorizada durante su ventana de validez. El cliente no deberia inferir acceso desde GUIDs de backend ni reconsultar UMS para cada accion. |
| 96 | + |
| 97 | +--- |
| 98 | + |
| 99 | +## Forma del Payload |
| 100 | + |
| 101 | +```json |
| 102 | +{ |
| 103 | + "schemaVersion": "1.0.0", |
| 104 | + "graphId": "optional-support-correlation-id", |
| 105 | + "context": { |
| 106 | + "tenant": { |
| 107 | + "code": "TECHNO", |
| 108 | + "value": "Techno Logistics", |
| 109 | + "status": "ACTIVE", |
| 110 | + "isManagementOwner": false |
| 111 | + }, |
| 112 | + "systemSuite": { |
| 113 | + "code": "WMS_SUITE", |
| 114 | + "value": "Warehouse Management Suite", |
| 115 | + "status": "PUBLISHED" |
| 116 | + }, |
| 117 | + "role": { |
| 118 | + "code": "WAREHOUSE_SUPERVISOR", |
| 119 | + "value": "Warehouse Supervisor", |
| 120 | + "hierarchyLevel": 3 |
| 121 | + }, |
| 122 | + "profile": { |
| 123 | + "scope": "BranchScoped", |
| 124 | + "isActive": true |
| 125 | + }, |
| 126 | + "branch": { |
| 127 | + "code": "LIM-01", |
| 128 | + "value": "Lima Main Branch" |
| 129 | + } |
| 130 | + }, |
| 131 | + "permissions": [ |
| 132 | + { |
| 133 | + "resourceCode": "INVENTORY", |
| 134 | + "actionCode": "VIEW", |
| 135 | + "effect": "Allow", |
| 136 | + "source": "Template" |
| 137 | + } |
| 138 | + ], |
| 139 | + "scopes": [ |
| 140 | + "INVENTORY.VIEW" |
| 141 | + ], |
| 142 | + "featureFlags": [ |
| 143 | + { |
| 144 | + "flagCode": "NEW_MENU_EXPERIMENT", |
| 145 | + "isEnabled": true |
| 146 | + } |
| 147 | + ], |
| 148 | + "effectiveConfig": { |
| 149 | + "sessionTimeoutMinutes": 60, |
| 150 | + "accessTokenDurationMs": 3600000 |
| 151 | + }, |
| 152 | + "generatedAt": "2026-06-04T12:00:00Z", |
| 153 | + "validUntil": "2026-06-04T13:00:00Z" |
| 154 | +} |
| 155 | +``` |
| 156 | + |
| 157 | +La estructura exacta puede evolucionar, pero el contrato debe permanecer semantico y estable para los sistemas cliente. |
| 158 | + |
| 159 | +--- |
| 160 | + |
| 161 | +## Estrategia de Implementacion |
| 162 | + |
| 163 | +### Baseline actual |
| 164 | + |
| 165 | +- Usar el contrato semantico del cliente como payload por defecto para todas las integraciones nuevas. |
| 166 | +- Mantener un modo diagnostico disponible para soporte y herramientas de previsualizacion. |
| 167 | +- Reservar los GUID internos solo para modelos backend y flujos de soporte. |
| 168 | + |
| 169 | +--- |
| 170 | + |
| 171 | +## Consecuencias |
| 172 | + |
| 173 | +### Positivas |
| 174 | + |
| 175 | +- Las integraciones cliente seran mas faciles de entender y mantener |
| 176 | +- Producto y negocio podran razonar sobre accesos usando lenguaje estable |
| 177 | +- Los identificadores de base de datos ya no se filtraran como dependencias de integracion |
| 178 | +- La evolucion del schema sera mas segura porque los clientes dependeran de campos semanticos y no de claves sustitutas |
| 179 | + |
| 180 | +### Compromisos |
| 181 | + |
| 182 | +- Las herramientas de soporte pueden necesitar soporte explicito para modo diagnostico |
| 183 | +- El backend debe seguir conservando identificadores internos aunque el cliente no dependa de ellos |
| 184 | + |
| 185 | +--- |
| 186 | + |
| 187 | +## Notas de Implementacion |
| 188 | + |
| 189 | +| Area | Guia | |
| 190 | +|---|---| |
| 191 | +| Graph builder | Producir campos semanticos como proyeccion cliente por defecto | |
| 192 | +| Modelo interno | Mantener GUIDs en agregados backend y registros de auditoria | |
| 193 | +| Endpoints cliente | Preferir respuestas basadas en code/value/description | |
| 194 | +| Modo diagnostico | Exponer IDs solo a flujos internos autenticados de soporte | |
| 195 | +| SDKs | Consumir campos semanticos como superficie canonica de decision | |
| 196 | +| Documentacion | Mantener sincronizados los documentos de contrato en ingles y espanol | |
| 197 | + |
| 198 | +--- |
| 199 | + |
| 200 | +**[Registro ADR](./index.md)** |
0 commit comments