Skip to main content

Arquitectura de referencia (C4)

Se documentan tres vistas C4: Contexto (C1) · Contenedores (C2) · Componentes (C3) y la vista interna por capas (Arquitectura Base Backend Alpura) que aplica a TODO micro/servicio/worker Nexus (WEB · Facade · Service · Persistence + Commons transversal · Alpura-SDK cross).


2.1 Diagrama de contexto (C1)​


2.2 Diagrama de contenedores (C2)​


2.2.1 Ficha de cada contenedor (plantilla aplicada)​

Purchase Order API​

CampoValor
ResponsabilidadIngesta de solicitudes OC + orquestación síncrona (validaciones, persistencia, outbox)
EntradasPOST /api/v1/purchase-orders, Idempotency-Key, Authorization: Bearer, JSON body`
Salidas202 Accepted (campos requestId, status, submittedAt); errores 400/401/403/409 con error model; escritura transaccional en PostgreSQL; outbox persistido
DependenciasPostgreSQL, Validation Engine, Outbox Publisher, IdP (JWKS)
Datos administradospurchase_order_request, validation_result, outbox_event, audit_event (solo escritura)
APIsPurchase Order ingestion endpoints. No publica eventos directamente; delega publicación al Outbox
Eventos(solo por medio de outbox: PURCHASE_ORDER_REQUESTED publicado por Outbox Publisher
EstadosTransiciona RECEIVED → VALIDATING → VALIDATED/VALIDATION_FAILED → QUEUED (o REJECTED)
ErroresVALIDATION_ERROR (400), AUTHENTICATION (401/403), CONFLICT (409), TECHNICAL (500)
PatronesArquitectura por capas (WEB → Facade → Service → Persistence + Commons), Transactional Outbox, Idempotency
SeguridadOAuth2 scopes nexus.purchase-order.create, idempotency, log sin PII
ObservabilidadMétricas nexus_purchase_orders_received_total, trazas OTEL, correlation requestId

Validation Engine (componente interno)​

CampoValor
ResponsabilidadEjecutar validaciones estructurales/sintácticas/semánticas/negocio configurables
EntradasPurchaseOrderCanónico + partnerId, sourceSystem, companyId`
Salidas{valid, errors[{ruleCode, field, message}
Dependenciasvalidation_rule / validation_rule_version en PostgreSQL
Datos administradosLectura de reglas; escritura de validation_result
APIsNo HTTP expuesto; interface Java dentro de capa Facade ValidationServiceFacade + implementación en ValidationEngineService (capa Service).
Eventosaudit_event VALIDATION_STARTED/COMPLETED/FAILED
EstadosSíncrono; no maneja estado propio (stateless)
ErroresRetorna VALIDATION_ERROR; no envía a DLQ
PatronesSpecification + Strategy + Rules DSL seguro (no arbitrary code)
SeguridadReglas versionadas, auditoría de cambios
Observabilidadnexus_validation_failed_total + labels partnerId, ruleCode

Status API​

CampoValor
ResponsabilidadLeer estado por requestId, búsqueda, historial de transiciones y errores
EntradasGET /api/v1/purchase-orders/requests/{requestId}
SalidasDTO con estado, referencias, timestamps, historial
DependenciasPostgreSQL (solo lectura)
Datos administradosLectura de purchase_order_request, transaction_status_history, integration_error
APIsStatus endpoints + search (filtros partnerId, externalReference, status, fechas
Eventosaudit_event: STATUS_QUERIED
EstadosRead-only
Errores401/403/404
PatronesCQRS-lite: separación de modelo de lectura
SeguridadScope nexus.purchase-order.read
ObservabilidadHistogramas latencia, logs query

Configuration API​

CampoValor
ResponsabilidadCRUD / versionado / activación de reglas y configuración partner
EntradasValidations Rules API + partners API + mappings API
SalidasReglas persistidas y auditadas
DependenciasPostgreSQL + auditoría fuerte
Datos administradosvalidation_rule, validation_rule_version, partner, partner_configuration
APIs6 endpoints de rules + partners + partner configurations
EventosAuditoría de cambios de reglas
EstadosDraft / Active / Inactive
Errores400/401/403/409/422
PatronesVersionado semántico de reglas
SeguridadScope nexus.validation-rule.manage (RBAC restrictivo)
ObservabilidadAuditoría TODO cambio, métricas nexus_rules_*, alerts en activaciones

Oracle Fusion Worker​

CampoValor
ResponsabilidadConsumir mensajes, transformar canónico→Fusion, invocar Fusion y reportar estado.
EntradasPull subscription Pub/Sub nexus.purchase-order.requested/retry
SalidasActualización de estado PROCESSING→CREATED/FAILED/RETRY_PENDING
DependenciasPostgreSQL, Oracle Fusion REST API, IdP (para Fusion)
Datos administradosEscritura en purchase_order, purchase_order_line, integration_error, processed_event
APIsNo HTTP; consumer Pub/Sub
EventosORACLE_REQUEST_SENT / RESPONSE_RECEIVED / CREATED /FAILED audit
EstadosPROCESSING · RETRY_PENDING ·CREATED · FAILED
ErroresTaxonomía de errores (TEMPORARY / INTEGRATION / BUSINESS / TECHNICAL
PatronesInterface PurchaseOrderCreationService + OracleFusionPurchaseOrderService (capa Service); Resilience4j por medio de Alpura-SDK; Idempotent Consumer
SeguridadCredenciales Fusion por Secret Manager; scopes worker; mTLS TBD
Observabilidadnexus_oracle_fusion_latency_seconds, retry count, DLQ

Outbox Publisher​

CampoValor
ResponsabilidadGarantizar publicación eventual de eventos persistidos en outbox_event
EntradasPoll periódico / CDC ligero (PostgreSQL SKIP LOCKED + LIMIT
SalidasPub/Sub publish + update processed_event + mark outbox processed
DependenciasPostgreSQL + Pub/Sub
Datos administradosoutbox_event, processed_event
APIsInterno
EventosPublicación de envelope canónico
Estados`PENDING → PUBLISHED → FAILED_PUBLISH (retries)
ErroresReintentos con backoff exponencial; alerta tras umbral
PatronesTransactional Outbox + Polling Publisher
SeguridadPub/Sub IAM mínimo privilegio
ObservabilidadLag outbox, tasa publicación, reintentos
tip

Leyenda igual que la imagen de referencia:

  • Morado = componentes que se importan desde librerías Alpura (Security, Telemetry, Utilities, Exceptions, Model, Alpura-SDK).
  • Blanco = componentes propios del servicio (Controllers, Service Interfaces/Facade, Services, Repositories, Value Objects, Constants).
  • Dependencia estricta: WEB → Facade → Service → Persistence. Commons es transversal. Alpura-SDK se usa dentro de la capa Service para clientes REST, auth, resiliencia y tracing.

2.3 Diagrama de componentes (C3) — Purchase Order API (por capas)​

tip

Esta vista se complementa con la estructura de paquetes Spring Boot y lineamientos de nomenclatura de métodos (públicos sin prefijo, privados con _, 0-3 params ideal) en Arquitectura interna por capas.