Contexto Delimitado: Aprobaciones
Raíz de Agregado: ApprovalRequest
Módulo: Ums.Domain.Approvals.ApprovalRequest
Estado: Producción
El agregado ApprovalRequest representa una ejecución concreta en tiempo de ejecución de un proceso de aprobación. Cuando un usuario solicita una acción administrativa de altos privilegios (como una promoción de perfil o una modificación de configuración de seguridad), UMS instancia una ApprovalRequest vinculada a un ApprovalWorkflow específico para rastrear el estado, las aprobaciones, los rechazos y los detalles de auditoría de esa decisión operativa.
Pending a Approved o Rejected mediante firmas autenticadas.ApprovalRequest es la raíz del agregado. Todas las transiciones de estado (Aprobación, Rechazo) deben fluir a través de él para garantizar el cumplimiento de las restricciones.
Pending (Pendiente).Pending a Approved (Aprobado) o Rejected (Rechazado). Una vez que una solicitud se ha finalizado, su estado se bloquea permanentemente y no se puede editar.WorkflowId y TargetUserId.| Entidad / VO | Tipo | Propietario |
|—|—|—|
| ApprovalRequestId | Objeto de Valor | Identificador de raíz de agregado basado en Guid |
| ApprovalStatus | Enumerado | PENDING · APPROVED · REJECTED |
| AuditValueObject | Objeto de Valor | Rastrea metadatos de creación y modificación |
| Evento | Desencadenante |
|—|—|
| ApprovalRequestCreatedEvent | Se registra una nueva solicitud de aprobación y se establece en Pendiente |
| ApprovalRequestApprovedEvent | La solicitud se marca como Aprobada, activando despliegues aguas abajo |
| ApprovalRequestRejectedEvent | La solicitud se marca como Rechazada, abortando los despliegues aguas abajo |
| Comando | Descripción |
|—|—|
| CreateApprovalRequestCommand | Instanciar una solicitud de aprobación para una acción del usuario |
| ApproveRequestCommand | Aprobar una solicitud pendiente con el identificador del actor autorizado |
| RejectRequestCommand | Rechazar una solicitud pendiente y cancelar la elevación propuesta |
IApprovalRequestRepository — Gestiona el ciclo de vida de las solicitudes.TenantId del llamador (heredado a través del flujo de trabajo y las configuraciones de usuario de destino).ApprovalRequest (Raíz de Agregado)
└── Props: ApprovalRequestProps
├── Id: ApprovalRequestId
├── WorkflowId: ApprovalWorkflowId
├── TargetUserId: UserId
├── TargetProfileId?: ProfileId
├── Status: ApprovalStatus
└── Audit: AuditValueObject
classDiagram
direction LR
class ApprovalRequest {
+Guid Id
+Guid WorkflowId
+Guid TargetUserId
+Guid? TargetProfileId
+ApprovalStatus Status
+Create()
+Approve()
+Reject()
}
class ApprovalStatus {
<<enumeration>>
PENDING
APPROVED
REJECTED
}
ApprovalRequest "1" *-- "1" ApprovalStatus
sequenceDiagram
participant U as Solicitante
participant H as RequestHandler
participant R as IApprovalRequestRepository
participant A as ApprovalRequest (AR)
participant E as EventPublisher
U->>H: CreateApprovalRequestCommand(workflowId, targetUserId, targetProfileId)
H->>A: ApprovalRequest.Create(workflowId, targetUserId, targetProfileId, actorId)
A->>A: Establecer Estado = Pendiente
A->>A: Levantar ApprovalRequestCreatedEvent
H->>R: Save(request)
R-->>H: ok
H-->>U: RequestId
Note over U,A: Revisión Administrativa
Admin->>H: ApproveRequestCommand(requestId)
H->>R: GetById(requestId)
R-->>H: ApprovalRequest (AR)
H->>A: Approve(adminActorId)
A->>A: Transición Estado -> Aprobado
A->>A: Levantar ApprovalRequestApprovedEvent
H->>R: Save(request)
R-->>H: ok
H->>E: Publicar ApprovalRequestApprovedEvent
erDiagram
APPROVAL_WORKFLOW ||--o{ APPROVAL_REQUEST : "enruta"
USER_ACCOUNT ||--o{ APPROVAL_REQUEST : "apunta-a"
PROFILE ||--o{ APPROVAL_REQUEST : "eleva-a"
APPROVAL_REQUEST {
uniqueidentifier RequestId PK
uniqueidentifier WorkflowId FK
uniqueidentifier TargetUserId FK
uniqueidentifier TargetProfileId FK "Nullable"
nvarchar Status "PENDING-APPROVED-REJECTED"
datetime2 UpdatedAt
uniqueidentifier UpdatedBy
}
Aprobaciones. Se dirige directamente a identificadores de usuario de Identidad y perfiles de Autorización.IGA.CreateApprovalRequestCommand -> Entradas: WorkflowId, TargetUserId, TargetProfileId? -> Retorna: GuidApproveRequestCommand -> Entradas: RequestId -> Retorna: voidRejectRequestCommand -> Entradas: RequestId -> Retorna: voidRequestId, con índice compuesto no agrupado en TargetUserId, Status.