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

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (657) hide show
  1. package/CHANGELOG.md +19 -0
  2. package/package.json +1 -1
  3. package/src/index.js +18 -0
  4. package/src/index.js.map +1 -0
  5. package/src/lib/attachment/attachment-options.d.ts +44 -0
  6. package/src/lib/attachment/attachment-options.js +62 -0
  7. package/src/lib/attachment/attachment-options.js.map +1 -0
  8. package/src/lib/attachment/attachment-storage.provider.d.ts +4 -0
  9. package/src/lib/attachment/attachment-storage.provider.js +35 -0
  10. package/src/lib/attachment/attachment-storage.provider.js.map +1 -0
  11. package/src/lib/attachment/{attachment-storage.token.ts → attachment-storage.token.d.ts} +1 -3
  12. package/src/lib/attachment/attachment-storage.token.js +5 -0
  13. package/src/lib/attachment/attachment-storage.token.js.map +1 -0
  14. package/src/lib/attachment/attachment.controller.d.ts +8 -0
  15. package/src/lib/attachment/attachment.controller.js +38 -0
  16. package/src/lib/attachment/attachment.controller.js.map +1 -0
  17. package/src/lib/attachment/attachment.entity.d.ts +14 -0
  18. package/src/lib/attachment/attachment.entity.js +74 -0
  19. package/src/lib/attachment/attachment.entity.js.map +1 -0
  20. package/src/lib/attachment/attachment.module.d.ts +27 -0
  21. package/src/lib/attachment/attachment.module.js +103 -0
  22. package/src/lib/attachment/attachment.module.js.map +1 -0
  23. package/src/lib/attachment/attachment.mutations.d.ts +8 -0
  24. package/src/lib/attachment/attachment.mutations.js +35 -0
  25. package/src/lib/attachment/attachment.mutations.js.map +1 -0
  26. package/src/lib/attachment/attachment.queries.d.ts +9 -0
  27. package/src/lib/attachment/attachment.queries.js +78 -0
  28. package/src/lib/attachment/attachment.queries.js.map +1 -0
  29. package/src/lib/attachment/attachment.service.d.ts +49 -0
  30. package/src/lib/attachment/attachment.service.js +276 -0
  31. package/src/lib/attachment/attachment.service.js.map +1 -0
  32. package/src/lib/attachment/dto/upload-attachment.input.d.ts +11 -0
  33. package/src/lib/attachment/dto/upload-attachment.input.js +68 -0
  34. package/src/lib/attachment/dto/upload-attachment.input.js.map +1 -0
  35. package/src/lib/attachment/index.js +9 -0
  36. package/src/lib/attachment/index.js.map +1 -0
  37. package/src/lib/bpm/bpm-root.module.d.ts +155 -0
  38. package/src/lib/bpm/bpm-root.module.js +170 -0
  39. package/src/lib/bpm/bpm-root.module.js.map +1 -0
  40. package/src/lib/bpm/index.js +5 -0
  41. package/src/lib/bpm/index.js.map +1 -0
  42. package/src/lib/bpm-auth/bpm-auth-context.d.ts +24 -0
  43. package/src/lib/bpm-auth/bpm-auth-context.extractor.d.ts +4 -0
  44. package/src/lib/bpm-auth/bpm-auth-context.extractor.js +69 -0
  45. package/src/lib/bpm-auth/bpm-auth-context.extractor.js.map +1 -0
  46. package/src/lib/bpm-auth/bpm-auth-context.js +15 -0
  47. package/src/lib/bpm-auth/bpm-auth-context.js.map +1 -0
  48. package/src/lib/bpm-auth/bpm-auth.authorization.d.ts +12 -0
  49. package/src/lib/bpm-auth/bpm-auth.authorization.js +67 -0
  50. package/src/lib/bpm-auth/bpm-auth.authorization.js.map +1 -0
  51. package/src/lib/bpm-auth/bpm-auth.decorators.d.ts +3 -0
  52. package/src/lib/bpm-auth/bpm-auth.decorators.js +11 -0
  53. package/src/lib/bpm-auth/bpm-auth.decorators.js.map +1 -0
  54. package/src/lib/bpm-auth/bpm-auth.guard.d.ts +7 -0
  55. package/src/lib/bpm-auth/bpm-auth.guard.js +24 -0
  56. package/src/lib/bpm-auth/bpm-auth.guard.js.map +1 -0
  57. package/src/lib/bpm-auth/bpm-auth.module.d.ts +6 -0
  58. package/src/lib/bpm-auth/bpm-auth.module.js +69 -0
  59. package/src/lib/bpm-auth/bpm-auth.module.js.map +1 -0
  60. package/src/lib/bpm-auth/bpm-auth.options.d.ts +11 -0
  61. package/src/lib/bpm-auth/bpm-auth.options.js +3 -0
  62. package/src/lib/bpm-auth/bpm-auth.options.js.map +1 -0
  63. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.d.ts +10 -0
  64. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js +40 -0
  65. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.js.map +1 -0
  66. package/src/lib/bpm-auth/index.js +10 -0
  67. package/src/lib/bpm-auth/index.js.map +1 -0
  68. package/src/lib/common/filters/all-exceptions.filter.d.ts +25 -0
  69. package/src/lib/common/filters/all-exceptions.filter.js +93 -0
  70. package/src/lib/common/filters/all-exceptions.filter.js.map +1 -0
  71. package/src/lib/common/index.js +5 -0
  72. package/src/lib/common/index.js.map +1 -0
  73. package/src/lib/common/iso-duration.d.ts +1 -0
  74. package/src/lib/common/iso-duration.js +27 -0
  75. package/src/lib/common/iso-duration.js.map +1 -0
  76. package/src/lib/condition/condition.module.d.ts +2 -0
  77. package/src/lib/condition/condition.module.js +16 -0
  78. package/src/lib/condition/condition.module.js.map +1 -0
  79. package/src/lib/condition/condition.service.d.ts +16 -0
  80. package/src/lib/condition/condition.service.js +82 -0
  81. package/src/lib/condition/condition.service.js.map +1 -0
  82. package/src/lib/condition/index.js +6 -0
  83. package/src/lib/condition/index.js.map +1 -0
  84. package/src/lib/database/data-source.d.ts +4 -0
  85. package/src/lib/database/data-source.js +7 -0
  86. package/src/lib/database/data-source.js.map +1 -0
  87. package/src/lib/database/index.js +6 -0
  88. package/src/lib/database/index.js.map +1 -0
  89. package/src/lib/database/migration-runner.d.ts +1 -0
  90. package/src/lib/database/migration-runner.js +25 -0
  91. package/src/lib/database/migration-runner.js.map +1 -0
  92. package/src/lib/database/reconcile-legacy-migrations.d.ts +13 -0
  93. package/src/lib/database/reconcile-legacy-migrations.js +70 -0
  94. package/src/lib/database/reconcile-legacy-migrations.js.map +1 -0
  95. package/src/lib/database/typeorm.config.d.ts +14 -0
  96. package/src/lib/database/typeorm.config.js +135 -0
  97. package/src/lib/database/typeorm.config.js.map +1 -0
  98. package/src/lib/delegation/delegation-rule.entity.d.ts +19 -0
  99. package/src/lib/delegation/delegation-rule.entity.js +99 -0
  100. package/src/lib/delegation/delegation-rule.entity.js.map +1 -0
  101. package/src/lib/delegation/delegation.enums.d.ts +10 -0
  102. package/src/lib/delegation/delegation.enums.js +23 -0
  103. package/src/lib/delegation/delegation.enums.js.map +1 -0
  104. package/src/lib/delegation/delegation.module.d.ts +2 -0
  105. package/src/lib/delegation/delegation.module.js +22 -0
  106. package/src/lib/delegation/delegation.module.js.map +1 -0
  107. package/src/lib/delegation/delegation.mutations.d.ts +11 -0
  108. package/src/lib/delegation/delegation.mutations.js +87 -0
  109. package/src/lib/delegation/delegation.mutations.js.map +1 -0
  110. package/src/lib/delegation/delegation.queries.d.ts +10 -0
  111. package/src/lib/delegation/delegation.queries.js +91 -0
  112. package/src/lib/delegation/delegation.queries.js.map +1 -0
  113. package/src/lib/delegation/delegation.service.d.ts +56 -0
  114. package/src/lib/delegation/delegation.service.js +268 -0
  115. package/src/lib/delegation/delegation.service.js.map +1 -0
  116. package/src/lib/delegation/dto/delegation-rule.input.d.ts +24 -0
  117. package/src/lib/delegation/dto/delegation-rule.input.js +143 -0
  118. package/src/lib/delegation/dto/delegation-rule.input.js.map +1 -0
  119. package/src/lib/delegation/index.js +9 -0
  120. package/src/lib/delegation/index.js.map +1 -0
  121. package/src/lib/form/dto/form-definition.input.d.ts +26 -0
  122. package/src/lib/form/dto/form-definition.input.js +126 -0
  123. package/src/lib/form/dto/form-definition.input.js.map +1 -0
  124. package/src/lib/form/form-definition-version.entity.d.ts +17 -0
  125. package/src/lib/form/form-definition-version.entity.js +84 -0
  126. package/src/lib/form/form-definition-version.entity.js.map +1 -0
  127. package/src/lib/form/form-definition.entity.d.ts +13 -0
  128. package/src/lib/form/form-definition.entity.js +66 -0
  129. package/src/lib/form/form-definition.entity.js.map +1 -0
  130. package/src/lib/form/form-schema-lint.object.d.ts +4 -0
  131. package/src/lib/form/form-schema-lint.object.js +20 -0
  132. package/src/lib/form/form-schema-lint.object.js.map +1 -0
  133. package/src/lib/form/form-schema.validator.d.ts +13 -0
  134. package/src/lib/form/form-schema.validator.js +354 -0
  135. package/src/lib/form/form-schema.validator.js.map +1 -0
  136. package/src/lib/form/form.enums.d.ts +9 -0
  137. package/src/lib/form/form.enums.js +22 -0
  138. package/src/lib/form/form.enums.js.map +1 -0
  139. package/src/lib/form/form.module.d.ts +2 -0
  140. package/src/lib/form/form.module.js +27 -0
  141. package/src/lib/form/form.module.js.map +1 -0
  142. package/src/lib/form/form.mutations.d.ts +14 -0
  143. package/src/lib/form/form.mutations.js +89 -0
  144. package/src/lib/form/form.mutations.js.map +1 -0
  145. package/src/lib/form/form.queries.d.ts +16 -0
  146. package/src/lib/form/form.queries.js +96 -0
  147. package/src/lib/form/form.queries.js.map +1 -0
  148. package/src/lib/form/form.service.d.ts +49 -0
  149. package/src/lib/form/form.service.js +346 -0
  150. package/src/lib/form/form.service.js.map +1 -0
  151. package/src/lib/form/index.js +12 -0
  152. package/src/lib/form/index.js.map +1 -0
  153. package/src/lib/identity/identity-options.d.ts +13 -0
  154. package/src/lib/identity/identity-options.js +20 -0
  155. package/src/lib/identity/identity-options.js.map +1 -0
  156. package/src/lib/identity/identity.module.d.ts +17 -0
  157. package/src/lib/identity/identity.module.js +65 -0
  158. package/src/lib/identity/identity.module.js.map +1 -0
  159. package/src/lib/identity/identity.queries.d.ts +12 -0
  160. package/src/lib/identity/identity.queries.js +79 -0
  161. package/src/lib/identity/identity.queries.js.map +1 -0
  162. package/src/lib/identity/identity.service.d.ts +31 -0
  163. package/src/lib/identity/identity.service.js +196 -0
  164. package/src/lib/identity/identity.service.js.map +1 -0
  165. package/src/lib/identity/index.js +8 -0
  166. package/src/lib/identity/index.js.map +1 -0
  167. package/src/lib/identity/member-base.adapter.d.ts +123 -0
  168. package/src/lib/identity/member-base.adapter.js +147 -0
  169. package/src/lib/identity/member-base.adapter.js.map +1 -0
  170. package/src/lib/identity/member-metadata-cache.entity.d.ts +8 -0
  171. package/src/lib/identity/member-metadata-cache.entity.js +39 -0
  172. package/src/lib/identity/member-metadata-cache.entity.js.map +1 -0
  173. package/src/lib/identity/{member-not-found.exception.ts → member-not-found.exception.d.ts} +3 -8
  174. package/src/lib/identity/member-not-found.exception.js +26 -0
  175. package/src/lib/identity/member-not-found.exception.js.map +1 -0
  176. package/src/lib/identity/member-profile.object.d.ts +8 -0
  177. package/src/lib/identity/member-profile.object.js +37 -0
  178. package/src/lib/identity/member-profile.object.js.map +1 -0
  179. package/src/lib/identity/{member-resolver.interface.ts → member-resolver.interface.d.ts} +41 -55
  180. package/src/lib/identity/member-resolver.interface.js +19 -0
  181. package/src/lib/identity/member-resolver.interface.js.map +1 -0
  182. package/src/lib/migrations/0000000000001-enable-postgres-extensions.d.ts +6 -0
  183. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js +17 -0
  184. package/src/lib/migrations/0000000000001-enable-postgres-extensions.js.map +1 -0
  185. package/src/lib/migrations/0000000001000-identity-organization-foundation.d.ts +6 -0
  186. package/src/lib/migrations/{0000000001000-identity-organization-foundation.ts → 0000000001000-identity-organization-foundation.js} +29 -38
  187. package/src/lib/migrations/0000000001000-identity-organization-foundation.js.map +1 -0
  188. package/src/lib/migrations/0000000002000-form-builder-foundation.d.ts +6 -0
  189. package/src/lib/migrations/{0000000002000-form-builder-foundation.ts → 0000000002000-form-builder-foundation.js} +21 -22
  190. package/src/lib/migrations/0000000002000-form-builder-foundation.js.map +1 -0
  191. package/src/lib/migrations/0000000003000-approval-template-foundation.d.ts +6 -0
  192. package/src/lib/migrations/{0000000003000-approval-template-foundation.ts → 0000000003000-approval-template-foundation.js} +21 -24
  193. package/src/lib/migrations/0000000003000-approval-template-foundation.js.map +1 -0
  194. package/src/lib/migrations/0000000004000-workflow-engine-foundation.d.ts +6 -0
  195. package/src/lib/migrations/{0000000004000-workflow-engine-foundation.ts → 0000000004000-workflow-engine-foundation.js} +34 -46
  196. package/src/lib/migrations/0000000004000-workflow-engine-foundation.js.map +1 -0
  197. package/src/lib/migrations/0000000005000-delegation-rules.d.ts +6 -0
  198. package/src/lib/migrations/{0000000005000-delegation-rules.ts → 0000000005000-delegation-rules.js} +19 -20
  199. package/src/lib/migrations/0000000005000-delegation-rules.js.map +1 -0
  200. package/src/lib/migrations/0000000006000-notifications-sla.d.ts +6 -0
  201. package/src/lib/migrations/{0000000006000-notifications-sla.ts → 0000000006000-notifications-sla.js} +23 -26
  202. package/src/lib/migrations/0000000006000-notifications-sla.js.map +1 -0
  203. package/src/lib/migrations/0000000007000-signatures-attachments.d.ts +6 -0
  204. package/src/lib/migrations/{0000000007000-signatures-attachments.ts → 0000000007000-signatures-attachments.js} +27 -28
  205. package/src/lib/migrations/0000000007000-signatures-attachments.js.map +1 -0
  206. package/src/lib/migrations/0000000008000-approval-template-categories.d.ts +6 -0
  207. package/src/lib/migrations/{0000000008000-approval-template-categories.ts → 0000000008000-approval-template-categories.js} +25 -28
  208. package/src/lib/migrations/0000000008000-approval-template-categories.js.map +1 -0
  209. package/src/lib/migrations/0000000009000-task-candidates.d.ts +6 -0
  210. package/src/lib/migrations/{0000000009000-task-candidates.ts → 0000000009000-task-candidates.js} +23 -26
  211. package/src/lib/migrations/0000000009000-task-candidates.js.map +1 -0
  212. package/src/lib/migrations/0000000010000-notification-delivery-state.d.ts +6 -0
  213. package/src/lib/migrations/{0000000010000-notification-delivery-state.ts → 0000000010000-notification-delivery-state.js} +17 -16
  214. package/src/lib/migrations/0000000010000-notification-delivery-state.js.map +1 -0
  215. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.d.ts +6 -0
  216. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js +22 -0
  217. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.js.map +1 -0
  218. package/src/lib/migrations/0000000012000-notification-sla-idempotency.d.ts +6 -0
  219. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js +21 -0
  220. package/src/lib/migrations/0000000012000-notification-sla-idempotency.js.map +1 -0
  221. package/src/lib/migrations/0000000013000-workflow-query-indexes.d.ts +6 -0
  222. package/src/lib/migrations/0000000013000-workflow-query-indexes.js +80 -0
  223. package/src/lib/migrations/0000000013000-workflow-query-indexes.js.map +1 -0
  224. package/src/lib/migrations/0000000014000-notification-resolution.d.ts +6 -0
  225. package/src/lib/migrations/0000000014000-notification-resolution.js +30 -0
  226. package/src/lib/migrations/0000000014000-notification-resolution.js.map +1 -0
  227. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.d.ts +15 -0
  228. package/src/lib/migrations/{0000000015000-backfill-stale-notification-resolution.ts → 0000000015000-backfill-stale-notification-resolution.js} +16 -15
  229. package/src/lib/migrations/0000000015000-backfill-stale-notification-resolution.js.map +1 -0
  230. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.d.ts +15 -0
  231. package/src/lib/migrations/{0000000016000-archive-parallel-form-drafts.ts → 0000000016000-archive-parallel-form-drafts.js} +16 -15
  232. package/src/lib/migrations/0000000016000-archive-parallel-form-drafts.js.map +1 -0
  233. package/src/lib/migrations/0000000017000-adhoc-directives.d.ts +6 -0
  234. package/src/lib/migrations/{0000000017000-adhoc-directives.ts → 0000000017000-adhoc-directives.js} +19 -18
  235. package/src/lib/migrations/0000000017000-adhoc-directives.js.map +1 -0
  236. package/src/lib/migrations/index.d.ts +20 -0
  237. package/src/lib/migrations/index.js +61 -0
  238. package/src/lib/migrations/index.js.map +1 -0
  239. package/src/lib/notification/dto/notification-preference.input.d.ts +9 -0
  240. package/src/lib/notification/dto/notification-preference.input.js +53 -0
  241. package/src/lib/notification/dto/notification-preference.input.js.map +1 -0
  242. package/src/lib/notification/index.js +11 -0
  243. package/src/lib/notification/index.js.map +1 -0
  244. package/src/lib/notification/notification-delivery-scheduler.service.d.ts +13 -0
  245. package/src/lib/notification/notification-delivery-scheduler.service.js +53 -0
  246. package/src/lib/notification/notification-delivery-scheduler.service.js.map +1 -0
  247. package/src/lib/notification/notification-delivery.service.d.ts +23 -0
  248. package/src/lib/notification/notification-delivery.service.js +245 -0
  249. package/src/lib/notification/notification-delivery.service.js.map +1 -0
  250. package/src/lib/notification/notification-dispatcher.token.d.ts +7 -0
  251. package/src/lib/notification/notification-dispatcher.token.js +5 -0
  252. package/src/lib/notification/notification-dispatcher.token.js.map +1 -0
  253. package/src/lib/notification/notification-options.d.ts +215 -0
  254. package/src/lib/notification/notification-options.js +128 -0
  255. package/src/lib/notification/notification-options.js.map +1 -0
  256. package/src/lib/notification/notification-options.module.d.ts +23 -0
  257. package/src/lib/notification/notification-options.module.js +41 -0
  258. package/src/lib/notification/notification-options.module.js.map +1 -0
  259. package/src/lib/notification/notification-preference.entity.d.ts +10 -0
  260. package/src/lib/notification/notification-preference.entity.js +50 -0
  261. package/src/lib/notification/notification-preference.entity.js.map +1 -0
  262. package/src/lib/notification/notification-sla-scheduler.service.d.ts +13 -0
  263. package/src/lib/notification/notification-sla-scheduler.service.js +51 -0
  264. package/src/lib/notification/notification-sla-scheduler.service.js.map +1 -0
  265. package/src/lib/notification/notification-template.d.ts +13 -0
  266. package/src/lib/notification/notification-template.js +61 -0
  267. package/src/lib/notification/notification-template.js.map +1 -0
  268. package/src/lib/notification/notification.entity.d.ts +31 -0
  269. package/src/lib/notification/notification.entity.js +149 -0
  270. package/src/lib/notification/notification.entity.js.map +1 -0
  271. package/src/lib/notification/notification.enums.d.ts +38 -0
  272. package/src/lib/notification/notification.enums.js +63 -0
  273. package/src/lib/notification/notification.enums.js.map +1 -0
  274. package/src/lib/notification/notification.module.d.ts +2 -0
  275. package/src/lib/notification/notification.module.js +45 -0
  276. package/src/lib/notification/notification.module.js.map +1 -0
  277. package/src/lib/notification/notification.mutations.d.ts +11 -0
  278. package/src/lib/notification/notification.mutations.js +64 -0
  279. package/src/lib/notification/notification.mutations.js.map +1 -0
  280. package/src/lib/notification/notification.queries.d.ts +11 -0
  281. package/src/lib/notification/notification.queries.js +77 -0
  282. package/src/lib/notification/notification.queries.js.map +1 -0
  283. package/src/lib/notification/notification.service.d.ts +121 -0
  284. package/src/lib/notification/notification.service.js +713 -0
  285. package/src/lib/notification/notification.service.js.map +1 -0
  286. package/src/lib/organization/dto/manager-resolution.input.d.ts +18 -0
  287. package/src/lib/organization/dto/manager-resolution.input.js +107 -0
  288. package/src/lib/organization/dto/manager-resolution.input.js.map +1 -0
  289. package/src/lib/organization/dto/membership.input.d.ts +16 -0
  290. package/src/lib/organization/dto/membership.input.js +99 -0
  291. package/src/lib/organization/dto/membership.input.js.map +1 -0
  292. package/src/lib/organization/dto/org-unit.input.d.ts +24 -0
  293. package/src/lib/organization/dto/org-unit.input.js +119 -0
  294. package/src/lib/organization/dto/org-unit.input.js.map +1 -0
  295. package/src/lib/organization/dto/position.input.d.ts +13 -0
  296. package/src/lib/organization/dto/position.input.js +70 -0
  297. package/src/lib/organization/dto/position.input.js.map +1 -0
  298. package/src/lib/organization/index.js +16 -0
  299. package/src/lib/organization/index.js.map +1 -0
  300. package/src/lib/organization/json-metadata.d.ts +1 -0
  301. package/src/lib/organization/json-metadata.js +14 -0
  302. package/src/lib/organization/json-metadata.js.map +1 -0
  303. package/src/lib/organization/manager-resolution.entity.d.ts +11 -0
  304. package/src/lib/organization/manager-resolution.entity.js +55 -0
  305. package/src/lib/organization/manager-resolution.entity.js.map +1 -0
  306. package/src/lib/organization/membership.entity.d.ts +11 -0
  307. package/src/lib/organization/membership.entity.js +60 -0
  308. package/src/lib/organization/membership.entity.js.map +1 -0
  309. package/src/lib/organization/org-unit-tree-commit-result.object.d.ts +4 -0
  310. package/src/lib/organization/org-unit-tree-commit-result.object.js +17 -0
  311. package/src/lib/organization/org-unit-tree-commit-result.object.js.map +1 -0
  312. package/src/lib/organization/org-unit.entity.d.ts +13 -0
  313. package/src/lib/organization/org-unit.entity.js +64 -0
  314. package/src/lib/organization/org-unit.entity.js.map +1 -0
  315. package/src/lib/organization/organization-summary.object.d.ts +6 -0
  316. package/src/lib/organization/organization-summary.object.js +28 -0
  317. package/src/lib/organization/organization-summary.object.js.map +1 -0
  318. package/src/lib/organization/organization.enums.d.ts +11 -0
  319. package/src/lib/organization/organization.enums.js +22 -0
  320. package/src/lib/organization/organization.enums.js.map +1 -0
  321. package/src/lib/organization/organization.module.d.ts +2 -0
  322. package/src/lib/organization/organization.module.js +35 -0
  323. package/src/lib/organization/organization.module.js.map +1 -0
  324. package/src/lib/organization/organization.mutations.d.ts +26 -0
  325. package/src/lib/organization/organization.mutations.js +148 -0
  326. package/src/lib/organization/organization.mutations.js.map +1 -0
  327. package/src/lib/organization/organization.queries.d.ts +23 -0
  328. package/src/lib/organization/organization.queries.js +204 -0
  329. package/src/lib/organization/organization.queries.js.map +1 -0
  330. package/src/lib/organization/organization.service.d.ts +103 -0
  331. package/src/lib/organization/organization.service.js +768 -0
  332. package/src/lib/organization/organization.service.js.map +1 -0
  333. package/src/lib/organization/position.entity.d.ts +9 -0
  334. package/src/lib/organization/position.entity.js +48 -0
  335. package/src/lib/organization/position.entity.js.map +1 -0
  336. package/src/lib/organization/resolved-manager.object.d.ts +4 -0
  337. package/src/lib/organization/resolved-manager.object.js +20 -0
  338. package/src/lib/organization/resolved-manager.object.js.map +1 -0
  339. package/src/lib/signature/index.js +8 -0
  340. package/src/lib/signature/index.js.map +1 -0
  341. package/src/lib/signature/signature-options.d.ts +33 -0
  342. package/src/lib/signature/signature-options.js +51 -0
  343. package/src/lib/signature/signature-options.js.map +1 -0
  344. package/src/lib/signature/signature-verification.object.d.ts +6 -0
  345. package/src/lib/signature/signature-verification.object.js +28 -0
  346. package/src/lib/signature/signature-verification.object.js.map +1 -0
  347. package/src/lib/signature/signature.entity.d.ts +16 -0
  348. package/src/lib/signature/signature.entity.js +88 -0
  349. package/src/lib/signature/signature.entity.js.map +1 -0
  350. package/src/lib/signature/signature.module.d.ts +11 -0
  351. package/src/lib/signature/signature.module.js +60 -0
  352. package/src/lib/signature/signature.module.js.map +1 -0
  353. package/src/lib/signature/signature.queries.d.ts +11 -0
  354. package/src/lib/signature/signature.queries.js +46 -0
  355. package/src/lib/signature/signature.queries.js.map +1 -0
  356. package/src/lib/signature/signature.service.d.ts +25 -0
  357. package/src/lib/signature/signature.service.js +124 -0
  358. package/src/lib/signature/signature.service.js.map +1 -0
  359. package/src/lib/template/approval-template-category.entity.d.ts +9 -0
  360. package/src/lib/template/approval-template-category.entity.js +49 -0
  361. package/src/lib/template/approval-template-category.entity.js.map +1 -0
  362. package/src/lib/template/approval-template-version.entity.d.ts +21 -0
  363. package/src/lib/template/approval-template-version.entity.js +106 -0
  364. package/src/lib/template/approval-template-version.entity.js.map +1 -0
  365. package/src/lib/template/approval-template.entity.d.ts +14 -0
  366. package/src/lib/template/approval-template.entity.js +74 -0
  367. package/src/lib/template/approval-template.entity.js.map +1 -0
  368. package/src/lib/template/compose-approval-template.object.d.ts +11 -0
  369. package/src/lib/template/compose-approval-template.object.js +36 -0
  370. package/src/lib/template/compose-approval-template.object.js.map +1 -0
  371. package/src/lib/template/compose-template.mutations.d.ts +8 -0
  372. package/src/lib/template/compose-template.mutations.js +32 -0
  373. package/src/lib/template/compose-template.mutations.js.map +1 -0
  374. package/src/lib/template/dto/approval-template.input.d.ts +36 -0
  375. package/src/lib/template/dto/approval-template.input.js +187 -0
  376. package/src/lib/template/dto/approval-template.input.js.map +1 -0
  377. package/src/lib/template/dto/compose-approval-template.input.d.ts +17 -0
  378. package/src/lib/template/dto/compose-approval-template.input.js +99 -0
  379. package/src/lib/template/dto/compose-approval-template.input.js.map +1 -0
  380. package/src/lib/template/index.js +14 -0
  381. package/src/lib/template/index.js.map +1 -0
  382. package/src/lib/template/template.enums.d.ts +14 -0
  383. package/src/lib/template/template.enums.js +31 -0
  384. package/src/lib/template/template.enums.js.map +1 -0
  385. package/src/lib/template/template.module.d.ts +2 -0
  386. package/src/lib/template/template.module.js +41 -0
  387. package/src/lib/template/template.module.js.map +1 -0
  388. package/src/lib/template/template.mutations.d.ts +20 -0
  389. package/src/lib/template/template.mutations.js +139 -0
  390. package/src/lib/template/template.mutations.js.map +1 -0
  391. package/src/lib/template/template.queries.d.ts +16 -0
  392. package/src/lib/template/template.queries.js +133 -0
  393. package/src/lib/template/template.queries.js.map +1 -0
  394. package/src/lib/template/template.service.d.ts +83 -0
  395. package/src/lib/template/template.service.js +654 -0
  396. package/src/lib/template/template.service.js.map +1 -0
  397. package/src/lib/template/workflow-definition.validator.d.ts +9 -0
  398. package/src/lib/template/workflow-definition.validator.js +362 -0
  399. package/src/lib/template/workflow-definition.validator.js.map +1 -0
  400. package/src/lib/testing/cel-js.jest.d.ts +15 -0
  401. package/src/lib/testing/cel-js.jest.js +27 -0
  402. package/src/lib/testing/cel-js.jest.js.map +1 -0
  403. package/src/lib/workflow-engine/activity-log.entity.d.ts +12 -0
  404. package/src/lib/workflow-engine/activity-log.entity.js +62 -0
  405. package/src/lib/workflow-engine/activity-log.entity.js.map +1 -0
  406. package/src/lib/workflow-engine/adhoc-directive.entity.d.ts +31 -0
  407. package/src/lib/workflow-engine/adhoc-directive.entity.js +105 -0
  408. package/src/lib/workflow-engine/adhoc-directive.entity.js.map +1 -0
  409. package/src/lib/workflow-engine/adhoc.enums.d.ts +21 -0
  410. package/src/lib/workflow-engine/adhoc.enums.js +42 -0
  411. package/src/lib/workflow-engine/adhoc.enums.js.map +1 -0
  412. package/src/lib/workflow-engine/approval-instance-page-info.object.d.ts +8 -0
  413. package/src/lib/workflow-engine/approval-instance-page-info.object.js +36 -0
  414. package/src/lib/workflow-engine/approval-instance-page-info.object.js.map +1 -0
  415. package/src/lib/workflow-engine/approval-instance.entity.d.ts +22 -0
  416. package/src/lib/workflow-engine/approval-instance.entity.js +113 -0
  417. package/src/lib/workflow-engine/approval-instance.entity.js.map +1 -0
  418. package/src/lib/workflow-engine/dto/adhoc-notification.input.d.ts +6 -0
  419. package/src/lib/workflow-engine/dto/adhoc-notification.input.js +28 -0
  420. package/src/lib/workflow-engine/dto/adhoc-notification.input.js.map +1 -0
  421. package/src/lib/workflow-engine/dto/adhoc-target.input.d.ts +16 -0
  422. package/src/lib/workflow-engine/dto/adhoc-target.input.js +61 -0
  423. package/src/lib/workflow-engine/dto/adhoc-target.input.js.map +1 -0
  424. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.d.ts +5 -0
  425. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js +29 -0
  426. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.js.map +1 -0
  427. package/src/lib/workflow-engine/dto/decide-task.input.d.ts +9 -0
  428. package/src/lib/workflow-engine/dto/decide-task.input.js +47 -0
  429. package/src/lib/workflow-engine/dto/decide-task.input.js.map +1 -0
  430. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.d.ts +6 -0
  431. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js +34 -0
  432. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.js.map +1 -0
  433. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.d.ts +6 -0
  434. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js +34 -0
  435. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.js.map +1 -0
  436. package/src/lib/workflow-engine/dto/submit-approval-instance.input.d.ts +7 -0
  437. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js +40 -0
  438. package/src/lib/workflow-engine/dto/submit-approval-instance.input.js.map +1 -0
  439. package/src/lib/workflow-engine/index.js +28 -0
  440. package/src/lib/workflow-engine/index.js.map +1 -0
  441. package/src/lib/workflow-engine/task-candidate.entity.d.ts +14 -0
  442. package/src/lib/workflow-engine/task-candidate.entity.js +72 -0
  443. package/src/lib/workflow-engine/task-candidate.entity.js.map +1 -0
  444. package/src/lib/workflow-engine/task-decision.entity.d.ts +12 -0
  445. package/src/lib/workflow-engine/task-decision.entity.js +60 -0
  446. package/src/lib/workflow-engine/task-decision.entity.js.map +1 -0
  447. package/src/lib/workflow-engine/task.entity.d.ts +25 -0
  448. package/src/lib/workflow-engine/task.entity.js +130 -0
  449. package/src/lib/workflow-engine/task.entity.js.map +1 -0
  450. package/src/lib/workflow-engine/workflow-condition-evaluator.d.ts +5 -0
  451. package/src/lib/workflow-engine/workflow-condition-evaluator.js +107 -0
  452. package/src/lib/workflow-engine/workflow-condition-evaluator.js.map +1 -0
  453. package/src/lib/workflow-engine/workflow-dashboard-summary.object.d.ts +8 -0
  454. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js +36 -0
  455. package/src/lib/workflow-engine/workflow-dashboard-summary.object.js.map +1 -0
  456. package/src/lib/workflow-engine/workflow-dry-run.object.d.ts +21 -0
  457. package/src/lib/workflow-engine/workflow-dry-run.object.js +86 -0
  458. package/src/lib/workflow-engine/workflow-dry-run.object.js.map +1 -0
  459. package/src/lib/workflow-engine/workflow-engine.enums.d.ts +61 -0
  460. package/src/lib/workflow-engine/workflow-engine.enums.js +98 -0
  461. package/src/lib/workflow-engine/workflow-engine.enums.js.map +1 -0
  462. package/src/lib/workflow-engine/workflow-engine.module.d.ts +9 -0
  463. package/src/lib/workflow-engine/workflow-engine.module.js +78 -0
  464. package/src/lib/workflow-engine/workflow-engine.module.js.map +1 -0
  465. package/src/lib/workflow-engine/workflow-engine.mutations.d.ts +29 -0
  466. package/src/lib/workflow-engine/workflow-engine.mutations.js +218 -0
  467. package/src/lib/workflow-engine/workflow-engine.mutations.js.map +1 -0
  468. package/src/lib/workflow-engine/workflow-engine.queries.d.ts +31 -0
  469. package/src/lib/workflow-engine/workflow-engine.queries.js +237 -0
  470. package/src/lib/workflow-engine/workflow-engine.queries.js.map +1 -0
  471. package/src/lib/workflow-engine/workflow-engine.service.d.ts +188 -0
  472. package/src/lib/workflow-engine/workflow-engine.service.js +3561 -0
  473. package/src/lib/workflow-engine/workflow-engine.service.js.map +1 -0
  474. package/src/lib/workflow-engine/{workflow-engine.tokens.ts → workflow-engine.tokens.d.ts} +3 -9
  475. package/src/lib/workflow-engine/workflow-engine.tokens.js +5 -0
  476. package/src/lib/workflow-engine/workflow-engine.tokens.js.map +1 -0
  477. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.d.ts +18 -0
  478. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js +39 -0
  479. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.js.map +1 -0
  480. package/src/lib/workflow-engine/workflow-token.entity.d.ts +10 -0
  481. package/src/lib/workflow-engine/workflow-token.entity.js +50 -0
  482. package/src/lib/workflow-engine/workflow-token.entity.js.map +1 -0
  483. package/eslint.config.mjs +0 -20
  484. package/jest.config.cts +0 -15
  485. package/project.json +0 -58
  486. package/src/lib/attachment/attachment-options.spec.ts +0 -45
  487. package/src/lib/attachment/attachment-options.ts +0 -130
  488. package/src/lib/attachment/attachment-storage.provider.spec.ts +0 -79
  489. package/src/lib/attachment/attachment-storage.provider.ts +0 -60
  490. package/src/lib/attachment/attachment.controller.ts +0 -39
  491. package/src/lib/attachment/attachment.entity.ts +0 -59
  492. package/src/lib/attachment/attachment.module.ts +0 -149
  493. package/src/lib/attachment/attachment.mutations.ts +0 -22
  494. package/src/lib/attachment/attachment.queries.ts +0 -65
  495. package/src/lib/attachment/attachment.service.spec.ts +0 -319
  496. package/src/lib/attachment/attachment.service.ts +0 -477
  497. package/src/lib/attachment/dto/upload-attachment.input.ts +0 -60
  498. package/src/lib/bpm/bpm-root.module.spec.ts +0 -138
  499. package/src/lib/bpm/bpm-root.module.ts +0 -320
  500. package/src/lib/bpm-auth/bpm-auth-context.extractor.ts +0 -106
  501. package/src/lib/bpm-auth/bpm-auth-context.ts +0 -40
  502. package/src/lib/bpm-auth/bpm-auth.authorization.ts +0 -80
  503. package/src/lib/bpm-auth/bpm-auth.decorators.ts +0 -19
  504. package/src/lib/bpm-auth/bpm-auth.guard.ts +0 -31
  505. package/src/lib/bpm-auth/bpm-auth.module.spec.ts +0 -106
  506. package/src/lib/bpm-auth/bpm-auth.module.ts +0 -69
  507. package/src/lib/bpm-auth/bpm-auth.options.ts +0 -21
  508. package/src/lib/bpm-auth/configurable-bpm-auth-context.accessor.ts +0 -55
  509. package/src/lib/common/filters/all-exceptions.filter.ts +0 -138
  510. package/src/lib/common/iso-duration.ts +0 -31
  511. package/src/lib/condition/condition.module.ts +0 -8
  512. package/src/lib/condition/condition.service.spec.ts +0 -50
  513. package/src/lib/condition/condition.service.ts +0 -141
  514. package/src/lib/database/data-source.ts +0 -7
  515. package/src/lib/database/migration-runner.ts +0 -26
  516. package/src/lib/database/reconcile-legacy-migrations.ts +0 -87
  517. package/src/lib/database/typeorm.config.ts +0 -217
  518. package/src/lib/delegation/delegation-rule.entity.ts +0 -84
  519. package/src/lib/delegation/delegation.enums.ts +0 -21
  520. package/src/lib/delegation/delegation.module.ts +0 -14
  521. package/src/lib/delegation/delegation.mutations.ts +0 -92
  522. package/src/lib/delegation/delegation.queries.ts +0 -111
  523. package/src/lib/delegation/delegation.service.spec.ts +0 -295
  524. package/src/lib/delegation/delegation.service.ts +0 -482
  525. package/src/lib/delegation/dto/delegation-rule.input.ts +0 -125
  526. package/src/lib/form/dto/form-definition.input.ts +0 -90
  527. package/src/lib/form/form-definition-version.entity.ts +0 -66
  528. package/src/lib/form/form-definition.entity.ts +0 -54
  529. package/src/lib/form/form-schema-lint.object.ts +0 -10
  530. package/src/lib/form/form-schema.validator.spec.ts +0 -180
  531. package/src/lib/form/form-schema.validator.ts +0 -538
  532. package/src/lib/form/form.enums.ts +0 -20
  533. package/src/lib/form/form.module.ts +0 -19
  534. package/src/lib/form/form.mutations.ts +0 -73
  535. package/src/lib/form/form.queries.ts +0 -72
  536. package/src/lib/form/form.service.spec.ts +0 -371
  537. package/src/lib/form/form.service.ts +0 -607
  538. package/src/lib/identity/identity-options.ts +0 -41
  539. package/src/lib/identity/identity.module.ts +0 -96
  540. package/src/lib/identity/identity.queries.ts +0 -61
  541. package/src/lib/identity/identity.service.spec.ts +0 -328
  542. package/src/lib/identity/identity.service.ts +0 -277
  543. package/src/lib/identity/member-base.adapter.spec.ts +0 -122
  544. package/src/lib/identity/member-base.adapter.ts +0 -302
  545. package/src/lib/identity/member-metadata-cache.entity.ts +0 -27
  546. package/src/lib/identity/member-profile.object.ts +0 -28
  547. package/src/lib/migrations/0000000000001-enable-postgres-extensions.ts +0 -14
  548. package/src/lib/migrations/0000000011000-remove-attachment-encryption-key.ts +0 -19
  549. package/src/lib/migrations/0000000012000-notification-sla-idempotency.ts +0 -22
  550. package/src/lib/migrations/0000000013000-workflow-query-indexes.ts +0 -113
  551. package/src/lib/migrations/0000000014000-notification-resolution.ts +0 -29
  552. package/src/lib/migrations/index.ts +0 -59
  553. package/src/lib/notification/dto/notification-preference.input.ts +0 -46
  554. package/src/lib/notification/notification-delivery-scheduler.service.ts +0 -69
  555. package/src/lib/notification/notification-delivery.service.spec.ts +0 -315
  556. package/src/lib/notification/notification-delivery.service.ts +0 -339
  557. package/src/lib/notification/notification-dispatcher.token.ts +0 -13
  558. package/src/lib/notification/notification-options.module.ts +0 -67
  559. package/src/lib/notification/notification-options.spec.ts +0 -93
  560. package/src/lib/notification/notification-options.ts +0 -452
  561. package/src/lib/notification/notification-preference.entity.ts +0 -35
  562. package/src/lib/notification/notification-sla-scheduler.service.ts +0 -66
  563. package/src/lib/notification/notification-template.spec.ts +0 -33
  564. package/src/lib/notification/notification-template.ts +0 -97
  565. package/src/lib/notification/notification.entity.ts +0 -129
  566. package/src/lib/notification/notification.enums.ts +0 -64
  567. package/src/lib/notification/notification.module.ts +0 -37
  568. package/src/lib/notification/notification.mutations.ts +0 -47
  569. package/src/lib/notification/notification.queries.ts +0 -64
  570. package/src/lib/notification/notification.service.spec.ts +0 -412
  571. package/src/lib/notification/notification.service.ts +0 -1129
  572. package/src/lib/organization/dto/manager-resolution.input.ts +0 -91
  573. package/src/lib/organization/dto/membership.input.ts +0 -77
  574. package/src/lib/organization/dto/org-unit.input.ts +0 -96
  575. package/src/lib/organization/dto/position.input.ts +0 -50
  576. package/src/lib/organization/json-metadata.ts +0 -15
  577. package/src/lib/organization/manager-resolution.entity.ts +0 -44
  578. package/src/lib/organization/membership.entity.ts +0 -50
  579. package/src/lib/organization/org-unit-tree-commit-result.object.ts +0 -8
  580. package/src/lib/organization/org-unit.entity.ts +0 -53
  581. package/src/lib/organization/organization-summary.object.ts +0 -16
  582. package/src/lib/organization/organization.enums.ts +0 -19
  583. package/src/lib/organization/organization.module.ts +0 -27
  584. package/src/lib/organization/organization.mutations.ts +0 -115
  585. package/src/lib/organization/organization.queries.ts +0 -191
  586. package/src/lib/organization/organization.service.spec.ts +0 -835
  587. package/src/lib/organization/organization.service.ts +0 -1245
  588. package/src/lib/organization/position.entity.ts +0 -39
  589. package/src/lib/organization/resolved-manager.object.ts +0 -10
  590. package/src/lib/signature/signature-options.spec.ts +0 -60
  591. package/src/lib/signature/signature-options.ts +0 -120
  592. package/src/lib/signature/signature-verification.object.ts +0 -16
  593. package/src/lib/signature/signature.entity.ts +0 -62
  594. package/src/lib/signature/signature.module.ts +0 -80
  595. package/src/lib/signature/signature.queries.ts +0 -37
  596. package/src/lib/signature/signature.service.spec.ts +0 -134
  597. package/src/lib/signature/signature.service.ts +0 -205
  598. package/src/lib/template/approval-template-category.entity.ts +0 -40
  599. package/src/lib/template/approval-template-version.entity.ts +0 -82
  600. package/src/lib/template/approval-template.entity.ts +0 -64
  601. package/src/lib/template/compose-approval-template.object.ts +0 -23
  602. package/src/lib/template/compose-template.mutations.ts +0 -22
  603. package/src/lib/template/dto/approval-template.input.ts +0 -147
  604. package/src/lib/template/dto/compose-approval-template.input.ts +0 -80
  605. package/src/lib/template/template.enums.ts +0 -30
  606. package/src/lib/template/template.module.ts +0 -33
  607. package/src/lib/template/template.mutations.ts +0 -106
  608. package/src/lib/template/template.queries.ts +0 -119
  609. package/src/lib/template/template.service.spec.ts +0 -822
  610. package/src/lib/template/template.service.ts +0 -1082
  611. package/src/lib/template/workflow-definition.validator.spec.ts +0 -595
  612. package/src/lib/template/workflow-definition.validator.ts +0 -539
  613. package/src/lib/testing/cel-js.jest.ts +0 -46
  614. package/src/lib/workflow-engine/activity-log.entity.ts +0 -48
  615. package/src/lib/workflow-engine/adhoc-directive.entity.ts +0 -90
  616. package/src/lib/workflow-engine/adhoc.enums.ts +0 -42
  617. package/src/lib/workflow-engine/approval-instance-page-info.object.ts +0 -22
  618. package/src/lib/workflow-engine/approval-instance.entity.ts +0 -86
  619. package/src/lib/workflow-engine/dto/adhoc-notification.input.ts +0 -18
  620. package/src/lib/workflow-engine/dto/adhoc-target.input.ts +0 -52
  621. package/src/lib/workflow-engine/dto/cancel-approval-instance.input.ts +0 -18
  622. package/src/lib/workflow-engine/dto/decide-task.input.ts +0 -33
  623. package/src/lib/workflow-engine/dto/dry-run-approval-workflow.input.ts +0 -22
  624. package/src/lib/workflow-engine/dto/resubmit-approval-instance.input.ts +0 -22
  625. package/src/lib/workflow-engine/dto/submit-approval-instance.input.ts +0 -27
  626. package/src/lib/workflow-engine/task-candidate.entity.ts +0 -56
  627. package/src/lib/workflow-engine/task-decision.entity.ts +0 -43
  628. package/src/lib/workflow-engine/task.entity.ts +0 -102
  629. package/src/lib/workflow-engine/workflow-condition-evaluator.ts +0 -168
  630. package/src/lib/workflow-engine/workflow-dashboard-summary.object.ts +0 -22
  631. package/src/lib/workflow-engine/workflow-dry-run.object.ts +0 -58
  632. package/src/lib/workflow-engine/workflow-engine.enums.ts +0 -102
  633. package/src/lib/workflow-engine/workflow-engine.module.ts +0 -77
  634. package/src/lib/workflow-engine/workflow-engine.mutations.ts +0 -193
  635. package/src/lib/workflow-engine/workflow-engine.queries.ts +0 -241
  636. package/src/lib/workflow-engine/workflow-engine.service.spec.ts +0 -3345
  637. package/src/lib/workflow-engine/workflow-engine.service.ts +0 -6022
  638. package/src/lib/workflow-engine/workflow-service-task-dispatcher.token.ts +0 -69
  639. package/src/lib/workflow-engine/workflow-token.entity.ts +0 -40
  640. package/tsconfig.json +0 -24
  641. package/tsconfig.lib.json +0 -16
  642. package/tsconfig.spec.json +0 -16
  643. /package/src/{index.ts → index.d.ts} +0 -0
  644. /package/src/lib/attachment/{index.ts → index.d.ts} +0 -0
  645. /package/src/lib/bpm/{index.ts → index.d.ts} +0 -0
  646. /package/src/lib/bpm-auth/{index.ts → index.d.ts} +0 -0
  647. /package/src/lib/common/{index.ts → index.d.ts} +0 -0
  648. /package/src/lib/condition/{index.ts → index.d.ts} +0 -0
  649. /package/src/lib/database/{index.ts → index.d.ts} +0 -0
  650. /package/src/lib/delegation/{index.ts → index.d.ts} +0 -0
  651. /package/src/lib/form/{index.ts → index.d.ts} +0 -0
  652. /package/src/lib/identity/{index.ts → index.d.ts} +0 -0
  653. /package/src/lib/notification/{index.ts → index.d.ts} +0 -0
  654. /package/src/lib/organization/{index.ts → index.d.ts} +0 -0
  655. /package/src/lib/signature/{index.ts → index.d.ts} +0 -0
  656. /package/src/lib/template/{index.ts → index.d.ts} +0 -0
  657. /package/src/lib/workflow-engine/{index.ts → index.d.ts} +0 -0
@@ -1,1245 +0,0 @@
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
- }