Contexto Delimitado: Autorización
Raíz de Agregado: SystemSuite
Módulo: Ums.Domain.Authorization.SystemSuite
Estado: Producción
El agregado SystemSuite representa una superficie de aplicacion perteneciente a un tenant y registrada en UMS. Define la topologia funcional consumida por los modelos de autorizacion aguas abajo y almacena configuraciones operativas a nivel de suite. En la implementacion actual, posee Module, topologia de menus, DomainResource (Agregados, Entidades y Métodos de Dominio), AppSetting y Action. El agregado independiente Role se mantiene en el contexto de la suite seleccionada y la referencia mediante SystemSuiteId. Durante el bootstrap, UMS es la suite base canonica para la superficie de gestion del tenant.
- Registrar una suite de software asociada a un tenant.
- Mantener la identidad de la suite:
Code,Name,Description,Status. - Poseer módulos funcionales, recursos de dominio (Agregados, Entidades y Métodos de Dominio) y configuraciones operativas de la suite.
- Exponer la superficie de acciones consumida por
PermissionTemplatey por los flujos de autorización efectiva. - Definir el limite propietario del catalogo de roles mantenido por Autorizacion.
- Controlar el estado de activación mediante
SystemStatus.
SystemSuite es la raíz del agregado. Los cambios sobre identidad, módulos, recursos de dominio, configuraciones y estado deben pasar por la raíz.
TenantId,Code,NameyDescriptionson obligatorios.Codedebe ser único dentro del tenant propietario.Module.Codedebe ser único dentro de la suite.- Las configuraciones no pueden duplicar la misma
ConfigurationKeypara el mismoConfigurationScope. - La activación y desactivación de módulos se controla desde el agregado padre.
- Las acciones referenciadas por plantillas de permisos aguas abajo deben pertenecer a la topología de la suite gobernada por este agregado.
| Entidad / VO | Tipo | Propiedad | Descripción |
|---|---|---|---|
Module |
Entidad | Propia | Subsistema funcional dentro de la suite |
AppSetting |
Entidad | Propia | Configuración a nivel de suite |
Action |
Entidad | Propia / catalogada | Tokens de acción expuestos para targeting de autorización |
Role |
Raiz de Agregado | Relacionada por SystemSuiteId |
Catalogo de responsabilidades y jerarquia definido para la suite |
TenantId |
Objeto de Valor | - | Límite de pertenencia del tenant |
Code |
Objeto de Valor | - | Identificador técnico |
Name |
Objeto de Valor | - | Etiqueta visible |
Description |
Objeto de Valor | - | Descripción funcional |
SystemStatus |
Enumeración | - | Active, Inactive, Beta, etc. |
| Evento | Disparador |
|---|---|
SystemSuiteRegisteredEvent |
Nueva suite creada |
SystemSuiteStatusChangedEvent |
Cambio de estado de la suite |
SystemSuiteModuleAddedEvent |
Módulo agregado |
SystemSuiteModuleRemovedEvent |
Módulo eliminado |
SystemSuiteModuleStatusChangedEvent |
Módulo activado o desactivado |
SystemSuite (Raíz de Agregado)
├── Props: SystemSuiteProps
│ ├── Id: IdValueObject
│ ├── TenantId: TenantId
│ ├── Code: Code
│ ├── Name: Name
│ ├── Description: Description
│ ├── Status: SystemStatus
│ └── Audit: AuditValueObject
├── Hijos
│ ├── IReadOnlyCollection<Module>
│ └── IReadOnlyCollection<AppSetting>
└── Superficie de Catálogo
└── IReadOnlyCollection<Action>
classDiagram
direction TB
class SystemSuite {
+Guid Id
+Guid TenantId
+Code Code
+Name Name
+Description Description
+SystemStatus Status
+List~Module~ Modules
+List~DomainResource~ DomainResources
+List~AppSetting~ AppSettings
+List~Action~ Actions
+Create(tenantId, code, name, description, actor)
+Update(name, description, actor)
+SetStatus(status, actor)
+AddModule(code, name, description, sortOrder, actor)
+UpdateModule(moduleId, name, description, sortOrder, actor)
+ActivateModule(moduleId, actor)
+DeactivateModule(moduleId, actor)
+RemoveModule(moduleId, actor)
+AddDomainResource(moduleId, parentResourceId, type, code, name, description, actor)
+UpdateDomainResource(resourceId, moduleId, type, code, name, description, actor)
+RemoveDomainResource(resourceId, actor)
+AddAppSetting(key, value, scope, actor)
}
class Module {
+Guid Id
+Guid SuiteId
+Code Code
+Name Name
+Description Description
+int SortOrder
+ModuleStatus Status
}
class DomainResource {
+Guid Id
+Guid? ModuleId
+Guid? ParentResourceId
+DomainResourceType Type
+Code Code
+Name Name
+Description Description
}
class AppSetting {
+Guid Id
+ConfigurationKey Key
+ConfigurationValue Value
+ConfigurationScope Scope
}
class Action {
+Guid Id
+ActionCode Code
}
SystemSuite "1" *-- "0..*" Module : contiene
SystemSuite "1" *-- "0..*" DomainResource : posee
SystemSuite "1" *-- "0..*" AppSetting : configura
SystemSuite "1" *-- "0..*" Action : expone
sequenceDiagram
participant C as Cliente
participant H as Handler
participant R as ISystemSuiteRepository
participant S as SystemSuite (AR)
C->>H: AddModuleCommand(systemSuiteId, code, name, description, sortOrder)
H->>R: GetById(systemSuiteId)
R-->>H: SystemSuite
H->>S: AddModule(code, name, description, sortOrder, actor)
S->>S: Validar unicidad de código
S->>S: Levantar SystemSuiteModuleAddedEvent
H->>R: Update(systemSuite)
R-->>H: ok
H-->>C: Success
erDiagram
TENANT ||--o{ SYSTEM_SUITE : "posee"
SYSTEM_SUITE ||--o{ MODULE : "contiene"
SYSTEM_SUITE ||--o{ APP_SETTING : "define"
SYSTEM_SUITE ||--o{ ACTION : "expone"
SYSTEM_SUITE ||--o{ ROLE : "define"
SYSTEM_SUITE {
uniqueidentifier Id PK
uniqueidentifier TenantId FK
nvarchar Code
nvarchar Name
nvarchar Description
int StatusId
nvarchar CreatedBy
datetime2 CreatedAtUtc
nvarchar UpdatedBy
datetime2 UpdatedAtUtc
nvarchar AuditTimeSpan
}
SystemSuitepertenece a un tenant en la implementación actual.- Módulos, configuraciones y acciones heredan la pertenencia a través del límite del agregado.
- Aguas arriba: contexto de tenant desde Identity.
- Aguas abajo: consumido por
PermissionTemplatey por la resolución de autorización efectiva. - Las acciones expuestas por la suite son referenciadas por plantillas y perfiles.
CreateSystemSuiteCommand-> Entradas:TenantId, Code, Name, Description-> Retorna:GuidUpdateSystemSuiteCommand-> Entradas:SystemSuiteId, Name, Description-> Retorna:voidSetSystemSuiteStatusCommand-> Entradas:SystemSuiteId, Status-> Retorna:voidCreateRoleCommand,UpdateRoleCommandySetRoleStatusCommandoperan sobre roles bajo la suite seleccionada.- GraphQL expone
rolesBySystemSuite(systemSuiteId)para la pestana Roles del detalle.
- Existen implementaciones de repositorio SQL Server e in-memory para modos de desarrollo y ejecucion de suite y roles.
[ums_authorization].[Roles]referencia[ums_authorization].[SystemSuites]y soporta una FK nullable al rol padre.- El filtrado de tenant en la aplicacion es el mecanismo primario de aislamiento.
- La definición de suites es una capacidad administrativa.
- Los cambios de módulos y estado afectan el comportamiento de autorización aguas abajo y deben auditarse.
SystemSuitepertenece a un tenant en el modelo de dominio actual, aunque documentación previa lo describiera como catálogo global.- El agregado actual prioriza gestión de módulos, configuraciones y una superficie plana de acciones por encima de la narrativa anterior del árbol profundo de menús.