@sebaseg/saga-builder-nestjs
v1.0.2
Published
Library to apply orchestrator saga pattern with steps and compensations
Downloads
3
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...
},
};
}
}