Estado: Aceptado
Fecha: 2026-06-03
Responsable: Arquitectura
Relacionados:
El sistema de autorización modela el control de acceso a nivel de dominio mediante objetos DomainResource. Inicialmente solo se soportaban los tipos Aggregate y Entity. El Diseño Orientado al Dominio (DDD) también define DomainMethods — operaciones expuestas por un Aggregate que contienen lógica de negocio y requieren permisos explícitos (e.g. ResetPassword(), ApproveOrder()).
Surgieron tres preguntas de diseño:
DomainMethod ser un tipo de entidad separado o extender DomainResource?ParentResourceId?DomainResourceTypeDomainMethod se agrega como tercer valor del enum DomainResourceType existente (DomainMethod = new(3, ...)), no como entidad separada. Una fila de DomainResource puede ser ahora Aggregate(1) | Entity(2) | DomainMethod(3).
| Opción | Razón de rechazo |
|---|---|
Entidad DomainMethod separada |
Duplica rutas de consulta y complica el constructor del auth graph |
| Acción personalizada en el Aggregate | Pierde la direccionabilidad necesaria para el auth graph |
| Extensión mediante tabla de unión | Sobre-ingenierado para una jerarquía de dos niveles |
ParentResourceId en la misma tablaUna columna nullable Guid? ParentResourceId en DOMAIN_RESOURCE provee la referencia al padre. Esto evita una tabla de unión manteniendo la jerarquía consultable en una sola lectura.
Reglas de restricción aplicadas por el agregado SystemSuite:
DomainMethod debe tener ParentResourceId no nulo.DomainMethod (evita anidamiento más allá de un nivel).SystemSuite.Entity puede opcionalmente referenciar un Aggregate padre; esto no se aplica como regla estricta.Todos los invariantes de jerarquía se aplican dentro de SystemSuite.AddDomainResource(moduleId, parentResourceId, type, ...). La capa de aplicación pasa el parentResourceId resuelto y el agregado lo valida. Esto mantiene las reglas cerca del dato y verificables sin base de datos.
El constructor del auth graph (IAuthorizationGraphBuilder) incluye nodos DomainMethod como objetivos de permiso direccionables, vinculados a su Aggregate o Entity padre. Los templates de permisos ahora pueden otorgar acceso a operaciones de dominio específicas, no solo a recursos completos.
Aggregate y Entity tienen ParentResourceId = null; no se requiere cambio en datos de migración.