Skip to content

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.

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
ConvenciónReforzada 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.
  • PermissionService vive en domain/permissions/, no en common. Aunque es transversal por uso, conceptualmente es un dominio (autorización).
  • ChartOfAccountsService vive en domain/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 de domain/. Están en Observabilidad.

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.