@rytass/bpm-core-nestjs-module 0.7.0 → 0.9.1
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +127 -0
- package/README.md +58 -1
- package/package.json +18 -11
- package/src/index.d.ts +1 -0
- package/src/index.js +1 -0
- package/src/index.js.map +1 -1
- package/src/lib/bpm/bpm-root.module.d.ts +15 -0
- package/src/lib/bpm/bpm-root.module.js +12 -0
- package/src/lib/bpm/bpm-root.module.js.map +1 -1
- package/src/lib/calendar/calendar.module.d.ts +5 -1
- package/src/lib/calendar/calendar.module.js +1 -0
- package/src/lib/calendar/calendar.module.js.map +1 -1
- package/src/lib/form/form-schema.validator.js +177 -10
- package/src/lib/form/form-schema.validator.js.map +1 -1
- package/src/lib/form/form.service.d.ts +19 -1
- package/src/lib/form/form.service.js +56 -6
- package/src/lib/form/form.service.js.map +1 -1
- package/src/lib/form-data-source/form-data-source-value-resolver.service.d.ts +16 -0
- package/src/lib/form-data-source/form-data-source-value-resolver.service.js +401 -0
- package/src/lib/form-data-source/form-data-source-value-resolver.service.js.map +1 -0
- package/src/lib/form-data-source/form-data-source.errors.d.ts +34 -0
- package/src/lib/form-data-source/form-data-source.errors.js +43 -0
- package/src/lib/form-data-source/form-data-source.errors.js.map +1 -0
- package/src/lib/form-data-source/form-data-source.module.d.ts +9 -0
- package/src/lib/form-data-source/form-data-source.module.js +55 -0
- package/src/lib/form-data-source/form-data-source.module.js.map +1 -0
- package/src/lib/form-data-source/form-data-source.queries.d.ts +57 -0
- package/src/lib/form-data-source/form-data-source.queries.js +293 -0
- package/src/lib/form-data-source/form-data-source.queries.js.map +1 -0
- package/src/lib/form-data-source/form-data-source.service.d.ts +72 -0
- package/src/lib/form-data-source/form-data-source.service.js +646 -0
- package/src/lib/form-data-source/form-data-source.service.js.map +1 -0
- package/src/lib/form-data-source/form-data-source.types.d.ts +88 -0
- package/src/lib/form-data-source/form-data-source.types.js +29 -0
- package/src/lib/form-data-source/form-data-source.types.js.map +1 -0
- package/src/lib/form-data-source/index.d.ts +5 -0
- package/src/lib/form-data-source/index.js +9 -0
- package/src/lib/form-data-source/index.js.map +1 -0
- package/src/lib/migrations/0000000018000-notification-archive.d.ts +6 -0
- package/src/lib/migrations/0000000018000-notification-archive.js +28 -0
- package/src/lib/migrations/0000000018000-notification-archive.js.map +1 -0
- package/src/lib/migrations/0000000019000-approval-template-activation.d.ts +6 -0
- package/src/lib/migrations/0000000019000-approval-template-activation.js +29 -0
- package/src/lib/migrations/0000000019000-approval-template-activation.js.map +1 -0
- package/src/lib/migrations/0000000020000-form-data-option-snapshots.d.ts +6 -0
- package/src/lib/migrations/0000000020000-form-data-option-snapshots.js +22 -0
- package/src/lib/migrations/0000000020000-form-data-option-snapshots.js.map +1 -0
- package/src/lib/migrations/index.d.ts +3 -0
- package/src/lib/migrations/index.js +9 -0
- package/src/lib/migrations/index.js.map +1 -1
- package/src/lib/notification/index.d.ts +3 -0
- package/src/lib/notification/index.js +3 -0
- package/src/lib/notification/index.js.map +1 -1
- package/src/lib/notification/notification-observer.token.d.ts +52 -0
- package/src/lib/notification/notification-observer.token.js +5 -0
- package/src/lib/notification/notification-observer.token.js.map +1 -0
- package/src/lib/notification/notification.entity.d.ts +11 -0
- package/src/lib/notification/notification.entity.js +17 -0
- package/src/lib/notification/notification.entity.js.map +1 -1
- package/src/lib/notification/notification.mutations.d.ts +2 -0
- package/src/lib/notification/notification.mutations.js +28 -0
- package/src/lib/notification/notification.mutations.js.map +1 -1
- package/src/lib/notification/notification.queries.d.ts +2 -2
- package/src/lib/notification/notification.queries.js +12 -8
- package/src/lib/notification/notification.queries.js.map +1 -1
- package/src/lib/notification/notification.service.d.ts +34 -2
- package/src/lib/notification/notification.service.js +116 -3
- package/src/lib/notification/notification.service.js.map +1 -1
- package/src/lib/template/approval-template.entity.d.ts +13 -0
- package/src/lib/template/approval-template.entity.js +12 -1
- package/src/lib/template/approval-template.entity.js.map +1 -1
- package/src/lib/template/template.enums.d.ts +5 -0
- package/src/lib/template/template.enums.js +10 -1
- package/src/lib/template/template.enums.js.map +1 -1
- package/src/lib/template/template.mutations.d.ts +2 -0
- package/src/lib/template/template.mutations.js +20 -0
- package/src/lib/template/template.mutations.js.map +1 -1
- package/src/lib/template/template.queries.d.ts +3 -3
- package/src/lib/template/template.queries.js +14 -4
- package/src/lib/template/template.queries.js.map +1 -1
- package/src/lib/template/template.service.d.ts +7 -2
- package/src/lib/template/template.service.js +56 -11
- package/src/lib/template/template.service.js.map +1 -1
- package/src/lib/template/workflow-definition.validator.js +11 -0
- package/src/lib/template/workflow-definition.validator.js.map +1 -1
- package/src/lib/workflow-engine/approval-instance.entity.d.ts +3 -0
- package/src/lib/workflow-engine/approval-instance.entity.js +15 -0
- package/src/lib/workflow-engine/approval-instance.entity.js.map +1 -1
- package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +5 -1
- package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +6 -2
- package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +1 -1
- package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +5 -1
- package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +6 -2
- package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +1 -1
- package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +3 -2
- package/src/lib/workflow-engine/workflow-engine.mutations.js +8 -6
- package/src/lib/workflow-engine/workflow-engine.mutations.js.map +1 -1
- package/src/lib/workflow-engine/workflow-engine.service.d.ts +18 -3
- package/src/lib/workflow-engine/workflow-engine.service.js +212 -7
- package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -1
|
@@ -1,3 +1,4 @@
|
|
|
1
|
+
import { BPMAuthContext } from '../bpm-auth';
|
|
1
2
|
import { AdhocDirectiveEntity } from './adhoc-directive.entity';
|
|
2
3
|
import { AdhocPreApprovalRejectBehaviorEnum } from './adhoc.enums';
|
|
3
4
|
import { ApprovalInstanceEntity } from './approval-instance.entity';
|
|
@@ -15,11 +16,11 @@ import { WorkflowEngineService } from './workflow-engine.service';
|
|
|
15
16
|
export declare class WorkflowEngineMutations {
|
|
16
17
|
private readonly workflowEngineService;
|
|
17
18
|
constructor(workflowEngineService: WorkflowEngineService);
|
|
18
|
-
submitApprovalInstance(input: SubmitApprovalInstanceInput, currentMemberId: string): Promise<ApprovalInstanceEntity>;
|
|
19
|
+
submitApprovalInstance(input: SubmitApprovalInstanceInput, currentMemberId: string, authContext: BPMAuthContext): Promise<ApprovalInstanceEntity>;
|
|
19
20
|
processApprovalInstance(instanceId: string): Promise<boolean>;
|
|
20
21
|
decideTask(input: DecideTaskInput, currentMemberId: string): Promise<TaskDecisionEntity>;
|
|
21
22
|
cancelApprovalInstance(input: CancelApprovalInstanceInput, currentMemberId: string): Promise<ApprovalInstanceEntity>;
|
|
22
|
-
resubmitApprovalInstance(input: ResubmitApprovalInstanceInput, currentMemberId: string): Promise<ApprovalInstanceEntity>;
|
|
23
|
+
resubmitApprovalInstance(input: ResubmitApprovalInstanceInput, currentMemberId: string, authContext: BPMAuthContext): Promise<ApprovalInstanceEntity>;
|
|
23
24
|
dryRunApprovalWorkflow(input: DryRunApprovalWorkflowInput): Promise<WorkflowDryRunResultObject>;
|
|
24
25
|
requestAdhocCountersign(taskId: string, target: AdhocTargetInput, comment: string | null, currentMemberId: string): Promise<AdhocDirectiveEntity>;
|
|
25
26
|
requestAdhocPreApproval(taskId: string, target: AdhocTargetInput, onReject: AdhocPreApprovalRejectBehaviorEnum, comment: string | null, currentMemberId: string): Promise<TaskEntity>;
|
|
@@ -22,12 +22,12 @@ let WorkflowEngineMutations = class WorkflowEngineMutations {
|
|
|
22
22
|
constructor(workflowEngineService) {
|
|
23
23
|
this.workflowEngineService = workflowEngineService;
|
|
24
24
|
}
|
|
25
|
-
async submitApprovalInstance(input, currentMemberId) {
|
|
25
|
+
async submitApprovalInstance(input, currentMemberId, authContext) {
|
|
26
26
|
return this.workflowEngineService.submitApprovalInstance({
|
|
27
27
|
...input,
|
|
28
28
|
initiatorMemberId: currentMemberId,
|
|
29
29
|
initiatorMetadataSnapshotJson: null,
|
|
30
|
-
});
|
|
30
|
+
}, authContext);
|
|
31
31
|
}
|
|
32
32
|
async processApprovalInstance(instanceId) {
|
|
33
33
|
await this.workflowEngineService.processInstance(instanceId);
|
|
@@ -45,11 +45,11 @@ let WorkflowEngineMutations = class WorkflowEngineMutations {
|
|
|
45
45
|
cancelledByMemberId: currentMemberId,
|
|
46
46
|
});
|
|
47
47
|
}
|
|
48
|
-
async resubmitApprovalInstance(input, currentMemberId) {
|
|
48
|
+
async resubmitApprovalInstance(input, currentMemberId, authContext) {
|
|
49
49
|
return this.workflowEngineService.resubmitApprovalInstance({
|
|
50
50
|
...input,
|
|
51
51
|
initiatorMemberId: currentMemberId,
|
|
52
|
-
});
|
|
52
|
+
}, authContext);
|
|
53
53
|
}
|
|
54
54
|
async dryRunApprovalWorkflow(input) {
|
|
55
55
|
return Promise.resolve(this.workflowEngineService.dryRunApprovalWorkflow(input));
|
|
@@ -101,8 +101,9 @@ tslib_1.__decorate([
|
|
|
101
101
|
(0, graphql_1.Mutation)(() => approval_instance_entity_1.ApprovalInstanceEntity),
|
|
102
102
|
tslib_1.__param(0, (0, graphql_1.Args)('input')),
|
|
103
103
|
tslib_1.__param(1, (0, bpm_auth_1.BPMCurrentMemberId)()),
|
|
104
|
+
tslib_1.__param(2, (0, bpm_auth_1.BPMCurrentAuthContext)()),
|
|
104
105
|
tslib_1.__metadata("design:type", Function),
|
|
105
|
-
tslib_1.__metadata("design:paramtypes", [submit_approval_instance_input_1.SubmitApprovalInstanceInput, String]),
|
|
106
|
+
tslib_1.__metadata("design:paramtypes", [submit_approval_instance_input_1.SubmitApprovalInstanceInput, String, Object]),
|
|
106
107
|
tslib_1.__metadata("design:returntype", Promise)
|
|
107
108
|
], WorkflowEngineMutations.prototype, "submitApprovalInstance", null);
|
|
108
109
|
tslib_1.__decorate([
|
|
@@ -133,8 +134,9 @@ tslib_1.__decorate([
|
|
|
133
134
|
(0, graphql_1.Mutation)(() => approval_instance_entity_1.ApprovalInstanceEntity),
|
|
134
135
|
tslib_1.__param(0, (0, graphql_1.Args)('input')),
|
|
135
136
|
tslib_1.__param(1, (0, bpm_auth_1.BPMCurrentMemberId)()),
|
|
137
|
+
tslib_1.__param(2, (0, bpm_auth_1.BPMCurrentAuthContext)()),
|
|
136
138
|
tslib_1.__metadata("design:type", Function),
|
|
137
|
-
tslib_1.__metadata("design:paramtypes", [resubmit_approval_instance_input_1.ResubmitApprovalInstanceInput, String]),
|
|
139
|
+
tslib_1.__metadata("design:paramtypes", [resubmit_approval_instance_input_1.ResubmitApprovalInstanceInput, String, Object]),
|
|
138
140
|
tslib_1.__metadata("design:returntype", Promise)
|
|
139
141
|
], WorkflowEngineMutations.prototype, "resubmitApprovalInstance", null);
|
|
140
142
|
tslib_1.__decorate([
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"workflow-engine.mutations.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-engine/workflow-engine.mutations.ts"],"names":[],"mappings":";;;;AAAA,6CAA+D;AAC/D,
|
|
1
|
+
{"version":3,"file":"workflow-engine.mutations.js","sourceRoot":"","sources":["../../../../../../libs/bpm-core/src/lib/workflow-engine/workflow-engine.mutations.ts"],"names":[],"mappings":"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"}
|
|
@@ -2,6 +2,7 @@ import { Repository } from 'typeorm';
|
|
|
2
2
|
import { AttachmentService } from '../attachment/attachment.service';
|
|
3
3
|
import { DelegationService } from '../delegation/delegation.service';
|
|
4
4
|
import { FormDefinitionVersionEntity } from '../form/form-definition-version.entity';
|
|
5
|
+
import type { BPMFormDataSourceValueResolver } from '../form-data-source/form-data-source.types';
|
|
5
6
|
import { BPMSlaScheduleService } from '../calendar/sla-schedule.service';
|
|
6
7
|
import { NotificationService } from '../notification/notification.service';
|
|
7
8
|
import { NotificationEntity } from '../notification/notification.entity';
|
|
@@ -28,6 +29,17 @@ import { ApprovalInstanceListViewEnum, ApprovalInstanceStateEnum } from './workf
|
|
|
28
29
|
import { WorkflowDryRunResultObject } from './workflow-dry-run.object';
|
|
29
30
|
import { BPMWorkflowServiceTaskDispatcher } from './workflow-service-task-dispatcher.token';
|
|
30
31
|
import { WorkflowTokenEntity } from './workflow-token.entity';
|
|
32
|
+
/**
|
|
33
|
+
* `initiatorMemberId` is optional on the GraphQL inputs because the resolver
|
|
34
|
+
* derives it from the authenticated member, but the engine still requires it:
|
|
35
|
+
* these aliases keep that obligation on the caller instead of re-checking it.
|
|
36
|
+
*/
|
|
37
|
+
type SubmitApprovalInstanceCommand = SubmitApprovalInstanceInput & {
|
|
38
|
+
readonly initiatorMemberId: string;
|
|
39
|
+
};
|
|
40
|
+
type ResubmitApprovalInstanceCommand = ResubmitApprovalInstanceInput & {
|
|
41
|
+
readonly initiatorMemberId: string;
|
|
42
|
+
};
|
|
31
43
|
/**
|
|
32
44
|
* Delegation-chain reason recorded for an approver-initiated transfer, as
|
|
33
45
|
* opposed to {@link SLA_ESCALATION_DELEGATION_REASON}.
|
|
@@ -76,12 +88,15 @@ export declare class WorkflowEngineService {
|
|
|
76
88
|
private readonly signatureService;
|
|
77
89
|
private readonly slaScheduleService;
|
|
78
90
|
private readonly serviceTaskDispatcher;
|
|
79
|
-
|
|
80
|
-
|
|
91
|
+
private readonly formDataSourceValueResolver?;
|
|
92
|
+
constructor(approvalInstanceRepository: Repository<ApprovalInstanceEntity>, workflowTokenRepository: Repository<WorkflowTokenEntity>, taskRepository: Repository<TaskEntity>, taskCandidateRepository: Repository<TaskCandidateEntity>, taskDecisionRepository: Repository<TaskDecisionEntity>, notificationRepository: Repository<NotificationEntity>, activityLogRepository: Repository<ActivityLogEntity>, adhocDirectiveRepository: Repository<AdhocDirectiveEntity>, approvalTemplateRepository: Repository<ApprovalTemplateEntity>, approvalTemplateVersionRepository: Repository<ApprovalTemplateVersionEntity>, formDefinitionVersionRepository: Repository<FormDefinitionVersionEntity>, attachmentService: AttachmentService, conditionService: ConditionService, delegationService: DelegationService, notificationService: NotificationService, signatureService: SignatureService, slaScheduleService: BPMSlaScheduleService, serviceTaskDispatcher?: BPMWorkflowServiceTaskDispatcher, formDataSourceValueResolver?: BPMFormDataSourceValueResolver | undefined);
|
|
93
|
+
submitApprovalInstance(input: SubmitApprovalInstanceCommand, authContext?: BPMAuthContext): Promise<ApprovalInstanceEntity>;
|
|
94
|
+
private resolveFormDataOptionSnapshots;
|
|
95
|
+
private prepareResubmitFormDataOptions;
|
|
81
96
|
processInstance(instanceId: string): Promise<void>;
|
|
82
97
|
decideTask(input: DecideTaskInput, options?: DecideTaskOptions): Promise<TaskDecisionEntity>;
|
|
83
98
|
cancelApprovalInstance(input: CancelApprovalInstanceInput): Promise<ApprovalInstanceEntity>;
|
|
84
|
-
resubmitApprovalInstance(input:
|
|
99
|
+
resubmitApprovalInstance(input: ResubmitApprovalInstanceCommand, authContext?: BPMAuthContext): Promise<ApprovalInstanceEntity>;
|
|
85
100
|
requestAdhocCountersign({ comment, requestedByMemberId, target, taskId, }: {
|
|
86
101
|
readonly comment?: string | null;
|
|
87
102
|
readonly requestedByMemberId: string;
|
|
@@ -2,6 +2,7 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.WorkflowEngineService = exports.MANUAL_TRANSFER_DELEGATION_REASON = void 0;
|
|
4
4
|
const tslib_1 = require("tslib");
|
|
5
|
+
const form_1 = require("@rytass/bpm-core-shared/form");
|
|
5
6
|
const common_1 = require("@nestjs/common");
|
|
6
7
|
const typeorm_1 = require("@nestjs/typeorm");
|
|
7
8
|
const typeorm_2 = require("typeorm");
|
|
@@ -9,6 +10,8 @@ const attachment_service_1 = require("../attachment/attachment.service");
|
|
|
9
10
|
const delegation_service_1 = require("../delegation/delegation.service");
|
|
10
11
|
const form_definition_version_entity_1 = require("../form/form-definition-version.entity");
|
|
11
12
|
const form_enums_1 = require("../form/form.enums");
|
|
13
|
+
const form_data_source_errors_1 = require("../form-data-source/form-data-source.errors");
|
|
14
|
+
const form_data_source_types_1 = require("../form-data-source/form-data-source.types");
|
|
12
15
|
const sla_schedule_service_1 = require("../calendar/sla-schedule.service");
|
|
13
16
|
const notification_service_1 = require("../notification/notification.service");
|
|
14
17
|
const notification_entity_1 = require("../notification/notification.entity");
|
|
@@ -49,7 +52,7 @@ const WORKFLOW_READ_ALL_PERMISSIONS = new Set([
|
|
|
49
52
|
'workflow.read_all',
|
|
50
53
|
]);
|
|
51
54
|
let WorkflowEngineService = class WorkflowEngineService {
|
|
52
|
-
constructor(approvalInstanceRepository, workflowTokenRepository, taskRepository, taskCandidateRepository, taskDecisionRepository, notificationRepository, activityLogRepository, adhocDirectiveRepository, approvalTemplateRepository, approvalTemplateVersionRepository, formDefinitionVersionRepository, attachmentService, conditionService, delegationService, notificationService, signatureService, slaScheduleService, serviceTaskDispatcher = new workflow_service_task_dispatcher_token_1.DefaultWorkflowServiceTaskDispatcher()) {
|
|
55
|
+
constructor(approvalInstanceRepository, workflowTokenRepository, taskRepository, taskCandidateRepository, taskDecisionRepository, notificationRepository, activityLogRepository, adhocDirectiveRepository, approvalTemplateRepository, approvalTemplateVersionRepository, formDefinitionVersionRepository, attachmentService, conditionService, delegationService, notificationService, signatureService, slaScheduleService, serviceTaskDispatcher = new workflow_service_task_dispatcher_token_1.DefaultWorkflowServiceTaskDispatcher(), formDataSourceValueResolver) {
|
|
53
56
|
this.approvalInstanceRepository = approvalInstanceRepository;
|
|
54
57
|
this.workflowTokenRepository = workflowTokenRepository;
|
|
55
58
|
this.taskRepository = taskRepository;
|
|
@@ -68,16 +71,26 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
68
71
|
this.signatureService = signatureService;
|
|
69
72
|
this.slaScheduleService = slaScheduleService;
|
|
70
73
|
this.serviceTaskDispatcher = serviceTaskDispatcher;
|
|
74
|
+
this.formDataSourceValueResolver = formDataSourceValueResolver;
|
|
71
75
|
}
|
|
72
|
-
async submitApprovalInstance(input) {
|
|
76
|
+
async submitApprovalInstance(input, authContext) {
|
|
73
77
|
const formData = parseJsonObject(input.formDataJson, 'formDataJson');
|
|
74
78
|
const template = await this.getTemplateOrThrow(input.templateId);
|
|
79
|
+
if (!template.isActive) {
|
|
80
|
+
throw new common_1.ConflictException('Approval template is deactivated');
|
|
81
|
+
}
|
|
75
82
|
if (!template.currentVersionId) {
|
|
76
83
|
throw new common_1.ConflictException('Approval template does not have a published version');
|
|
77
84
|
}
|
|
78
85
|
const templateVersion = await this.getPublishedTemplateVersionOrThrow(template.currentVersionId);
|
|
79
86
|
const formDefinitionVersion = await this.getPublishedFormVersionOrThrow(templateVersion.formDefinitionVersionId);
|
|
80
87
|
validateSubmittedFormData(formDefinitionVersion.schema, formData);
|
|
88
|
+
const formDataOptionSnapshot = await this.resolveFormDataOptionSnapshots({
|
|
89
|
+
authContext: authContext ?? createWorkflowAuthContext(input.initiatorMemberId),
|
|
90
|
+
formData,
|
|
91
|
+
revalidateAll: true,
|
|
92
|
+
schema: formDefinitionVersion.schema,
|
|
93
|
+
});
|
|
81
94
|
const initiatorMetadataSnapshot = input.initiatorMetadataSnapshotJson
|
|
82
95
|
? parseJsonObject(input.initiatorMetadataSnapshotJson, 'initiatorMetadataSnapshotJson')
|
|
83
96
|
: await this.readDefaultInitiatorMetadataSnapshot(input.initiatorMemberId);
|
|
@@ -96,6 +109,7 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
96
109
|
const instance = await instanceRepository.save(instanceRepository.create({
|
|
97
110
|
completedAt: null,
|
|
98
111
|
formData,
|
|
112
|
+
formDataOptionSnapshot,
|
|
99
113
|
formDefinitionSnapshot: {
|
|
100
114
|
formDefinitionVersionId: formDefinitionVersion.id,
|
|
101
115
|
schema: formDefinitionVersion.schema,
|
|
@@ -149,6 +163,48 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
149
163
|
return instance;
|
|
150
164
|
});
|
|
151
165
|
}
|
|
166
|
+
async resolveFormDataOptionSnapshots({ authContext, formData, previousFormData, previousSnapshots, revalidateAll, schema, }) {
|
|
167
|
+
if (!this.formDataSourceValueResolver) {
|
|
168
|
+
assertNoUnresolvableDynamicValues(schema, formData);
|
|
169
|
+
return previousSnapshots ?? {};
|
|
170
|
+
}
|
|
171
|
+
return this.formDataSourceValueResolver.resolveFormDataOptionSnapshots({
|
|
172
|
+
authContext,
|
|
173
|
+
formData,
|
|
174
|
+
previousFormData,
|
|
175
|
+
previousSnapshots,
|
|
176
|
+
revalidateAll,
|
|
177
|
+
schema,
|
|
178
|
+
});
|
|
179
|
+
}
|
|
180
|
+
async prepareResubmitFormDataOptions(input, formData, authContext) {
|
|
181
|
+
const instance = await this.approvalInstanceRepository.findOne({
|
|
182
|
+
where: { id: input.instanceId },
|
|
183
|
+
});
|
|
184
|
+
if (!instance) {
|
|
185
|
+
throw new common_1.NotFoundException(`Approval instance ${input.instanceId} was not found`);
|
|
186
|
+
}
|
|
187
|
+
if (instance.initiatorMemberId !== input.initiatorMemberId) {
|
|
188
|
+
throw new common_1.ConflictException(`Approval instance ${instance.id} can only be resubmitted by its initiator`);
|
|
189
|
+
}
|
|
190
|
+
if (instance.state !== workflow_engine_enums_1.ApprovalInstanceStateEnum.RETURNED) {
|
|
191
|
+
throw new common_1.ConflictException(`Approval instance ${instance.id} is not returned`);
|
|
192
|
+
}
|
|
193
|
+
const template = await this.getTemplateOrThrow(instance.templateId);
|
|
194
|
+
if (!template.isActive) {
|
|
195
|
+
throw new common_1.ConflictException('Approval template is deactivated');
|
|
196
|
+
}
|
|
197
|
+
const schema = readFormDefinitionSnapshotSchema(instance.formDefinitionSnapshot);
|
|
198
|
+
validateSubmittedFormData(schema, formData);
|
|
199
|
+
const formDataOptionSnapshot = await this.resolveFormDataOptionSnapshots({
|
|
200
|
+
authContext,
|
|
201
|
+
formData,
|
|
202
|
+
previousFormData: instance.formData,
|
|
203
|
+
previousSnapshots: instance.formDataOptionSnapshot ?? {},
|
|
204
|
+
schema,
|
|
205
|
+
});
|
|
206
|
+
return { formDataOptionSnapshot, instance };
|
|
207
|
+
}
|
|
152
208
|
async processInstance(instanceId) {
|
|
153
209
|
await this.approvalInstanceRepository.manager.transaction(async (manager) => {
|
|
154
210
|
await manager.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
|
|
@@ -227,6 +283,19 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
227
283
|
if (instance.state !== workflow_engine_enums_1.ApprovalInstanceStateEnum.RUNNING) {
|
|
228
284
|
throw new common_1.ConflictException(`Approval instance ${instance.id} is not running`);
|
|
229
285
|
}
|
|
286
|
+
const taskNode = readWorkflowNodeOrThrow(instance.workflowSnapshot, task.nodeId);
|
|
287
|
+
if (taskNode.type !== 'userTask') {
|
|
288
|
+
throw new common_1.ConflictException(`Task ${task.id} is not bound to a user task node`);
|
|
289
|
+
}
|
|
290
|
+
if (input.action === workflow_engine_enums_1.TaskDecisionActionEnum.REJECTED &&
|
|
291
|
+
taskNode.data.allowReject === false) {
|
|
292
|
+
throw new common_1.ForbiddenException(`Workflow node ${task.nodeId} does not allow rejection`);
|
|
293
|
+
}
|
|
294
|
+
if (input.action === workflow_engine_enums_1.TaskDecisionActionEnum.TRANSFERRED &&
|
|
295
|
+
options.transferReason === undefined &&
|
|
296
|
+
taskNode.data.allowTransfer === false) {
|
|
297
|
+
throw new common_1.ForbiddenException(`Workflow node ${task.nodeId} does not allow transfer`);
|
|
298
|
+
}
|
|
230
299
|
const returnToNodeId = input.action === workflow_engine_enums_1.TaskDecisionActionEnum.RETURNED
|
|
231
300
|
? readReturnTargetNodeId(instance.workflowSnapshot, task.nodeId, input.returnToNodeId)
|
|
232
301
|
: null;
|
|
@@ -423,8 +492,11 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
423
492
|
return cancelledInstance;
|
|
424
493
|
});
|
|
425
494
|
}
|
|
426
|
-
async resubmitApprovalInstance(input) {
|
|
495
|
+
async resubmitApprovalInstance(input, authContext) {
|
|
427
496
|
const formData = parseJsonObject(input.formDataJson, 'formDataJson');
|
|
497
|
+
const preparation = this.formDataSourceValueResolver
|
|
498
|
+
? await this.prepareResubmitFormDataOptions(input, formData, authContext ?? createWorkflowAuthContext(input.initiatorMemberId))
|
|
499
|
+
: null;
|
|
428
500
|
return this.approvalInstanceRepository.manager.transaction(async (manager) => {
|
|
429
501
|
await manager.query('SELECT pg_advisory_xact_lock(hashtext($1))', [
|
|
430
502
|
input.instanceId,
|
|
@@ -442,11 +514,28 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
442
514
|
if (instance.state !== workflow_engine_enums_1.ApprovalInstanceStateEnum.RETURNED) {
|
|
443
515
|
throw new common_1.ConflictException(`Approval instance ${instance.id} is not returned`);
|
|
444
516
|
}
|
|
445
|
-
|
|
517
|
+
const template = await this.getTemplateOrThrow(instance.templateId);
|
|
518
|
+
if (!template.isActive) {
|
|
519
|
+
throw new common_1.ConflictException('Approval template is deactivated');
|
|
520
|
+
}
|
|
521
|
+
if (preparation &&
|
|
522
|
+
!isSameApprovalInstanceRevision(preparation.instance, instance)) {
|
|
523
|
+
throw new common_1.ConflictException('Approval instance changed while options were resolving; refresh and retry');
|
|
524
|
+
}
|
|
525
|
+
const resubmitSchema = readFormDefinitionSnapshotSchema(instance.formDefinitionSnapshot);
|
|
526
|
+
validateSubmittedFormData(resubmitSchema, formData);
|
|
527
|
+
if (!preparation) {
|
|
528
|
+
assertNoUnresolvableDynamicValues(resubmitSchema, formData);
|
|
529
|
+
}
|
|
446
530
|
const resubmittedInstance = await instanceRepository.save({
|
|
447
531
|
...instance,
|
|
448
532
|
completedAt: null,
|
|
449
533
|
formData,
|
|
534
|
+
formDataOptionSnapshot: preparation?.formDataOptionSnapshot ??
|
|
535
|
+
// Without a resolver every remaining dynamic value was rejected
|
|
536
|
+
// above, so only cleared fields can reach here — drop their
|
|
537
|
+
// snapshots instead of keeping a label for a value that is gone.
|
|
538
|
+
readSnapshotForPresentValues(resubmitSchema, formData, instance.formDataOptionSnapshot),
|
|
450
539
|
state: workflow_engine_enums_1.ApprovalInstanceStateEnum.RUNNING,
|
|
451
540
|
title: input.title?.trim() || instance.title,
|
|
452
541
|
});
|
|
@@ -469,7 +558,13 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
469
558
|
taskId: null,
|
|
470
559
|
}));
|
|
471
560
|
await this.processRunningInstance(manager, runtimeInstance);
|
|
472
|
-
|
|
561
|
+
const refreshedInstance = await instanceRepository.findOne({
|
|
562
|
+
where: { id: instance.id },
|
|
563
|
+
});
|
|
564
|
+
if (!refreshedInstance) {
|
|
565
|
+
throw new common_1.NotFoundException(`Approval instance ${instance.id} was not found after resubmit`);
|
|
566
|
+
}
|
|
567
|
+
return refreshedInstance;
|
|
473
568
|
});
|
|
474
569
|
}
|
|
475
570
|
async requestAdhocCountersign({ comment, requestedByMemberId, target, taskId, }) {
|
|
@@ -1359,6 +1454,7 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
1359
1454
|
async listLaunchableApprovalTemplates(memberId) {
|
|
1360
1455
|
const templates = await this.approvalTemplateRepository.find({
|
|
1361
1456
|
order: { updatedAt: 'DESC' },
|
|
1457
|
+
where: { isActive: true },
|
|
1362
1458
|
});
|
|
1363
1459
|
const currentVersionIds = templates
|
|
1364
1460
|
.map((template) => template.currentVersionId)
|
|
@@ -2405,11 +2501,20 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
2405
2501
|
if (action.type === 'SET_FORM_FIELD') {
|
|
2406
2502
|
const value = this.conditionService.evaluateValue(action.value, buildWorkflowExpressionContext(instance), `workflow.nodes.${node.id}.data.action.value`);
|
|
2407
2503
|
const updatedFormData = writeValueAtPath(instance.formData, action.fieldPath, value);
|
|
2504
|
+
// A service task runs inside this transaction, so it cannot call a host
|
|
2505
|
+
// provider to re-resolve the label. Rather than leave the previous
|
|
2506
|
+
// option snapshot describing a value that no longer exists, drop it: the
|
|
2507
|
+
// history view then shows the raw value instead of a wrong label.
|
|
2508
|
+
const staleSnapshotFieldKey = readDataSourceFieldKeyAtPath(instance.formDefinitionSnapshot, action.fieldPath);
|
|
2509
|
+
const updatedOptionSnapshot = staleSnapshotFieldKey
|
|
2510
|
+
? readSnapshotWithoutField(instance.formDataOptionSnapshot, staleSnapshotFieldKey)
|
|
2511
|
+
: instance.formDataOptionSnapshot;
|
|
2408
2512
|
const updatedInstance = await manager
|
|
2409
2513
|
.getRepository(approval_instance_entity_1.ApprovalInstanceEntity)
|
|
2410
2514
|
.save({
|
|
2411
2515
|
...instance,
|
|
2412
2516
|
formData: updatedFormData,
|
|
2517
|
+
formDataOptionSnapshot: updatedOptionSnapshot,
|
|
2413
2518
|
});
|
|
2414
2519
|
Object.assign(instance, updatedInstance);
|
|
2415
2520
|
await activityRepository.save(activityRepository.create({
|
|
@@ -2419,6 +2524,7 @@ let WorkflowEngineService = class WorkflowEngineService {
|
|
|
2419
2524
|
nodeId: node.id,
|
|
2420
2525
|
payload: {
|
|
2421
2526
|
action: 'SET_FORM_FIELD',
|
|
2527
|
+
clearedOptionSnapshot: staleSnapshotFieldKey ?? null,
|
|
2422
2528
|
fieldPath: action.fieldPath,
|
|
2423
2529
|
tokenId: token.id,
|
|
2424
2530
|
},
|
|
@@ -2736,6 +2842,8 @@ exports.WorkflowEngineService = WorkflowEngineService = tslib_1.__decorate([
|
|
|
2736
2842
|
tslib_1.__param(10, (0, typeorm_1.InjectRepository)(form_definition_version_entity_1.FormDefinitionVersionEntity)),
|
|
2737
2843
|
tslib_1.__param(17, (0, common_1.Optional)()),
|
|
2738
2844
|
tslib_1.__param(17, (0, common_1.Inject)(workflow_service_task_dispatcher_token_1.BPM_WORKFLOW_SERVICE_TASK_DISPATCHER)),
|
|
2845
|
+
tslib_1.__param(18, (0, common_1.Optional)()),
|
|
2846
|
+
tslib_1.__param(18, (0, common_1.Inject)(form_data_source_types_1.BPM_FORM_DATA_SOURCE_VALUE_RESOLVER)),
|
|
2739
2847
|
tslib_1.__metadata("design:paramtypes", [typeorm_2.Repository,
|
|
2740
2848
|
typeorm_2.Repository,
|
|
2741
2849
|
typeorm_2.Repository,
|
|
@@ -2752,7 +2860,7 @@ exports.WorkflowEngineService = WorkflowEngineService = tslib_1.__decorate([
|
|
|
2752
2860
|
delegation_service_1.DelegationService,
|
|
2753
2861
|
notification_service_1.NotificationService,
|
|
2754
2862
|
signature_service_1.SignatureService,
|
|
2755
|
-
sla_schedule_service_1.BPMSlaScheduleService, Object])
|
|
2863
|
+
sla_schedule_service_1.BPMSlaScheduleService, Object, Object])
|
|
2756
2864
|
], WorkflowEngineService);
|
|
2757
2865
|
function parseJsonObject(value, label) {
|
|
2758
2866
|
try {
|
|
@@ -2775,6 +2883,98 @@ function readDefaultInitiatorMetadataSnapshot(memberId) {
|
|
|
2775
2883
|
memberId,
|
|
2776
2884
|
};
|
|
2777
2885
|
}
|
|
2886
|
+
function createWorkflowAuthContext(memberId) {
|
|
2887
|
+
return {
|
|
2888
|
+
memberId,
|
|
2889
|
+
metadata: {},
|
|
2890
|
+
permissions: [],
|
|
2891
|
+
roles: [],
|
|
2892
|
+
};
|
|
2893
|
+
}
|
|
2894
|
+
function isSameApprovalInstanceRevision(left, right) {
|
|
2895
|
+
return (readApprovalInstanceRevision(left) === readApprovalInstanceRevision(right) &&
|
|
2896
|
+
JSON.stringify(left.formData) === JSON.stringify(right.formData));
|
|
2897
|
+
}
|
|
2898
|
+
/**
|
|
2899
|
+
* Returns the field key a service-task `fieldPath` writes into when that field
|
|
2900
|
+
* is DataSource-backed, else `null`. Only the first path segment can name a
|
|
2901
|
+
* form field; deeper segments address inside its value.
|
|
2902
|
+
*/
|
|
2903
|
+
/**
|
|
2904
|
+
* Reads defensively: a service task must keep running even when the instance
|
|
2905
|
+
* carries a snapshot this version cannot parse, so an unreadable schema simply
|
|
2906
|
+
* means "no snapshot to invalidate" rather than a failed workflow step.
|
|
2907
|
+
*/
|
|
2908
|
+
function readDataSourceFieldKeyAtPath(snapshot, fieldPath) {
|
|
2909
|
+
const schema = snapshot?.schema;
|
|
2910
|
+
// Deliberately looser than `isFormDefinitionSchema`: one malformed sibling
|
|
2911
|
+
// entry must not stop a valid dynamic field from having its stale snapshot
|
|
2912
|
+
// pruned. Each entry is record-guarded below instead.
|
|
2913
|
+
if (!isRecord(schema) || !Array.isArray(schema.fields)) {
|
|
2914
|
+
return null;
|
|
2915
|
+
}
|
|
2916
|
+
// Reuse the writer's normalization so an optional `form.`/`formData.` prefix
|
|
2917
|
+
// resolves to the same field the value is written into.
|
|
2918
|
+
const [fieldKey] = normalizeFormFieldPath(fieldPath);
|
|
2919
|
+
if (!fieldKey) {
|
|
2920
|
+
return null;
|
|
2921
|
+
}
|
|
2922
|
+
// A corrupt snapshot can hold non-object entries: read them defensively
|
|
2923
|
+
// rather than letting a service task throw.
|
|
2924
|
+
const field = schema.fields.find((candidate) => isRecord(candidate) && candidate.fieldKey === fieldKey);
|
|
2925
|
+
return field && (0, form_1.isFormDataSourceFieldDefinition)(field) ? field.fieldKey : null;
|
|
2926
|
+
}
|
|
2927
|
+
function readSnapshotWithoutField(snapshots, fieldKey) {
|
|
2928
|
+
return Object.fromEntries(Object.entries(snapshots ?? {}).filter(([key]) => key !== fieldKey));
|
|
2929
|
+
}
|
|
2930
|
+
/**
|
|
2931
|
+
* Keeps only the snapshots whose field still carries a value, so clearing a
|
|
2932
|
+
* dynamic option also removes the label recorded for it.
|
|
2933
|
+
*/
|
|
2934
|
+
function readSnapshotForPresentValues(schema, formData, snapshots) {
|
|
2935
|
+
return Object.fromEntries(Object.entries(snapshots ?? {}).filter(([fieldKey]) => schema.fields.some((field) => isRecord(field) &&
|
|
2936
|
+
field.fieldKey === fieldKey &&
|
|
2937
|
+
(0, form_1.isFormDataSourceFieldDefinition)(field) &&
|
|
2938
|
+
hasPresentDynamicValue(field, formData[fieldKey]))));
|
|
2939
|
+
}
|
|
2940
|
+
/**
|
|
2941
|
+
* Only a value the field's own selection mode can represent counts as cleared:
|
|
2942
|
+
* an empty array clears a `multiple` field, but on a `single` field it is an
|
|
2943
|
+
* illegal value that must still reach validation rather than silently drop the
|
|
2944
|
+
* option snapshot.
|
|
2945
|
+
*/
|
|
2946
|
+
function hasPresentDynamicValue(field, value) {
|
|
2947
|
+
if (typeof value === 'undefined' || value === null) {
|
|
2948
|
+
return false;
|
|
2949
|
+
}
|
|
2950
|
+
// Only a shape the field's mode can actually hold counts as cleared: `''`
|
|
2951
|
+
// clears a single field, `[]` clears a multiple one. The other combinations
|
|
2952
|
+
// are illegal values that must still reach validation instead of silently
|
|
2953
|
+
// dropping the option snapshot.
|
|
2954
|
+
return (0, form_1.readFormFieldSelectionMode)(field) === 'multiple'
|
|
2955
|
+
? !Array.isArray(value) || value.length > 0
|
|
2956
|
+
: value !== '';
|
|
2957
|
+
}
|
|
2958
|
+
/**
|
|
2959
|
+
* Hosts without a DataSource registry keep working for static forms, but a
|
|
2960
|
+
* dynamic value they cannot re-resolve must never reach the database: nothing
|
|
2961
|
+
* downstream could tell whether the browser made the value up.
|
|
2962
|
+
*/
|
|
2963
|
+
function assertNoUnresolvableDynamicValues(schema, formData) {
|
|
2964
|
+
// A malformed snapshot can hold non-object entries; skip them rather than
|
|
2965
|
+
// throwing a TypeError out of a submit or resubmit.
|
|
2966
|
+
const hasDynamicValue = schema.fields.some((field) => isRecord(field) &&
|
|
2967
|
+
(0, form_1.isFormDataSourceFieldDefinition)(field) &&
|
|
2968
|
+
hasPresentDynamicValue(field, formData[field.fieldKey]));
|
|
2969
|
+
if (hasDynamicValue) {
|
|
2970
|
+
throw new form_data_source_errors_1.BPMFormDataSourceException(form_data_source_errors_1.BPM_FORM_DATA_SOURCE_ERROR_CODES.DATA_SOURCE_MISSING);
|
|
2971
|
+
}
|
|
2972
|
+
}
|
|
2973
|
+
function readApprovalInstanceRevision(instance) {
|
|
2974
|
+
return instance.updatedAt instanceof Date
|
|
2975
|
+
? instance.updatedAt.toISOString()
|
|
2976
|
+
: String(instance.updatedAt ?? '');
|
|
2977
|
+
}
|
|
2778
2978
|
function parseWorkflowDefinition(value) {
|
|
2779
2979
|
try {
|
|
2780
2980
|
const parsedValue = JSON.parse(value);
|
|
@@ -3436,7 +3636,12 @@ function readFormDefinitionSnapshotSchema(snapshot) {
|
|
|
3436
3636
|
throw new common_1.BadRequestException('Approval instance form schema is invalid');
|
|
3437
3637
|
}
|
|
3438
3638
|
function isFormDefinitionSchema(value) {
|
|
3439
|
-
return (isRecord(value) &&
|
|
3639
|
+
return (isRecord(value) &&
|
|
3640
|
+
value.schemaVersion === 1 &&
|
|
3641
|
+
Array.isArray(value.fields) &&
|
|
3642
|
+
// Every reader below dereferences `field.fieldKey`; requiring records here
|
|
3643
|
+
// turns a corrupt snapshot into a controlled 400 instead of a TypeError.
|
|
3644
|
+
value.fields.every((field) => isRecord(field)));
|
|
3440
3645
|
}
|
|
3441
3646
|
function isSubmittedFormFieldVisible(field, fields, values) {
|
|
3442
3647
|
return field.visibleWhen
|