@rytass/bpm-core-nestjs-module 0.1.3 → 0.1.5

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 (612) hide show
  1. package/CHANGELOG.md +49 -0
  2. package/LICENSE +21 -0
  3. package/README.md +143 -0
  4. package/package.json +3 -3
  5. package/src/index.js +18 -0
  6. package/src/index.js.map +1 -0
  7. package/src/lib/attachment/attachment-options.d.ts +44 -0
  8. package/src/lib/attachment/attachment-options.js +62 -0
  9. package/src/lib/attachment/attachment-options.js.map +1 -0
  10. package/src/lib/attachment/attachment-storage.provider.d.ts +4 -0
  11. package/src/lib/attachment/attachment-storage.provider.js +35 -0
  12. package/src/lib/attachment/attachment-storage.provider.js.map +1 -0
  13. package/src/lib/attachment/{attachment-storage.token.ts → attachment-storage.token.d.ts} +1 -3
  14. package/src/lib/attachment/attachment-storage.token.js +5 -0
  15. package/src/lib/attachment/attachment-storage.token.js.map +1 -0
  16. package/src/lib/attachment/attachment.controller.d.ts +8 -0
  17. package/src/lib/attachment/attachment.controller.js +38 -0
  18. package/src/lib/attachment/attachment.controller.js.map +1 -0
  19. package/src/lib/attachment/attachment.entity.d.ts +14 -0
  20. package/src/lib/attachment/attachment.entity.js +74 -0
  21. package/src/lib/attachment/attachment.entity.js.map +1 -0
  22. package/src/lib/attachment/attachment.module.d.ts +27 -0
  23. package/src/lib/attachment/attachment.module.js +103 -0
  24. package/src/lib/attachment/attachment.module.js.map +1 -0
  25. package/src/lib/attachment/attachment.mutations.d.ts +8 -0
  26. package/src/lib/attachment/attachment.mutations.js +35 -0
  27. package/src/lib/attachment/attachment.mutations.js.map +1 -0
  28. package/src/lib/attachment/attachment.queries.d.ts +9 -0
  29. package/src/lib/attachment/attachment.queries.js +78 -0
  30. package/src/lib/attachment/attachment.queries.js.map +1 -0
  31. package/src/lib/attachment/attachment.service.d.ts +49 -0
  32. package/src/lib/attachment/attachment.service.js +276 -0
  33. package/src/lib/attachment/attachment.service.js.map +1 -0
  34. package/src/lib/attachment/dto/upload-attachment.input.d.ts +11 -0
  35. package/src/lib/attachment/dto/upload-attachment.input.js +68 -0
  36. package/src/lib/attachment/dto/upload-attachment.input.js.map +1 -0
  37. package/src/lib/attachment/index.js +9 -0
  38. package/src/lib/attachment/index.js.map +1 -0
  39. package/src/lib/bpm/bpm-root.module.d.ts +155 -0
  40. package/src/lib/bpm/bpm-root.module.js +170 -0
  41. package/src/lib/bpm/bpm-root.module.js.map +1 -0
  42. package/src/lib/bpm/index.js +5 -0
  43. package/src/lib/bpm/index.js.map +1 -0
  44. package/src/lib/bpm-auth/bpm-auth-context.d.ts +24 -0
  45. package/src/lib/bpm-auth/bpm-auth-context.extractor.d.ts +4 -0
  46. package/src/lib/bpm-auth/bpm-auth-context.extractor.js +69 -0
  47. package/src/lib/bpm-auth/bpm-auth-context.extractor.js.map +1 -0
  48. package/src/lib/bpm-auth/bpm-auth-context.js +15 -0
  49. package/src/lib/bpm-auth/bpm-auth-context.js.map +1 -0
  50. package/src/lib/bpm-auth/bpm-auth.authorization.d.ts +12 -0
  51. package/src/lib/bpm-auth/bpm-auth.authorization.js +67 -0
  52. package/src/lib/bpm-auth/bpm-auth.authorization.js.map +1 -0
  53. package/src/lib/bpm-auth/bpm-auth.decorators.d.ts +3 -0
  54. package/src/lib/bpm-auth/bpm-auth.decorators.js +11 -0
  55. package/src/lib/bpm-auth/bpm-auth.decorators.js.map +1 -0
  56. package/src/lib/bpm-auth/bpm-auth.guard.d.ts +7 -0
  57. package/src/lib/bpm-auth/bpm-auth.guard.js +24 -0
  58. package/src/lib/bpm-auth/bpm-auth.guard.js.map +1 -0
  59. package/src/lib/bpm-auth/bpm-auth.module.d.ts +6 -0
  60. package/src/lib/bpm-auth/bpm-auth.module.js +69 -0
  61. package/src/lib/bpm-auth/bpm-auth.module.js.map +1 -0
  62. package/src/lib/bpm-auth/bpm-auth.options.d.ts +11 -0
  63. package/src/lib/bpm-auth/bpm-auth.options.js +3 -0
  64. package/src/lib/bpm-auth/bpm-auth.options.js.map +1 -0
  65. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.d.ts +10 -0
  66. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js +40 -0
  67. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js.map +1 -0
  68. package/src/lib/bpm-auth/index.js +10 -0
  69. package/src/lib/bpm-auth/index.js.map +1 -0
  70. package/src/lib/common/filters/all-exceptions.filter.d.ts +25 -0
  71. package/src/lib/common/filters/all-exceptions.filter.js +93 -0
  72. package/src/lib/common/filters/all-exceptions.filter.js.map +1 -0
  73. package/src/lib/common/index.js +5 -0
  74. package/src/lib/common/index.js.map +1 -0
  75. package/src/lib/common/iso-duration.d.ts +1 -0
  76. package/src/lib/common/iso-duration.js +27 -0
  77. package/src/lib/common/iso-duration.js.map +1 -0
  78. package/src/lib/condition/condition.module.d.ts +2 -0
  79. package/src/lib/condition/condition.module.js +16 -0
  80. package/src/lib/condition/condition.module.js.map +1 -0
  81. package/src/lib/condition/condition.service.d.ts +16 -0
  82. package/src/lib/condition/condition.service.js +82 -0
  83. package/src/lib/condition/condition.service.js.map +1 -0
  84. package/src/lib/condition/index.js +6 -0
  85. package/src/lib/condition/index.js.map +1 -0
  86. package/src/lib/database/data-source.d.ts +4 -0
  87. package/src/lib/database/data-source.js +7 -0
  88. package/src/lib/database/data-source.js.map +1 -0
  89. package/src/lib/database/index.js +6 -0
  90. package/src/lib/database/index.js.map +1 -0
  91. package/src/lib/database/migration-runner.d.ts +1 -0
  92. package/src/lib/database/migration-runner.js +23 -0
  93. package/src/lib/database/migration-runner.js.map +1 -0
  94. package/src/lib/database/typeorm.config.d.ts +14 -0
  95. package/src/lib/database/typeorm.config.js +135 -0
  96. package/src/lib/database/typeorm.config.js.map +1 -0
  97. package/src/lib/delegation/delegation-rule.entity.d.ts +19 -0
  98. package/src/lib/delegation/delegation-rule.entity.js +99 -0
  99. package/src/lib/delegation/delegation-rule.entity.js.map +1 -0
  100. package/src/lib/delegation/delegation.enums.d.ts +10 -0
  101. package/src/lib/delegation/delegation.enums.js +23 -0
  102. package/src/lib/delegation/delegation.enums.js.map +1 -0
  103. package/src/lib/delegation/delegation.module.d.ts +2 -0
  104. package/src/lib/delegation/delegation.module.js +22 -0
  105. package/src/lib/delegation/delegation.module.js.map +1 -0
  106. package/src/lib/delegation/delegation.mutations.d.ts +11 -0
  107. package/src/lib/delegation/delegation.mutations.js +87 -0
  108. package/src/lib/delegation/delegation.mutations.js.map +1 -0
  109. package/src/lib/delegation/delegation.queries.d.ts +10 -0
  110. package/src/lib/delegation/delegation.queries.js +91 -0
  111. package/src/lib/delegation/delegation.queries.js.map +1 -0
  112. package/src/lib/delegation/delegation.service.d.ts +56 -0
  113. package/src/lib/delegation/delegation.service.js +268 -0
  114. package/src/lib/delegation/delegation.service.js.map +1 -0
  115. package/src/lib/delegation/dto/delegation-rule.input.d.ts +24 -0
  116. package/src/lib/delegation/dto/delegation-rule.input.js +143 -0
  117. package/src/lib/delegation/dto/delegation-rule.input.js.map +1 -0
  118. package/src/lib/delegation/index.js +9 -0
  119. package/src/lib/delegation/index.js.map +1 -0
  120. package/src/lib/form/dto/form-definition.input.d.ts +21 -0
  121. package/src/lib/form/dto/form-definition.input.js +103 -0
  122. package/src/lib/form/dto/form-definition.input.js.map +1 -0
  123. package/src/lib/form/form-definition-version.entity.d.ts +17 -0
  124. package/src/lib/form/form-definition-version.entity.js +84 -0
  125. package/src/lib/form/form-definition-version.entity.js.map +1 -0
  126. package/src/lib/form/form-definition.entity.d.ts +13 -0
  127. package/src/lib/form/form-definition.entity.js +66 -0
  128. package/src/lib/form/form-definition.entity.js.map +1 -0
  129. package/src/lib/form/form-schema-lint.object.d.ts +4 -0
  130. package/src/lib/form/form-schema-lint.object.js +20 -0
  131. package/src/lib/form/form-schema-lint.object.js.map +1 -0
  132. package/src/lib/form/form-schema.validator.d.ts +13 -0
  133. package/src/lib/form/form-schema.validator.js +354 -0
  134. package/src/lib/form/form-schema.validator.js.map +1 -0
  135. package/src/lib/form/form.enums.d.ts +9 -0
  136. package/src/lib/form/form.enums.js +22 -0
  137. package/src/lib/form/form.enums.js.map +1 -0
  138. package/src/lib/form/form.module.d.ts +2 -0
  139. package/src/lib/form/form.module.js +27 -0
  140. package/src/lib/form/form.module.js.map +1 -0
  141. package/src/lib/form/form.mutations.d.ts +14 -0
  142. package/src/lib/form/form.mutations.js +88 -0
  143. package/src/lib/form/form.mutations.js.map +1 -0
  144. package/src/lib/form/form.queries.d.ts +16 -0
  145. package/src/lib/form/form.queries.js +96 -0
  146. package/src/lib/form/form.queries.js.map +1 -0
  147. package/src/lib/form/form.service.d.ts +35 -0
  148. package/src/lib/form/form.service.js +297 -0
  149. package/src/lib/form/form.service.js.map +1 -0
  150. package/src/lib/form/index.js +12 -0
  151. package/src/lib/form/index.js.map +1 -0
  152. package/src/lib/identity/identity-options.d.ts +13 -0
  153. package/src/lib/identity/identity-options.js +20 -0
  154. package/src/lib/identity/identity-options.js.map +1 -0
  155. package/src/lib/identity/identity.module.d.ts +17 -0
  156. package/src/lib/identity/identity.module.js +65 -0
  157. package/src/lib/identity/identity.module.js.map +1 -0
  158. package/src/lib/identity/identity.queries.d.ts +12 -0
  159. package/src/lib/identity/identity.queries.js +79 -0
  160. package/src/lib/identity/identity.queries.js.map +1 -0
  161. package/src/lib/identity/identity.service.d.ts +22 -0
  162. package/src/lib/identity/identity.service.js +141 -0
  163. package/src/lib/identity/identity.service.js.map +1 -0
  164. package/src/lib/identity/index.js +7 -0
  165. package/src/lib/identity/index.js.map +1 -0
  166. package/src/lib/identity/member-base.adapter.d.ts +95 -0
  167. package/src/lib/identity/member-base.adapter.js +137 -0
  168. package/src/lib/identity/member-base.adapter.js.map +1 -0
  169. package/src/lib/identity/member-metadata-cache.entity.d.ts +8 -0
  170. package/src/lib/identity/member-metadata-cache.entity.js +39 -0
  171. package/src/lib/identity/member-metadata-cache.entity.js.map +1 -0
  172. package/src/lib/identity/member-profile.object.d.ts +8 -0
  173. package/src/lib/identity/member-profile.object.js +37 -0
  174. package/src/lib/identity/member-profile.object.js.map +1 -0
  175. package/src/lib/identity/member-resolver.interface.d.ts +79 -0
  176. package/src/lib/identity/member-resolver.interface.js +19 -0
  177. package/src/lib/identity/member-resolver.interface.js.map +1 -0
  178. package/src/lib/migrations/0000000000001-enable-postgres-extensions.d.ts +6 -0
  179. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js +17 -0
  180. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js.map +1 -0
  181. package/src/lib/migrations/0000000001000-identity-organization-foundation.d.ts +6 -0
  182. package/src/lib/migrations/{0000000001000-identity-organization-foundation.ts → 0000000001000-identity-organization-foundation.js} +29 -38
  183. package/src/lib/migrations/0000000001000-identity-organization-foundation.js.map +1 -0
  184. package/src/lib/migrations/0000000002000-form-builder-foundation.d.ts +6 -0
  185. package/src/lib/migrations/{0000000002000-form-builder-foundation.ts → 0000000002000-form-builder-foundation.js} +21 -22
  186. package/src/lib/migrations/0000000002000-form-builder-foundation.js.map +1 -0
  187. package/src/lib/migrations/0000000003000-approval-template-foundation.d.ts +6 -0
  188. package/src/lib/migrations/{0000000003000-approval-template-foundation.ts → 0000000003000-approval-template-foundation.js} +21 -24
  189. package/src/lib/migrations/0000000003000-approval-template-foundation.js.map +1 -0
  190. package/src/lib/migrations/0000000004000-workflow-engine-foundation.d.ts +6 -0
  191. package/src/lib/migrations/{0000000004000-workflow-engine-foundation.ts → 0000000004000-workflow-engine-foundation.js} +34 -46
  192. package/src/lib/migrations/0000000004000-workflow-engine-foundation.js.map +1 -0
  193. package/src/lib/migrations/0000000005000-delegation-rules.d.ts +6 -0
  194. package/src/lib/migrations/{0000000005000-delegation-rules.ts → 0000000005000-delegation-rules.js} +19 -20
  195. package/src/lib/migrations/0000000005000-delegation-rules.js.map +1 -0
  196. package/src/lib/migrations/0000000006000-notifications-sla.d.ts +6 -0
  197. package/src/lib/migrations/{0000000006000-notifications-sla.ts → 0000000006000-notifications-sla.js} +23 -26
  198. package/src/lib/migrations/0000000006000-notifications-sla.js.map +1 -0
  199. package/src/lib/migrations/0000000007000-signatures-attachments.d.ts +6 -0
  200. package/src/lib/migrations/{0000000007000-signatures-attachments.ts → 0000000007000-signatures-attachments.js} +27 -28
  201. package/src/lib/migrations/0000000007000-signatures-attachments.js.map +1 -0
  202. package/src/lib/migrations/0000000008000-approval-template-categories.d.ts +6 -0
  203. package/src/lib/migrations/{0000000008000-approval-template-categories.ts → 0000000008000-approval-template-categories.js} +25 -28
  204. package/src/lib/migrations/0000000008000-approval-template-categories.js.map +1 -0
  205. package/src/lib/migrations/0000000009000-task-candidates.d.ts +6 -0
  206. package/src/lib/migrations/{0000000009000-task-candidates.ts → 0000000009000-task-candidates.js} +23 -26
  207. package/src/lib/migrations/0000000009000-task-candidates.js.map +1 -0
  208. package/src/lib/migrations/0000000010000-notification-delivery-state.d.ts +6 -0
  209. package/src/lib/migrations/{0000000010000-notification-delivery-state.ts → 0000000010000-notification-delivery-state.js} +17 -16
  210. package/src/lib/migrations/0000000010000-notification-delivery-state.js.map +1 -0
  211. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.d.ts +6 -0
  212. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js +22 -0
  213. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js.map +1 -0
  214. package/src/lib/migrations/0000000012000-notification-sla-idempotency.d.ts +6 -0
  215. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js +21 -0
  216. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js.map +1 -0
  217. package/src/lib/migrations/0000000013000-workflow-query-indexes.d.ts +6 -0
  218. package/src/lib/migrations/0000000013000-workflow-query-indexes.js +80 -0
  219. package/src/lib/migrations/0000000013000-workflow-query-indexes.js.map +1 -0
  220. package/src/lib/migrations/index.d.ts +16 -0
  221. package/src/lib/migrations/index.js +49 -0
  222. package/src/lib/migrations/index.js.map +1 -0
  223. package/src/lib/notification/dto/notification-preference.input.d.ts +9 -0
  224. package/src/lib/notification/dto/notification-preference.input.js +53 -0
  225. package/src/lib/notification/dto/notification-preference.input.js.map +1 -0
  226. package/src/lib/notification/index.js +11 -0
  227. package/src/lib/notification/index.js.map +1 -0
  228. package/src/lib/notification/notification-delivery-scheduler.service.d.ts +13 -0
  229. package/src/lib/notification/notification-delivery-scheduler.service.js +53 -0
  230. package/src/lib/notification/notification-delivery-scheduler.service.js.map +1 -0
  231. package/src/lib/notification/notification-delivery.service.d.ts +23 -0
  232. package/src/lib/notification/notification-delivery.service.js +245 -0
  233. package/src/lib/notification/notification-delivery.service.js.map +1 -0
  234. package/src/lib/notification/notification-dispatcher.token.d.ts +7 -0
  235. package/src/lib/notification/notification-dispatcher.token.js +5 -0
  236. package/src/lib/notification/notification-dispatcher.token.js.map +1 -0
  237. package/src/lib/notification/notification-options.d.ts +215 -0
  238. package/src/lib/notification/notification-options.js +128 -0
  239. package/src/lib/notification/notification-options.js.map +1 -0
  240. package/src/lib/notification/notification-options.module.d.ts +23 -0
  241. package/src/lib/notification/notification-options.module.js +41 -0
  242. package/src/lib/notification/notification-options.module.js.map +1 -0
  243. package/src/lib/notification/notification-preference.entity.d.ts +10 -0
  244. package/src/lib/notification/notification-preference.entity.js +50 -0
  245. package/src/lib/notification/notification-preference.entity.js.map +1 -0
  246. package/src/lib/notification/notification-sla-scheduler.service.d.ts +13 -0
  247. package/src/lib/notification/notification-sla-scheduler.service.js +51 -0
  248. package/src/lib/notification/notification-sla-scheduler.service.js.map +1 -0
  249. package/src/lib/notification/notification-template.d.ts +13 -0
  250. package/src/lib/notification/notification-template.js +61 -0
  251. package/src/lib/notification/notification-template.js.map +1 -0
  252. package/src/lib/notification/notification.entity.d.ts +23 -0
  253. package/src/lib/notification/notification.entity.js +122 -0
  254. package/src/lib/notification/notification.entity.js.map +1 -0
  255. package/src/lib/notification/notification.enums.d.ts +24 -0
  256. package/src/lib/notification/notification.enums.js +45 -0
  257. package/src/lib/notification/notification.enums.js.map +1 -0
  258. package/src/lib/notification/notification.module.d.ts +2 -0
  259. package/src/lib/notification/notification.module.js +45 -0
  260. package/src/lib/notification/notification.module.js.map +1 -0
  261. package/src/lib/notification/notification.mutations.d.ts +11 -0
  262. package/src/lib/notification/notification.mutations.js +64 -0
  263. package/src/lib/notification/notification.mutations.js.map +1 -0
  264. package/src/lib/notification/notification.queries.d.ts +11 -0
  265. package/src/lib/notification/notification.queries.js +77 -0
  266. package/src/lib/notification/notification.queries.js.map +1 -0
  267. package/src/lib/notification/notification.service.d.ts +81 -0
  268. package/src/lib/notification/notification.service.js +621 -0
  269. package/src/lib/notification/notification.service.js.map +1 -0
  270. package/src/lib/organization/dto/manager-resolution.input.d.ts +18 -0
  271. package/src/lib/organization/dto/manager-resolution.input.js +107 -0
  272. package/src/lib/organization/dto/manager-resolution.input.js.map +1 -0
  273. package/src/lib/organization/dto/membership.input.d.ts +16 -0
  274. package/src/lib/organization/dto/membership.input.js +99 -0
  275. package/src/lib/organization/dto/membership.input.js.map +1 -0
  276. package/src/lib/organization/dto/org-unit.input.d.ts +24 -0
  277. package/src/lib/organization/dto/org-unit.input.js +119 -0
  278. package/src/lib/organization/dto/org-unit.input.js.map +1 -0
  279. package/src/lib/organization/dto/position.input.d.ts +13 -0
  280. package/src/lib/organization/dto/position.input.js +70 -0
  281. package/src/lib/organization/dto/position.input.js.map +1 -0
  282. package/src/lib/organization/index.js +16 -0
  283. package/src/lib/organization/index.js.map +1 -0
  284. package/src/lib/organization/json-metadata.d.ts +1 -0
  285. package/src/lib/organization/json-metadata.js +14 -0
  286. package/src/lib/organization/json-metadata.js.map +1 -0
  287. package/src/lib/organization/manager-resolution.entity.d.ts +11 -0
  288. package/src/lib/organization/manager-resolution.entity.js +55 -0
  289. package/src/lib/organization/manager-resolution.entity.js.map +1 -0
  290. package/src/lib/organization/membership.entity.d.ts +11 -0
  291. package/src/lib/organization/membership.entity.js +60 -0
  292. package/src/lib/organization/membership.entity.js.map +1 -0
  293. package/src/lib/organization/org-unit-tree-commit-result.object.d.ts +4 -0
  294. package/src/lib/organization/org-unit-tree-commit-result.object.js +17 -0
  295. package/src/lib/organization/org-unit-tree-commit-result.object.js.map +1 -0
  296. package/src/lib/organization/org-unit.entity.d.ts +13 -0
  297. package/src/lib/organization/org-unit.entity.js +64 -0
  298. package/src/lib/organization/org-unit.entity.js.map +1 -0
  299. package/src/lib/organization/organization-summary.object.d.ts +6 -0
  300. package/src/lib/organization/organization-summary.object.js +28 -0
  301. package/src/lib/organization/organization-summary.object.js.map +1 -0
  302. package/src/lib/organization/organization.enums.d.ts +11 -0
  303. package/src/lib/organization/organization.enums.js +22 -0
  304. package/src/lib/organization/organization.enums.js.map +1 -0
  305. package/src/lib/organization/organization.module.d.ts +2 -0
  306. package/src/lib/organization/organization.module.js +35 -0
  307. package/src/lib/organization/organization.module.js.map +1 -0
  308. package/src/lib/organization/organization.mutations.d.ts +26 -0
  309. package/src/lib/organization/organization.mutations.js +148 -0
  310. package/src/lib/organization/organization.mutations.js.map +1 -0
  311. package/src/lib/organization/organization.queries.d.ts +23 -0
  312. package/src/lib/organization/organization.queries.js +202 -0
  313. package/src/lib/organization/organization.queries.js.map +1 -0
  314. package/src/lib/organization/organization.service.d.ts +102 -0
  315. package/src/lib/organization/organization.service.js +751 -0
  316. package/src/lib/organization/organization.service.js.map +1 -0
  317. package/src/lib/organization/position.entity.d.ts +9 -0
  318. package/src/lib/organization/position.entity.js +48 -0
  319. package/src/lib/organization/position.entity.js.map +1 -0
  320. package/src/lib/organization/resolved-manager.object.d.ts +4 -0
  321. package/src/lib/organization/resolved-manager.object.js +20 -0
  322. package/src/lib/organization/resolved-manager.object.js.map +1 -0
  323. package/src/lib/signature/index.js +8 -0
  324. package/src/lib/signature/index.js.map +1 -0
  325. package/src/lib/signature/signature-options.d.ts +33 -0
  326. package/src/lib/signature/signature-options.js +51 -0
  327. package/src/lib/signature/signature-options.js.map +1 -0
  328. package/src/lib/signature/signature-verification.object.d.ts +6 -0
  329. package/src/lib/signature/signature-verification.object.js +28 -0
  330. package/src/lib/signature/signature-verification.object.js.map +1 -0
  331. package/src/lib/signature/signature.entity.d.ts +16 -0
  332. package/src/lib/signature/signature.entity.js +88 -0
  333. package/src/lib/signature/signature.entity.js.map +1 -0
  334. package/src/lib/signature/signature.module.d.ts +11 -0
  335. package/src/lib/signature/signature.module.js +60 -0
  336. package/src/lib/signature/signature.module.js.map +1 -0
  337. package/src/lib/signature/signature.queries.d.ts +11 -0
  338. package/src/lib/signature/signature.queries.js +46 -0
  339. package/src/lib/signature/signature.queries.js.map +1 -0
  340. package/src/lib/signature/signature.service.d.ts +25 -0
  341. package/src/lib/signature/signature.service.js +124 -0
  342. package/src/lib/signature/signature.service.js.map +1 -0
  343. package/src/lib/template/approval-template-category.entity.d.ts +9 -0
  344. package/src/lib/template/approval-template-category.entity.js +49 -0
  345. package/src/lib/template/approval-template-category.entity.js.map +1 -0
  346. package/src/lib/template/approval-template-version.entity.d.ts +21 -0
  347. package/src/lib/template/approval-template-version.entity.js +106 -0
  348. package/src/lib/template/approval-template-version.entity.js.map +1 -0
  349. package/src/lib/template/approval-template.entity.d.ts +14 -0
  350. package/src/lib/template/approval-template.entity.js +74 -0
  351. package/src/lib/template/approval-template.entity.js.map +1 -0
  352. package/src/lib/template/dto/approval-template.input.d.ts +36 -0
  353. package/src/lib/template/dto/approval-template.input.js +187 -0
  354. package/src/lib/template/dto/approval-template.input.js.map +1 -0
  355. package/src/lib/template/index.js +12 -0
  356. package/src/lib/template/index.js.map +1 -0
  357. package/src/lib/template/template.enums.d.ts +14 -0
  358. package/src/lib/template/template.enums.js +31 -0
  359. package/src/lib/template/template.enums.js.map +1 -0
  360. package/src/lib/template/template.module.d.ts +2 -0
  361. package/src/lib/template/template.module.js +33 -0
  362. package/src/lib/template/template.module.js.map +1 -0
  363. package/src/lib/template/template.mutations.d.ts +20 -0
  364. package/src/lib/template/template.mutations.js +139 -0
  365. package/src/lib/template/template.mutations.js.map +1 -0
  366. package/src/lib/template/template.queries.d.ts +16 -0
  367. package/src/lib/template/template.queries.js +133 -0
  368. package/src/lib/template/template.queries.js.map +1 -0
  369. package/src/lib/template/template.service.d.ts +64 -0
  370. package/src/lib/template/template.service.js +521 -0
  371. package/src/lib/template/template.service.js.map +1 -0
  372. package/src/lib/template/workflow-definition.validator.d.ts +9 -0
  373. package/src/lib/template/workflow-definition.validator.js +362 -0
  374. package/src/lib/template/workflow-definition.validator.js.map +1 -0
  375. package/src/lib/testing/cel-js.jest.d.ts +15 -0
  376. package/src/lib/testing/cel-js.jest.js +27 -0
  377. package/src/lib/testing/cel-js.jest.js.map +1 -0
  378. package/src/lib/workflow-engine/activity-log.entity.d.ts +12 -0
  379. package/src/lib/workflow-engine/activity-log.entity.js +62 -0
  380. package/src/lib/workflow-engine/activity-log.entity.js.map +1 -0
  381. package/src/lib/workflow-engine/approval-instance-page-info.object.d.ts +8 -0
  382. package/src/lib/workflow-engine/approval-instance-page-info.object.js +36 -0
  383. package/src/lib/workflow-engine/approval-instance-page-info.object.js.map +1 -0
  384. package/src/lib/workflow-engine/approval-instance.entity.d.ts +22 -0
  385. package/src/lib/workflow-engine/approval-instance.entity.js +113 -0
  386. package/src/lib/workflow-engine/approval-instance.entity.js.map +1 -0
  387. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.d.ts +5 -0
  388. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js +29 -0
  389. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js.map +1 -0
  390. package/src/lib/workflow-engine/dto/decide-task.input.d.ts +9 -0
  391. package/src/lib/workflow-engine/dto/decide-task.input.js +47 -0
  392. package/src/lib/workflow-engine/dto/decide-task.input.js.map +1 -0
  393. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.d.ts +6 -0
  394. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js +34 -0
  395. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js.map +1 -0
  396. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +6 -0
  397. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +34 -0
  398. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +1 -0
  399. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +7 -0
  400. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +40 -0
  401. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +1 -0
  402. package/src/lib/workflow-engine/index.js +24 -0
  403. package/src/lib/workflow-engine/index.js.map +1 -0
  404. package/src/lib/workflow-engine/task-candidate.entity.d.ts +14 -0
  405. package/src/lib/workflow-engine/task-candidate.entity.js +72 -0
  406. package/src/lib/workflow-engine/task-candidate.entity.js.map +1 -0
  407. package/src/lib/workflow-engine/task-decision.entity.d.ts +12 -0
  408. package/src/lib/workflow-engine/task-decision.entity.js +60 -0
  409. package/src/lib/workflow-engine/task-decision.entity.js.map +1 -0
  410. package/src/lib/workflow-engine/task.entity.d.ts +20 -0
  411. package/src/lib/workflow-engine/task.entity.js +109 -0
  412. package/src/lib/workflow-engine/task.entity.js.map +1 -0
  413. package/src/lib/workflow-engine/workflow-condition-evaluator.d.ts +5 -0
  414. package/src/lib/workflow-engine/workflow-condition-evaluator.js +107 -0
  415. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +1 -0
  416. package/src/lib/workflow-engine/workflow-dashboard-summary.object.d.ts +8 -0
  417. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js +36 -0
  418. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js.map +1 -0
  419. package/src/lib/workflow-engine/workflow-dry-run.object.d.ts +21 -0
  420. package/src/lib/workflow-engine/workflow-dry-run.object.js +86 -0
  421. package/src/lib/workflow-engine/workflow-dry-run.object.js.map +1 -0
  422. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +58 -0
  423. package/src/lib/workflow-engine/workflow-engine.enums.js +95 -0
  424. package/src/lib/workflow-engine/workflow-engine.enums.js.map +1 -0
  425. package/src/lib/workflow-engine/workflow-engine.module.d.ts +9 -0
  426. package/src/lib/workflow-engine/workflow-engine.module.js +76 -0
  427. package/src/lib/workflow-engine/workflow-engine.module.js.map +1 -0
  428. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +19 -0
  429. package/src/lib/workflow-engine/workflow-engine.mutations.js +106 -0
  430. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +1 -0
  431. package/src/lib/workflow-engine/workflow-engine.queries.d.ts +29 -0
  432. package/src/lib/workflow-engine/workflow-engine.queries.js +225 -0
  433. package/src/lib/workflow-engine/workflow-engine.queries.js.map +1 -0
  434. package/src/lib/workflow-engine/workflow-engine.service.d.ts +145 -0
  435. package/src/lib/workflow-engine/workflow-engine.service.js +2785 -0
  436. package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -0
  437. package/src/lib/workflow-engine/{workflow-engine.tokens.ts → workflow-engine.tokens.d.ts} +3 -9
  438. package/src/lib/workflow-engine/workflow-engine.tokens.js +5 -0
  439. package/src/lib/workflow-engine/workflow-engine.tokens.js.map +1 -0
  440. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.d.ts +18 -0
  441. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +39 -0
  442. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +1 -0
  443. package/src/lib/workflow-engine/workflow-token.entity.d.ts +10 -0
  444. package/src/lib/workflow-engine/workflow-token.entity.js +50 -0
  445. package/src/lib/workflow-engine/workflow-token.entity.js.map +1 -0
  446. package/eslint.config.mjs +0 -20
  447. package/jest.config.cts +0 -15
  448. package/project.json +0 -58
  449. package/src/lib/attachment/attachment-options.spec.ts +0 -45
  450. package/src/lib/attachment/attachment-options.ts +0 -130
  451. package/src/lib/attachment/attachment-storage.provider.spec.ts +0 -79
  452. package/src/lib/attachment/attachment-storage.provider.ts +0 -60
  453. package/src/lib/attachment/attachment.controller.ts +0 -39
  454. package/src/lib/attachment/attachment.entity.ts +0 -59
  455. package/src/lib/attachment/attachment.module.ts +0 -149
  456. package/src/lib/attachment/attachment.mutations.ts +0 -22
  457. package/src/lib/attachment/attachment.queries.ts +0 -65
  458. package/src/lib/attachment/attachment.service.spec.ts +0 -319
  459. package/src/lib/attachment/attachment.service.ts +0 -477
  460. package/src/lib/attachment/dto/upload-attachment.input.ts +0 -60
  461. package/src/lib/bpm/bpm-root.module.spec.ts +0 -138
  462. package/src/lib/bpm/bpm-root.module.ts +0 -320
  463. package/src/lib/bpm-auth/bpm-auth-context.extractor.ts +0 -106
  464. package/src/lib/bpm-auth/bpm-auth-context.ts +0 -40
  465. package/src/lib/bpm-auth/bpm-auth.authorization.ts +0 -80
  466. package/src/lib/bpm-auth/bpm-auth.decorators.ts +0 -19
  467. package/src/lib/bpm-auth/bpm-auth.guard.ts +0 -31
  468. package/src/lib/bpm-auth/bpm-auth.module.spec.ts +0 -106
  469. package/src/lib/bpm-auth/bpm-auth.module.ts +0 -69
  470. package/src/lib/bpm-auth/bpm-auth.options.ts +0 -21
  471. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.ts +0 -55
  472. package/src/lib/common/filters/all-exceptions.filter.ts +0 -138
  473. package/src/lib/common/iso-duration.ts +0 -31
  474. package/src/lib/condition/condition.module.ts +0 -8
  475. package/src/lib/condition/condition.service.spec.ts +0 -50
  476. package/src/lib/condition/condition.service.ts +0 -141
  477. package/src/lib/database/data-source.ts +0 -7
  478. package/src/lib/database/migration-runner.ts +0 -24
  479. package/src/lib/database/typeorm.config.ts +0 -217
  480. package/src/lib/delegation/delegation-rule.entity.ts +0 -84
  481. package/src/lib/delegation/delegation.enums.ts +0 -21
  482. package/src/lib/delegation/delegation.module.ts +0 -14
  483. package/src/lib/delegation/delegation.mutations.ts +0 -92
  484. package/src/lib/delegation/delegation.queries.ts +0 -111
  485. package/src/lib/delegation/delegation.service.spec.ts +0 -295
  486. package/src/lib/delegation/delegation.service.ts +0 -482
  487. package/src/lib/delegation/dto/delegation-rule.input.ts +0 -125
  488. package/src/lib/form/dto/form-definition.input.ts +0 -73
  489. package/src/lib/form/form-definition-version.entity.ts +0 -66
  490. package/src/lib/form/form-definition.entity.ts +0 -54
  491. package/src/lib/form/form-schema-lint.object.ts +0 -10
  492. package/src/lib/form/form-schema.validator.spec.ts +0 -180
  493. package/src/lib/form/form-schema.validator.ts +0 -538
  494. package/src/lib/form/form.enums.ts +0 -20
  495. package/src/lib/form/form.module.ts +0 -19
  496. package/src/lib/form/form.mutations.ts +0 -68
  497. package/src/lib/form/form.queries.ts +0 -72
  498. package/src/lib/form/form.service.spec.ts +0 -144
  499. package/src/lib/form/form.service.ts +0 -490
  500. package/src/lib/identity/identity-options.ts +0 -41
  501. package/src/lib/identity/identity.module.ts +0 -96
  502. package/src/lib/identity/identity.queries.ts +0 -61
  503. package/src/lib/identity/identity.service.spec.ts +0 -105
  504. package/src/lib/identity/identity.service.ts +0 -200
  505. package/src/lib/identity/member-base.adapter.spec.ts +0 -77
  506. package/src/lib/identity/member-base.adapter.ts +0 -244
  507. package/src/lib/identity/member-metadata-cache.entity.ts +0 -27
  508. package/src/lib/identity/member-profile.object.ts +0 -28
  509. package/src/lib/identity/member-resolver.interface.ts +0 -47
  510. package/src/lib/migrations/0000000000001-enable-postgres-extensions.ts +0 -14
  511. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.ts +0 -19
  512. package/src/lib/migrations/0000000012000-notification-sla-idempotency.ts +0 -22
  513. package/src/lib/migrations/0000000013000-workflow-query-indexes.ts +0 -113
  514. package/src/lib/migrations/index.ts +0 -47
  515. package/src/lib/notification/dto/notification-preference.input.ts +0 -46
  516. package/src/lib/notification/notification-delivery-scheduler.service.ts +0 -69
  517. package/src/lib/notification/notification-delivery.service.spec.ts +0 -315
  518. package/src/lib/notification/notification-delivery.service.ts +0 -339
  519. package/src/lib/notification/notification-dispatcher.token.ts +0 -13
  520. package/src/lib/notification/notification-options.module.ts +0 -67
  521. package/src/lib/notification/notification-options.spec.ts +0 -93
  522. package/src/lib/notification/notification-options.ts +0 -452
  523. package/src/lib/notification/notification-preference.entity.ts +0 -35
  524. package/src/lib/notification/notification-sla-scheduler.service.ts +0 -66
  525. package/src/lib/notification/notification-template.spec.ts +0 -33
  526. package/src/lib/notification/notification-template.ts +0 -97
  527. package/src/lib/notification/notification.entity.ts +0 -102
  528. package/src/lib/notification/notification.enums.ts +0 -45
  529. package/src/lib/notification/notification.module.ts +0 -37
  530. package/src/lib/notification/notification.mutations.ts +0 -47
  531. package/src/lib/notification/notification.queries.ts +0 -64
  532. package/src/lib/notification/notification.service.spec.ts +0 -412
  533. package/src/lib/notification/notification.service.ts +0 -974
  534. package/src/lib/organization/dto/manager-resolution.input.ts +0 -91
  535. package/src/lib/organization/dto/membership.input.ts +0 -77
  536. package/src/lib/organization/dto/org-unit.input.ts +0 -96
  537. package/src/lib/organization/dto/position.input.ts +0 -50
  538. package/src/lib/organization/json-metadata.ts +0 -15
  539. package/src/lib/organization/manager-resolution.entity.ts +0 -44
  540. package/src/lib/organization/membership.entity.ts +0 -50
  541. package/src/lib/organization/org-unit-tree-commit-result.object.ts +0 -8
  542. package/src/lib/organization/org-unit.entity.ts +0 -53
  543. package/src/lib/organization/organization-summary.object.ts +0 -16
  544. package/src/lib/organization/organization.enums.ts +0 -19
  545. package/src/lib/organization/organization.module.ts +0 -27
  546. package/src/lib/organization/organization.mutations.ts +0 -115
  547. package/src/lib/organization/organization.queries.ts +0 -188
  548. package/src/lib/organization/organization.service.spec.ts +0 -760
  549. package/src/lib/organization/organization.service.ts +0 -1216
  550. package/src/lib/organization/position.entity.ts +0 -39
  551. package/src/lib/organization/resolved-manager.object.ts +0 -10
  552. package/src/lib/signature/signature-options.spec.ts +0 -60
  553. package/src/lib/signature/signature-options.ts +0 -120
  554. package/src/lib/signature/signature-verification.object.ts +0 -16
  555. package/src/lib/signature/signature.entity.ts +0 -62
  556. package/src/lib/signature/signature.module.ts +0 -80
  557. package/src/lib/signature/signature.queries.ts +0 -37
  558. package/src/lib/signature/signature.service.spec.ts +0 -134
  559. package/src/lib/signature/signature.service.ts +0 -205
  560. package/src/lib/template/approval-template-category.entity.ts +0 -40
  561. package/src/lib/template/approval-template-version.entity.ts +0 -82
  562. package/src/lib/template/approval-template.entity.ts +0 -64
  563. package/src/lib/template/dto/approval-template.input.ts +0 -147
  564. package/src/lib/template/template.enums.ts +0 -30
  565. package/src/lib/template/template.module.ts +0 -25
  566. package/src/lib/template/template.mutations.ts +0 -106
  567. package/src/lib/template/template.queries.ts +0 -119
  568. package/src/lib/template/template.service.spec.ts +0 -476
  569. package/src/lib/template/template.service.ts +0 -820
  570. package/src/lib/template/workflow-definition.validator.spec.ts +0 -595
  571. package/src/lib/template/workflow-definition.validator.ts +0 -539
  572. package/src/lib/testing/cel-js.jest.ts +0 -46
  573. package/src/lib/workflow-engine/activity-log.entity.ts +0 -48
  574. package/src/lib/workflow-engine/approval-instance-page-info.object.ts +0 -22
  575. package/src/lib/workflow-engine/approval-instance.entity.ts +0 -86
  576. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.ts +0 -18
  577. package/src/lib/workflow-engine/dto/decide-task.input.ts +0 -33
  578. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.ts +0 -22
  579. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.ts +0 -22
  580. package/src/lib/workflow-engine/dto/submit-approval-instance.input.ts +0 -27
  581. package/src/lib/workflow-engine/task-candidate.entity.ts +0 -56
  582. package/src/lib/workflow-engine/task-decision.entity.ts +0 -43
  583. package/src/lib/workflow-engine/task.entity.ts +0 -85
  584. package/src/lib/workflow-engine/workflow-condition-evaluator.ts +0 -168
  585. package/src/lib/workflow-engine/workflow-dashboard-summary.object.ts +0 -22
  586. package/src/lib/workflow-engine/workflow-dry-run.object.ts +0 -58
  587. package/src/lib/workflow-engine/workflow-engine.enums.ts +0 -99
  588. package/src/lib/workflow-engine/workflow-engine.module.ts +0 -75
  589. package/src/lib/workflow-engine/workflow-engine.mutations.ts +0 -85
  590. package/src/lib/workflow-engine/workflow-engine.queries.ts +0 -229
  591. package/src/lib/workflow-engine/workflow-engine.service.spec.ts +0 -2689
  592. package/src/lib/workflow-engine/workflow-engine.service.ts +0 -4707
  593. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.ts +0 -69
  594. package/src/lib/workflow-engine/workflow-token.entity.ts +0 -40
  595. package/tsconfig.json +0 -24
  596. package/tsconfig.lib.json +0 -16
  597. package/tsconfig.spec.json +0 -16
  598. /package/src/{index.ts → index.d.ts} +0 -0
  599. /package/src/lib/attachment/{index.ts → index.d.ts} +0 -0
  600. /package/src/lib/bpm/{index.ts → index.d.ts} +0 -0
  601. /package/src/lib/bpm-auth/{index.ts → index.d.ts} +0 -0
  602. /package/src/lib/common/{index.ts → index.d.ts} +0 -0
  603. /package/src/lib/condition/{index.ts → index.d.ts} +0 -0
  604. /package/src/lib/database/{index.ts → index.d.ts} +0 -0
  605. /package/src/lib/delegation/{index.ts → index.d.ts} +0 -0
  606. /package/src/lib/form/{index.ts → index.d.ts} +0 -0
  607. /package/src/lib/identity/{index.ts → index.d.ts} +0 -0
  608. /package/src/lib/notification/{index.ts → index.d.ts} +0 -0
  609. /package/src/lib/organization/{index.ts → index.d.ts} +0 -0
  610. /package/src/lib/signature/{index.ts → index.d.ts} +0 -0
  611. /package/src/lib/template/{index.ts → index.d.ts} +0 -0
  612. /package/src/lib/workflow-engine/{index.ts → index.d.ts} +0 -0
@@ -1,974 +0,0 @@
1
- import {
2
- ServiceTaskNode,
3
- UserTaskNode,
4
- } from '@rytass/bpm-core-shared/workflow';
5
- import {
6
- Inject,
7
- Injectable,
8
- Logger,
9
- NotFoundException,
10
- Optional,
11
- } from '@nestjs/common';
12
- import { ModuleRef } from '@nestjs/core';
13
- import { InjectRepository } from '@nestjs/typeorm';
14
- import {
15
- EntityManager,
16
- IsNull,
17
- LessThanOrEqual,
18
- MoreThan,
19
- Not,
20
- Repository,
21
- } from 'typeorm';
22
- import { parseIsoDurationToMilliseconds } from '../common/iso-duration';
23
- import { ActivityLogEntity } from '../workflow-engine/activity-log.entity';
24
- import { ApprovalInstanceEntity } from '../workflow-engine/approval-instance.entity';
25
- import { OrganizationService } from '../organization/organization.service';
26
- import { TaskCandidateEntity } from '../workflow-engine/task-candidate.entity';
27
- import { TaskEntity } from '../workflow-engine/task.entity';
28
- import {
29
- BPM_WORKFLOW_ENGINE_SERVICE,
30
- BPMWorkflowEngineService,
31
- } from '../workflow-engine/workflow-engine.tokens';
32
- import {
33
- ActivityLogEventTypeEnum,
34
- TaskDecisionActionEnum,
35
- TaskCandidateStatusEnum,
36
- TaskStatusEnum,
37
- } from '../workflow-engine/workflow-engine.enums';
38
- import { NotificationDeliveryService } from './notification-delivery.service';
39
- import { NotificationPreferenceEntity } from './notification-preference.entity';
40
- import { NotificationEntity } from './notification.entity';
41
- import {
42
- NotificationChannelEnum,
43
- NotificationStatusEnum,
44
- NotificationTypeEnum,
45
- } from './notification.enums';
46
- import {
47
- BPM_NOTIFICATION_OPTIONS,
48
- BPMResolvedNotificationOptions,
49
- DEFAULT_BPM_NOTIFICATION_OPTIONS,
50
- } from './notification-options';
51
- import { renderNotificationTemplate } from './notification-template';
52
- import { UpdateNotificationPreferenceInput } from './dto/notification-preference.input';
53
-
54
- interface CreateNotificationInput {
55
- readonly channels: readonly NotificationChannelEnum[];
56
- readonly instanceId: string | null;
57
- readonly payload: Readonly<Record<string, unknown>>;
58
- readonly recipientMemberId: string;
59
- readonly taskId: string | null;
60
- readonly type: NotificationTypeEnum;
61
- readonly customTemplate?: string | null;
62
- }
63
-
64
- interface SlaScanResult {
65
- readonly overdueCount: number;
66
- readonly warningCount: number;
67
- }
68
-
69
- @Injectable()
70
- export class NotificationService {
71
- private readonly logger = new Logger(NotificationService.name);
72
-
73
- constructor(
74
- @InjectRepository(NotificationEntity)
75
- private readonly notificationRepository: Repository<NotificationEntity>,
76
- @InjectRepository(NotificationPreferenceEntity)
77
- private readonly notificationPreferenceRepository: Repository<NotificationPreferenceEntity>,
78
- @InjectRepository(TaskEntity)
79
- private readonly taskRepository: Repository<TaskEntity>,
80
- @InjectRepository(TaskCandidateEntity)
81
- private readonly taskCandidateRepository: Repository<TaskCandidateEntity>,
82
- @InjectRepository(ApprovalInstanceEntity)
83
- private readonly approvalInstanceRepository: Repository<ApprovalInstanceEntity>,
84
- @InjectRepository(ActivityLogEntity)
85
- private readonly activityLogRepository: Repository<ActivityLogEntity>,
86
- private readonly deliveryService: NotificationDeliveryService,
87
- private readonly moduleRef: ModuleRef,
88
- @Optional()
89
- @Inject(BPM_NOTIFICATION_OPTIONS)
90
- private readonly notificationOptions: BPMResolvedNotificationOptions = DEFAULT_BPM_NOTIFICATION_OPTIONS,
91
- ) {}
92
-
93
- async listNotifications({
94
- includeRead = false,
95
- page = 1,
96
- pageSize = 10,
97
- recipientMemberId,
98
- }: {
99
- readonly includeRead?: boolean;
100
- readonly page?: number;
101
- readonly pageSize?: number;
102
- readonly recipientMemberId: string;
103
- }): Promise<readonly NotificationEntity[]> {
104
- const normalizedPageSize = normalizePageSize(pageSize);
105
-
106
- return this.notificationRepository.find({
107
- order: { createdAt: 'DESC' },
108
- skip: (normalizePage(page) - 1) * normalizedPageSize,
109
- take: normalizedPageSize,
110
- where: {
111
- channel: NotificationChannelEnum.IN_APP,
112
- recipientMemberId,
113
- ...(includeRead ? {} : { status: Not(NotificationStatusEnum.READ) }),
114
- },
115
- });
116
- }
117
-
118
- async countNotifications({
119
- includeRead = false,
120
- recipientMemberId,
121
- }: {
122
- readonly includeRead?: boolean;
123
- readonly recipientMemberId: string;
124
- }): Promise<number> {
125
- return this.notificationRepository.count({
126
- where: {
127
- channel: NotificationChannelEnum.IN_APP,
128
- recipientMemberId,
129
- ...(includeRead ? {} : { status: Not(NotificationStatusEnum.READ) }),
130
- },
131
- });
132
- }
133
-
134
- async countUnreadNotifications(recipientMemberId: string): Promise<number> {
135
- return this.notificationRepository.count({
136
- where: {
137
- channel: NotificationChannelEnum.IN_APP,
138
- recipientMemberId,
139
- status: Not(NotificationStatusEnum.READ),
140
- },
141
- });
142
- }
143
-
144
- async markAllNotificationsRead({
145
- recipientMemberId,
146
- }: {
147
- readonly recipientMemberId: string;
148
- }): Promise<number> {
149
- const trimmedRecipientMemberId = recipientMemberId.trim();
150
-
151
- if (!trimmedRecipientMemberId) {
152
- return 0;
153
- }
154
-
155
- const result = await this.notificationRepository.update(
156
- {
157
- channel: NotificationChannelEnum.IN_APP,
158
- recipientMemberId: trimmedRecipientMemberId,
159
- status: Not(NotificationStatusEnum.READ),
160
- },
161
- {
162
- readAt: new Date(),
163
- status: NotificationStatusEnum.READ,
164
- },
165
- );
166
-
167
- return result.affected ?? 0;
168
- }
169
-
170
- async markNotificationRead({
171
- id,
172
- readerMemberId,
173
- }: {
174
- readonly id: string;
175
- readonly readerMemberId: string | null;
176
- }): Promise<NotificationEntity> {
177
- const notification = await this.notificationRepository.findOne({
178
- where: { id },
179
- });
180
-
181
- if (!notification) {
182
- throw new NotFoundException(`Notification ${id} was not found`);
183
- }
184
-
185
- if (
186
- readerMemberId &&
187
- notification.recipientMemberId !== readerMemberId.trim()
188
- ) {
189
- throw new NotFoundException(`Notification ${id} was not found`);
190
- }
191
-
192
- return this.notificationRepository.save(
193
- this.notificationRepository.create({
194
- ...notification,
195
- readAt: notification.readAt ?? new Date(),
196
- status: NotificationStatusEnum.READ,
197
- }),
198
- );
199
- }
200
-
201
- async getPreference(memberId: string): Promise<NotificationPreferenceEntity> {
202
- const existingPreference =
203
- await this.notificationPreferenceRepository.findOne({
204
- where: { memberId },
205
- });
206
-
207
- return (
208
- existingPreference ??
209
- createDefaultPreference(memberId, this.notificationOptions)
210
- );
211
- }
212
-
213
- async updatePreference(
214
- input: UpdateNotificationPreferenceInput,
215
- ): Promise<NotificationPreferenceEntity> {
216
- const currentPreference = await this.getPreference(input.memberId);
217
-
218
- return this.notificationPreferenceRepository.save({
219
- ...currentPreference,
220
- emailDigestMode: input.emailDigestMode,
221
- emailEnabled: input.emailEnabled,
222
- inAppEnabled: input.inAppEnabled,
223
- memberId: input.memberId,
224
- quietHoursEnd: normalizeTimeInput(input.quietHoursEnd),
225
- quietHoursStart: normalizeTimeInput(input.quietHoursStart),
226
- });
227
- }
228
-
229
- async createTaskAssignedNotification({
230
- instance,
231
- manager,
232
- node,
233
- task,
234
- transferred = false,
235
- }: {
236
- readonly instance: ApprovalInstanceEntity;
237
- readonly manager: EntityManager;
238
- readonly node: UserTaskNode;
239
- readonly task: TaskEntity;
240
- readonly transferred?: boolean;
241
- }): Promise<readonly NotificationEntity[]> {
242
- if (!task.assigneeMemberId) {
243
- return [];
244
- }
245
-
246
- return this.createNotifications(
247
- {
248
- channels: readNodeNotificationChannels(node, this.notificationOptions),
249
- customTemplate: node.data.notification?.customTemplate ?? null,
250
- instanceId: instance.id,
251
- payload: {
252
- assigneeMemberId: task.assigneeMemberId,
253
- instanceId: instance.id,
254
- instanceTitle: instance.title,
255
- nodeId: node.id,
256
- nodeLabel: node.data.label,
257
- originalAssigneeMemberId: task.originalAssigneeMemberId,
258
- slaDueAt: task.slaDueAt?.toISOString() ?? null,
259
- taskId: task.id,
260
- },
261
- recipientMemberId: task.assigneeMemberId,
262
- taskId: task.id,
263
- type: transferred
264
- ? NotificationTypeEnum.TASK_TRANSFERRED
265
- : NotificationTypeEnum.TASK_ASSIGNED,
266
- },
267
- manager,
268
- );
269
- }
270
-
271
- async createServiceTaskNotifications({
272
- instance,
273
- manager,
274
- node,
275
- recipientMemberIds,
276
- }: {
277
- readonly instance: ApprovalInstanceEntity;
278
- readonly manager: EntityManager;
279
- readonly node: ServiceTaskNode;
280
- readonly recipientMemberIds: readonly string[];
281
- }): Promise<readonly NotificationEntity[]> {
282
- if (node.data.action.type !== 'NOTIFY') {
283
- return [];
284
- }
285
-
286
- const action = node.data.action;
287
- const channels = normalizeNotificationChannels(action.channels);
288
- const uniqueRecipientMemberIds = uniqueStrings(recipientMemberIds);
289
-
290
- return uniqueRecipientMemberIds.reduce<
291
- Promise<readonly NotificationEntity[]>
292
- >(
293
- async (
294
- previousPromise,
295
- recipientMemberId,
296
- ): Promise<readonly NotificationEntity[]> => {
297
- const previous = await previousPromise;
298
- const created = await this.createNotifications(
299
- {
300
- channels,
301
- customTemplate: action.template ?? null,
302
- instanceId: instance.id,
303
- payload: {
304
- instanceId: instance.id,
305
- instanceTitle: instance.title,
306
- message:
307
- action.template ??
308
- `案件 ${instance.title} 的 ${node.data.label} 已送出通知。`,
309
- nodeId: node.id,
310
- nodeLabel: node.data.label,
311
- recipientMemberId,
312
- },
313
- recipientMemberId,
314
- taskId: null,
315
- type: NotificationTypeEnum.WORKFLOW_NOTIFICATION,
316
- },
317
- manager,
318
- );
319
-
320
- return [...previous, ...created];
321
- },
322
- Promise.resolve([]),
323
- );
324
- }
325
-
326
- async createInstanceCompletedNotification({
327
- instance,
328
- manager,
329
- }: {
330
- readonly instance: ApprovalInstanceEntity;
331
- readonly manager: EntityManager;
332
- }): Promise<readonly NotificationEntity[]> {
333
- const repository = manager.getRepository(NotificationEntity);
334
- const existingNotification = await repository.findOne({
335
- where: {
336
- channel: NotificationChannelEnum.IN_APP,
337
- instanceId: instance.id,
338
- recipientMemberId: instance.initiatorMemberId,
339
- taskId: IsNull(),
340
- type: NotificationTypeEnum.INSTANCE_COMPLETED,
341
- },
342
- });
343
-
344
- if (existingNotification) {
345
- return [];
346
- }
347
-
348
- return this.createNotifications(
349
- {
350
- channels: [NotificationChannelEnum.IN_APP],
351
- instanceId: instance.id,
352
- payload: {
353
- completedAt: instance.completedAt?.toISOString() ?? null,
354
- instanceId: instance.id,
355
- instanceTitle: instance.title,
356
- recipientMemberId: instance.initiatorMemberId,
357
- },
358
- recipientMemberId: instance.initiatorMemberId,
359
- taskId: null,
360
- type: NotificationTypeEnum.INSTANCE_COMPLETED,
361
- },
362
- manager,
363
- );
364
- }
365
-
366
- async runSlaScan(now: Date = new Date()): Promise<SlaScanResult> {
367
- const candidateTasks = await this.taskRepository.find({
368
- order: { slaDueAt: 'ASC' },
369
- where: [
370
- {
371
- slaDueAt: LessThanOrEqual(now),
372
- status: TaskStatusEnum.PENDING,
373
- },
374
- {
375
- slaDueAt: LessThanOrEqual(now),
376
- status: TaskStatusEnum.IN_PROGRESS,
377
- },
378
- {
379
- slaDueAt: MoreThan(now),
380
- status: TaskStatusEnum.PENDING,
381
- },
382
- {
383
- slaDueAt: MoreThan(now),
384
- status: TaskStatusEnum.IN_PROGRESS,
385
- },
386
- ],
387
- });
388
- const results = await candidateTasks.reduce<Promise<SlaScanResult>>(
389
- async (resultPromise, task): Promise<SlaScanResult> => {
390
- const currentResult = await resultPromise;
391
-
392
- if (!(await this.tryClaimSlaTask(task.id))) {
393
- return currentResult;
394
- }
395
-
396
- const instance = await this.approvalInstanceRepository.findOne({
397
- where: { id: task.instanceId },
398
- });
399
-
400
- if (!instance) {
401
- return currentResult;
402
- }
403
-
404
- const node = readUserTaskNode(instance, task.nodeId);
405
-
406
- if (!node?.data.sla || !task.slaDueAt) {
407
- return currentResult;
408
- }
409
-
410
- if (task.slaDueAt.getTime() <= now.getTime()) {
411
- const created = await this.createSlaNotificationOnce({
412
- instance,
413
- node,
414
- task,
415
- type: NotificationTypeEnum.SLA_OVERDUE,
416
- });
417
-
418
- if (created) {
419
- await this.recordSlaActivity({
420
- instance,
421
- node,
422
- task,
423
- trigger: 'OVERDUE',
424
- });
425
- await this.runSlaTimeoutHook({ instance, node, task });
426
- }
427
-
428
- return {
429
- overdueCount: currentResult.overdueCount + (created ? 1 : 0),
430
- warningCount: currentResult.warningCount,
431
- };
432
- }
433
-
434
- const warningAt = node.data.sla.warningAt;
435
-
436
- if (!warningAt || warningAt <= 0 || warningAt >= 1) {
437
- return currentResult;
438
- }
439
-
440
- const warningAtTime =
441
- task.createdAt.getTime() +
442
- (task.slaDueAt.getTime() - task.createdAt.getTime()) * warningAt;
443
-
444
- if (warningAtTime > now.getTime()) {
445
- return currentResult;
446
- }
447
-
448
- const created = await this.createSlaNotificationOnce({
449
- instance,
450
- node,
451
- task,
452
- type: NotificationTypeEnum.SLA_WARNING,
453
- });
454
-
455
- if (created) {
456
- await this.recordSlaActivity({
457
- instance,
458
- node,
459
- task,
460
- trigger: 'WARNING',
461
- });
462
- }
463
-
464
- return {
465
- overdueCount: currentResult.overdueCount,
466
- warningCount: currentResult.warningCount + (created ? 1 : 0),
467
- };
468
- },
469
- Promise.resolve({ overdueCount: 0, warningCount: 0 }),
470
- );
471
-
472
- return results;
473
- }
474
-
475
- private async tryClaimSlaTask(taskId: string): Promise<boolean> {
476
- if (!this.taskRepository.query) {
477
- return true;
478
- }
479
-
480
- const rows = (await this.taskRepository.query(
481
- 'SELECT pg_try_advisory_xact_lock(hashtext($1)) AS claimed',
482
- [`bpm-sla:${taskId}`],
483
- )) as readonly { readonly claimed?: boolean }[];
484
-
485
- return rows[0]?.claimed !== false;
486
- }
487
-
488
- private async createSlaNotificationOnce({
489
- instance,
490
- node,
491
- task,
492
- type,
493
- }: {
494
- readonly instance: ApprovalInstanceEntity;
495
- readonly node: UserTaskNode;
496
- readonly task: TaskEntity;
497
- readonly type:
498
- | NotificationTypeEnum.SLA_OVERDUE
499
- | NotificationTypeEnum.SLA_WARNING;
500
- }): Promise<boolean> {
501
- const recipientMemberIds = await this.resolveTaskRecipientMemberIds(task);
502
-
503
- if (recipientMemberIds.length === 0) {
504
- return false;
505
- }
506
-
507
- const createdNotifications = await recipientMemberIds.reduce<
508
- Promise<number>
509
- >(async (countPromise, recipientMemberId): Promise<number> => {
510
- const count = await countPromise;
511
- const existingNotification = await this.notificationRepository.findOne({
512
- where: {
513
- channel: NotificationChannelEnum.IN_APP,
514
- recipientMemberId,
515
- taskId: task.id,
516
- type,
517
- },
518
- });
519
-
520
- if (existingNotification) {
521
- return count;
522
- }
523
-
524
- try {
525
- await this.createNotifications({
526
- channels: [NotificationChannelEnum.IN_APP],
527
- customTemplate: node.data.notification?.customTemplate ?? null,
528
- instanceId: instance.id,
529
- payload: {
530
- assigneeMemberId: task.assigneeMemberId,
531
- instanceId: instance.id,
532
- instanceTitle: instance.title,
533
- nodeId: node.id,
534
- nodeLabel: node.data.label,
535
- onTimeout: node.data.sla?.onTimeout ?? 'REMIND',
536
- recipientMemberId,
537
- slaDueAt: task.slaDueAt?.toISOString() ?? null,
538
- taskId: task.id,
539
- },
540
- recipientMemberId,
541
- taskId: task.id,
542
- type,
543
- });
544
- } catch (error: unknown) {
545
- if (isUniqueConstraintViolation(error)) {
546
- return count;
547
- }
548
-
549
- throw error;
550
- }
551
-
552
- return count + 1;
553
- }, Promise.resolve(0));
554
-
555
- return createdNotifications > 0;
556
- }
557
-
558
- private async createNotifications(
559
- input: CreateNotificationInput,
560
- manager?: EntityManager,
561
- ): Promise<readonly NotificationEntity[]> {
562
- const preference = await this.getPreference(input.recipientMemberId);
563
- const repository = manager
564
- ? manager.getRepository(NotificationEntity)
565
- : this.notificationRepository;
566
- const notifications = input.channels.flatMap((channel) =>
567
- isChannelEnabled(channel, preference, this.notificationOptions)
568
- ? [
569
- createNotificationEntity({
570
- channel,
571
- input,
572
- options: this.notificationOptions,
573
- repository,
574
- }),
575
- ]
576
- : [],
577
- );
578
-
579
- if (notifications.length === 0) {
580
- return [];
581
- }
582
-
583
- const savedNotifications = await repository.save(notifications);
584
-
585
- await Promise.all(
586
- savedNotifications
587
- .filter(
588
- (notification) =>
589
- notification.channel !== NotificationChannelEnum.IN_APP,
590
- )
591
- .map((notification) =>
592
- manager
593
- ? Promise.resolve(false)
594
- : this.deliveryService.deliverNotification(
595
- notification,
596
- this.notificationOptions,
597
- ),
598
- ),
599
- );
600
-
601
- return savedNotifications;
602
- }
603
-
604
- private async recordSlaActivity({
605
- instance,
606
- node,
607
- task,
608
- trigger,
609
- }: {
610
- readonly instance: ApprovalInstanceEntity;
611
- readonly node: UserTaskNode;
612
- readonly task: TaskEntity;
613
- readonly trigger: 'OVERDUE' | 'WARNING';
614
- }): Promise<void> {
615
- await this.activityLogRepository.save(
616
- this.activityLogRepository.create({
617
- actorMemberId: null,
618
- eventType: ActivityLogEventTypeEnum.SLA_TRIGGERED,
619
- instanceId: instance.id,
620
- nodeId: task.nodeId,
621
- payload: {
622
- assigneeMemberId: task.assigneeMemberId,
623
- nodeLabel: node.data.label,
624
- onTimeout: node.data.sla?.onTimeout ?? 'REMIND',
625
- slaDueAt: task.slaDueAt?.toISOString() ?? null,
626
- trigger,
627
- },
628
- taskId: task.id,
629
- }),
630
- );
631
- }
632
-
633
- private async runSlaTimeoutHook({
634
- instance,
635
- node,
636
- task,
637
- }: {
638
- readonly instance: ApprovalInstanceEntity;
639
- readonly node: UserTaskNode;
640
- readonly task: TaskEntity;
641
- }): Promise<void> {
642
- const timeoutAction = node.data.sla?.onTimeout ?? 'REMIND';
643
-
644
- if (!isSlaTimeoutActionEnabled(timeoutAction, this.notificationOptions)) {
645
- return;
646
- }
647
-
648
- await this.executeSlaTimeoutAction({
649
- instance,
650
- node,
651
- task,
652
- timeoutAction,
653
- });
654
- }
655
-
656
- private async executeSlaTimeoutAction({
657
- instance,
658
- node,
659
- task,
660
- timeoutAction,
661
- }: {
662
- readonly instance: ApprovalInstanceEntity;
663
- readonly node: UserTaskNode;
664
- readonly task: TaskEntity;
665
- readonly timeoutAction: NonNullable<
666
- UserTaskNode['data']['sla']
667
- >['onTimeout'];
668
- }): Promise<void> {
669
- if (timeoutAction === 'REMIND') {
670
- this.logger.log(`SLA reminder processed for task ${task.id}`);
671
-
672
- return;
673
- }
674
-
675
- const workflowEngine = this.moduleRef.get<BPMWorkflowEngineService>(
676
- BPM_WORKFLOW_ENGINE_SERVICE,
677
- { strict: false },
678
- );
679
-
680
- if (timeoutAction === 'AUTO_APPROVE') {
681
- const actorMemberId = await this.resolveTaskActorMemberId(task);
682
-
683
- await workflowEngine.decideTask({
684
- action: TaskDecisionActionEnum.APPROVED,
685
- comment: 'SLA timeout auto-approved this task.',
686
- decidedByMemberId: actorMemberId,
687
- taskId: task.id,
688
- });
689
-
690
- return;
691
- }
692
-
693
- if (timeoutAction === 'ESCALATE') {
694
- const actorMemberId = await this.resolveTaskActorMemberId(task);
695
- const targetMemberId = await this.resolveEscalationTargetMemberId({
696
- actorMemberId,
697
- node,
698
- });
699
-
700
- if (!targetMemberId || targetMemberId === actorMemberId) {
701
- this.logger.warn(`SLA escalation skipped for task ${task.id}`);
702
-
703
- return;
704
- }
705
-
706
- await workflowEngine.decideTask({
707
- action: TaskDecisionActionEnum.TRANSFERRED,
708
- comment: 'SLA timeout escalated this task.',
709
- decidedByMemberId: actorMemberId,
710
- taskId: task.id,
711
- transferToMemberId: targetMemberId,
712
- });
713
-
714
- return;
715
- }
716
-
717
- await workflowEngine.cancelApprovalInstance({
718
- cancelledByMemberId: instance.initiatorMemberId,
719
- comment: 'SLA timeout terminated this instance.',
720
- instanceId: instance.id,
721
- });
722
- }
723
-
724
- private async resolveTaskActorMemberId(task: TaskEntity): Promise<string> {
725
- if (task.assigneeMemberId) {
726
- return task.assigneeMemberId;
727
- }
728
-
729
- const candidate = await this.taskCandidateRepository.findOne({
730
- order: { createdAt: 'ASC' },
731
- where: { taskId: task.id },
732
- });
733
-
734
- if (!candidate) {
735
- throw new NotFoundException(`Task ${task.id} has no actor candidate`);
736
- }
737
-
738
- return candidate.memberId;
739
- }
740
-
741
- private async resolveTaskRecipientMemberIds(
742
- task: TaskEntity,
743
- ): Promise<readonly string[]> {
744
- if (task.assigneeMemberId) {
745
- return [task.assigneeMemberId];
746
- }
747
-
748
- const candidates = await this.taskCandidateRepository.find({
749
- order: { createdAt: 'ASC' },
750
- where: { taskId: task.id },
751
- });
752
-
753
- return uniqueStrings(
754
- candidates
755
- .filter(
756
- (candidate) =>
757
- candidate.status === TaskCandidateStatusEnum.PENDING ||
758
- candidate.status === TaskCandidateStatusEnum.CLAIMED,
759
- )
760
- .map((candidate) => candidate.memberId),
761
- );
762
- }
763
-
764
- private async resolveEscalationTargetMemberId({
765
- actorMemberId,
766
- node,
767
- }: {
768
- readonly actorMemberId: string;
769
- readonly node: UserTaskNode;
770
- }): Promise<string | null> {
771
- const organizationService = this.moduleRef.get(OrganizationService, {
772
- strict: false,
773
- });
774
- const levelsUp = Math.max(node.data.sla?.escalateLevelsUp ?? 1, 1);
775
- let currentMemberId: string | null = actorMemberId;
776
-
777
- for (let level = 0; level < levelsUp && currentMemberId; level += 1) {
778
- currentMemberId =
779
- await organizationService.resolveManagerMemberId(currentMemberId);
780
- }
781
-
782
- return currentMemberId;
783
- }
784
- }
785
-
786
- export function calculateTaskSlaDueAt({
787
- node,
788
- now,
789
- }: {
790
- readonly node: UserTaskNode;
791
- readonly now: Date;
792
- }): Date | null {
793
- const duration = node.data.sla?.duration;
794
-
795
- if (!duration) {
796
- return null;
797
- }
798
-
799
- const durationMs = parseIsoDurationToMilliseconds(duration);
800
-
801
- return durationMs ? new Date(now.getTime() + durationMs) : null;
802
- }
803
-
804
- function createDefaultPreference(
805
- memberId: string,
806
- options: BPMResolvedNotificationOptions,
807
- ): NotificationPreferenceEntity {
808
- return Object.assign(new NotificationPreferenceEntity(), {
809
- emailDigestMode: options.defaultEmailDigestMode,
810
- emailEnabled: options.defaultEmailPreferenceEnabled,
811
- inAppEnabled: options.defaultInAppPreferenceEnabled,
812
- memberId,
813
- quietHoursEnd: null,
814
- quietHoursStart: null,
815
- updatedAt: new Date(0),
816
- });
817
- }
818
-
819
- function normalizeTimeInput(value: string | null): string | null {
820
- const trimmedValue = value?.trim() ?? '';
821
-
822
- return trimmedValue || null;
823
- }
824
-
825
- function readNodeNotificationChannels(
826
- node: UserTaskNode,
827
- options: BPMResolvedNotificationOptions,
828
- ): readonly NotificationChannelEnum[] {
829
- const configuredChannels = node.data.notification?.channels ?? [];
830
- const channels = configuredChannels
831
- .map((channel): NotificationChannelEnum | null =>
832
- channel === 'EMAIL'
833
- ? NotificationChannelEnum.EMAIL
834
- : channel === 'WEBHOOK'
835
- ? NotificationChannelEnum.WEBHOOK
836
- : channel === 'IN_APP'
837
- ? NotificationChannelEnum.IN_APP
838
- : null,
839
- )
840
- .filter((channel): channel is NotificationChannelEnum => Boolean(channel));
841
-
842
- return channels.length ? channels : options.defaultChannels;
843
- }
844
-
845
- function normalizeNotificationChannels(
846
- channels: readonly string[],
847
- ): readonly NotificationChannelEnum[] {
848
- const normalizedChannels = channels
849
- .map((channel): NotificationChannelEnum | null =>
850
- channel === NotificationChannelEnum.EMAIL
851
- ? NotificationChannelEnum.EMAIL
852
- : channel === NotificationChannelEnum.IN_APP
853
- ? NotificationChannelEnum.IN_APP
854
- : null,
855
- )
856
- .filter((channel): channel is NotificationChannelEnum => Boolean(channel));
857
-
858
- return normalizedChannels.length
859
- ? normalizedChannels
860
- : [NotificationChannelEnum.IN_APP];
861
- }
862
-
863
- function uniqueStrings(values: readonly string[]): readonly string[] {
864
- return Array.from(new Set(values));
865
- }
866
-
867
- function isUniqueConstraintViolation(error: unknown): boolean {
868
- return (
869
- typeof error === 'object' &&
870
- error !== null &&
871
- 'code' in error &&
872
- error.code === '23505'
873
- );
874
- }
875
-
876
- function isChannelEnabled(
877
- channel: NotificationChannelEnum,
878
- preference: NotificationPreferenceEntity,
879
- options: BPMResolvedNotificationOptions,
880
- ): boolean {
881
- if (channel === NotificationChannelEnum.IN_APP) {
882
- return options.inAppEnabled && preference.inAppEnabled;
883
- }
884
-
885
- if (channel === NotificationChannelEnum.EMAIL) {
886
- return options.emailEnabled && preference.emailEnabled;
887
- }
888
-
889
- return options.webhookEnabled;
890
- }
891
-
892
- function isSlaTimeoutActionEnabled(
893
- action: NonNullable<UserTaskNode['data']['sla']>['onTimeout'],
894
- options: BPMResolvedNotificationOptions,
895
- ): boolean {
896
- if (action === 'AUTO_APPROVE') {
897
- return options.slaTimeoutAutoApproveEnabled;
898
- }
899
-
900
- if (action === 'ESCALATE') {
901
- return options.slaTimeoutEscalateEnabled;
902
- }
903
-
904
- if (action === 'TERMINATE_INSTANCE') {
905
- return options.slaTimeoutTerminateInstanceEnabled;
906
- }
907
-
908
- return options.slaTimeoutRemindEnabled;
909
- }
910
-
911
- function createNotificationEntity({
912
- channel,
913
- input,
914
- options,
915
- repository,
916
- }: {
917
- readonly channel: NotificationChannelEnum;
918
- readonly input: CreateNotificationInput;
919
- readonly options: BPMResolvedNotificationOptions;
920
- readonly repository: Repository<NotificationEntity>;
921
- }): NotificationEntity {
922
- const renderedTemplate = renderNotificationTemplate({
923
- customTemplate: input.customTemplate,
924
- engine: options.templateEngine,
925
- payload: input.payload,
926
- type: input.type,
927
- });
928
- const isInApp = channel === NotificationChannelEnum.IN_APP;
929
-
930
- return repository.create({
931
- attemptCount: 0,
932
- body: renderedTemplate.body,
933
- channel,
934
- deliveredAt: isInApp ? new Date() : null,
935
- deliveryError: null,
936
- deliveryTarget: null,
937
- instanceId: input.instanceId,
938
- lastAttemptAt: null,
939
- nextRetryAt: null,
940
- payload: input.payload,
941
- readAt: null,
942
- recipientMemberId: input.recipientMemberId,
943
- sentAt: isInApp ? new Date() : null,
944
- status: isInApp
945
- ? NotificationStatusEnum.SENT
946
- : NotificationStatusEnum.PENDING,
947
- taskId: input.taskId,
948
- title: renderedTemplate.title,
949
- type: input.type,
950
- });
951
- }
952
-
953
- function readUserTaskNode(
954
- instance: ApprovalInstanceEntity,
955
- nodeId: string,
956
- ): UserTaskNode | null {
957
- const node = instance.workflowSnapshot.nodes.find(
958
- (candidate) => candidate.id === nodeId,
959
- );
960
-
961
- return node?.type === 'userTask' ? node : null;
962
- }
963
-
964
- function normalizePage(page: number): number {
965
- return Number.isInteger(page) && page > 0 ? page : 1;
966
- }
967
-
968
- function normalizePageSize(pageSize: number): number {
969
- if (!Number.isInteger(pageSize)) {
970
- return 10;
971
- }
972
-
973
- return Math.min(Math.max(pageSize, 1), 100);
974
- }