@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.
Files changed (100) hide show
  1. package/CHANGELOG.md +127 -0
  2. package/README.md +58 -1
  3. package/package.json +18 -11
  4. package/src/index.d.ts +1 -0
  5. package/src/index.js +1 -0
  6. package/src/index.js.map +1 -1
  7. package/src/lib/bpm/bpm-root.module.d.ts +15 -0
  8. package/src/lib/bpm/bpm-root.module.js +12 -0
  9. package/src/lib/bpm/bpm-root.module.js.map +1 -1
  10. package/src/lib/calendar/calendar.module.d.ts +5 -1
  11. package/src/lib/calendar/calendar.module.js +1 -0
  12. package/src/lib/calendar/calendar.module.js.map +1 -1
  13. package/src/lib/form/form-schema.validator.js +177 -10
  14. package/src/lib/form/form-schema.validator.js.map +1 -1
  15. package/src/lib/form/form.service.d.ts +19 -1
  16. package/src/lib/form/form.service.js +56 -6
  17. package/src/lib/form/form.service.js.map +1 -1
  18. package/src/lib/form-data-source/form-data-source-value-resolver.service.d.ts +16 -0
  19. package/src/lib/form-data-source/form-data-source-value-resolver.service.js +401 -0
  20. package/src/lib/form-data-source/form-data-source-value-resolver.service.js.map +1 -0
  21. package/src/lib/form-data-source/form-data-source.errors.d.ts +34 -0
  22. package/src/lib/form-data-source/form-data-source.errors.js +43 -0
  23. package/src/lib/form-data-source/form-data-source.errors.js.map +1 -0
  24. package/src/lib/form-data-source/form-data-source.module.d.ts +9 -0
  25. package/src/lib/form-data-source/form-data-source.module.js +55 -0
  26. package/src/lib/form-data-source/form-data-source.module.js.map +1 -0
  27. package/src/lib/form-data-source/form-data-source.queries.d.ts +57 -0
  28. package/src/lib/form-data-source/form-data-source.queries.js +293 -0
  29. package/src/lib/form-data-source/form-data-source.queries.js.map +1 -0
  30. package/src/lib/form-data-source/form-data-source.service.d.ts +72 -0
  31. package/src/lib/form-data-source/form-data-source.service.js +646 -0
  32. package/src/lib/form-data-source/form-data-source.service.js.map +1 -0
  33. package/src/lib/form-data-source/form-data-source.types.d.ts +88 -0
  34. package/src/lib/form-data-source/form-data-source.types.js +29 -0
  35. package/src/lib/form-data-source/form-data-source.types.js.map +1 -0
  36. package/src/lib/form-data-source/index.d.ts +5 -0
  37. package/src/lib/form-data-source/index.js +9 -0
  38. package/src/lib/form-data-source/index.js.map +1 -0
  39. package/src/lib/migrations/0000000018000-notification-archive.d.ts +6 -0
  40. package/src/lib/migrations/0000000018000-notification-archive.js +28 -0
  41. package/src/lib/migrations/0000000018000-notification-archive.js.map +1 -0
  42. package/src/lib/migrations/0000000019000-approval-template-activation.d.ts +6 -0
  43. package/src/lib/migrations/0000000019000-approval-template-activation.js +29 -0
  44. package/src/lib/migrations/0000000019000-approval-template-activation.js.map +1 -0
  45. package/src/lib/migrations/0000000020000-form-data-option-snapshots.d.ts +6 -0
  46. package/src/lib/migrations/0000000020000-form-data-option-snapshots.js +22 -0
  47. package/src/lib/migrations/0000000020000-form-data-option-snapshots.js.map +1 -0
  48. package/src/lib/migrations/index.d.ts +3 -0
  49. package/src/lib/migrations/index.js +9 -0
  50. package/src/lib/migrations/index.js.map +1 -1
  51. package/src/lib/notification/index.d.ts +3 -0
  52. package/src/lib/notification/index.js +3 -0
  53. package/src/lib/notification/index.js.map +1 -1
  54. package/src/lib/notification/notification-observer.token.d.ts +52 -0
  55. package/src/lib/notification/notification-observer.token.js +5 -0
  56. package/src/lib/notification/notification-observer.token.js.map +1 -0
  57. package/src/lib/notification/notification.entity.d.ts +11 -0
  58. package/src/lib/notification/notification.entity.js +17 -0
  59. package/src/lib/notification/notification.entity.js.map +1 -1
  60. package/src/lib/notification/notification.mutations.d.ts +2 -0
  61. package/src/lib/notification/notification.mutations.js +28 -0
  62. package/src/lib/notification/notification.mutations.js.map +1 -1
  63. package/src/lib/notification/notification.queries.d.ts +2 -2
  64. package/src/lib/notification/notification.queries.js +12 -8
  65. package/src/lib/notification/notification.queries.js.map +1 -1
  66. package/src/lib/notification/notification.service.d.ts +34 -2
  67. package/src/lib/notification/notification.service.js +116 -3
  68. package/src/lib/notification/notification.service.js.map +1 -1
  69. package/src/lib/template/approval-template.entity.d.ts +13 -0
  70. package/src/lib/template/approval-template.entity.js +12 -1
  71. package/src/lib/template/approval-template.entity.js.map +1 -1
  72. package/src/lib/template/template.enums.d.ts +5 -0
  73. package/src/lib/template/template.enums.js +10 -1
  74. package/src/lib/template/template.enums.js.map +1 -1
  75. package/src/lib/template/template.mutations.d.ts +2 -0
  76. package/src/lib/template/template.mutations.js +20 -0
  77. package/src/lib/template/template.mutations.js.map +1 -1
  78. package/src/lib/template/template.queries.d.ts +3 -3
  79. package/src/lib/template/template.queries.js +14 -4
  80. package/src/lib/template/template.queries.js.map +1 -1
  81. package/src/lib/template/template.service.d.ts +7 -2
  82. package/src/lib/template/template.service.js +56 -11
  83. package/src/lib/template/template.service.js.map +1 -1
  84. package/src/lib/template/workflow-definition.validator.js +11 -0
  85. package/src/lib/template/workflow-definition.validator.js.map +1 -1
  86. package/src/lib/workflow-engine/approval-instance.entity.d.ts +3 -0
  87. package/src/lib/workflow-engine/approval-instance.entity.js +15 -0
  88. package/src/lib/workflow-engine/approval-instance.entity.js.map +1 -1
  89. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +5 -1
  90. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +6 -2
  91. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +1 -1
  92. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +5 -1
  93. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +6 -2
  94. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +1 -1
  95. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +3 -2
  96. package/src/lib/workflow-engine/workflow-engine.mutations.js +8 -6
  97. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +1 -1
  98. package/src/lib/workflow-engine/workflow-engine.service.d.ts +18 -3
  99. package/src/lib/workflow-engine/workflow-engine.service.js +212 -7
  100. 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":"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"}
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
- 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);
80
- submitApprovalInstance(input: SubmitApprovalInstanceInput): Promise<ApprovalInstanceEntity>;
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: ResubmitApprovalInstanceInput): Promise<ApprovalInstanceEntity>;
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
- validateSubmittedFormData(readFormDefinitionSnapshotSchema(instance.formDefinitionSnapshot), formData);
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
- return runtimeInstance;
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) && value.schemaVersion === 1 && Array.isArray(value.fields));
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