@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,1245 @@
1
+ import { randomUUID } from 'node:crypto';
2
+ import {
3
+ BadRequestException,
4
+ ConflictException,
5
+ Injectable,
6
+ Logger,
7
+ NotFoundException,
8
+ } from '@nestjs/common';
9
+ import { InjectRepository } from '@nestjs/typeorm';
10
+ import {
11
+ DataSource,
12
+ FindOptionsWhere,
13
+ ILike,
14
+ In,
15
+ IsNull,
16
+ LessThanOrEqual,
17
+ MoreThanOrEqual,
18
+ Not,
19
+ Repository,
20
+ } from 'typeorm';
21
+ import { ManagerResolutionEntity } from './manager-resolution.entity';
22
+ import { MembershipEntity } from './membership.entity';
23
+ import { OrgUnitEntity } from './org-unit.entity';
24
+ import {
25
+ ManagerResolutionScopeTypeEnum,
26
+ OrgUnitTypeEnum,
27
+ } from './organization.enums';
28
+ import { PositionEntity } from './position.entity';
29
+ import {
30
+ CreateManagerResolutionInput,
31
+ UpdateManagerResolutionInput,
32
+ } from './dto/manager-resolution.input';
33
+ import {
34
+ CreateMembershipInput,
35
+ UpdateMembershipInput,
36
+ } from './dto/membership.input';
37
+ import {
38
+ CommitOrgUnitTreeDraftInput,
39
+ CommitOrgUnitTreeDraftMoveInput,
40
+ CreateOrgUnitInput,
41
+ UpdateOrgUnitInput,
42
+ } from './dto/org-unit.input';
43
+ import { OrgUnitTreeCommitResultObject } from './org-unit-tree-commit-result.object';
44
+ import { CreatePositionInput, UpdatePositionInput } from './dto/position.input';
45
+ import { parseMetadataJson } from './json-metadata';
46
+ import { OrganizationSummaryObject } from './organization-summary.object';
47
+
48
+ const ROOT_PATH_PREFIX = 'org';
49
+ const BUSINESS_TIME_ZONE = 'Asia/Taipei';
50
+
51
+ /**
52
+ * Upper bound for a single paginated page. Callers that need the complete list
53
+ * (org tree, id->name mapping, dropdowns) must instead opt in explicitly via
54
+ * `all: true` (or, historically, by omitting `pageSize`), which bypasses this
55
+ * cap. A `pageSize` larger than this is clamped and logged rather than silently
56
+ * truncated.
57
+ */
58
+ const MAX_PAGE_SIZE = 100;
59
+
60
+ const paginationLogger = new Logger('OrganizationPagination');
61
+
62
+ @Injectable()
63
+ export class OrganizationService {
64
+ constructor(
65
+ private readonly dataSource: DataSource,
66
+ @InjectRepository(OrgUnitEntity)
67
+ private readonly orgUnitRepository: Repository<OrgUnitEntity>,
68
+ @InjectRepository(PositionEntity)
69
+ private readonly positionRepository: Repository<PositionEntity>,
70
+ @InjectRepository(MembershipEntity)
71
+ private readonly membershipRepository: Repository<MembershipEntity>,
72
+ @InjectRepository(ManagerResolutionEntity)
73
+ private readonly managerResolutionRepository: Repository<ManagerResolutionEntity>,
74
+ ) {}
75
+
76
+ async createOrgUnit(input: CreateOrgUnitInput): Promise<OrgUnitEntity> {
77
+ await this.assertOrgUnitCodeAvailable(input.code);
78
+ const id = randomUUID();
79
+ const parent = input.parentId
80
+ ? await this.getOrgUnitOrThrow(input.parentId)
81
+ : null;
82
+ const pathSegment = this.buildPathSegment(id);
83
+ const path = parent
84
+ ? `${parent.path}.${pathSegment}`
85
+ : `${ROOT_PATH_PREFIX}.${pathSegment}`;
86
+ const entity = this.orgUnitRepository.create({
87
+ code: input.code,
88
+ id,
89
+ metadata: parseMetadataJson(input.metadataJson),
90
+ name: input.name,
91
+ parentId: input.parentId,
92
+ path,
93
+ type: input.type,
94
+ });
95
+
96
+ return this.orgUnitRepository.save(entity);
97
+ }
98
+
99
+ async updateOrgUnit(input: UpdateOrgUnitInput): Promise<OrgUnitEntity> {
100
+ const existing = await this.getOrgUnitOrThrow(input.id);
101
+ const nextParentId =
102
+ input.parentId === undefined ? existing.parentId : input.parentId;
103
+ const parent = nextParentId
104
+ ? await this.getOrgUnitOrThrow(nextParentId)
105
+ : null;
106
+ const nextCode = input.code ?? existing.code;
107
+
108
+ if (nextParentId === existing.id) {
109
+ throw new BadRequestException('Org unit cannot be its own parent');
110
+ }
111
+
112
+ if (parent && parent.path.startsWith(`${existing.path}.`)) {
113
+ throw new BadRequestException(
114
+ 'Org unit cannot be moved under its descendant',
115
+ );
116
+ }
117
+
118
+ await this.assertOrgUnitCodeAvailable(nextCode, existing.id);
119
+ const pathSegment = this.buildPathSegment(existing.id);
120
+ const path = parent
121
+ ? `${parent.path}.${pathSegment}`
122
+ : `${ROOT_PATH_PREFIX}.${pathSegment}`;
123
+ const previousPath = existing.path;
124
+
125
+ const next = this.orgUnitRepository.merge(existing, {
126
+ code: nextCode,
127
+ metadata: input.metadataJson
128
+ ? parseMetadataJson(input.metadataJson)
129
+ : existing.metadata,
130
+ name: input.name ?? existing.name,
131
+ parentId: nextParentId,
132
+ path,
133
+ type: input.type ?? existing.type,
134
+ });
135
+
136
+ return this.dataSource.transaction(
137
+ async (manager): Promise<OrgUnitEntity> => {
138
+ const saved = await manager.getRepository(OrgUnitEntity).save(next);
139
+
140
+ if (saved.path !== previousPath) {
141
+ const descendants = await manager
142
+ .getRepository(OrgUnitEntity)
143
+ .createQueryBuilder('orgUnit')
144
+ .where('orgUnit.deleted_at IS NULL')
145
+ .andWhere('orgUnit.path <@ :previousPath', { previousPath })
146
+ .andWhere('orgUnit.id != :id', { id: saved.id })
147
+ .getMany();
148
+
149
+ await Promise.all(
150
+ descendants.map((descendant): Promise<OrgUnitEntity> => {
151
+ const updatedDescendant = manager
152
+ .getRepository(OrgUnitEntity)
153
+ .merge(descendant, {
154
+ path: descendant.path.replace(previousPath, saved.path),
155
+ });
156
+
157
+ return manager
158
+ .getRepository(OrgUnitEntity)
159
+ .save(updatedDescendant);
160
+ }),
161
+ );
162
+ }
163
+
164
+ return saved;
165
+ },
166
+ );
167
+ }
168
+
169
+ async commitOrgUnitTreeDraft(
170
+ input: CommitOrgUnitTreeDraftInput,
171
+ ): Promise<OrgUnitTreeCommitResultObject> {
172
+ if (!input.moves.length) {
173
+ return { orgUnits: [] };
174
+ }
175
+
176
+ this.assertUniqueOrgUnitTreeMoves(input.moves);
177
+
178
+ return this.dataSource.transaction(
179
+ async (manager): Promise<OrgUnitTreeCommitResultObject> => {
180
+ const repository = manager.getRepository(OrgUnitEntity);
181
+ const orgUnitIds = collectOrgUnitTreeDraftIds(input.moves);
182
+ const orgUnits = await repository.find({
183
+ where: { deletedAt: IsNull(), id: In(orgUnitIds) },
184
+ });
185
+ const orgUnitById = new Map(
186
+ orgUnits.map((orgUnit): readonly [string, OrgUnitEntity] => [
187
+ orgUnit.id,
188
+ orgUnit,
189
+ ]),
190
+ );
191
+
192
+ this.assertOrgUnitTreeDraftReferences(input.moves, orgUnitById);
193
+ this.assertOrgUnitTreeDraftVersions(input.moves, orgUnitById);
194
+ this.assertOrgUnitTreeDraftHierarchy(input.moves, orgUnitById);
195
+
196
+ const affectedOrgUnits = new Map<string, OrgUnitEntity>();
197
+ const sortedMoves = sortOrgUnitTreeDraftMoves(input.moves);
198
+
199
+ for (const move of sortedMoves) {
200
+ const existing = orgUnitById.get(move.id);
201
+
202
+ if (!existing) {
203
+ throw new NotFoundException(`Org unit ${move.id} was not found`);
204
+ }
205
+
206
+ const parent = move.parentId
207
+ ? orgUnitById.get(move.parentId) ?? null
208
+ : null;
209
+ const previousPath = existing.path;
210
+ const nextPath = parent
211
+ ? `${parent.path}.${this.buildPathSegment(existing.id)}`
212
+ : `${ROOT_PATH_PREFIX}.${this.buildPathSegment(existing.id)}`;
213
+
214
+ if (
215
+ existing.parentId === move.parentId &&
216
+ existing.path === nextPath
217
+ ) {
218
+ affectedOrgUnits.set(existing.id, existing);
219
+ continue;
220
+ }
221
+
222
+ const saved = await repository.save(
223
+ repository.merge(existing, {
224
+ parentId: move.parentId,
225
+ path: nextPath,
226
+ }),
227
+ );
228
+
229
+ orgUnitById.set(saved.id, saved);
230
+ affectedOrgUnits.set(saved.id, saved);
231
+
232
+ const descendants = await repository
233
+ .createQueryBuilder('orgUnit')
234
+ .where('orgUnit.deleted_at IS NULL')
235
+ .andWhere('orgUnit.path <@ :previousPath', { previousPath })
236
+ .andWhere('orgUnit.id != :id', { id: saved.id })
237
+ .getMany();
238
+
239
+ for (const descendant of descendants) {
240
+ const updatedDescendant = await repository.save(
241
+ repository.merge(descendant, {
242
+ path: descendant.path.replace(previousPath, saved.path),
243
+ }),
244
+ );
245
+
246
+ orgUnitById.set(updatedDescendant.id, updatedDescendant);
247
+ affectedOrgUnits.set(updatedDescendant.id, updatedDescendant);
248
+ }
249
+ }
250
+
251
+ return {
252
+ orgUnits: [...affectedOrgUnits.values()].sort(compareOrgUnitPath),
253
+ };
254
+ },
255
+ );
256
+ }
257
+
258
+ async deleteOrgUnit(id: string): Promise<boolean> {
259
+ await this.getOrgUnitOrThrow(id);
260
+ const childCount = await this.orgUnitRepository.count({
261
+ where: { deletedAt: IsNull(), parentId: id },
262
+ });
263
+
264
+ if (childCount > 0) {
265
+ throw new BadRequestException(
266
+ 'Org unit with child units cannot be deleted',
267
+ );
268
+ }
269
+
270
+ const membershipCount = await this.membershipRepository.count({
271
+ where: { orgUnitId: id },
272
+ });
273
+
274
+ if (membershipCount > 0) {
275
+ throw new BadRequestException(
276
+ 'Org unit with memberships cannot be deleted',
277
+ );
278
+ }
279
+
280
+ await this.orgUnitRepository.softDelete(id);
281
+
282
+ return true;
283
+ }
284
+
285
+ async getOrgUnit(id: string): Promise<OrgUnitEntity> {
286
+ return this.getOrgUnitOrThrow(id);
287
+ }
288
+
289
+ async listOrgUnits({
290
+ all,
291
+ page,
292
+ pageSize,
293
+ parentId,
294
+ searchText,
295
+ type,
296
+ }: {
297
+ readonly all?: boolean | null;
298
+ readonly page?: number | null;
299
+ readonly pageSize?: number | null;
300
+ readonly parentId?: string | null;
301
+ readonly searchText?: string | null;
302
+ readonly type?: OrgUnitTypeEnum | null;
303
+ } = {}): Promise<readonly OrgUnitEntity[]> {
304
+ return this.orgUnitRepository.find({
305
+ ...createPaginationFindOptions({ all, page, pageSize }),
306
+ order: { path: 'ASC' },
307
+ where: createOrgUnitWhere({ parentId, searchText, type }),
308
+ });
309
+ }
310
+
311
+ async countOrgUnits({
312
+ parentId,
313
+ searchText,
314
+ type,
315
+ }: {
316
+ readonly parentId?: string | null;
317
+ readonly searchText?: string | null;
318
+ readonly type?: OrgUnitTypeEnum | null;
319
+ } = {}): Promise<number> {
320
+ return this.orgUnitRepository.count({
321
+ where: createOrgUnitWhere({ parentId, searchText, type }),
322
+ });
323
+ }
324
+
325
+ async createPosition(input: CreatePositionInput): Promise<PositionEntity> {
326
+ await this.assertPositionCodeAvailable(input.code);
327
+
328
+ return this.positionRepository.save(
329
+ this.positionRepository.create({
330
+ code: input.code,
331
+ level: input.level,
332
+ metadata: parseMetadataJson(input.metadataJson),
333
+ name: input.name,
334
+ }),
335
+ );
336
+ }
337
+
338
+ async updatePosition(input: UpdatePositionInput): Promise<PositionEntity> {
339
+ const existing = await this.getPositionOrThrow(input.id);
340
+ const nextCode = input.code ?? existing.code;
341
+
342
+ await this.assertPositionCodeAvailable(nextCode, existing.id);
343
+
344
+ const next = this.positionRepository.merge(existing, {
345
+ code: nextCode,
346
+ level: input.level ?? existing.level,
347
+ metadata: input.metadataJson
348
+ ? parseMetadataJson(input.metadataJson)
349
+ : existing.metadata,
350
+ name: input.name ?? existing.name,
351
+ });
352
+
353
+ return this.positionRepository.save(next);
354
+ }
355
+
356
+ async listPositions({
357
+ page,
358
+ pageSize,
359
+ searchText,
360
+ }: {
361
+ readonly page?: number | null;
362
+ readonly pageSize?: number | null;
363
+ readonly searchText?: string | null;
364
+ } = {}): Promise<readonly PositionEntity[]> {
365
+ return this.positionRepository.find({
366
+ ...createPaginationFindOptions({ page, pageSize }),
367
+ order: { level: 'DESC', code: 'ASC' },
368
+ where: createPositionWhere({ searchText }),
369
+ });
370
+ }
371
+
372
+ async countPositions({
373
+ searchText,
374
+ }: {
375
+ readonly searchText?: string | null;
376
+ } = {}): Promise<number> {
377
+ return this.positionRepository.count({
378
+ where: createPositionWhere({ searchText }),
379
+ });
380
+ }
381
+
382
+ async createMembership(
383
+ input: CreateMembershipInput,
384
+ ): Promise<MembershipEntity> {
385
+ await this.assertMembershipReferences(input);
386
+ await this.assertMembershipDateRange(
387
+ input.effectiveFrom,
388
+ input.effectiveTo,
389
+ );
390
+
391
+ if (input.isPrimary) {
392
+ await this.clearPrimaryMemberships(input.memberId);
393
+ }
394
+
395
+ return this.membershipRepository.save(
396
+ this.membershipRepository.create(input),
397
+ );
398
+ }
399
+
400
+ async updateMembership(
401
+ input: UpdateMembershipInput,
402
+ ): Promise<MembershipEntity> {
403
+ const existing = await this.getMembershipOrThrow(input.id);
404
+ const nextMemberId = existing.memberId;
405
+ const nextOrgUnitId = input.orgUnitId ?? existing.orgUnitId;
406
+ const nextPositionId =
407
+ input.positionId === undefined ? existing.positionId : input.positionId;
408
+ const nextEffectiveFrom = input.effectiveFrom ?? existing.effectiveFrom;
409
+ const nextEffectiveTo =
410
+ input.effectiveTo === undefined
411
+ ? existing.effectiveTo
412
+ : input.effectiveTo;
413
+ const nextIsPrimary = input.isPrimary ?? existing.isPrimary;
414
+
415
+ await this.assertMembershipReferences({
416
+ effectiveFrom: nextEffectiveFrom,
417
+ effectiveTo: nextEffectiveTo,
418
+ isPrimary: nextIsPrimary,
419
+ memberId: nextMemberId,
420
+ orgUnitId: nextOrgUnitId,
421
+ positionId: nextPositionId,
422
+ });
423
+ await this.assertMembershipDateRange(nextEffectiveFrom, nextEffectiveTo);
424
+
425
+ if (nextIsPrimary) {
426
+ await this.clearPrimaryMemberships(nextMemberId, existing.id);
427
+ }
428
+
429
+ const next = this.membershipRepository.merge(existing, {
430
+ effectiveFrom: nextEffectiveFrom,
431
+ effectiveTo: nextEffectiveTo,
432
+ isPrimary: nextIsPrimary,
433
+ orgUnitId: nextOrgUnitId,
434
+ positionId: nextPositionId,
435
+ });
436
+
437
+ return this.membershipRepository.save(next);
438
+ }
439
+
440
+ async deleteMembership(id: string): Promise<boolean> {
441
+ await this.getMembershipOrThrow(id);
442
+ await this.membershipRepository.delete(id);
443
+
444
+ return true;
445
+ }
446
+
447
+ async listMemberships({
448
+ activeOnly = false,
449
+ memberId,
450
+ orgUnitId,
451
+ page,
452
+ pageSize,
453
+ positionId,
454
+ }: {
455
+ readonly activeOnly?: boolean;
456
+ readonly memberId?: string | null;
457
+ readonly orgUnitId?: string | null;
458
+ readonly page?: number | null;
459
+ readonly pageSize?: number | null;
460
+ readonly positionId?: string | null;
461
+ } = {}): Promise<readonly MembershipEntity[]> {
462
+ const date = this.toDateOnly(new Date());
463
+
464
+ return this.membershipRepository.find({
465
+ ...createPaginationFindOptions({ page, pageSize }),
466
+ order: { memberId: 'ASC', isPrimary: 'DESC', effectiveFrom: 'DESC' },
467
+ where: createMembershipWhere({
468
+ activeOnly,
469
+ date,
470
+ memberId,
471
+ orgUnitId,
472
+ positionId,
473
+ }),
474
+ });
475
+ }
476
+
477
+ async countMemberships({
478
+ activeOnly = false,
479
+ memberId,
480
+ orgUnitId,
481
+ positionId,
482
+ }: {
483
+ readonly activeOnly?: boolean;
484
+ readonly memberId?: string | null;
485
+ readonly orgUnitId?: string | null;
486
+ readonly positionId?: string | null;
487
+ } = {}): Promise<number> {
488
+ const date = this.toDateOnly(new Date());
489
+
490
+ return this.membershipRepository.count({
491
+ where: createMembershipWhere({
492
+ activeOnly,
493
+ date,
494
+ memberId,
495
+ orgUnitId,
496
+ positionId,
497
+ }),
498
+ });
499
+ }
500
+
501
+ async createManagerResolution(
502
+ input: CreateManagerResolutionInput,
503
+ ): Promise<ManagerResolutionEntity> {
504
+ await this.assertManagerResolutionReferences(input);
505
+ await this.assertMembershipDateRange(
506
+ input.effectiveFrom,
507
+ input.effectiveTo,
508
+ );
509
+
510
+ return this.managerResolutionRepository.save(
511
+ this.managerResolutionRepository.create(input),
512
+ );
513
+ }
514
+
515
+ async updateManagerResolution(
516
+ input: UpdateManagerResolutionInput,
517
+ ): Promise<ManagerResolutionEntity> {
518
+ const existing = await this.getManagerResolutionOrThrow(input.id);
519
+ const nextScopeType = input.scopeType ?? existing.scopeType;
520
+ const nextScopeId = input.scopeId ?? existing.scopeId;
521
+ const nextManagerMemberId =
522
+ input.managerMemberId ?? existing.managerMemberId;
523
+ const nextEffectiveFrom = input.effectiveFrom ?? existing.effectiveFrom;
524
+ const nextEffectiveTo =
525
+ input.effectiveTo === undefined
526
+ ? existing.effectiveTo
527
+ : input.effectiveTo;
528
+
529
+ await this.assertManagerResolutionReferences({
530
+ effectiveFrom: nextEffectiveFrom,
531
+ effectiveTo: nextEffectiveTo,
532
+ managerMemberId: nextManagerMemberId,
533
+ priority: input.priority ?? existing.priority,
534
+ scopeId: nextScopeId,
535
+ scopeType: nextScopeType,
536
+ });
537
+ await this.assertMembershipDateRange(nextEffectiveFrom, nextEffectiveTo);
538
+
539
+ const next = this.managerResolutionRepository.merge(existing, {
540
+ effectiveFrom: nextEffectiveFrom,
541
+ effectiveTo: nextEffectiveTo,
542
+ managerMemberId: nextManagerMemberId,
543
+ priority: input.priority ?? existing.priority,
544
+ scopeId: nextScopeId,
545
+ scopeType: nextScopeType,
546
+ });
547
+
548
+ return this.managerResolutionRepository.save(next);
549
+ }
550
+
551
+ async deleteManagerResolution(id: string): Promise<boolean> {
552
+ await this.getManagerResolutionOrThrow(id);
553
+ await this.managerResolutionRepository.delete(id);
554
+
555
+ return true;
556
+ }
557
+
558
+ async listManagerResolutions({
559
+ activeOnly = false,
560
+ page,
561
+ pageSize,
562
+ scopeId,
563
+ scopeType,
564
+ }: {
565
+ readonly activeOnly?: boolean;
566
+ readonly page?: number | null;
567
+ readonly pageSize?: number | null;
568
+ readonly scopeId?: string | null;
569
+ readonly scopeType?: ManagerResolutionScopeTypeEnum | null;
570
+ } = {}): Promise<readonly ManagerResolutionEntity[]> {
571
+ const date = this.toDateOnly(new Date());
572
+
573
+ return this.managerResolutionRepository.find({
574
+ ...createPaginationFindOptions({ page, pageSize }),
575
+ order: { priority: 'DESC', createdAt: 'DESC' },
576
+ where: createManagerResolutionWhere({
577
+ activeOnly,
578
+ date,
579
+ scopeId,
580
+ scopeType,
581
+ }),
582
+ });
583
+ }
584
+
585
+ async countManagerResolutions({
586
+ activeOnly = false,
587
+ scopeId,
588
+ scopeType,
589
+ }: {
590
+ readonly activeOnly?: boolean;
591
+ readonly scopeId?: string | null;
592
+ readonly scopeType?: ManagerResolutionScopeTypeEnum | null;
593
+ } = {}): Promise<number> {
594
+ const date = this.toDateOnly(new Date());
595
+
596
+ return this.managerResolutionRepository.count({
597
+ where: createManagerResolutionWhere({
598
+ activeOnly,
599
+ date,
600
+ scopeId,
601
+ scopeType,
602
+ }),
603
+ });
604
+ }
605
+
606
+ async readOrganizationSummary(): Promise<OrganizationSummaryObject> {
607
+ const [
608
+ orgUnitCount,
609
+ positionCount,
610
+ membershipCount,
611
+ managerResolutionCount,
612
+ ] = await Promise.all([
613
+ this.orgUnitRepository.count({ where: { deletedAt: IsNull() } }),
614
+ this.positionRepository.count(),
615
+ this.membershipRepository.count(),
616
+ this.managerResolutionRepository.count(),
617
+ ]);
618
+
619
+ return {
620
+ managerResolutionCount,
621
+ membershipCount,
622
+ orgUnitCount,
623
+ positionCount,
624
+ };
625
+ }
626
+
627
+ async resolveManagerMemberId(
628
+ memberId: string,
629
+ effectiveAt = new Date(),
630
+ ): Promise<string | null> {
631
+ const date = this.toDateOnly(effectiveAt);
632
+ const memberships = await this.findActiveMemberships(memberId, date);
633
+ const orgUnits = await this.findMembershipOrgUnits(memberships);
634
+ const positionIds = memberships
635
+ .map((membership) => membership.positionId)
636
+ .filter((positionId): positionId is string => Boolean(positionId));
637
+ const candidatePairs = [
638
+ { scopeId: memberId, scopeType: ManagerResolutionScopeTypeEnum.MEMBER },
639
+ ...orgUnits.map((orgUnit) => ({
640
+ scopeId: orgUnit.id,
641
+ scopeType: ManagerResolutionScopeTypeEnum.ORG_UNIT,
642
+ })),
643
+ ...positionIds.map((positionId) => ({
644
+ scopeId: positionId,
645
+ scopeType: ManagerResolutionScopeTypeEnum.POSITION,
646
+ })),
647
+ ];
648
+ const scopeIds = candidatePairs.map((pair) => pair.scopeId);
649
+ const resolutions = scopeIds.length
650
+ ? await this.managerResolutionRepository.find({
651
+ where: {
652
+ scopeId: In(scopeIds),
653
+ scopeType: In([
654
+ ManagerResolutionScopeTypeEnum.MEMBER,
655
+ ManagerResolutionScopeTypeEnum.ORG_UNIT,
656
+ ManagerResolutionScopeTypeEnum.POSITION,
657
+ ]),
658
+ },
659
+ })
660
+ : [];
661
+
662
+ const active = resolutions
663
+ .filter((resolution) =>
664
+ candidatePairs.some(
665
+ (pair) =>
666
+ pair.scopeId === resolution.scopeId &&
667
+ pair.scopeType === resolution.scopeType,
668
+ ),
669
+ )
670
+ .filter((resolution) => this.isDateActive(resolution, date))
671
+ .sort((left, right) => this.compareManagerResolution(left, right));
672
+
673
+ return active[0]?.managerMemberId ?? null;
674
+ }
675
+
676
+ private assertUniqueOrgUnitTreeMoves(
677
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
678
+ ): void {
679
+ const moveIds = moves.map((move) => move.id);
680
+ const uniqueMoveIds = new Set(moveIds);
681
+
682
+ if (uniqueMoveIds.size !== moveIds.length) {
683
+ throw new BadRequestException(
684
+ 'Org unit tree draft includes duplicate moves',
685
+ );
686
+ }
687
+ }
688
+
689
+ private assertOrgUnitTreeDraftReferences(
690
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
691
+ orgUnitById: ReadonlyMap<string, OrgUnitEntity>,
692
+ ): void {
693
+ const missingId = collectOrgUnitTreeDraftIds(moves).find(
694
+ (id) => !orgUnitById.has(id),
695
+ );
696
+
697
+ if (missingId) {
698
+ throw new NotFoundException(`Org unit ${missingId} was not found`);
699
+ }
700
+ }
701
+
702
+ private assertOrgUnitTreeDraftVersions(
703
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
704
+ orgUnitById: ReadonlyMap<string, OrgUnitEntity>,
705
+ ): void {
706
+ const staleMove = moves.find((move) => {
707
+ const orgUnit = orgUnitById.get(move.id);
708
+
709
+ return orgUnit
710
+ ? orgUnit.updatedAt.getTime() !== parseBaseUpdatedAt(move).getTime()
711
+ : false;
712
+ });
713
+
714
+ if (staleMove) {
715
+ throw new ConflictException(
716
+ `Org unit ${staleMove.id} has changed since this draft was based`,
717
+ );
718
+ }
719
+ }
720
+
721
+ private assertOrgUnitTreeDraftHierarchy(
722
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
723
+ orgUnitById: ReadonlyMap<string, OrgUnitEntity>,
724
+ ): void {
725
+ for (const move of moves) {
726
+ if (move.id === move.parentId) {
727
+ throw new BadRequestException('Org unit cannot be its own parent');
728
+ }
729
+
730
+ const existing = orgUnitById.get(move.id);
731
+ const parent = move.parentId ? orgUnitById.get(move.parentId) : null;
732
+
733
+ if (existing && parent?.path.startsWith(`${existing.path}.`)) {
734
+ throw new BadRequestException(
735
+ 'Org unit cannot be moved under its descendant',
736
+ );
737
+ }
738
+ }
739
+
740
+ assertOrgUnitTreeDraftHasNoCycles(moves);
741
+ }
742
+
743
+ private async getOrgUnitOrThrow(id: string): Promise<OrgUnitEntity> {
744
+ const entity = await this.orgUnitRepository.findOne({
745
+ where: { deletedAt: IsNull(), id },
746
+ });
747
+
748
+ if (!entity) {
749
+ throw new NotFoundException(`Org unit ${id} was not found`);
750
+ }
751
+
752
+ return entity;
753
+ }
754
+
755
+ private async getPositionOrThrow(id: string): Promise<PositionEntity> {
756
+ const entity = await this.positionRepository.findOne({ where: { id } });
757
+
758
+ if (!entity) {
759
+ throw new NotFoundException(`Position ${id} was not found`);
760
+ }
761
+
762
+ return entity;
763
+ }
764
+
765
+ private async assertOrgUnitCodeAvailable(
766
+ code: string,
767
+ exceptId?: string,
768
+ ): Promise<void> {
769
+ const existing = await this.orgUnitRepository.findOne({
770
+ where: {
771
+ code,
772
+ deletedAt: IsNull(),
773
+ ...(exceptId ? { id: Not(exceptId) } : {}),
774
+ },
775
+ });
776
+
777
+ if (existing) {
778
+ throw new BadRequestException(`Org unit code ${code} is already used`);
779
+ }
780
+ }
781
+
782
+ private async assertPositionCodeAvailable(
783
+ code: string,
784
+ exceptId?: string,
785
+ ): Promise<void> {
786
+ const existing = await this.positionRepository.findOne({
787
+ where: {
788
+ code,
789
+ ...(exceptId ? { id: Not(exceptId) } : {}),
790
+ },
791
+ });
792
+
793
+ if (existing) {
794
+ throw new BadRequestException(`Position code ${code} is already used`);
795
+ }
796
+ }
797
+
798
+ private async assertMembershipReferences(
799
+ input: CreateMembershipInput,
800
+ ): Promise<void> {
801
+ await this.getOrgUnitOrThrow(input.orgUnitId);
802
+
803
+ if (input.positionId) {
804
+ await this.getPositionOrThrow(input.positionId);
805
+ }
806
+ }
807
+
808
+ private async assertManagerResolutionReferences(
809
+ input: CreateManagerResolutionInput,
810
+ ): Promise<void> {
811
+ if (
812
+ input.scopeType === ManagerResolutionScopeTypeEnum.MEMBER &&
813
+ input.scopeId === input.managerMemberId
814
+ ) {
815
+ throw new BadRequestException('Manager cannot be the scoped member');
816
+ }
817
+
818
+ if (input.scopeType === ManagerResolutionScopeTypeEnum.ORG_UNIT) {
819
+ await this.getOrgUnitOrThrow(input.scopeId);
820
+ }
821
+
822
+ if (input.scopeType === ManagerResolutionScopeTypeEnum.POSITION) {
823
+ await this.getPositionOrThrow(input.scopeId);
824
+ }
825
+ }
826
+
827
+ private async assertMembershipDateRange(
828
+ effectiveFrom: string,
829
+ effectiveTo: string | null,
830
+ ): Promise<void> {
831
+ if (effectiveTo && effectiveFrom > effectiveTo) {
832
+ throw new BadRequestException(
833
+ 'Effective from cannot be after effective to',
834
+ );
835
+ }
836
+ }
837
+
838
+ private async clearPrimaryMemberships(
839
+ memberId: string,
840
+ exceptId?: string,
841
+ ): Promise<void> {
842
+ await this.membershipRepository.update(
843
+ {
844
+ isPrimary: true,
845
+ memberId,
846
+ ...(exceptId ? { id: Not(exceptId) } : {}),
847
+ },
848
+ { isPrimary: false },
849
+ );
850
+ }
851
+
852
+ private async getMembershipOrThrow(id: string): Promise<MembershipEntity> {
853
+ const entity = await this.membershipRepository.findOne({ where: { id } });
854
+
855
+ if (!entity) {
856
+ throw new NotFoundException(`Membership ${id} was not found`);
857
+ }
858
+
859
+ return entity;
860
+ }
861
+
862
+ private async getManagerResolutionOrThrow(
863
+ id: string,
864
+ ): Promise<ManagerResolutionEntity> {
865
+ const entity = await this.managerResolutionRepository.findOne({
866
+ where: { id },
867
+ });
868
+
869
+ if (!entity) {
870
+ throw new NotFoundException(`Manager resolution ${id} was not found`);
871
+ }
872
+
873
+ return entity;
874
+ }
875
+
876
+ private async findActiveMemberships(
877
+ memberId: string,
878
+ date: string,
879
+ ): Promise<readonly MembershipEntity[]> {
880
+ const memberships = await this.membershipRepository.find({
881
+ where: { memberId },
882
+ });
883
+
884
+ return memberships.filter((membership) =>
885
+ this.isDateActive(membership, date),
886
+ );
887
+ }
888
+
889
+ private async findMembershipOrgUnits(
890
+ memberships: readonly MembershipEntity[],
891
+ ): Promise<readonly OrgUnitEntity[]> {
892
+ const orgUnitIds = memberships.map((membership) => membership.orgUnitId);
893
+
894
+ if (!orgUnitIds.length) {
895
+ return [];
896
+ }
897
+
898
+ const directOrgUnits = await this.orgUnitRepository.find({
899
+ where: { deletedAt: IsNull(), id: In(orgUnitIds) },
900
+ });
901
+ const ancestorGroups = await Promise.all(
902
+ directOrgUnits.map((orgUnit) =>
903
+ this.orgUnitRepository
904
+ .createQueryBuilder('orgUnit')
905
+ .where('orgUnit.deleted_at IS NULL')
906
+ .andWhere('orgUnit.path @> :path', { path: orgUnit.path })
907
+ .getMany(),
908
+ ),
909
+ );
910
+ const flattened = ancestorGroups.flat();
911
+ const byId = new Map(
912
+ flattened.map((orgUnit): readonly [string, OrgUnitEntity] => [
913
+ orgUnit.id,
914
+ orgUnit,
915
+ ]),
916
+ );
917
+
918
+ return [...byId.values()];
919
+ }
920
+
921
+ private buildPathSegment(id: string): string {
922
+ return `n${id.replace(/-/g, '_')}`;
923
+ }
924
+
925
+ private toDateOnly(date: Date): string {
926
+ const parts = new Intl.DateTimeFormat('en-US', {
927
+ day: '2-digit',
928
+ month: '2-digit',
929
+ timeZone: BUSINESS_TIME_ZONE,
930
+ year: 'numeric',
931
+ }).formatToParts(date);
932
+ const byType = new Map(
933
+ parts.map((part): readonly [string, string] => [part.type, part.value]),
934
+ );
935
+
936
+ return `${byType.get('year') ?? '1970'}-${byType.get('month') ?? '01'}-${byType.get('day') ?? '01'}`;
937
+ }
938
+
939
+ private isDateActive(
940
+ value: Pick<
941
+ MembershipEntity | ManagerResolutionEntity,
942
+ 'effectiveFrom' | 'effectiveTo'
943
+ >,
944
+ date: string,
945
+ ): boolean {
946
+ return (
947
+ value.effectiveFrom <= date &&
948
+ (!value.effectiveTo || value.effectiveTo >= date)
949
+ );
950
+ }
951
+
952
+ private compareManagerResolution(
953
+ left: ManagerResolutionEntity,
954
+ right: ManagerResolutionEntity,
955
+ ): number {
956
+ const priorityDiff = right.priority - left.priority;
957
+
958
+ if (priorityDiff !== 0) {
959
+ return priorityDiff;
960
+ }
961
+
962
+ return (
963
+ this.scopeRank(right.scopeType) - this.scopeRank(left.scopeType) ||
964
+ right.effectiveFrom.localeCompare(left.effectiveFrom)
965
+ );
966
+ }
967
+
968
+ private scopeRank(scopeType: ManagerResolutionScopeTypeEnum): number {
969
+ const ranks: Readonly<Record<ManagerResolutionScopeTypeEnum, number>> = {
970
+ [ManagerResolutionScopeTypeEnum.MEMBER]: 3,
971
+ [ManagerResolutionScopeTypeEnum.ORG_UNIT]: 2,
972
+ [ManagerResolutionScopeTypeEnum.POSITION]: 1,
973
+ };
974
+
975
+ return ranks[scopeType];
976
+ }
977
+ }
978
+
979
+ function createOrgUnitWhere({
980
+ parentId,
981
+ searchText,
982
+ type,
983
+ }: {
984
+ readonly parentId?: string | null;
985
+ readonly searchText?: string | null;
986
+ readonly type?: OrgUnitTypeEnum | null;
987
+ }):
988
+ | FindOptionsWhere<OrgUnitEntity>
989
+ | FindOptionsWhere<OrgUnitEntity>[] {
990
+ const parentWhere: FindOptionsWhere<OrgUnitEntity> =
991
+ parentId === undefined
992
+ ? {}
993
+ : { parentId: parentId === null ? IsNull() : parentId };
994
+ const baseWhere: FindOptionsWhere<OrgUnitEntity> = {
995
+ deletedAt: IsNull(),
996
+ ...parentWhere,
997
+ ...(type ? { type } : {}),
998
+ };
999
+ const trimmedSearchText = searchText?.trim();
1000
+
1001
+ if (!trimmedSearchText) {
1002
+ return baseWhere;
1003
+ }
1004
+
1005
+ const searchPattern = `%${trimmedSearchText}%`;
1006
+
1007
+ return [
1008
+ { ...baseWhere, code: ILike(searchPattern) },
1009
+ { ...baseWhere, name: ILike(searchPattern) },
1010
+ ];
1011
+ }
1012
+
1013
+ function createPositionWhere({
1014
+ searchText,
1015
+ }: {
1016
+ readonly searchText?: string | null;
1017
+ }):
1018
+ | FindOptionsWhere<PositionEntity>
1019
+ | FindOptionsWhere<PositionEntity>[] {
1020
+ const trimmedSearchText = searchText?.trim();
1021
+
1022
+ if (!trimmedSearchText) {
1023
+ return {};
1024
+ }
1025
+
1026
+ const searchPattern = `%${trimmedSearchText}%`;
1027
+
1028
+ return [{ code: ILike(searchPattern) }, { name: ILike(searchPattern) }];
1029
+ }
1030
+
1031
+ function createMembershipWhere({
1032
+ activeOnly,
1033
+ date,
1034
+ memberId,
1035
+ orgUnitId,
1036
+ positionId,
1037
+ }: {
1038
+ readonly activeOnly: boolean;
1039
+ readonly date: string;
1040
+ readonly memberId?: string | null;
1041
+ readonly orgUnitId?: string | null;
1042
+ readonly positionId?: string | null;
1043
+ }):
1044
+ | FindOptionsWhere<MembershipEntity>
1045
+ | FindOptionsWhere<MembershipEntity>[] {
1046
+ const baseWhere: FindOptionsWhere<MembershipEntity> = {
1047
+ ...(memberId ? { memberId } : {}),
1048
+ ...(orgUnitId ? { orgUnitId } : {}),
1049
+ ...(positionId ? { positionId } : {}),
1050
+ };
1051
+
1052
+ if (!activeOnly) {
1053
+ return baseWhere;
1054
+ }
1055
+
1056
+ return [
1057
+ {
1058
+ ...baseWhere,
1059
+ effectiveFrom: LessThanOrEqual(date),
1060
+ effectiveTo: IsNull(),
1061
+ },
1062
+ {
1063
+ ...baseWhere,
1064
+ effectiveFrom: LessThanOrEqual(date),
1065
+ effectiveTo: MoreThanOrEqual(date),
1066
+ },
1067
+ ];
1068
+ }
1069
+
1070
+ function createManagerResolutionWhere({
1071
+ activeOnly,
1072
+ date,
1073
+ scopeId,
1074
+ scopeType,
1075
+ }: {
1076
+ readonly activeOnly: boolean;
1077
+ readonly date: string;
1078
+ readonly scopeId?: string | null;
1079
+ readonly scopeType?: ManagerResolutionScopeTypeEnum | null;
1080
+ }):
1081
+ | FindOptionsWhere<ManagerResolutionEntity>
1082
+ | FindOptionsWhere<ManagerResolutionEntity>[] {
1083
+ const baseWhere: FindOptionsWhere<ManagerResolutionEntity> = {
1084
+ ...(scopeId ? { scopeId } : {}),
1085
+ ...(scopeType ? { scopeType } : {}),
1086
+ };
1087
+
1088
+ if (!activeOnly) {
1089
+ return baseWhere;
1090
+ }
1091
+
1092
+ return [
1093
+ {
1094
+ ...baseWhere,
1095
+ effectiveFrom: LessThanOrEqual(date),
1096
+ effectiveTo: IsNull(),
1097
+ },
1098
+ {
1099
+ ...baseWhere,
1100
+ effectiveFrom: LessThanOrEqual(date),
1101
+ effectiveTo: MoreThanOrEqual(date),
1102
+ },
1103
+ ];
1104
+ }
1105
+
1106
+ function createPaginationFindOptions({
1107
+ all,
1108
+ page,
1109
+ pageSize,
1110
+ }: {
1111
+ readonly all?: boolean | null;
1112
+ readonly page?: number | null;
1113
+ readonly pageSize?: number | null;
1114
+ }): { readonly skip?: number; readonly take?: number } {
1115
+ if (all) {
1116
+ return {};
1117
+ }
1118
+
1119
+ const normalizedPageSize = normalizePageSize(pageSize);
1120
+
1121
+ if (!normalizedPageSize) {
1122
+ return {};
1123
+ }
1124
+
1125
+ return {
1126
+ skip: (normalizePage(page) - 1) * normalizedPageSize,
1127
+ take: normalizedPageSize,
1128
+ };
1129
+ }
1130
+
1131
+ function normalizePage(page?: number | null): number {
1132
+ if (typeof page !== 'number' || !Number.isFinite(page)) {
1133
+ return 1;
1134
+ }
1135
+
1136
+ return Math.max(1, Math.floor(page));
1137
+ }
1138
+
1139
+ function normalizePageSize(pageSize?: number | null): number | null {
1140
+ if (typeof pageSize !== 'number' || !Number.isFinite(pageSize)) {
1141
+ return null;
1142
+ }
1143
+
1144
+ const flooredPageSize = Math.max(1, Math.floor(pageSize));
1145
+
1146
+ if (flooredPageSize > MAX_PAGE_SIZE) {
1147
+ paginationLogger.warn(
1148
+ `Requested pageSize ${flooredPageSize} exceeds the maximum of ${MAX_PAGE_SIZE} and was clamped. ` +
1149
+ `To fetch the complete list, pass all: true (or omit pageSize) instead of an oversized pageSize.`,
1150
+ );
1151
+ }
1152
+
1153
+ return Math.min(MAX_PAGE_SIZE, flooredPageSize);
1154
+ }
1155
+
1156
+ function collectOrgUnitTreeDraftIds(
1157
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
1158
+ ): readonly string[] {
1159
+ return [
1160
+ ...new Set(
1161
+ moves.flatMap((move) =>
1162
+ move.parentId ? [move.id, move.parentId] : [move.id],
1163
+ ),
1164
+ ),
1165
+ ];
1166
+ }
1167
+
1168
+ function parseBaseUpdatedAt(move: CommitOrgUnitTreeDraftMoveInput): Date {
1169
+ const baseUpdatedAt = new Date(move.baseUpdatedAt);
1170
+
1171
+ if (Number.isNaN(baseUpdatedAt.getTime())) {
1172
+ throw new BadRequestException(
1173
+ `Org unit ${move.id} baseUpdatedAt is invalid`,
1174
+ );
1175
+ }
1176
+
1177
+ return baseUpdatedAt;
1178
+ }
1179
+
1180
+ function assertOrgUnitTreeDraftHasNoCycles(
1181
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
1182
+ ): void {
1183
+ const parentById = new Map(
1184
+ moves.map((move): readonly [string, string | null] => [
1185
+ move.id,
1186
+ move.parentId,
1187
+ ]),
1188
+ );
1189
+
1190
+ for (const move of moves) {
1191
+ const visited = new Set<string>();
1192
+ let parentId = move.parentId;
1193
+
1194
+ while (parentId && parentById.has(parentId)) {
1195
+ if (parentId === move.id || visited.has(parentId)) {
1196
+ throw new BadRequestException(
1197
+ 'Org unit tree draft cannot create a cycle',
1198
+ );
1199
+ }
1200
+
1201
+ visited.add(parentId);
1202
+ parentId = parentById.get(parentId) ?? null;
1203
+ }
1204
+ }
1205
+ }
1206
+
1207
+ function sortOrgUnitTreeDraftMoves(
1208
+ moves: readonly CommitOrgUnitTreeDraftMoveInput[],
1209
+ ): readonly CommitOrgUnitTreeDraftMoveInput[] {
1210
+ const moveById = new Map(
1211
+ moves.map((move): readonly [string, CommitOrgUnitTreeDraftMoveInput] => [
1212
+ move.id,
1213
+ move,
1214
+ ]),
1215
+ );
1216
+
1217
+ return [...moves].sort((left, right) => {
1218
+ const leftDepth = calculateOrgUnitTreeDraftMoveDepth(left, moveById);
1219
+ const rightDepth = calculateOrgUnitTreeDraftMoveDepth(right, moveById);
1220
+
1221
+ return leftDepth - rightDepth || left.id.localeCompare(right.id);
1222
+ });
1223
+ }
1224
+
1225
+ function calculateOrgUnitTreeDraftMoveDepth(
1226
+ move: CommitOrgUnitTreeDraftMoveInput,
1227
+ moveById: ReadonlyMap<string, CommitOrgUnitTreeDraftMoveInput>,
1228
+ ): number {
1229
+ let depth = 0;
1230
+ let parentId = move.parentId;
1231
+
1232
+ while (parentId && moveById.has(parentId)) {
1233
+ depth += 1;
1234
+ parentId = moveById.get(parentId)?.parentId ?? null;
1235
+ }
1236
+
1237
+ return depth;
1238
+ }
1239
+
1240
+ function compareOrgUnitPath(
1241
+ left: OrgUnitEntity,
1242
+ right: OrgUnitEntity,
1243
+ ): number {
1244
+ return left.path.localeCompare(right.path);
1245
+ }