ums

SystemSuite — Arquitectura de Agregado

Contexto Delimitado: Autorización
Raíz de Agregado: SystemSuite
Módulo: Ums.Domain.Authorization.SystemSuite
Estado: Producción


1. Visión General del Agregado

Propósito

El agregado SystemSuite representa una superficie de aplicación perteneciente a un tenant y registrada en UMS. Define la topología funcional consumida por los modelos de autorización aguas abajo y almacena configuraciones operativas a nivel de suite. En la implementación actual, posee entidades hijas Module y AppSetting, y expone un catálogo plano de Action para el targeting de plantillas de permisos.

Responsabilidad de Negocio

Raíz de Agregado

SystemSuite es la raíz del agregado. Los cambios sobre identidad, módulos, configuraciones y estado deben pasar por la raíz.

Invariantes y Reglas de Consistencia

  1. TenantId, Code, Name y Description son obligatorios.
  2. Code debe ser único dentro del tenant propietario.
  3. Module.Code debe ser único dentro de la suite.
  4. Las configuraciones no pueden duplicar la misma ConfigurationKey para el mismo ConfigurationScope.
  5. La activación y desactivación de módulos se controla desde el agregado padre.
  6. Las acciones referenciadas por plantillas de permisos aguas abajo deben pertenecer a la topología de la suite gobernada por este agregado.

Entidades Relacionadas / Objetos de Valor

| 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 | | 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. |

Eventos de Dominio

| 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 |


2. Modelo de Dominio

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>

3. Diagramas del Modelo de Objetos

classDiagram
    direction TB
    class SystemSuite {
        +Guid Id
        +Guid TenantId
        +Code Code
        +Name Name
        +Description Description
        +SystemStatus Status
        +List~Module~ Modules
        +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)
        +AddAppSetting(key, value, scope, actor)
    }
    class Module {
        +Guid Id
        +Guid SuiteId
        +Code Code
        +Name Name
        +Description Description
        +int SortOrder
        +ModuleStatus Status
    }
    class AppSetting {
        +Guid Id
        +ConfigurationKey Key
        +ConfigurationValue Value
        +ConfigurationScope Scope
    }
    class Action {
        +Guid Id
        +ActionCode Code
    }
    SystemSuite "1" *-- "0..*" Module
    SystemSuite "1" *-- "0..*" AppSetting
    SystemSuite "1" *-- "0..*" Action

4. Diagramas de Secuencia

Flujo de Alta de Módulo

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

5. Modelo ER

erDiagram
    TENANT ||--o{ SYSTEM_SUITE : "posee"
    SYSTEM_SUITE ||--o{ MODULE : "contiene"
    SYSTEM_SUITE ||--o{ APP_SETTING : "define"
    SYSTEM_SUITE ||--o{ ACTION : "expone"

    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
    }

Reglas de Aislamiento por Tenant


6. Integración entre Contextos Delimitados


7. Capa de Aplicación


8. Infraestructura / Persistencia


9. Seguridad y Cumplimiento


10. Decisiones Técnicas


Volver al Índice de Autorización