BC-C — Configuration Context
| Idioma: Español |
Versión en inglés no disponible |
Schema: [ums_config] | Owner: UMS Core API .NET 8
Misión: Gobernar el comportamiento dinamico de todos los sistemas integrados sin requerir redeployments. Tres pilares: Multi-IdP, Configuración de Sistemas, Feature Flags.
FS cubiertos: FS-08, FS-09, FS-13
Versión: 2.0 | Fecha: 2026-05-15
Arquitectura de Agregados: Modelo completo con diagramas, secuencias, ER y API:
IdpConfiguration · AppConfiguration · FeatureFlag
Agregados
| Agregado |
Raiz |
Descripción |
| IdpConfiguration |
IdpConfiguration |
Config de proveedor de identidad por tenant/sistema |
| AppConfiguration |
AppConfiguration |
Parametros jerarquicos de configuración |
| FeatureFlag |
FeatureFlag |
Toggles de funcionalidad multi-dimension |
Aggregate: IdpConfiguration
Aggregate Root: IdpConfiguration
FS: FS-01, FS-03, FS-08
Value Objects
| Value Object |
Tipo |
Regla |
ProviderType |
enum |
INTERNAL_BCRYPT / ZITADEL / AZURE_AD / OKTA / KEYCLOAK / AUTH0 / GOOGLE / LDAP / SAML2 / GENERIC_OIDC |
DomainHints |
string[] |
Patrónes de dominio email para routing (ej. @logisticscorp.com) |
ConfigPayload |
JSON cifrado |
authority URL, client_id, scopes, claim mappings |
SecretRef |
string |
Ruta Vault para credenciales (ej. vault://ums/secrets/{tenant}/client_secret) |
IdpConfigStatus |
enum |
DRAFT / ACTIVE / INACTIVE |
ResolutionPriority |
int |
Orden de evaluación; menor = mayor prioridad |
Invariantes
| ID |
Regla |
Fuente |
| INV-IDP1 |
ResolutionPriority único dentro del scope (TenantId, SystemId) |
conceptual-data-model.md |
| INV-IDP2 |
FallbackToId no puede formar ciclo en la cadena |
ADR-0020 |
| INV-IDP3 |
Solo una config ACTIVE por ProviderType en el mismo scope |
FS-03 |
| INV-IDP4 |
ConfigPayload debe ser JSON valido |
conceptual-data-model.md |
| INV-IDP5 |
DRAFT no puede usarse para autenticar usuarios |
FS-03 |
Diagrama del Agregado
classDiagram
direction TB
class IdpConfiguration {
<<AggregateRoot>>
+Guid Id
+Guid TenantId
+Guid SystemId
+ProviderType ProviderType
+string[] DomainHints
+JSON ConfigPayload
+string SecretRef
+IdpConfigStatus Status
+int ResolutionPriority
+Guid FallbackToId
}
Máquina de Estado: IdpConfiguration
stateDiagram-v2
[*] --> DRAFT : RegisterIdpConfig
DRAFT --> ACTIVE : ActivateIdpConfig
ACTIVE --> INACTIVE : DeactivateIdpConfig
INACTIVE --> ACTIVE : ActivateIdpConfig
note right of DRAFT : No puede autenticar usuarios
Comandos y Eventos
RegisterIdpConfigCommand -> IdpConfigRegisteredEvent { configId, tenantId, providerType, version }
ActivateIdpConfigCommand -> IdpConfigActivatedEvent { configId, tenantId }
UpdateIdpConfigCommand -> IdpConfigUpdatedEvent { configId, tenantId, version }
DeactivateIdpConfigCommand -> IdpConfigDeactivatedEvent { configId, tenantId }
Aggregate: AppConfiguration
Aggregate Root: AppConfiguration
FS: FS-08, FS-13
Value Objects
| Value Object |
Tipo |
Regla |
ConfigScope |
enum/record |
GLOBAL / TENANT / SUITE / MODULE segun FKs poblados |
ConfigCode |
string |
Único por scope (TenantId, SuiteId, ModuleId) |
IsInheritable |
bool |
false bloquea override en scopes inferiores |
IsEncrypted |
bool |
Valor cifrado en reposo |
ConfigVersión |
string |
Semver; lineage de versiónes |
ConfigStatus |
enum |
DRAFT / PUBLISHED / ARCHIVED |
Invariantes
| ID |
Regla |
Fuente |
| INV-AC1 |
ConfigCode único para (TenantId, SuiteId, ModuleId) |
ADR-0047, FS-13 |
| INV-AC2 |
Si IsInheritable=false en scope superior, scopes inferiores no pueden crear ese ConfigCode |
ADR-0047 |
| INV-AC3 |
Resolución jerarquica: MODULE > SUITE > TENANT > GLOBAL |
ADR-0047 |
| INV-AC4 |
Description obligatorio; debe documentar proposito, impacto, comportamiento y scope |
FS-13, database-design-er.md Regla 9 |
| INV-AC5 |
DRAFT no puede servirse a clientes |
FS-13 |
Diagrama del Agregado
classDiagram
direction TB
class AppConfiguration {
<<AggregateRoot>>
+Guid Id
+Guid TenantId
+Guid SuiteId
+Guid ModuleId
+ConfigScope Scope
+ConfigCode Code
+string Value
+bool IsInheritable
+bool IsEncrypted
+ConfigVersion Version
+ConfigStatus Status
+string Description
}
Máquina de Estado: AppConfiguration
stateDiagram-v2
[*] --> DRAFT : CreateAppConfig
DRAFT --> PUBLISHED : PublishAppConfig
PUBLISHED --> ARCHIVED : ArchiveAppConfig
Comandos y Eventos
CreateAppConfigCommand -> AppConfigCreatedEvent { configId, scope, code, version }
PublishAppConfigCommand -> AppConfigPublishedEvent { configId, code, version }
ArchiveAppConfigCommand -> AppConfigArchivedEvent { configId, code }
UpdateAppConfigCommand -> AppConfigUpdatedEvent { configId, code, newVersion }
Aggregate: FeatureFlag
Aggregate Root: FeatureFlag
FS: FS-08, FS-13
Entidades
| Entidad |
Descripción |
FeatureFlag (AR) |
Toggle multi-dimension de funcionalidades |
FlagEvaluationLog |
Registro de evaluaciónes; se proyecta tambien en Audit Context |
Value Objects
| Value Object |
Tipo |
Regla |
FlagCode |
string |
Único globalmente en la plataforma |
FlagType |
enum |
BOOLEAN / VARIANT / PERCENTAGE |
FlagTargets |
JSON |
{systems, tenants, branches, roles, users, rollout_percentage} |
FlagStatus |
enum |
ACTIVE / INACTIVE / ARCHIVED |
LinkedResourceType |
enum? |
Nullable: MENU / MODULE / ENDPOINT / WORKFLOW |
Invariantes
| ID |
Regla |
Fuente |
| INV-FF1 |
FlagCode único globalmente |
conceptual-data-model.md |
| INV-FF2 |
PERCENTAGE type: rollout_percentage entre 0 y 100 |
FS-08 |
| INV-FF3 |
ARCHIVED no puede evaluarse ni reactivarse; debe crearse nueva versión |
FS-08 |
Diagrama del Agregado
classDiagram
direction TB
class FeatureFlag {
<<AggregateRoot>>
+Guid Id
+FlagCode Code
+FlagType Type
+JSON FlagTargets
+FlagStatus Status
+LinkedResourceType LinkedResourceType
}
class FlagEvaluationLog {
<<Entity>>
+Guid Id
+string Context
+bool Result
+DateTimeOffset EvaluatedAt
}
FeatureFlag "1" --> "0..*" FlagEvaluationLog : records
Máquina de Estado: FeatureFlag
stateDiagram-v2
[*] --> INACTIVE : CreateFeatureFlag
INACTIVE --> ACTIVE : ActivateFlag
ACTIVE --> INACTIVE : DeactivateFlag
ACTIVE --> ARCHIVED : ArchiveFlag
INACTIVE --> ARCHIVED : ArchiveFlag
note right of ARCHIVED : Estado terminal — crear nueva version
Comandos y Eventos
CreateFeatureFlagCommand -> FeatureFlagCreatedEvent { flagCode, type }
ActivateFlagCommand -> FeatureFlagActivatedEvent { flagCode, targetScope }
DeactivateFlagCommand -> FeatureFlagDeactivatedEvent { flagCode }
ArchiveFlagCommand -> FeatureFlagArchivedEvent { flagCode }
EvaluateFlagCommand -> FlagEvaluatedEvent { flagCode, result, context }
FeatureFlagStateChangedEvent { flagCode, newStatus, targetScope, changedBy }