Plataforma técnica · Orchestrator
Common (Infraestructura compartida)
Orchestrator Common Infraestructura
domain/common/ agrupa la infraestructura compartida que consumen todos los demás dominios del Orchestrator: la base abstracta de los servicios, helpers de SQL, decoradores de repositorio, el bus de eventos y un wrapper de PDF. Más una fachada (CommonDataService) sobre los parámetros del commonPool (UF, UTM, AFP, AFC, leyes sociales, etc.).
A diferencia de los otros directorios bajo services/, casi nada acá expone endpoints HTTP directamente — son piezas que otros servicios importan.
Mapa de uso
Section titled “Mapa de uso”flowchart TB
subgraph CMN["domain/common/"]
BS["BaseService"]
CDS["CommonDataService"]
SQL["sqlBuilders"]
DEC["RepositoryDecorators"]
EVT["events/<br/>DomainEventBus + MongoEventSink"]
PDF["PdfService"]
ERR["errors.ts<br/>(getPgErrorCode)"]
end
subgraph DOM["Resto de domain/"]
PAY["PayrollService"]
CAP["CapitalService"]
LR["LegalRepService"]
COA["ChartOfAccountsService"]
others["..."]
end
subgraph EXT["Externo"]
PG[("PostgreSQL")]
MG[("MongoDB · nostromo_cortex")]
BR["Puppeteer<br/>(Chromium)"]
end
PAY & CAP & LR & COA & others -- extends --> BS
PAY & CAP & LR -. consultan parámetros .-> CDS
PAY & CAP & LR & COA -. SQL helpers .-> SQL
PAY & CAP & LR -. wrap static repo .-> DEC
BS -- outbox flush --> EVT
EVT --> MG
PAY -. genera PDF liquidaciones .-> PDF --> BR
CDS --> PG Convenciones que impone esta capa
Section titled “Convenciones que impone esta capa”| Convención | Reforzada por |
|---|---|
| Eventos solo se emiten tras COMMIT. | BaseService.withTransaction + outbox.queue. |
| Errores transientes (40001/40P01) → retry. | wrapStaticRepository con retry: true default. |
Slow queries → console.warn. | wrapStaticRepository con slowQueryMs: 500 default. |
Audit fields (updated_by, updated_at) | buildUpdate/buildInsert los añaden automáticamente. |
Validaciones tempranas → ValidationError. | BaseService.assert, assertExists, validateRequired. |
tenantDb / userId siempre via ServiceContext. | Firma de BaseService y subclases. |
Lo que no vive acá
Section titled “Lo que no vive acá”PermissionServicevive endomain/permissions/, no en common. Aunque es transversal por uso, conceptualmente es un dominio (autorización).ChartOfAccountsServicevive endomain/chart-of-accounts/. Es transversal por consumo pero es CRUD de una tabla específica — está documentado bajo Administración.- El audit logger (
lib/audit.ts) y metrics middleware (middleware/metrics.ts) son cross-cutting pero viven fuera dedomain/. Están en Observabilidad.
Convención de import
Section titled “Convención de import”Los servicios siempre importan con alias @/domain/common/...:
import { BaseService, ServiceContext, ServiceResult } from "@/domain/common/BaseService";import { buildUpdate, buildWhere } from "@/domain/common/sqlBuilders";import { wrapStaticRepository } from "@/domain/common/decorators/RepositoryDecorators";@/ apunta a orchestrator/src/ vía tsconfig.json.