light business process state management
npm install @h-platform/bpm
export class BusinessTask {
constructor(
readonly taskName: string,
readonly taskType: TaskType,
readonly getNextTasks: NextTasksFunc = (process) => [],
readonly canComplete: TaskConstraintFunc = (process) => true,
) { }
}
`
The above examples can be implemented as follows
`
import { BusinessProcess, BusinessTask, TaskType } from '@h-platform/bpm';
createRegistrationProcess() {
return new BusinessProcess([
'start'
], [
new BusinessTask('start', TaskType.UserTask,
() => ['user.verifyEmail']),
new BusinessTask('user.verifyEmail', TaskType.UserTask,
() => ['user.fillInvestmentForm']),
new BusinessTask('user.fillInvestmentForm', TaskType.UserTask,
() => ['user.fillExperienceForm']),
new BusinessTask('user.fillExperienceForm', TaskType.UserTask,
() => ['user.fillNeedsForm',]),
new BusinessTask('user.fillNeedsForm', TaskType.UserTask,
() => [
'user.uploadIdentity',
'user.uploadPhoto',
]),
new BusinessTask('user.uploadIdentity', TaskType.UserTask,
() => ['admin.approveAccount']),
new BusinessTask('user.uploadPhoto', TaskType.UserTask,
() => ['admin.approveAccount'],
new BusinessTask('admin.approveAccount', TaskType.UserTask,
() => ['system.sendWelcomeEmail'],
(process) => {
// ensure previous tasks are completed
return ['user.uploadIdentity', 'user.uploadPhoto'].every((taskName) => process.completedTasks.includes(taskName)
}),
new BusinessTask('system.sendWelcomeEmail', TaskType.SystemTask,
() => []),
])
}
`
Using the process
the above defined process can be used as follows:
`
const registrationProcess = createRegistrationProcess();
registrationProcess.start();
console.log(registrationProcess.currentTasks); // ['user.fillInvestmentForm']
registrationProcess.complete('user.fillInvestmentForm');
console.log(registrationProcess.currentTasks); // ['user.fillExperienceForm']
registrationProcess.complete('user.fillExperianceForm');
console.log(registrationProcess.currentTasks); // ['user.fillNeedsForm']
registrationProcess.complete('someRandomTaskName'); // throw taskName not found error
registrationProcess.complete('admin.approveAccount'); // throw taskName not yet active error
registrationProcess.complete('user.fillNeedsForm'); // ok
registrationProcess.complete('user.uploadPhoto'); // ok
registrationProcess.complete('user.uploadIdentity'); // ok
registrationProcess.complete('user.approveAccount'); // ok
registrationProcess.complete('system.sendWelcomeEmail'); // ok, no more active tasks
``