@sebaseg/saga-builder-nestjs
v1.0.2
Published
Library to apply orchestrator saga pattern with steps and compensations
Maintainers
Readme
Saga Orchestrator pattern for NestJS Library
Nest.js Library to apply orchestrator saga pattern with steps and compensations
Instructions
Install
npm i @sebaseg/saga-builder-nestjs
Use library
Import the SagaBuilderNestjsModule in your module service or app where you need to implement the pattern.
Before inject SagaBuilderNestjsService in the constructor:
constructor(private sagaBuilderSrvc: SagaBuilderNestjsService){}Example usage:
import { Injectable } from '@nestjs/common';
import { SagaStep, SagaCompensation } from 'src/saga/interfaces';
import { SagaBuilderNestjsService } from '@sebaseg/saga-builder-nestjs/saga-builder-nestjs.service';
export interface Iuser {
name: string;
}
@Injectable()
export class ConsumeSagaService {
constructor(private sagaBuilderSrvc: SagaBuilderNestjsService) {}
responseFunc1: Iuser;
async startSaga(data: any) {
try {
const steps = [
{
step: this.func1(),
compensation: this.compensationForFunc1(),
},
{
step: this.func2(),
compensation: this.compensationForFunc2(),
},
{
step: this.func3(),
},
];
await this.sagaService.run(data, steps);
} catch (error) {
console.error('[startSaga] error: ', error);
throw error;
}
}
// Your functions
func1(): SagaStep {
console.log('func1 configured');
return {
action: async (data: any) => {
console.log('Executing func1', data);
// Logic here...
const dataFunc1 = { name: 'john doe' };
this.responseFunc1 = dataFunc1;
},
};
}
compensationForFunc1(): SagaCompensation {
console.log('compensation for func1 configured');
return {
compensation: async (data: any) => {
console.log('Executing compensation for step 1', data);
// Logic compensation here
},
};
}
func2(): SagaStep {
console.log('func2 configured');
return {
action: async (data: any) => {
console.log('Executing func2', data);
console.log('data de func1: ', this.responseFunc1);
// Your logic here...
//throw new Error('error ejecutando error func2');
},
};
}
compensationForFunc2(): SagaCompensation {
console.log('compensation for func2 configured');
return {
compensation: async (data: any) => {
console.log('Executing compensation for func2, data);
// Your compensation logic here...
},
};
}
func3(): SagaStep {
console.log('func3 configured');
return {
action: async (data: any) => {
console.log('Executing func3', data);
// Your logic here...
},
};
}
}