@rytass/bpm-core-nestjs-module 0.3.0 → 0.5.0

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 (658) hide show
  1. package/CHANGELOG.md +44 -0
  2. package/eslint.config.mjs +20 -0
  3. package/jest.config.cts +15 -0
  4. package/package.json +2 -2
  5. package/project.json +58 -0
  6. package/src/lib/attachment/attachment-options.spec.ts +45 -0
  7. package/src/lib/attachment/attachment-options.ts +130 -0
  8. package/src/lib/attachment/attachment-storage.provider.spec.ts +79 -0
  9. package/src/lib/attachment/attachment-storage.provider.ts +60 -0
  10. package/src/lib/attachment/{attachment-storage.token.d.ts → attachment-storage.token.ts} +3 -1
  11. package/src/lib/attachment/attachment.controller.ts +39 -0
  12. package/src/lib/attachment/attachment.entity.ts +59 -0
  13. package/src/lib/attachment/attachment.module.ts +149 -0
  14. package/src/lib/attachment/attachment.mutations.ts +22 -0
  15. package/src/lib/attachment/attachment.queries.ts +65 -0
  16. package/src/lib/attachment/attachment.service.spec.ts +319 -0
  17. package/src/lib/attachment/attachment.service.ts +477 -0
  18. package/src/lib/attachment/dto/upload-attachment.input.ts +60 -0
  19. package/src/lib/bpm/bpm-root.module.spec.ts +138 -0
  20. package/src/lib/bpm/bpm-root.module.ts +320 -0
  21. package/src/lib/bpm-auth/bpm-auth-context.extractor.ts +106 -0
  22. package/src/lib/bpm-auth/bpm-auth-context.ts +40 -0
  23. package/src/lib/bpm-auth/bpm-auth.authorization.ts +80 -0
  24. package/src/lib/bpm-auth/bpm-auth.decorators.ts +19 -0
  25. package/src/lib/bpm-auth/bpm-auth.guard.ts +31 -0
  26. package/src/lib/bpm-auth/bpm-auth.module.spec.ts +106 -0
  27. package/src/lib/bpm-auth/bpm-auth.module.ts +69 -0
  28. package/src/lib/bpm-auth/bpm-auth.options.ts +21 -0
  29. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.ts +55 -0
  30. package/src/lib/common/filters/all-exceptions.filter.ts +138 -0
  31. package/src/lib/common/iso-duration.ts +31 -0
  32. package/src/lib/condition/condition.module.ts +8 -0
  33. package/src/lib/condition/condition.service.spec.ts +50 -0
  34. package/src/lib/condition/condition.service.ts +141 -0
  35. package/src/lib/database/data-source.ts +7 -0
  36. package/src/lib/database/migration-runner.ts +26 -0
  37. package/src/lib/database/reconcile-legacy-migrations.ts +87 -0
  38. package/src/lib/database/typeorm.config.ts +217 -0
  39. package/src/lib/delegation/delegation-rule.entity.ts +84 -0
  40. package/src/lib/delegation/delegation.enums.ts +21 -0
  41. package/src/lib/delegation/delegation.module.ts +14 -0
  42. package/src/lib/delegation/delegation.mutations.ts +92 -0
  43. package/src/lib/delegation/delegation.queries.ts +111 -0
  44. package/src/lib/delegation/delegation.service.spec.ts +295 -0
  45. package/src/lib/delegation/delegation.service.ts +482 -0
  46. package/src/lib/delegation/dto/delegation-rule.input.ts +125 -0
  47. package/src/lib/form/dto/form-definition.input.ts +90 -0
  48. package/src/lib/form/form-definition-version.entity.ts +66 -0
  49. package/src/lib/form/form-definition.entity.ts +54 -0
  50. package/src/lib/form/form-schema-lint.object.ts +10 -0
  51. package/src/lib/form/form-schema.validator.spec.ts +180 -0
  52. package/src/lib/form/form-schema.validator.ts +538 -0
  53. package/src/lib/form/form.enums.ts +20 -0
  54. package/src/lib/form/form.module.ts +19 -0
  55. package/src/lib/form/form.mutations.ts +73 -0
  56. package/src/lib/form/form.queries.ts +72 -0
  57. package/src/lib/form/form.service.spec.ts +371 -0
  58. package/src/lib/form/form.service.ts +607 -0
  59. package/src/lib/identity/identity-options.ts +41 -0
  60. package/src/lib/identity/identity.module.ts +96 -0
  61. package/src/lib/identity/identity.queries.ts +61 -0
  62. package/src/lib/identity/identity.service.spec.ts +328 -0
  63. package/src/lib/identity/identity.service.ts +277 -0
  64. package/src/lib/identity/member-base.adapter.spec.ts +122 -0
  65. package/src/lib/identity/member-base.adapter.ts +302 -0
  66. package/src/lib/identity/member-metadata-cache.entity.ts +27 -0
  67. package/src/lib/identity/{member-not-found.exception.d.ts → member-not-found.exception.ts} +8 -3
  68. package/src/lib/identity/member-profile.object.ts +28 -0
  69. package/src/lib/identity/member-resolver.interface.ts +140 -0
  70. package/src/lib/migrations/0000000000001-enable-postgres-extensions.ts +14 -0
  71. package/src/lib/migrations/{0000000001000-identity-organization-foundation.js → 0000000001000-identity-organization-foundation.ts} +38 -29
  72. package/src/lib/migrations/{0000000002000-form-builder-foundation.js → 0000000002000-form-builder-foundation.ts} +22 -21
  73. package/src/lib/migrations/{0000000003000-approval-template-foundation.js → 0000000003000-approval-template-foundation.ts} +24 -21
  74. package/src/lib/migrations/{0000000004000-workflow-engine-foundation.js → 0000000004000-workflow-engine-foundation.ts} +46 -34
  75. package/src/lib/migrations/{0000000005000-delegation-rules.js → 0000000005000-delegation-rules.ts} +20 -19
  76. package/src/lib/migrations/{0000000006000-notifications-sla.js → 0000000006000-notifications-sla.ts} +26 -23
  77. package/src/lib/migrations/{0000000007000-signatures-attachments.js → 0000000007000-signatures-attachments.ts} +28 -27
  78. package/src/lib/migrations/{0000000008000-approval-template-categories.js → 0000000008000-approval-template-categories.ts} +28 -25
  79. package/src/lib/migrations/{0000000009000-task-candidates.js → 0000000009000-task-candidates.ts} +26 -23
  80. package/src/lib/migrations/{0000000010000-notification-delivery-state.js → 0000000010000-notification-delivery-state.ts} +16 -17
  81. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.ts +19 -0
  82. package/src/lib/migrations/0000000012000-notification-sla-idempotency.ts +22 -0
  83. package/src/lib/migrations/0000000013000-workflow-query-indexes.ts +113 -0
  84. package/src/lib/migrations/0000000014000-notification-resolution.ts +29 -0
  85. package/src/lib/migrations/{0000000015000-backfill-stale-notification-resolution.js → 0000000015000-backfill-stale-notification-resolution.ts} +15 -16
  86. package/src/lib/migrations/{0000000016000-archive-parallel-form-drafts.js → 0000000016000-archive-parallel-form-drafts.ts} +15 -16
  87. package/src/lib/migrations/{0000000017000-adhoc-directives.js → 0000000017000-adhoc-directives.ts} +18 -19
  88. package/src/lib/migrations/index.ts +59 -0
  89. package/src/lib/notification/dto/notification-preference.input.ts +46 -0
  90. package/src/lib/notification/notification-delivery-scheduler.service.ts +69 -0
  91. package/src/lib/notification/notification-delivery.service.spec.ts +315 -0
  92. package/src/lib/notification/notification-delivery.service.ts +339 -0
  93. package/src/lib/notification/notification-dispatcher.token.ts +13 -0
  94. package/src/lib/notification/notification-options.module.ts +67 -0
  95. package/src/lib/notification/notification-options.spec.ts +93 -0
  96. package/src/lib/notification/notification-options.ts +452 -0
  97. package/src/lib/notification/notification-preference.entity.ts +35 -0
  98. package/src/lib/notification/notification-sla-scheduler.service.ts +66 -0
  99. package/src/lib/notification/notification-template.spec.ts +33 -0
  100. package/src/lib/notification/notification-template.ts +97 -0
  101. package/src/lib/notification/notification.entity.ts +129 -0
  102. package/src/lib/notification/notification.enums.ts +64 -0
  103. package/src/lib/notification/notification.module.ts +37 -0
  104. package/src/lib/notification/notification.mutations.ts +47 -0
  105. package/src/lib/notification/notification.queries.ts +64 -0
  106. package/src/lib/notification/notification.service.spec.ts +412 -0
  107. package/src/lib/notification/notification.service.ts +1129 -0
  108. package/src/lib/organization/dto/manager-resolution.input.ts +91 -0
  109. package/src/lib/organization/dto/membership.input.ts +77 -0
  110. package/src/lib/organization/dto/org-unit.input.ts +96 -0
  111. package/src/lib/organization/dto/position.input.ts +50 -0
  112. package/src/lib/organization/json-metadata.ts +15 -0
  113. package/src/lib/organization/manager-resolution.entity.ts +44 -0
  114. package/src/lib/organization/membership.entity.ts +50 -0
  115. package/src/lib/organization/org-unit-tree-commit-result.object.ts +8 -0
  116. package/src/lib/organization/org-unit.entity.ts +53 -0
  117. package/src/lib/organization/organization-summary.object.ts +16 -0
  118. package/src/lib/organization/organization.enums.ts +19 -0
  119. package/src/lib/organization/organization.module.ts +27 -0
  120. package/src/lib/organization/organization.mutations.ts +115 -0
  121. package/src/lib/organization/organization.queries.ts +191 -0
  122. package/src/lib/organization/organization.service.spec.ts +835 -0
  123. package/src/lib/organization/organization.service.ts +1245 -0
  124. package/src/lib/organization/position.entity.ts +39 -0
  125. package/src/lib/organization/resolved-manager.object.ts +10 -0
  126. package/src/lib/signature/signature-options.spec.ts +60 -0
  127. package/src/lib/signature/signature-options.ts +120 -0
  128. package/src/lib/signature/signature-verification.object.ts +16 -0
  129. package/src/lib/signature/signature.entity.ts +62 -0
  130. package/src/lib/signature/signature.module.ts +80 -0
  131. package/src/lib/signature/signature.queries.ts +37 -0
  132. package/src/lib/signature/signature.service.spec.ts +134 -0
  133. package/src/lib/signature/signature.service.ts +205 -0
  134. package/src/lib/template/approval-template-category.entity.ts +40 -0
  135. package/src/lib/template/approval-template-version.entity.ts +82 -0
  136. package/src/lib/template/approval-template.entity.ts +64 -0
  137. package/src/lib/template/compose-approval-template.object.ts +23 -0
  138. package/src/lib/template/compose-template.mutations.ts +22 -0
  139. package/src/lib/template/dto/approval-template.input.ts +147 -0
  140. package/src/lib/template/dto/compose-approval-template.input.ts +80 -0
  141. package/src/lib/template/template.enums.ts +30 -0
  142. package/src/lib/template/template.module.ts +33 -0
  143. package/src/lib/template/template.mutations.ts +106 -0
  144. package/src/lib/template/template.queries.ts +119 -0
  145. package/src/lib/template/template.service.spec.ts +822 -0
  146. package/src/lib/template/template.service.ts +1082 -0
  147. package/src/lib/template/workflow-definition.validator.spec.ts +595 -0
  148. package/src/lib/template/workflow-definition.validator.ts +539 -0
  149. package/src/lib/testing/cel-js.jest.ts +46 -0
  150. package/src/lib/workflow-engine/activity-log.entity.ts +48 -0
  151. package/src/lib/workflow-engine/adhoc-directive.entity.ts +90 -0
  152. package/src/lib/workflow-engine/adhoc.enums.ts +42 -0
  153. package/src/lib/workflow-engine/approval-instance-page-info.object.ts +22 -0
  154. package/src/lib/workflow-engine/approval-instance.entity.ts +86 -0
  155. package/src/lib/workflow-engine/dto/adhoc-notification.input.ts +18 -0
  156. package/src/lib/workflow-engine/dto/adhoc-target.input.ts +52 -0
  157. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.ts +18 -0
  158. package/src/lib/workflow-engine/dto/decide-task.input.ts +33 -0
  159. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.ts +22 -0
  160. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.ts +22 -0
  161. package/src/lib/workflow-engine/dto/submit-approval-instance.input.ts +27 -0
  162. package/src/lib/workflow-engine/task-candidate.entity.ts +56 -0
  163. package/src/lib/workflow-engine/task-decision.entity.ts +43 -0
  164. package/src/lib/workflow-engine/task.entity.ts +102 -0
  165. package/src/lib/workflow-engine/workflow-condition-evaluator.ts +168 -0
  166. package/src/lib/workflow-engine/workflow-dashboard-summary.object.ts +22 -0
  167. package/src/lib/workflow-engine/workflow-dry-run.object.ts +58 -0
  168. package/src/lib/workflow-engine/workflow-engine.enums.ts +102 -0
  169. package/src/lib/workflow-engine/workflow-engine.module.ts +77 -0
  170. package/src/lib/workflow-engine/workflow-engine.mutations.ts +193 -0
  171. package/src/lib/workflow-engine/workflow-engine.queries.ts +241 -0
  172. package/src/lib/workflow-engine/workflow-engine.service.spec.ts +3345 -0
  173. package/src/lib/workflow-engine/workflow-engine.service.ts +6022 -0
  174. package/src/lib/workflow-engine/{workflow-engine.tokens.d.ts → workflow-engine.tokens.ts} +9 -3
  175. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.ts +69 -0
  176. package/src/lib/workflow-engine/workflow-token.entity.ts +40 -0
  177. package/tsconfig.json +24 -0
  178. package/tsconfig.lib.json +16 -0
  179. package/tsconfig.spec.json +16 -0
  180. package/src/index.js +0 -18
  181. package/src/index.js.map +0 -1
  182. package/src/lib/attachment/attachment-options.d.ts +0 -44
  183. package/src/lib/attachment/attachment-options.js +0 -62
  184. package/src/lib/attachment/attachment-options.js.map +0 -1
  185. package/src/lib/attachment/attachment-storage.provider.d.ts +0 -4
  186. package/src/lib/attachment/attachment-storage.provider.js +0 -35
  187. package/src/lib/attachment/attachment-storage.provider.js.map +0 -1
  188. package/src/lib/attachment/attachment-storage.token.js +0 -5
  189. package/src/lib/attachment/attachment-storage.token.js.map +0 -1
  190. package/src/lib/attachment/attachment.controller.d.ts +0 -8
  191. package/src/lib/attachment/attachment.controller.js +0 -38
  192. package/src/lib/attachment/attachment.controller.js.map +0 -1
  193. package/src/lib/attachment/attachment.entity.d.ts +0 -14
  194. package/src/lib/attachment/attachment.entity.js +0 -74
  195. package/src/lib/attachment/attachment.entity.js.map +0 -1
  196. package/src/lib/attachment/attachment.module.d.ts +0 -27
  197. package/src/lib/attachment/attachment.module.js +0 -103
  198. package/src/lib/attachment/attachment.module.js.map +0 -1
  199. package/src/lib/attachment/attachment.mutations.d.ts +0 -8
  200. package/src/lib/attachment/attachment.mutations.js +0 -35
  201. package/src/lib/attachment/attachment.mutations.js.map +0 -1
  202. package/src/lib/attachment/attachment.queries.d.ts +0 -9
  203. package/src/lib/attachment/attachment.queries.js +0 -78
  204. package/src/lib/attachment/attachment.queries.js.map +0 -1
  205. package/src/lib/attachment/attachment.service.d.ts +0 -49
  206. package/src/lib/attachment/attachment.service.js +0 -276
  207. package/src/lib/attachment/attachment.service.js.map +0 -1
  208. package/src/lib/attachment/dto/upload-attachment.input.d.ts +0 -11
  209. package/src/lib/attachment/dto/upload-attachment.input.js +0 -68
  210. package/src/lib/attachment/dto/upload-attachment.input.js.map +0 -1
  211. package/src/lib/attachment/index.js +0 -9
  212. package/src/lib/attachment/index.js.map +0 -1
  213. package/src/lib/bpm/bpm-root.module.d.ts +0 -155
  214. package/src/lib/bpm/bpm-root.module.js +0 -170
  215. package/src/lib/bpm/bpm-root.module.js.map +0 -1
  216. package/src/lib/bpm/index.js +0 -5
  217. package/src/lib/bpm/index.js.map +0 -1
  218. package/src/lib/bpm-auth/bpm-auth-context.d.ts +0 -24
  219. package/src/lib/bpm-auth/bpm-auth-context.extractor.d.ts +0 -4
  220. package/src/lib/bpm-auth/bpm-auth-context.extractor.js +0 -69
  221. package/src/lib/bpm-auth/bpm-auth-context.extractor.js.map +0 -1
  222. package/src/lib/bpm-auth/bpm-auth-context.js +0 -15
  223. package/src/lib/bpm-auth/bpm-auth-context.js.map +0 -1
  224. package/src/lib/bpm-auth/bpm-auth.authorization.d.ts +0 -12
  225. package/src/lib/bpm-auth/bpm-auth.authorization.js +0 -67
  226. package/src/lib/bpm-auth/bpm-auth.authorization.js.map +0 -1
  227. package/src/lib/bpm-auth/bpm-auth.decorators.d.ts +0 -3
  228. package/src/lib/bpm-auth/bpm-auth.decorators.js +0 -11
  229. package/src/lib/bpm-auth/bpm-auth.decorators.js.map +0 -1
  230. package/src/lib/bpm-auth/bpm-auth.guard.d.ts +0 -7
  231. package/src/lib/bpm-auth/bpm-auth.guard.js +0 -24
  232. package/src/lib/bpm-auth/bpm-auth.guard.js.map +0 -1
  233. package/src/lib/bpm-auth/bpm-auth.module.d.ts +0 -6
  234. package/src/lib/bpm-auth/bpm-auth.module.js +0 -69
  235. package/src/lib/bpm-auth/bpm-auth.module.js.map +0 -1
  236. package/src/lib/bpm-auth/bpm-auth.options.d.ts +0 -11
  237. package/src/lib/bpm-auth/bpm-auth.options.js +0 -3
  238. package/src/lib/bpm-auth/bpm-auth.options.js.map +0 -1
  239. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.d.ts +0 -10
  240. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js +0 -40
  241. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js.map +0 -1
  242. package/src/lib/bpm-auth/index.js +0 -10
  243. package/src/lib/bpm-auth/index.js.map +0 -1
  244. package/src/lib/common/filters/all-exceptions.filter.d.ts +0 -25
  245. package/src/lib/common/filters/all-exceptions.filter.js +0 -93
  246. package/src/lib/common/filters/all-exceptions.filter.js.map +0 -1
  247. package/src/lib/common/index.js +0 -5
  248. package/src/lib/common/index.js.map +0 -1
  249. package/src/lib/common/iso-duration.d.ts +0 -1
  250. package/src/lib/common/iso-duration.js +0 -27
  251. package/src/lib/common/iso-duration.js.map +0 -1
  252. package/src/lib/condition/condition.module.d.ts +0 -2
  253. package/src/lib/condition/condition.module.js +0 -16
  254. package/src/lib/condition/condition.module.js.map +0 -1
  255. package/src/lib/condition/condition.service.d.ts +0 -16
  256. package/src/lib/condition/condition.service.js +0 -82
  257. package/src/lib/condition/condition.service.js.map +0 -1
  258. package/src/lib/condition/index.js +0 -6
  259. package/src/lib/condition/index.js.map +0 -1
  260. package/src/lib/database/data-source.d.ts +0 -4
  261. package/src/lib/database/data-source.js +0 -7
  262. package/src/lib/database/data-source.js.map +0 -1
  263. package/src/lib/database/index.js +0 -6
  264. package/src/lib/database/index.js.map +0 -1
  265. package/src/lib/database/migration-runner.d.ts +0 -1
  266. package/src/lib/database/migration-runner.js +0 -25
  267. package/src/lib/database/migration-runner.js.map +0 -1
  268. package/src/lib/database/reconcile-legacy-migrations.d.ts +0 -13
  269. package/src/lib/database/reconcile-legacy-migrations.js +0 -70
  270. package/src/lib/database/reconcile-legacy-migrations.js.map +0 -1
  271. package/src/lib/database/typeorm.config.d.ts +0 -14
  272. package/src/lib/database/typeorm.config.js +0 -135
  273. package/src/lib/database/typeorm.config.js.map +0 -1
  274. package/src/lib/delegation/delegation-rule.entity.d.ts +0 -19
  275. package/src/lib/delegation/delegation-rule.entity.js +0 -99
  276. package/src/lib/delegation/delegation-rule.entity.js.map +0 -1
  277. package/src/lib/delegation/delegation.enums.d.ts +0 -10
  278. package/src/lib/delegation/delegation.enums.js +0 -23
  279. package/src/lib/delegation/delegation.enums.js.map +0 -1
  280. package/src/lib/delegation/delegation.module.d.ts +0 -2
  281. package/src/lib/delegation/delegation.module.js +0 -22
  282. package/src/lib/delegation/delegation.module.js.map +0 -1
  283. package/src/lib/delegation/delegation.mutations.d.ts +0 -11
  284. package/src/lib/delegation/delegation.mutations.js +0 -87
  285. package/src/lib/delegation/delegation.mutations.js.map +0 -1
  286. package/src/lib/delegation/delegation.queries.d.ts +0 -10
  287. package/src/lib/delegation/delegation.queries.js +0 -91
  288. package/src/lib/delegation/delegation.queries.js.map +0 -1
  289. package/src/lib/delegation/delegation.service.d.ts +0 -56
  290. package/src/lib/delegation/delegation.service.js +0 -268
  291. package/src/lib/delegation/delegation.service.js.map +0 -1
  292. package/src/lib/delegation/dto/delegation-rule.input.d.ts +0 -24
  293. package/src/lib/delegation/dto/delegation-rule.input.js +0 -143
  294. package/src/lib/delegation/dto/delegation-rule.input.js.map +0 -1
  295. package/src/lib/delegation/index.js +0 -9
  296. package/src/lib/delegation/index.js.map +0 -1
  297. package/src/lib/form/dto/form-definition.input.d.ts +0 -26
  298. package/src/lib/form/dto/form-definition.input.js +0 -126
  299. package/src/lib/form/dto/form-definition.input.js.map +0 -1
  300. package/src/lib/form/form-definition-version.entity.d.ts +0 -17
  301. package/src/lib/form/form-definition-version.entity.js +0 -84
  302. package/src/lib/form/form-definition-version.entity.js.map +0 -1
  303. package/src/lib/form/form-definition.entity.d.ts +0 -13
  304. package/src/lib/form/form-definition.entity.js +0 -66
  305. package/src/lib/form/form-definition.entity.js.map +0 -1
  306. package/src/lib/form/form-schema-lint.object.d.ts +0 -4
  307. package/src/lib/form/form-schema-lint.object.js +0 -20
  308. package/src/lib/form/form-schema-lint.object.js.map +0 -1
  309. package/src/lib/form/form-schema.validator.d.ts +0 -13
  310. package/src/lib/form/form-schema.validator.js +0 -354
  311. package/src/lib/form/form-schema.validator.js.map +0 -1
  312. package/src/lib/form/form.enums.d.ts +0 -9
  313. package/src/lib/form/form.enums.js +0 -22
  314. package/src/lib/form/form.enums.js.map +0 -1
  315. package/src/lib/form/form.module.d.ts +0 -2
  316. package/src/lib/form/form.module.js +0 -27
  317. package/src/lib/form/form.module.js.map +0 -1
  318. package/src/lib/form/form.mutations.d.ts +0 -14
  319. package/src/lib/form/form.mutations.js +0 -89
  320. package/src/lib/form/form.mutations.js.map +0 -1
  321. package/src/lib/form/form.queries.d.ts +0 -16
  322. package/src/lib/form/form.queries.js +0 -96
  323. package/src/lib/form/form.queries.js.map +0 -1
  324. package/src/lib/form/form.service.d.ts +0 -49
  325. package/src/lib/form/form.service.js +0 -346
  326. package/src/lib/form/form.service.js.map +0 -1
  327. package/src/lib/form/index.js +0 -12
  328. package/src/lib/form/index.js.map +0 -1
  329. package/src/lib/identity/identity-options.d.ts +0 -13
  330. package/src/lib/identity/identity-options.js +0 -20
  331. package/src/lib/identity/identity-options.js.map +0 -1
  332. package/src/lib/identity/identity.module.d.ts +0 -17
  333. package/src/lib/identity/identity.module.js +0 -65
  334. package/src/lib/identity/identity.module.js.map +0 -1
  335. package/src/lib/identity/identity.queries.d.ts +0 -12
  336. package/src/lib/identity/identity.queries.js +0 -79
  337. package/src/lib/identity/identity.queries.js.map +0 -1
  338. package/src/lib/identity/identity.service.d.ts +0 -22
  339. package/src/lib/identity/identity.service.js +0 -141
  340. package/src/lib/identity/identity.service.js.map +0 -1
  341. package/src/lib/identity/index.js +0 -8
  342. package/src/lib/identity/index.js.map +0 -1
  343. package/src/lib/identity/member-base.adapter.d.ts +0 -95
  344. package/src/lib/identity/member-base.adapter.js +0 -137
  345. package/src/lib/identity/member-base.adapter.js.map +0 -1
  346. package/src/lib/identity/member-metadata-cache.entity.d.ts +0 -8
  347. package/src/lib/identity/member-metadata-cache.entity.js +0 -39
  348. package/src/lib/identity/member-metadata-cache.entity.js.map +0 -1
  349. package/src/lib/identity/member-not-found.exception.js +0 -26
  350. package/src/lib/identity/member-not-found.exception.js.map +0 -1
  351. package/src/lib/identity/member-profile.object.d.ts +0 -8
  352. package/src/lib/identity/member-profile.object.js +0 -37
  353. package/src/lib/identity/member-profile.object.js.map +0 -1
  354. package/src/lib/identity/member-resolver.interface.d.ts +0 -79
  355. package/src/lib/identity/member-resolver.interface.js +0 -19
  356. package/src/lib/identity/member-resolver.interface.js.map +0 -1
  357. package/src/lib/migrations/0000000000001-enable-postgres-extensions.d.ts +0 -6
  358. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js +0 -17
  359. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js.map +0 -1
  360. package/src/lib/migrations/0000000001000-identity-organization-foundation.d.ts +0 -6
  361. package/src/lib/migrations/0000000001000-identity-organization-foundation.js.map +0 -1
  362. package/src/lib/migrations/0000000002000-form-builder-foundation.d.ts +0 -6
  363. package/src/lib/migrations/0000000002000-form-builder-foundation.js.map +0 -1
  364. package/src/lib/migrations/0000000003000-approval-template-foundation.d.ts +0 -6
  365. package/src/lib/migrations/0000000003000-approval-template-foundation.js.map +0 -1
  366. package/src/lib/migrations/0000000004000-workflow-engine-foundation.d.ts +0 -6
  367. package/src/lib/migrations/0000000004000-workflow-engine-foundation.js.map +0 -1
  368. package/src/lib/migrations/0000000005000-delegation-rules.d.ts +0 -6
  369. package/src/lib/migrations/0000000005000-delegation-rules.js.map +0 -1
  370. package/src/lib/migrations/0000000006000-notifications-sla.d.ts +0 -6
  371. package/src/lib/migrations/0000000006000-notifications-sla.js.map +0 -1
  372. package/src/lib/migrations/0000000007000-signatures-attachments.d.ts +0 -6
  373. package/src/lib/migrations/0000000007000-signatures-attachments.js.map +0 -1
  374. package/src/lib/migrations/0000000008000-approval-template-categories.d.ts +0 -6
  375. package/src/lib/migrations/0000000008000-approval-template-categories.js.map +0 -1
  376. package/src/lib/migrations/0000000009000-task-candidates.d.ts +0 -6
  377. package/src/lib/migrations/0000000009000-task-candidates.js.map +0 -1
  378. package/src/lib/migrations/0000000010000-notification-delivery-state.d.ts +0 -6
  379. package/src/lib/migrations/0000000010000-notification-delivery-state.js.map +0 -1
  380. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.d.ts +0 -6
  381. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js +0 -22
  382. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js.map +0 -1
  383. package/src/lib/migrations/0000000012000-notification-sla-idempotency.d.ts +0 -6
  384. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js +0 -21
  385. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js.map +0 -1
  386. package/src/lib/migrations/0000000013000-workflow-query-indexes.d.ts +0 -6
  387. package/src/lib/migrations/0000000013000-workflow-query-indexes.js +0 -80
  388. package/src/lib/migrations/0000000013000-workflow-query-indexes.js.map +0 -1
  389. package/src/lib/migrations/0000000014000-notification-resolution.d.ts +0 -6
  390. package/src/lib/migrations/0000000014000-notification-resolution.js +0 -30
  391. package/src/lib/migrations/0000000014000-notification-resolution.js.map +0 -1
  392. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.d.ts +0 -15
  393. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.js.map +0 -1
  394. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.d.ts +0 -15
  395. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.js.map +0 -1
  396. package/src/lib/migrations/0000000017000-adhoc-directives.d.ts +0 -6
  397. package/src/lib/migrations/0000000017000-adhoc-directives.js.map +0 -1
  398. package/src/lib/migrations/index.d.ts +0 -20
  399. package/src/lib/migrations/index.js +0 -61
  400. package/src/lib/migrations/index.js.map +0 -1
  401. package/src/lib/notification/dto/notification-preference.input.d.ts +0 -9
  402. package/src/lib/notification/dto/notification-preference.input.js +0 -53
  403. package/src/lib/notification/dto/notification-preference.input.js.map +0 -1
  404. package/src/lib/notification/index.js +0 -11
  405. package/src/lib/notification/index.js.map +0 -1
  406. package/src/lib/notification/notification-delivery-scheduler.service.d.ts +0 -13
  407. package/src/lib/notification/notification-delivery-scheduler.service.js +0 -53
  408. package/src/lib/notification/notification-delivery-scheduler.service.js.map +0 -1
  409. package/src/lib/notification/notification-delivery.service.d.ts +0 -23
  410. package/src/lib/notification/notification-delivery.service.js +0 -245
  411. package/src/lib/notification/notification-delivery.service.js.map +0 -1
  412. package/src/lib/notification/notification-dispatcher.token.d.ts +0 -7
  413. package/src/lib/notification/notification-dispatcher.token.js +0 -5
  414. package/src/lib/notification/notification-dispatcher.token.js.map +0 -1
  415. package/src/lib/notification/notification-options.d.ts +0 -215
  416. package/src/lib/notification/notification-options.js +0 -128
  417. package/src/lib/notification/notification-options.js.map +0 -1
  418. package/src/lib/notification/notification-options.module.d.ts +0 -23
  419. package/src/lib/notification/notification-options.module.js +0 -41
  420. package/src/lib/notification/notification-options.module.js.map +0 -1
  421. package/src/lib/notification/notification-preference.entity.d.ts +0 -10
  422. package/src/lib/notification/notification-preference.entity.js +0 -50
  423. package/src/lib/notification/notification-preference.entity.js.map +0 -1
  424. package/src/lib/notification/notification-sla-scheduler.service.d.ts +0 -13
  425. package/src/lib/notification/notification-sla-scheduler.service.js +0 -51
  426. package/src/lib/notification/notification-sla-scheduler.service.js.map +0 -1
  427. package/src/lib/notification/notification-template.d.ts +0 -13
  428. package/src/lib/notification/notification-template.js +0 -61
  429. package/src/lib/notification/notification-template.js.map +0 -1
  430. package/src/lib/notification/notification.entity.d.ts +0 -31
  431. package/src/lib/notification/notification.entity.js +0 -149
  432. package/src/lib/notification/notification.entity.js.map +0 -1
  433. package/src/lib/notification/notification.enums.d.ts +0 -38
  434. package/src/lib/notification/notification.enums.js +0 -63
  435. package/src/lib/notification/notification.enums.js.map +0 -1
  436. package/src/lib/notification/notification.module.d.ts +0 -2
  437. package/src/lib/notification/notification.module.js +0 -45
  438. package/src/lib/notification/notification.module.js.map +0 -1
  439. package/src/lib/notification/notification.mutations.d.ts +0 -11
  440. package/src/lib/notification/notification.mutations.js +0 -64
  441. package/src/lib/notification/notification.mutations.js.map +0 -1
  442. package/src/lib/notification/notification.queries.d.ts +0 -11
  443. package/src/lib/notification/notification.queries.js +0 -77
  444. package/src/lib/notification/notification.queries.js.map +0 -1
  445. package/src/lib/notification/notification.service.d.ts +0 -121
  446. package/src/lib/notification/notification.service.js +0 -713
  447. package/src/lib/notification/notification.service.js.map +0 -1
  448. package/src/lib/organization/dto/manager-resolution.input.d.ts +0 -18
  449. package/src/lib/organization/dto/manager-resolution.input.js +0 -107
  450. package/src/lib/organization/dto/manager-resolution.input.js.map +0 -1
  451. package/src/lib/organization/dto/membership.input.d.ts +0 -16
  452. package/src/lib/organization/dto/membership.input.js +0 -99
  453. package/src/lib/organization/dto/membership.input.js.map +0 -1
  454. package/src/lib/organization/dto/org-unit.input.d.ts +0 -24
  455. package/src/lib/organization/dto/org-unit.input.js +0 -119
  456. package/src/lib/organization/dto/org-unit.input.js.map +0 -1
  457. package/src/lib/organization/dto/position.input.d.ts +0 -13
  458. package/src/lib/organization/dto/position.input.js +0 -70
  459. package/src/lib/organization/dto/position.input.js.map +0 -1
  460. package/src/lib/organization/index.js +0 -16
  461. package/src/lib/organization/index.js.map +0 -1
  462. package/src/lib/organization/json-metadata.d.ts +0 -1
  463. package/src/lib/organization/json-metadata.js +0 -14
  464. package/src/lib/organization/json-metadata.js.map +0 -1
  465. package/src/lib/organization/manager-resolution.entity.d.ts +0 -11
  466. package/src/lib/organization/manager-resolution.entity.js +0 -55
  467. package/src/lib/organization/manager-resolution.entity.js.map +0 -1
  468. package/src/lib/organization/membership.entity.d.ts +0 -11
  469. package/src/lib/organization/membership.entity.js +0 -60
  470. package/src/lib/organization/membership.entity.js.map +0 -1
  471. package/src/lib/organization/org-unit-tree-commit-result.object.d.ts +0 -4
  472. package/src/lib/organization/org-unit-tree-commit-result.object.js +0 -17
  473. package/src/lib/organization/org-unit-tree-commit-result.object.js.map +0 -1
  474. package/src/lib/organization/org-unit.entity.d.ts +0 -13
  475. package/src/lib/organization/org-unit.entity.js +0 -64
  476. package/src/lib/organization/org-unit.entity.js.map +0 -1
  477. package/src/lib/organization/organization-summary.object.d.ts +0 -6
  478. package/src/lib/organization/organization-summary.object.js +0 -28
  479. package/src/lib/organization/organization-summary.object.js.map +0 -1
  480. package/src/lib/organization/organization.enums.d.ts +0 -11
  481. package/src/lib/organization/organization.enums.js +0 -22
  482. package/src/lib/organization/organization.enums.js.map +0 -1
  483. package/src/lib/organization/organization.module.d.ts +0 -2
  484. package/src/lib/organization/organization.module.js +0 -35
  485. package/src/lib/organization/organization.module.js.map +0 -1
  486. package/src/lib/organization/organization.mutations.d.ts +0 -26
  487. package/src/lib/organization/organization.mutations.js +0 -148
  488. package/src/lib/organization/organization.mutations.js.map +0 -1
  489. package/src/lib/organization/organization.queries.d.ts +0 -23
  490. package/src/lib/organization/organization.queries.js +0 -202
  491. package/src/lib/organization/organization.queries.js.map +0 -1
  492. package/src/lib/organization/organization.service.d.ts +0 -102
  493. package/src/lib/organization/organization.service.js +0 -751
  494. package/src/lib/organization/organization.service.js.map +0 -1
  495. package/src/lib/organization/position.entity.d.ts +0 -9
  496. package/src/lib/organization/position.entity.js +0 -48
  497. package/src/lib/organization/position.entity.js.map +0 -1
  498. package/src/lib/organization/resolved-manager.object.d.ts +0 -4
  499. package/src/lib/organization/resolved-manager.object.js +0 -20
  500. package/src/lib/organization/resolved-manager.object.js.map +0 -1
  501. package/src/lib/signature/index.js +0 -8
  502. package/src/lib/signature/index.js.map +0 -1
  503. package/src/lib/signature/signature-options.d.ts +0 -33
  504. package/src/lib/signature/signature-options.js +0 -51
  505. package/src/lib/signature/signature-options.js.map +0 -1
  506. package/src/lib/signature/signature-verification.object.d.ts +0 -6
  507. package/src/lib/signature/signature-verification.object.js +0 -28
  508. package/src/lib/signature/signature-verification.object.js.map +0 -1
  509. package/src/lib/signature/signature.entity.d.ts +0 -16
  510. package/src/lib/signature/signature.entity.js +0 -88
  511. package/src/lib/signature/signature.entity.js.map +0 -1
  512. package/src/lib/signature/signature.module.d.ts +0 -11
  513. package/src/lib/signature/signature.module.js +0 -60
  514. package/src/lib/signature/signature.module.js.map +0 -1
  515. package/src/lib/signature/signature.queries.d.ts +0 -11
  516. package/src/lib/signature/signature.queries.js +0 -46
  517. package/src/lib/signature/signature.queries.js.map +0 -1
  518. package/src/lib/signature/signature.service.d.ts +0 -25
  519. package/src/lib/signature/signature.service.js +0 -124
  520. package/src/lib/signature/signature.service.js.map +0 -1
  521. package/src/lib/template/approval-template-category.entity.d.ts +0 -9
  522. package/src/lib/template/approval-template-category.entity.js +0 -49
  523. package/src/lib/template/approval-template-category.entity.js.map +0 -1
  524. package/src/lib/template/approval-template-version.entity.d.ts +0 -21
  525. package/src/lib/template/approval-template-version.entity.js +0 -106
  526. package/src/lib/template/approval-template-version.entity.js.map +0 -1
  527. package/src/lib/template/approval-template.entity.d.ts +0 -14
  528. package/src/lib/template/approval-template.entity.js +0 -74
  529. package/src/lib/template/approval-template.entity.js.map +0 -1
  530. package/src/lib/template/compose-approval-template.object.d.ts +0 -11
  531. package/src/lib/template/compose-approval-template.object.js +0 -36
  532. package/src/lib/template/compose-approval-template.object.js.map +0 -1
  533. package/src/lib/template/compose-template.mutations.d.ts +0 -8
  534. package/src/lib/template/compose-template.mutations.js +0 -32
  535. package/src/lib/template/compose-template.mutations.js.map +0 -1
  536. package/src/lib/template/dto/approval-template.input.d.ts +0 -36
  537. package/src/lib/template/dto/approval-template.input.js +0 -187
  538. package/src/lib/template/dto/approval-template.input.js.map +0 -1
  539. package/src/lib/template/dto/compose-approval-template.input.d.ts +0 -17
  540. package/src/lib/template/dto/compose-approval-template.input.js +0 -99
  541. package/src/lib/template/dto/compose-approval-template.input.js.map +0 -1
  542. package/src/lib/template/index.js +0 -14
  543. package/src/lib/template/index.js.map +0 -1
  544. package/src/lib/template/template.enums.d.ts +0 -14
  545. package/src/lib/template/template.enums.js +0 -31
  546. package/src/lib/template/template.enums.js.map +0 -1
  547. package/src/lib/template/template.module.d.ts +0 -2
  548. package/src/lib/template/template.module.js +0 -41
  549. package/src/lib/template/template.module.js.map +0 -1
  550. package/src/lib/template/template.mutations.d.ts +0 -20
  551. package/src/lib/template/template.mutations.js +0 -139
  552. package/src/lib/template/template.mutations.js.map +0 -1
  553. package/src/lib/template/template.queries.d.ts +0 -16
  554. package/src/lib/template/template.queries.js +0 -133
  555. package/src/lib/template/template.queries.js.map +0 -1
  556. package/src/lib/template/template.service.d.ts +0 -83
  557. package/src/lib/template/template.service.js +0 -654
  558. package/src/lib/template/template.service.js.map +0 -1
  559. package/src/lib/template/workflow-definition.validator.d.ts +0 -9
  560. package/src/lib/template/workflow-definition.validator.js +0 -362
  561. package/src/lib/template/workflow-definition.validator.js.map +0 -1
  562. package/src/lib/testing/cel-js.jest.d.ts +0 -15
  563. package/src/lib/testing/cel-js.jest.js +0 -27
  564. package/src/lib/testing/cel-js.jest.js.map +0 -1
  565. package/src/lib/workflow-engine/activity-log.entity.d.ts +0 -12
  566. package/src/lib/workflow-engine/activity-log.entity.js +0 -62
  567. package/src/lib/workflow-engine/activity-log.entity.js.map +0 -1
  568. package/src/lib/workflow-engine/adhoc-directive.entity.d.ts +0 -31
  569. package/src/lib/workflow-engine/adhoc-directive.entity.js +0 -105
  570. package/src/lib/workflow-engine/adhoc-directive.entity.js.map +0 -1
  571. package/src/lib/workflow-engine/adhoc.enums.d.ts +0 -21
  572. package/src/lib/workflow-engine/adhoc.enums.js +0 -42
  573. package/src/lib/workflow-engine/adhoc.enums.js.map +0 -1
  574. package/src/lib/workflow-engine/approval-instance-page-info.object.d.ts +0 -8
  575. package/src/lib/workflow-engine/approval-instance-page-info.object.js +0 -36
  576. package/src/lib/workflow-engine/approval-instance-page-info.object.js.map +0 -1
  577. package/src/lib/workflow-engine/approval-instance.entity.d.ts +0 -22
  578. package/src/lib/workflow-engine/approval-instance.entity.js +0 -113
  579. package/src/lib/workflow-engine/approval-instance.entity.js.map +0 -1
  580. package/src/lib/workflow-engine/dto/adhoc-notification.input.d.ts +0 -6
  581. package/src/lib/workflow-engine/dto/adhoc-notification.input.js +0 -28
  582. package/src/lib/workflow-engine/dto/adhoc-notification.input.js.map +0 -1
  583. package/src/lib/workflow-engine/dto/adhoc-target.input.d.ts +0 -16
  584. package/src/lib/workflow-engine/dto/adhoc-target.input.js +0 -61
  585. package/src/lib/workflow-engine/dto/adhoc-target.input.js.map +0 -1
  586. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.d.ts +0 -5
  587. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js +0 -29
  588. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js.map +0 -1
  589. package/src/lib/workflow-engine/dto/decide-task.input.d.ts +0 -9
  590. package/src/lib/workflow-engine/dto/decide-task.input.js +0 -47
  591. package/src/lib/workflow-engine/dto/decide-task.input.js.map +0 -1
  592. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.d.ts +0 -6
  593. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js +0 -34
  594. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js.map +0 -1
  595. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +0 -6
  596. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +0 -34
  597. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +0 -1
  598. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +0 -7
  599. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +0 -40
  600. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +0 -1
  601. package/src/lib/workflow-engine/index.js +0 -28
  602. package/src/lib/workflow-engine/index.js.map +0 -1
  603. package/src/lib/workflow-engine/task-candidate.entity.d.ts +0 -14
  604. package/src/lib/workflow-engine/task-candidate.entity.js +0 -72
  605. package/src/lib/workflow-engine/task-candidate.entity.js.map +0 -1
  606. package/src/lib/workflow-engine/task-decision.entity.d.ts +0 -12
  607. package/src/lib/workflow-engine/task-decision.entity.js +0 -60
  608. package/src/lib/workflow-engine/task-decision.entity.js.map +0 -1
  609. package/src/lib/workflow-engine/task.entity.d.ts +0 -25
  610. package/src/lib/workflow-engine/task.entity.js +0 -130
  611. package/src/lib/workflow-engine/task.entity.js.map +0 -1
  612. package/src/lib/workflow-engine/workflow-condition-evaluator.d.ts +0 -5
  613. package/src/lib/workflow-engine/workflow-condition-evaluator.js +0 -107
  614. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +0 -1
  615. package/src/lib/workflow-engine/workflow-dashboard-summary.object.d.ts +0 -8
  616. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js +0 -36
  617. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js.map +0 -1
  618. package/src/lib/workflow-engine/workflow-dry-run.object.d.ts +0 -21
  619. package/src/lib/workflow-engine/workflow-dry-run.object.js +0 -86
  620. package/src/lib/workflow-engine/workflow-dry-run.object.js.map +0 -1
  621. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +0 -61
  622. package/src/lib/workflow-engine/workflow-engine.enums.js +0 -98
  623. package/src/lib/workflow-engine/workflow-engine.enums.js.map +0 -1
  624. package/src/lib/workflow-engine/workflow-engine.module.d.ts +0 -9
  625. package/src/lib/workflow-engine/workflow-engine.module.js +0 -78
  626. package/src/lib/workflow-engine/workflow-engine.module.js.map +0 -1
  627. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +0 -29
  628. package/src/lib/workflow-engine/workflow-engine.mutations.js +0 -218
  629. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +0 -1
  630. package/src/lib/workflow-engine/workflow-engine.queries.d.ts +0 -31
  631. package/src/lib/workflow-engine/workflow-engine.queries.js +0 -237
  632. package/src/lib/workflow-engine/workflow-engine.queries.js.map +0 -1
  633. package/src/lib/workflow-engine/workflow-engine.service.d.ts +0 -188
  634. package/src/lib/workflow-engine/workflow-engine.service.js +0 -3561
  635. package/src/lib/workflow-engine/workflow-engine.service.js.map +0 -1
  636. package/src/lib/workflow-engine/workflow-engine.tokens.js +0 -5
  637. package/src/lib/workflow-engine/workflow-engine.tokens.js.map +0 -1
  638. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.d.ts +0 -18
  639. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +0 -39
  640. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +0 -1
  641. package/src/lib/workflow-engine/workflow-token.entity.d.ts +0 -10
  642. package/src/lib/workflow-engine/workflow-token.entity.js +0 -50
  643. package/src/lib/workflow-engine/workflow-token.entity.js.map +0 -1
  644. /package/src/{index.d.ts → index.ts} +0 -0
  645. /package/src/lib/attachment/{index.d.ts → index.ts} +0 -0
  646. /package/src/lib/bpm/{index.d.ts → index.ts} +0 -0
  647. /package/src/lib/bpm-auth/{index.d.ts → index.ts} +0 -0
  648. /package/src/lib/common/{index.d.ts → index.ts} +0 -0
  649. /package/src/lib/condition/{index.d.ts → index.ts} +0 -0
  650. /package/src/lib/database/{index.d.ts → index.ts} +0 -0
  651. /package/src/lib/delegation/{index.d.ts → index.ts} +0 -0
  652. /package/src/lib/form/{index.d.ts → index.ts} +0 -0
  653. /package/src/lib/identity/{index.d.ts → index.ts} +0 -0
  654. /package/src/lib/notification/{index.d.ts → index.ts} +0 -0
  655. /package/src/lib/organization/{index.d.ts → index.ts} +0 -0
  656. /package/src/lib/signature/{index.d.ts → index.ts} +0 -0
  657. /package/src/lib/template/{index.d.ts → index.ts} +0 -0
  658. /package/src/lib/workflow-engine/{index.d.ts → index.ts} +0 -0
@@ -0,0 +1,452 @@
1
+ import { InjectionToken } from '@nestjs/common';
2
+ import {
3
+ NotificationChannelEnum,
4
+ NotificationDigestModeEnum,
5
+ } from './notification.enums';
6
+
7
+ export type NotificationFeatureToggle = boolean | 'auto';
8
+
9
+ export type NotificationTemplateEngine = 'handlebars' | 'simple';
10
+
11
+ export interface BPMRootNotificationOptions {
12
+ /**
13
+ * Enables creation and display of in-app notification records.
14
+ *
15
+ * Defaults to `true`. Set to `false` only when the host application wants
16
+ * BPM to run without notification center data.
17
+ */
18
+ readonly notificationInAppEnabled?: boolean;
19
+
20
+ /**
21
+ * Controls whether BPM may create and dispatch email notifications.
22
+ *
23
+ * Use `auto` to enable email only when all SMTP connection fields are
24
+ * present. Use `false` to force email off even when SMTP secrets exist.
25
+ * Defaults to `auto`.
26
+ */
27
+ readonly notificationEmailEnabled?: NotificationFeatureToggle;
28
+
29
+ /**
30
+ * SMTP server hostname used for BPM email delivery.
31
+ *
32
+ * Required when `notificationEmailEnabled` is `true`; required for auto
33
+ * enablement when `notificationEmailEnabled` is `auto`.
34
+ */
35
+ readonly notificationEmailSmtpHost?: string | null;
36
+
37
+ /**
38
+ * SMTP server port used for BPM email delivery.
39
+ *
40
+ * Common values are `587` for STARTTLS and `465` for implicit TLS. Required
41
+ * when `notificationEmailEnabled` is `true`; required for auto enablement
42
+ * when `notificationEmailEnabled` is `auto`.
43
+ */
44
+ readonly notificationEmailSmtpPort?: number | null;
45
+
46
+ /**
47
+ * Whether the SMTP connection should use implicit TLS.
48
+ *
49
+ * Use `false` for STARTTLS on port `587`; use `true` for implicit TLS on
50
+ * port `465`. Defaults to `false`.
51
+ */
52
+ readonly notificationEmailSmtpSecure?: boolean;
53
+
54
+ /**
55
+ * SMTP authentication username used by BPM email delivery.
56
+ *
57
+ * Required when `notificationEmailEnabled` is `true`; required for auto
58
+ * enablement when `notificationEmailEnabled` is `auto`.
59
+ */
60
+ readonly notificationEmailSmtpUsername?: string | null;
61
+
62
+ /**
63
+ * SMTP authentication password or app password used by BPM email delivery.
64
+ *
65
+ * Required when `notificationEmailEnabled` is `true`; required for auto
66
+ * enablement when `notificationEmailEnabled` is `auto`.
67
+ */
68
+ readonly notificationEmailSmtpPassword?: string | null;
69
+
70
+ /**
71
+ * Sender address used for BPM email delivery.
72
+ *
73
+ * Accepts either an email address or an RFC 5322 display format such as
74
+ * `BPM <bpm@example.com>`. Required when email delivery is enabled.
75
+ */
76
+ readonly notificationEmailFrom?: string | null;
77
+
78
+ /**
79
+ * Controls whether BPM may create and dispatch webhook notifications.
80
+ *
81
+ * Use `auto` to enable webhooks only when
82
+ * `notificationWebhookSigningSecret` is present. Use `false` to force
83
+ * webhooks off. Defaults to `auto`.
84
+ */
85
+ readonly notificationWebhookEnabled?: NotificationFeatureToggle;
86
+
87
+ /**
88
+ * Secret used to sign BPM webhook payloads.
89
+ *
90
+ * Required when `notificationWebhookEnabled` is `true`; required for auto
91
+ * enablement when `notificationWebhookEnabled` is `auto`.
92
+ */
93
+ readonly notificationWebhookSigningSecret?: string | null;
94
+
95
+ /**
96
+ * Default endpoint URL used for BPM webhook notification delivery.
97
+ *
98
+ * Required when `notificationWebhookEnabled` is `true`; required for auto
99
+ * enablement when `notificationWebhookEnabled` is `auto`.
100
+ */
101
+ readonly notificationWebhookEndpointUrl?: string | null;
102
+
103
+ /**
104
+ * Enables the background delivery scheduler for pending email and webhook
105
+ * notifications.
106
+ *
107
+ * Defaults to `false`. Set to `true` only in a dedicated worker process or
108
+ * single-replica host that should run notification delivery itself.
109
+ */
110
+ readonly notificationDeliverySchedulerEnabled?: boolean;
111
+
112
+ /**
113
+ * Interval in milliseconds between pending notification delivery scans.
114
+ *
115
+ * Defaults to `30000`. Values below `1000` are normalized to `1000` to avoid
116
+ * tight loops in long-running API processes.
117
+ */
118
+ readonly notificationDeliveryScanIntervalMs?: number;
119
+
120
+ /**
121
+ * Maximum pending notifications processed by each delivery scan.
122
+ */
123
+ readonly notificationDeliveryBatchSize?: number;
124
+
125
+ /**
126
+ * Maximum delivery attempts before a pending email/webhook notification is
127
+ * marked failed.
128
+ */
129
+ readonly notificationDeliveryMaxAttempts?: number;
130
+
131
+ /**
132
+ * Base retry delay in milliseconds. Retry scheduling multiplies this value
133
+ * by the current attempt count.
134
+ */
135
+ readonly notificationDeliveryRetryBaseDelayMs?: number;
136
+
137
+ /**
138
+ * Enables the background SLA scheduler that scans pending tasks.
139
+ *
140
+ * Defaults to `false`. Set to `true` only in a dedicated worker process or
141
+ * single-replica host that should run SLA scans itself.
142
+ */
143
+ readonly notificationSlaSchedulerEnabled?: boolean;
144
+
145
+ /**
146
+ * Interval in milliseconds between automatic SLA scans.
147
+ *
148
+ * Defaults to `60000`. Values below `1000` are normalized to `1000` to avoid
149
+ * tight loops in long-running API processes.
150
+ */
151
+ readonly notificationSlaScanIntervalMs?: number;
152
+
153
+ /**
154
+ * Enables the SLA timeout `REMIND` action.
155
+ *
156
+ * Defaults to `true`. When disabled, overdue tasks with `REMIND` timeout
157
+ * policy still keep their task state, but the timeout action hook is skipped.
158
+ */
159
+ readonly notificationSlaTimeoutRemindEnabled?: boolean;
160
+
161
+ /**
162
+ * Enables the SLA timeout `AUTO_APPROVE` action.
163
+ *
164
+ * Defaults to `false` because this action changes workflow state and should
165
+ * be explicitly enabled by the host application.
166
+ */
167
+ readonly notificationSlaTimeoutAutoApproveEnabled?: boolean;
168
+
169
+ /**
170
+ * Enables the SLA timeout `ESCALATE` action.
171
+ *
172
+ * Defaults to `false` because escalation changes task assignment and should
173
+ * be explicitly enabled by the host application.
174
+ */
175
+ readonly notificationSlaTimeoutEscalateEnabled?: boolean;
176
+
177
+ /**
178
+ * Enables the SLA timeout `TERMINATE_INSTANCE` action.
179
+ *
180
+ * Defaults to `false` because termination changes instance state and should
181
+ * be explicitly enabled by the host application.
182
+ */
183
+ readonly notificationSlaTimeoutTerminateInstanceEnabled?: boolean;
184
+
185
+ /**
186
+ * Template engine used to render notification title and body text.
187
+ *
188
+ * `simple` uses BPM's built-in `{{path}}` replacement renderer. `handlebars`
189
+ * reserves the host configuration for the Handlebars renderer once the email
190
+ * template implementation is wired. Defaults to `simple`.
191
+ */
192
+ readonly notificationTemplateEngine?: NotificationTemplateEngine;
193
+
194
+ /**
195
+ * Channels used when a workflow node does not specify notification channels.
196
+ */
197
+ readonly notificationDefaultChannels?: readonly NotificationChannelEnum[];
198
+
199
+ /**
200
+ * Default email digest mode for members without a stored preference.
201
+ */
202
+ readonly notificationDefaultEmailDigestMode?: NotificationDigestModeEnum;
203
+
204
+ /**
205
+ * Default in-app notification preference for members without a stored
206
+ * preference.
207
+ */
208
+ readonly notificationDefaultInAppPreferenceEnabled?: boolean;
209
+
210
+ /**
211
+ * Default email notification preference for members without a stored
212
+ * preference.
213
+ */
214
+ readonly notificationDefaultEmailPreferenceEnabled?: boolean;
215
+ }
216
+
217
+ export interface BPMResolvedNotificationOptions {
218
+ readonly emailEnabled: boolean;
219
+ readonly emailFrom: string | null;
220
+ readonly emailSmtpHost: string | null;
221
+ readonly emailSmtpPassword: string | null;
222
+ readonly emailSmtpPort: number | null;
223
+ readonly emailSmtpSecure: boolean;
224
+ readonly emailSmtpUsername: string | null;
225
+ readonly inAppEnabled: boolean;
226
+ readonly defaultChannels: readonly NotificationChannelEnum[];
227
+ readonly defaultEmailDigestMode: NotificationDigestModeEnum;
228
+ readonly defaultEmailPreferenceEnabled: boolean;
229
+ readonly defaultInAppPreferenceEnabled: boolean;
230
+ readonly deliveryBatchSize: number;
231
+ readonly deliveryMaxAttempts: number;
232
+ readonly deliveryRetryBaseDelayMs: number;
233
+ readonly deliveryScanIntervalMs: number;
234
+ readonly deliverySchedulerEnabled: boolean;
235
+ readonly slaScanIntervalMs: number;
236
+ readonly slaSchedulerEnabled: boolean;
237
+ readonly slaTimeoutAutoApproveEnabled: boolean;
238
+ readonly slaTimeoutEscalateEnabled: boolean;
239
+ readonly slaTimeoutRemindEnabled: boolean;
240
+ readonly slaTimeoutTerminateInstanceEnabled: boolean;
241
+ readonly templateEngine: NotificationTemplateEngine;
242
+ readonly webhookEnabled: boolean;
243
+ readonly webhookEndpointUrl: string | null;
244
+ readonly webhookSigningSecret: string | null;
245
+ }
246
+
247
+ export const BPM_NOTIFICATION_OPTIONS: InjectionToken<BPMResolvedNotificationOptions> =
248
+ Symbol('BPM_NOTIFICATION_OPTIONS');
249
+
250
+ export const DEFAULT_BPM_NOTIFICATION_OPTIONS: BPMResolvedNotificationOptions =
251
+ {
252
+ emailEnabled: false,
253
+ emailFrom: null,
254
+ emailSmtpHost: null,
255
+ emailSmtpPassword: null,
256
+ emailSmtpPort: null,
257
+ emailSmtpSecure: false,
258
+ emailSmtpUsername: null,
259
+ inAppEnabled: true,
260
+ defaultChannels: [NotificationChannelEnum.IN_APP],
261
+ defaultEmailDigestMode: NotificationDigestModeEnum.INSTANT,
262
+ defaultEmailPreferenceEnabled: true,
263
+ defaultInAppPreferenceEnabled: true,
264
+ deliveryBatchSize: 25,
265
+ deliveryMaxAttempts: 3,
266
+ deliveryRetryBaseDelayMs: 60_000,
267
+ deliveryScanIntervalMs: 30_000,
268
+ deliverySchedulerEnabled: false,
269
+ slaScanIntervalMs: 60_000,
270
+ slaSchedulerEnabled: false,
271
+ slaTimeoutAutoApproveEnabled: false,
272
+ slaTimeoutEscalateEnabled: false,
273
+ slaTimeoutRemindEnabled: true,
274
+ slaTimeoutTerminateInstanceEnabled: false,
275
+ templateEngine: 'simple',
276
+ webhookEndpointUrl: null,
277
+ webhookEnabled: false,
278
+ webhookSigningSecret: null,
279
+ };
280
+
281
+ export function resolveBPMNotificationOptions(
282
+ options: BPMRootNotificationOptions = {},
283
+ ): BPMResolvedNotificationOptions {
284
+ const emailSmtpHost = normalizeText(options.notificationEmailSmtpHost);
285
+ const emailSmtpPort = normalizePort(options.notificationEmailSmtpPort);
286
+ const emailSmtpUsername = normalizeText(
287
+ options.notificationEmailSmtpUsername,
288
+ );
289
+ const emailSmtpPassword = normalizeText(
290
+ options.notificationEmailSmtpPassword,
291
+ );
292
+ const emailFrom = normalizeText(options.notificationEmailFrom);
293
+ const webhookSigningSecret = normalizeText(
294
+ options.notificationWebhookSigningSecret,
295
+ );
296
+ const webhookEndpointUrl = normalizeText(
297
+ options.notificationWebhookEndpointUrl,
298
+ );
299
+
300
+ return {
301
+ deliveryScanIntervalMs: normalizeInterval(
302
+ options.notificationDeliveryScanIntervalMs,
303
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.deliveryScanIntervalMs,
304
+ ),
305
+ deliveryBatchSize: normalizePositiveInteger(
306
+ options.notificationDeliveryBatchSize,
307
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.deliveryBatchSize,
308
+ ),
309
+ deliveryMaxAttempts: normalizePositiveInteger(
310
+ options.notificationDeliveryMaxAttempts,
311
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.deliveryMaxAttempts,
312
+ ),
313
+ deliveryRetryBaseDelayMs: normalizeInterval(
314
+ options.notificationDeliveryRetryBaseDelayMs,
315
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.deliveryRetryBaseDelayMs,
316
+ ),
317
+ deliverySchedulerEnabled:
318
+ options.notificationDeliverySchedulerEnabled ??
319
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.deliverySchedulerEnabled,
320
+ emailEnabled: resolveToggle(
321
+ options.notificationEmailEnabled ?? 'auto',
322
+ Boolean(
323
+ emailSmtpHost &&
324
+ emailSmtpPort &&
325
+ emailSmtpUsername &&
326
+ emailSmtpPassword &&
327
+ emailFrom,
328
+ ),
329
+ ),
330
+ emailFrom,
331
+ emailSmtpHost,
332
+ emailSmtpPassword,
333
+ emailSmtpPort,
334
+ emailSmtpSecure: options.notificationEmailSmtpSecure ?? false,
335
+ emailSmtpUsername,
336
+ inAppEnabled:
337
+ options.notificationInAppEnabled ??
338
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.inAppEnabled,
339
+ defaultChannels: normalizeChannels(options.notificationDefaultChannels),
340
+ defaultEmailDigestMode: isNotificationDigestMode(
341
+ options.notificationDefaultEmailDigestMode,
342
+ )
343
+ ? options.notificationDefaultEmailDigestMode
344
+ : DEFAULT_BPM_NOTIFICATION_OPTIONS.defaultEmailDigestMode,
345
+ defaultEmailPreferenceEnabled:
346
+ options.notificationDefaultEmailPreferenceEnabled ??
347
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.defaultEmailPreferenceEnabled,
348
+ defaultInAppPreferenceEnabled:
349
+ options.notificationDefaultInAppPreferenceEnabled ??
350
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.defaultInAppPreferenceEnabled,
351
+ slaScanIntervalMs: normalizeInterval(
352
+ options.notificationSlaScanIntervalMs,
353
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaScanIntervalMs,
354
+ ),
355
+ slaSchedulerEnabled:
356
+ options.notificationSlaSchedulerEnabled ??
357
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaSchedulerEnabled,
358
+ slaTimeoutAutoApproveEnabled:
359
+ options.notificationSlaTimeoutAutoApproveEnabled ??
360
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaTimeoutAutoApproveEnabled,
361
+ slaTimeoutEscalateEnabled:
362
+ options.notificationSlaTimeoutEscalateEnabled ??
363
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaTimeoutEscalateEnabled,
364
+ slaTimeoutRemindEnabled:
365
+ options.notificationSlaTimeoutRemindEnabled ??
366
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaTimeoutRemindEnabled,
367
+ slaTimeoutTerminateInstanceEnabled:
368
+ options.notificationSlaTimeoutTerminateInstanceEnabled ??
369
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.slaTimeoutTerminateInstanceEnabled,
370
+ templateEngine:
371
+ options.notificationTemplateEngine ??
372
+ DEFAULT_BPM_NOTIFICATION_OPTIONS.templateEngine,
373
+ webhookEnabled: resolveToggle(
374
+ options.notificationWebhookEnabled ?? 'auto',
375
+ Boolean(webhookEndpointUrl && webhookSigningSecret),
376
+ ),
377
+ webhookEndpointUrl,
378
+ webhookSigningSecret,
379
+ };
380
+ }
381
+
382
+ function resolveToggle(
383
+ toggle: NotificationFeatureToggle,
384
+ autoValue: boolean,
385
+ ): boolean {
386
+ return toggle === 'auto' ? autoValue : toggle;
387
+ }
388
+
389
+ function normalizeText(value: string | null | undefined): string | null {
390
+ const trimmedValue = value?.trim() ?? '';
391
+
392
+ return trimmedValue || null;
393
+ }
394
+
395
+ function normalizePort(value: number | null | undefined): number | null {
396
+ return typeof value === 'number' && Number.isInteger(value) && value > 0
397
+ ? value
398
+ : null;
399
+ }
400
+
401
+ function normalizeInterval(
402
+ value: number | undefined,
403
+ fallback: number,
404
+ ): number {
405
+ if (typeof value !== 'number' || !Number.isInteger(value)) {
406
+ return fallback;
407
+ }
408
+
409
+ return Math.max(value, 1000);
410
+ }
411
+
412
+ function normalizePositiveInteger(
413
+ value: number | undefined,
414
+ fallback: number,
415
+ ): number {
416
+ if (typeof value !== 'number' || !Number.isInteger(value) || value <= 0) {
417
+ return fallback;
418
+ }
419
+
420
+ return value;
421
+ }
422
+
423
+ function normalizeChannels(
424
+ channels: readonly NotificationChannelEnum[] | undefined,
425
+ ): readonly NotificationChannelEnum[] {
426
+ const normalizedChannels =
427
+ channels
428
+ ?.filter(isNotificationChannel)
429
+ .filter(
430
+ (channel, index, allChannels) => allChannels.indexOf(channel) === index,
431
+ ) ?? [];
432
+
433
+ return normalizedChannels.length
434
+ ? normalizedChannels
435
+ : DEFAULT_BPM_NOTIFICATION_OPTIONS.defaultChannels;
436
+ }
437
+
438
+ function isNotificationChannel(
439
+ value: unknown,
440
+ ): value is NotificationChannelEnum {
441
+ return Object.values(NotificationChannelEnum).includes(
442
+ value as NotificationChannelEnum,
443
+ );
444
+ }
445
+
446
+ function isNotificationDigestMode(
447
+ value: unknown,
448
+ ): value is NotificationDigestModeEnum {
449
+ return Object.values(NotificationDigestModeEnum).includes(
450
+ value as NotificationDigestModeEnum,
451
+ );
452
+ }
@@ -0,0 +1,35 @@
1
+ import { Field, ObjectType } from '@nestjs/graphql';
2
+ import { Column, Entity, PrimaryColumn, UpdateDateColumn } from 'typeorm';
3
+ import { NotificationDigestModeEnum } from './notification.enums';
4
+
5
+ @Entity('notification_preferences')
6
+ @ObjectType('NotificationPreference')
7
+ export class NotificationPreferenceEntity {
8
+ @PrimaryColumn('text', { name: 'member_id' })
9
+ @Field()
10
+ memberId!: string;
11
+
12
+ @Column('boolean', { name: 'in_app_enabled', default: true })
13
+ @Field()
14
+ inAppEnabled!: boolean;
15
+
16
+ @Column('boolean', { name: 'email_enabled', default: true })
17
+ @Field()
18
+ emailEnabled!: boolean;
19
+
20
+ @Column('text', { name: 'email_digest_mode' })
21
+ @Field(() => NotificationDigestModeEnum)
22
+ emailDigestMode!: NotificationDigestModeEnum;
23
+
24
+ @Column('time', { name: 'quiet_hours_start', nullable: true })
25
+ @Field(() => String, { nullable: true })
26
+ quietHoursStart!: string | null;
27
+
28
+ @Column('time', { name: 'quiet_hours_end', nullable: true })
29
+ @Field(() => String, { nullable: true })
30
+ quietHoursEnd!: string | null;
31
+
32
+ @UpdateDateColumn({ name: 'updated_at', type: 'timestamptz' })
33
+ @Field()
34
+ updatedAt!: Date;
35
+ }
@@ -0,0 +1,66 @@
1
+ import {
2
+ Inject,
3
+ Injectable,
4
+ Logger,
5
+ OnApplicationBootstrap,
6
+ OnApplicationShutdown,
7
+ Optional,
8
+ } from '@nestjs/common';
9
+ import {
10
+ BPM_NOTIFICATION_OPTIONS,
11
+ BPMResolvedNotificationOptions,
12
+ DEFAULT_BPM_NOTIFICATION_OPTIONS,
13
+ } from './notification-options';
14
+ import { NotificationService } from './notification.service';
15
+
16
+ @Injectable()
17
+ export class NotificationSlaSchedulerService
18
+ implements OnApplicationBootstrap, OnApplicationShutdown
19
+ {
20
+ private readonly logger = new Logger(NotificationSlaSchedulerService.name);
21
+ private timer: NodeJS.Timeout | null = null;
22
+
23
+ constructor(
24
+ private readonly notificationService: NotificationService,
25
+ @Optional()
26
+ @Inject(BPM_NOTIFICATION_OPTIONS)
27
+ private readonly notificationOptions: BPMResolvedNotificationOptions = DEFAULT_BPM_NOTIFICATION_OPTIONS,
28
+ ) {}
29
+
30
+ onApplicationBootstrap(): void {
31
+ if (
32
+ process.env.NODE_ENV === 'test' ||
33
+ !this.notificationOptions.slaSchedulerEnabled
34
+ ) {
35
+ return;
36
+ }
37
+
38
+ this.timer = setInterval((): void => {
39
+ void this.scanSla();
40
+ }, this.notificationOptions.slaScanIntervalMs);
41
+ this.timer.unref();
42
+ }
43
+
44
+ onApplicationShutdown(): void {
45
+ if (this.timer) {
46
+ clearInterval(this.timer);
47
+ this.timer = null;
48
+ }
49
+ }
50
+
51
+ private async scanSla(): Promise<void> {
52
+ try {
53
+ const result = await this.notificationService.runSlaScan();
54
+
55
+ if (result.overdueCount || result.warningCount) {
56
+ this.logger.log(
57
+ `SLA scan created ${result.warningCount} warning and ${result.overdueCount} overdue notifications`,
58
+ );
59
+ }
60
+ } catch (error: unknown) {
61
+ this.logger.error(
62
+ error instanceof Error ? error.message : 'SLA scan failed',
63
+ );
64
+ }
65
+ }
66
+ }
@@ -0,0 +1,33 @@
1
+ import { NotificationTypeEnum } from './notification.enums';
2
+ import { renderNotificationTemplate } from './notification-template';
3
+
4
+ describe('renderNotificationTemplate', () => {
5
+ it('renders built-in templates with simple path replacement', (): void => {
6
+ expect(
7
+ renderNotificationTemplate({
8
+ payload: {
9
+ instanceTitle: '採購申請',
10
+ nodeLabel: '主管簽核',
11
+ },
12
+ type: NotificationTypeEnum.TASK_ASSIGNED,
13
+ }),
14
+ ).toEqual({
15
+ body: '案件 採購申請 的 主管簽核 已指派給你。',
16
+ title: '新的待簽任務',
17
+ });
18
+ });
19
+
20
+ it('renders custom body templates with handlebars', (): void => {
21
+ expect(
22
+ renderNotificationTemplate({
23
+ customTemplate: '{{instanceTitle}} / {{node.label}}',
24
+ engine: 'handlebars',
25
+ payload: {
26
+ instanceTitle: '合約審核',
27
+ node: { label: '法務簽核' },
28
+ },
29
+ type: NotificationTypeEnum.TASK_ASSIGNED,
30
+ }).body,
31
+ ).toBe('合約審核 / 法務簽核');
32
+ });
33
+ });
@@ -0,0 +1,97 @@
1
+ import * as Handlebars from 'handlebars';
2
+ import { NotificationTypeEnum } from './notification.enums';
3
+ import { NotificationTemplateEngine } from './notification-options';
4
+
5
+ interface NotificationTemplate {
6
+ readonly body: string;
7
+ readonly title: string;
8
+ }
9
+
10
+ const TEMPLATES: Readonly<Record<NotificationTypeEnum, NotificationTemplate>> =
11
+ {
12
+ [NotificationTypeEnum.INSTANCE_COMPLETED]: {
13
+ body: '案件 {{instanceTitle}} 已完成。',
14
+ title: '案件已完成',
15
+ },
16
+ [NotificationTypeEnum.SLA_OVERDUE]: {
17
+ body: '{{nodeLabel}} 已於 {{slaDueAt}} 逾時,處理者:{{assigneeMemberId}}。',
18
+ title: 'SLA 已逾時',
19
+ },
20
+ [NotificationTypeEnum.SLA_WARNING]: {
21
+ body: '{{nodeLabel}} 將於 {{slaDueAt}} 到期,請儘快處理。',
22
+ title: 'SLA 即將到期',
23
+ },
24
+ [NotificationTypeEnum.TASK_ASSIGNED]: {
25
+ body: '案件 {{instanceTitle}} 的 {{nodeLabel}} 已指派給你。',
26
+ title: '新的待簽任務',
27
+ },
28
+ [NotificationTypeEnum.TASK_TRANSFERRED]: {
29
+ body: '案件 {{instanceTitle}} 的 {{nodeLabel}} 已轉派給你。',
30
+ title: '新的轉派任務',
31
+ },
32
+ [NotificationTypeEnum.WORKFLOW_NOTIFICATION]: {
33
+ body: '{{message}}',
34
+ title: '{{nodeLabel}}',
35
+ },
36
+ };
37
+
38
+ export function renderNotificationTemplate({
39
+ customTemplate,
40
+ engine = 'simple',
41
+ payload,
42
+ type,
43
+ }: {
44
+ readonly customTemplate?: string | null;
45
+ readonly engine?: NotificationTemplateEngine;
46
+ readonly payload: Readonly<Record<string, unknown>>;
47
+ readonly type: NotificationTypeEnum;
48
+ }): NotificationTemplate {
49
+ const template = TEMPLATES[type];
50
+ const bodyTemplate = customTemplate?.trim() || template.body;
51
+
52
+ return {
53
+ body: renderTemplate(bodyTemplate, payload, engine),
54
+ title: renderTemplate(template.title, payload, engine),
55
+ };
56
+ }
57
+
58
+ function renderTemplate(
59
+ template: string,
60
+ payload: Readonly<Record<string, unknown>>,
61
+ engine: NotificationTemplateEngine,
62
+ ): string {
63
+ if (engine === 'handlebars') {
64
+ return Handlebars.compile(template, {
65
+ noEscape: true,
66
+ strict: false,
67
+ })(payload);
68
+ }
69
+
70
+ return template.replace(
71
+ /\{\{\s*([A-Za-z0-9_.]+)\s*\}\}/gu,
72
+ (_match, key: string): string => readPayloadValue(payload, key),
73
+ );
74
+ }
75
+
76
+ function readPayloadValue(
77
+ payload: Readonly<Record<string, unknown>>,
78
+ path: string,
79
+ ): string {
80
+ const value = path
81
+ .split('.')
82
+ .reduce<unknown>(
83
+ (currentValue, key) =>
84
+ isRecord(currentValue) ? currentValue[key] : undefined,
85
+ payload,
86
+ );
87
+
88
+ if (value === null || typeof value === 'undefined') {
89
+ return '';
90
+ }
91
+
92
+ return String(value);
93
+ }
94
+
95
+ function isRecord(value: unknown): value is Readonly<Record<string, unknown>> {
96
+ return typeof value === 'object' && value !== null;
97
+ }