Navegación bilingüe: English · Español (este documento)
Este documento define el diseño táctico y estratégico del Bounded Context de Integration. Es un subdominio de soporte que actúa como la Anti-Corruption Layer (ACL) de todo el sistema: ingiere datos de sistemas externos (GitHub, GitLab, Jira, Trello, .harness) y exporta artefactos del Tracker hacia afuera, traduciendo cada forma externa a domain events canónicos — de modo que ningún tipo externo penetre un contexto core. Fuente de los agregados: TAD §3. Relaciones estratégicas: Bounded Context Map.
- Integration Endpoint: Una conexión configurada a un sistema externo para un tenant (proveedor, referencia de credenciales, dirección, alcance).
- ACL Adapter: El traductor que mapea un payload externo a un domain event canónico del Tracker (y viceversa para la exportación).
- Sync Record: Un rastro inmutable de una sincronización individual entrante/saliente, incluyendo el resultado canónico y la clave de idempotencia.
- Canonical Event: El domain event interno del Tracker producido a partir de un payload externo (ej.
CodeCommittedEventdesde un webhook de GitHub). - Egress / Ingress: La dirección del flujo de datos relativa al Tracker.
| Símbolo/Estereotipo | Significado |
|---|---|
<<Aggregate Root>> |
Entidad raíz transaccional. |
<<Entity>> |
Objeto con identidad, dependiente de su raíz. |
<<Value Object>> |
Objeto inmutable sin identidad intrínseca. |
<<Shared Kernel Shell>> |
Módulo transversal inyectado por aplicación/infraestructura. |
*-- (Línea sólida) |
Composición. |
..> (Línea punteada) |
Dependencia. |
classDiagram
class IntegrationEndpoint {
<<Aggregate Root>>
+UUID id
+String tenantId
+ExternalProvider provider
+SyncDirection direction
+String credentialsRef
+EndpointStatus status
+configure(UUID umsUserId)
+enable()
+disable()
+rotateCredentials(String newRef)
}
class SyncRecord {
<<Aggregate Root>>
+UUID id
+String tenantId
+UUID integrationEndpointId
+SyncDirection direction
+String idempotencyKey
+SyncStatus status
+String canonicalEventType
+Date syncedAt
+record(UUID umsUserId)
+markFailed(String reason)
}
class ACLAdapter {
<<Entity>>
+ExternalProvider provider
+String adapterVersion
+ingest(ExternalPayload) CanonicalEvent
+export(CanonicalArtifact) ExternalPayload
}
IntegrationEndpoint "1" *-- "1" ACLAdapter : usa
IntegrationEndpoint "1" --> "0..*" SyncRecord : produce
classDiagram
class ExternalReference {
<<Value Object>>
+ExternalSystem system
+String externalId
+String url
+ReferenceType type
+String label
+Date linkedAt
+Map metadata
}
class WebhookSignature {
<<Value Object>>
+String algorithm
+String signature
+Boolean verified
}
class AuditControl {
<<Value Object>>
+String createdBy
+Date createdAt
+String modifiedBy
+Date modifiedAt
}
class IntegrationEndpoint {
<<Aggregate Root>>
}
class SyncRecord {
<<Aggregate Root>>
}
SyncRecord "1" *-- "0..1" WebhookSignature : verificado por
SyncRecord "1" *-- "1" ExternalReference : enlaza a
SyncRecord "1" *-- "1" AuditControl : rastreado por
IntegrationEndpoint "1" *-- "1" AuditControl : rastreado por
classDiagram
class IntegrationFabric {
<<Shared Kernel Shell>>
+ingestFromWebhook()
+exportToExternalSystem()
}
class EventBusShell {
<<Shared Kernel Shell>>
+publish(CanonicalEvent)
}
class UMS_SDK {
<<Cross-Cutting>>
+RequiresDomainAccess()
}
class IntegrationEndpoint {
<<Aggregate Root>>
}
class ACLAdapter {
<<Entity>>
}
ACLAdapter ..> IntegrationFabric : delega transporte
ACLAdapter ..> EventBusShell : publica eventos canónicos
IntegrationEndpoint ..> UMS_SDK : asegurado vía
IntegrationEndpoint: Config de conexión externa por tenant. Las credenciales se mantienen solo por referencia (el secreto vive en el secret manager — Security Spec §8), nunca en línea.SyncRecord: Rastro inmutable e idempotente de una sincronización. LaidempotencyKeygarantiza que la entrega entrante at-least-once no se aplique dos veces (alineado con la regla de idempotencia de consumidor de TAD §13.1).
ACLAdapter(Entity): El traductor específico del proveedor; versionado para que un cambio de formato del proveedor sea un bump de versión del adapter, no un cambio de dominio.ExternalReference(VO): Compartido con Discovery, Construction, QA (Shared Kernel) — el enlace canónico a un objeto externo.WebhookSignature(VO): Verificación HMAC de webhooks entrantes (Security Spec SEC-D4 ⊕ propuesta) — protege contra la falsificación de payloads (STRIDE Tampering).
- Ningún tipo externo cruza la frontera. Cada payload entrante se convierte en un
DomainEventcanónico; cada exportación parte de un artefacto canónico. Los contextos core nunca importan tipos de GitHub/Jira. Esta es la ACL primaria del sistema, complementando la ACLUmsSecurityAdapterpara auth.
- Ingreso: webhook/CSV → verificado → normalizado → evento canónico publicado en el bus.
- Egreso: artefacto canónico → adapter → API externa (exportación en Modo Standalone).
- Ambas direcciones persisten un
SyncRecordcon clave de idempotencia.
- Anti-Corruption Layer (upstream de Discovery): ingiere iniciativas externas →
InitiativeImport. - Anti-Corruption Layer (par de Construction): webhooks de PR y commit de GitHub/GitLab →
CodeCommittedEvent,PeerReviewUpdatedEvent. - Puente
.harness↔ QA: retransmite payloads de CI/test (el contexto QA posee el contrato de resultados de.harness; Integration maneja el transporte). - Conformist hacia proveedores externos: se adapta a sus formatos; nunca les pide cambiar.
IntegrationEndpointConfiguredEventInboundSyncReceivedEventOutboundSyncCompletedEventSyncFailedEventWebhookRejectedEvent(fallo de verificación de firma)ExternalCheckpointRegisteredEvent(avance por checkpoint externo en modo initiative-only)