ceo-api/src/sagas/sagas.module.ts
valentinbvro 765ec37c3a feat: Saga Manager (Sprint 4-6)
Motor generic pentru procese cu mai multi pasi care nu incap intr-o
tranzactie. Garantia nu e atomicitatea, ci compensarea in ordine inversa.

- saga-registry: definitii versionate in cod, backoff exponential plafonat
- saga-runner: corelator outbox->instanta, step runner, timeout, retry,
  compensare; revendicare cu FOR UPDATE SKIP LOCKED ca doua procese sa nu
  avanseze aceeasi saga simultan
- idempotenta la pornire prin index unic (saga, versiune, trigger_event),
  nu prin SELECT-apoi-INSERT care ar avea race
- compensarea are propriul retry: o compensare esuata lasa sistemul mai rau
  decat esecul original
- monitor /v1/sagas cu instante blocate si retry manual care NU sare pasi
- prima saga reala: imbogatire research brief, fara pas AI (un apel AI
  automat per brief ar schimba profilul de cost)
2026-07-29 15:02:56 +02:00

26 lines
1 KiB
TypeScript

import { Module, OnModuleInit } from '@nestjs/common';
import { IntelligenceModule } from '../intelligence/intelligence.module';
import { IntelligenceService } from '../intelligence/intelligence.service';
import { registerResearchBriefEnrichment } from './research-brief-enrichment.saga';
import { SagaRunnerService } from './saga-runner.service';
import { SagasController } from './sagas.controller';
import { SagasService } from './sagas.service';
@Module({
imports: [IntelligenceModule],
controllers: [SagasController],
providers: [SagaRunnerService, SagasService],
exports: [SagaRunnerService],
})
export class SagasModule implements OnModuleInit {
constructor(private readonly intelligence: IntelligenceService) {}
/**
* Sagas se inregistreaza la bootstrap, nu la import: definitia are nevoie de
* servicii injectate, iar registrul trebuie sa fie complet inainte ca primul
* tur de corelator sa ruleze.
*/
onModuleInit(): void {
registerResearchBriefEnrichment(this.intelligence);
}
}