@dynamatix/gb-schemas 2.17.13 → 2.19.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 (251) hide show
  1. package/dist/applicants/applicant-additional-income.model.d.ts +1 -0
  2. package/dist/applicants/applicant-additional-income.model.d.ts.map +1 -1
  3. package/dist/applicants/applicant-additional-income.type.d.ts +1 -0
  4. package/dist/applicants/applicant-additional-income.type.d.ts.map +1 -1
  5. package/dist/applicants/applicant-commitment-creditCard.model.d.ts +1 -0
  6. package/dist/applicants/applicant-commitment-creditCard.model.d.ts.map +1 -1
  7. package/dist/applicants/applicant-commitment-loan.model.d.ts +1 -0
  8. package/dist/applicants/applicant-commitment-loan.model.d.ts.map +1 -1
  9. package/dist/applicants/applicant-commitment-mortgage.model.d.ts +1 -0
  10. package/dist/applicants/applicant-commitment-mortgage.model.d.ts.map +1 -1
  11. package/dist/applicants/applicant-commitment-residence.model.d.ts +1 -0
  12. package/dist/applicants/applicant-commitment-residence.model.d.ts.map +1 -1
  13. package/dist/applicants/applicant-commitment-secureLoan.model.d.ts +1 -0
  14. package/dist/applicants/applicant-commitment-secureLoan.model.d.ts.map +1 -1
  15. package/dist/applicants/applicant-commitment-unsecuredLoan.model.d.ts +1 -0
  16. package/dist/applicants/applicant-commitment-unsecuredLoan.model.d.ts.map +1 -1
  17. package/dist/applicants/applicant-credit-data.model.d.ts +1 -0
  18. package/dist/applicants/applicant-credit-data.model.d.ts.map +1 -1
  19. package/dist/applicants/applicant-credit-profile.model.d.ts +1 -0
  20. package/dist/applicants/applicant-credit-profile.model.d.ts.map +1 -1
  21. package/dist/applicants/applicant-credit-report.model.d.ts +1 -0
  22. package/dist/applicants/applicant-credit-report.model.d.ts.map +1 -1
  23. package/dist/applicants/applicant-credit-report.type.d.ts +1 -0
  24. package/dist/applicants/applicant-credit-report.type.d.ts.map +1 -1
  25. package/dist/applicants/applicant-employment-income.model.d.ts +1 -0
  26. package/dist/applicants/applicant-employment-income.model.d.ts.map +1 -1
  27. package/dist/applicants/applicant-employment-income.type.d.ts +1 -0
  28. package/dist/applicants/applicant-employment-income.type.d.ts.map +1 -1
  29. package/dist/applicants/applicant-employment.model.d.ts +1 -0
  30. package/dist/applicants/applicant-employment.model.d.ts.map +1 -1
  31. package/dist/applicants/applicant-expenditure.model.d.ts +1 -0
  32. package/dist/applicants/applicant-expenditure.model.d.ts.map +1 -1
  33. package/dist/applicants/applicant-expenditure.type.d.ts +1 -0
  34. package/dist/applicants/applicant-expenditure.type.d.ts.map +1 -1
  35. package/dist/applicants/applicant-income-settings.model.d.ts +1 -0
  36. package/dist/applicants/applicant-income-settings.model.d.ts.map +1 -1
  37. package/dist/applicants/applicant-income-settings.type.d.ts +1 -0
  38. package/dist/applicants/applicant-income-settings.type.d.ts.map +1 -1
  39. package/dist/applicants/applicant-income-summary.model.d.ts +1 -0
  40. package/dist/applicants/applicant-income-summary.model.d.ts.map +1 -1
  41. package/dist/applicants/applicant-income-summary.type.d.ts +1 -0
  42. package/dist/applicants/applicant-income-summary.type.d.ts.map +1 -1
  43. package/dist/applicants/applicant-large-exposure.model.d.ts +1 -0
  44. package/dist/applicants/applicant-large-exposure.model.d.ts.map +1 -1
  45. package/dist/applicants/applicant-large-exposure.type.d.ts +1 -0
  46. package/dist/applicants/applicant-large-exposure.type.d.ts.map +1 -1
  47. package/dist/applicants/applicant-pension-income.model.d.ts +1 -0
  48. package/dist/applicants/applicant-pension-income.model.d.ts.map +1 -1
  49. package/dist/applicants/applicant-pension-income.type.d.ts +1 -0
  50. package/dist/applicants/applicant-pension-income.type.d.ts.map +1 -1
  51. package/dist/applicants/applicant-property-income.model.d.ts +1 -0
  52. package/dist/applicants/applicant-property-income.model.d.ts.map +1 -1
  53. package/dist/applicants/applicant-property-income.type.d.ts +1 -0
  54. package/dist/applicants/applicant-property-income.type.d.ts.map +1 -1
  55. package/dist/applicants/applicant-risk-narrative.model.d.ts +1 -0
  56. package/dist/applicants/applicant-risk-narrative.model.d.ts.map +1 -1
  57. package/dist/applicants/applicant-self-employed-income.model.d.ts +1 -0
  58. package/dist/applicants/applicant-self-employed-income.model.d.ts.map +1 -1
  59. package/dist/applicants/applicant-self-employed-income.type.d.ts +1 -0
  60. package/dist/applicants/applicant-self-employed-income.type.d.ts.map +1 -1
  61. package/dist/applicants/applicant-self-employment.model.d.ts +1 -0
  62. package/dist/applicants/applicant-self-employment.model.d.ts.map +1 -1
  63. package/dist/applicants/applicant-sole-trader-income.model.d.ts +1 -0
  64. package/dist/applicants/applicant-sole-trader-income.model.d.ts.map +1 -1
  65. package/dist/applicants/applicant-sole-trader-income.type.d.ts +1 -0
  66. package/dist/applicants/applicant-sole-trader-income.type.d.ts.map +1 -1
  67. package/dist/applicants/applicant-uk-tax-credits.model.d.ts +1 -0
  68. package/dist/applicants/applicant-uk-tax-credits.model.d.ts.map +1 -1
  69. package/dist/applicants/applicant-uk-tax-credits.type.d.ts +1 -0
  70. package/dist/applicants/applicant-uk-tax-credits.type.d.ts.map +1 -1
  71. package/dist/applicants/applicant-welcome-call.model.d.ts +1 -0
  72. package/dist/applicants/applicant-welcome-call.model.d.ts.map +1 -1
  73. package/dist/applicants/applicant-welcome-call.type.d.ts +1 -0
  74. package/dist/applicants/applicant-welcome-call.type.d.ts.map +1 -1
  75. package/dist/applicants/applicant.model.d.ts +1 -54
  76. package/dist/applicants/applicant.model.d.ts.map +1 -1
  77. package/dist/applicants/applicant.model.js +31 -33
  78. package/dist/applicants/applicant.type.d.ts +1 -1
  79. package/dist/applicants/applicant.type.d.ts.map +1 -1
  80. package/dist/applications/application-audit.model.d.ts +1 -0
  81. package/dist/applications/application-audit.model.d.ts.map +1 -1
  82. package/dist/applications/application-checklist-Item.model.d.ts +1 -0
  83. package/dist/applications/application-checklist-Item.model.d.ts.map +1 -1
  84. package/dist/applications/application-company-model.d.ts +1 -0
  85. package/dist/applications/application-company-model.d.ts.map +1 -1
  86. package/dist/applications/application-credit-profile.model.d.ts +1 -0
  87. package/dist/applications/application-credit-profile.model.d.ts.map +1 -1
  88. package/dist/applications/application-direct-debit.model.d.ts +1 -0
  89. package/dist/applications/application-direct-debit.model.d.ts.map +1 -1
  90. package/dist/applications/application-direct-debit.model.js +18 -10
  91. package/dist/applications/application-direct-debit.type.d.ts +1 -0
  92. package/dist/applications/application-direct-debit.type.d.ts.map +1 -1
  93. package/dist/applications/application-euc.model.d.ts +1 -0
  94. package/dist/applications/application-euc.model.d.ts.map +1 -1
  95. package/dist/applications/application-euc.type.d.ts +1 -0
  96. package/dist/applications/application-euc.type.d.ts.map +1 -1
  97. package/dist/applications/application-fieldconfig.model.d.ts +1 -0
  98. package/dist/applications/application-fieldconfig.model.d.ts.map +1 -1
  99. package/dist/applications/application-illustration-model.d.ts +1 -0
  100. package/dist/applications/application-illustration-model.d.ts.map +1 -1
  101. package/dist/applications/application-legal.model.d.ts +1 -0
  102. package/dist/applications/application-legal.model.d.ts.map +1 -1
  103. package/dist/applications/application-mortgage.model.d.ts +1 -0
  104. package/dist/applications/application-mortgage.model.d.ts.map +1 -1
  105. package/dist/applications/application-mortgage.type.d.ts +1 -0
  106. package/dist/applications/application-mortgage.type.d.ts.map +1 -1
  107. package/dist/applications/application-note.model.d.ts +1 -0
  108. package/dist/applications/application-note.model.d.ts.map +1 -1
  109. package/dist/applications/application-note.type.d.ts +1 -0
  110. package/dist/applications/application-note.type.d.ts.map +1 -1
  111. package/dist/applications/application-offer.model.d.ts +1 -0
  112. package/dist/applications/application-offer.model.d.ts.map +1 -1
  113. package/dist/applications/application-offer.type.d.ts +1 -0
  114. package/dist/applications/application-offer.type.d.ts.map +1 -1
  115. package/dist/applications/application-onboarding.model.d.ts +1 -0
  116. package/dist/applications/application-onboarding.model.d.ts.map +1 -1
  117. package/dist/applications/application-product.model.d.ts +1 -0
  118. package/dist/applications/application-product.model.d.ts.map +1 -1
  119. package/dist/applications/application-product.type.d.ts +1 -0
  120. package/dist/applications/application-product.type.d.ts.map +1 -1
  121. package/dist/applications/application-productfeatures.model.d.ts +1 -0
  122. package/dist/applications/application-productfeatures.model.d.ts.map +1 -1
  123. package/dist/applications/application-productfeatures.type.d.ts +1 -0
  124. package/dist/applications/application-productfeatures.type.d.ts.map +1 -1
  125. package/dist/applications/application-rationale.model.d.ts +1 -0
  126. package/dist/applications/application-rationale.model.d.ts.map +1 -1
  127. package/dist/applications/application-rationale.type.d.ts +1 -0
  128. package/dist/applications/application-rationale.type.d.ts.map +1 -1
  129. package/dist/applications/application-risk-narrative.model.d.ts +1 -0
  130. package/dist/applications/application-risk-narrative.model.d.ts.map +1 -1
  131. package/dist/applications/application-valuation-report.model.d.ts +1 -0
  132. package/dist/applications/application-valuation-report.model.d.ts.map +1 -1
  133. package/dist/applications/application-valuation-report.type.d.ts +1 -0
  134. package/dist/applications/application-valuation-report.type.d.ts.map +1 -1
  135. package/dist/applications/application-valuation.model.d.ts +1 -0
  136. package/dist/applications/application-valuation.model.d.ts.map +1 -1
  137. package/dist/applications/application-valuation.type.d.ts +1 -0
  138. package/dist/applications/application-valuation.type.d.ts.map +1 -1
  139. package/dist/applications/application.model.d.ts +1 -0
  140. package/dist/applications/application.model.d.ts.map +1 -1
  141. package/dist/applications/applications-task.model.d.ts +1 -0
  142. package/dist/applications/applications-task.model.d.ts.map +1 -1
  143. package/dist/applications/applications-task.type.d.ts +1 -0
  144. package/dist/applications/applications-task.type.d.ts.map +1 -1
  145. package/dist/applications/broker.model.d.ts +1 -0
  146. package/dist/applications/broker.model.d.ts.map +1 -1
  147. package/dist/applications/broker.type.d.ts +1 -0
  148. package/dist/applications/broker.type.d.ts.map +1 -1
  149. package/dist/applications/solicitor.model.d.ts +1 -0
  150. package/dist/applications/solicitor.model.d.ts.map +1 -1
  151. package/dist/applications/solicitor.type.d.ts +1 -0
  152. package/dist/applications/solicitor.type.d.ts.map +1 -1
  153. package/dist/product-catalogues/product-catalogue.model.d.ts +1 -0
  154. package/dist/product-catalogues/product-catalogue.model.d.ts.map +1 -1
  155. package/dist/product-catalogues/product-definitions.model.d.ts +1 -0
  156. package/dist/product-catalogues/product-definitions.model.d.ts.map +1 -1
  157. package/dist/product-catalogues/product-definitions.type.d.ts +1 -0
  158. package/dist/product-catalogues/product-definitions.type.d.ts.map +1 -1
  159. package/dist/product-catalogues/product-variant.model.d.ts +1 -0
  160. package/dist/product-catalogues/product-variant.model.d.ts.map +1 -1
  161. package/dist/product-catalogues/product-variant.type.d.ts +1 -0
  162. package/dist/product-catalogues/product-variant.type.d.ts.map +1 -1
  163. package/dist/properties/property.model.d.ts +1 -0
  164. package/dist/properties/property.model.d.ts.map +1 -1
  165. package/dist/properties/security.model.d.ts +1 -0
  166. package/dist/properties/security.model.d.ts.map +1 -1
  167. package/dist/shared/alert.model.d.ts +1 -0
  168. package/dist/shared/alert.model.d.ts.map +1 -1
  169. package/dist/shared/api-log.model.d.ts +1 -0
  170. package/dist/shared/api-log.model.d.ts.map +1 -1
  171. package/dist/shared/api-performance.model.d.ts +1 -0
  172. package/dist/shared/api-performance.model.d.ts.map +1 -1
  173. package/dist/shared/api-performance.type.d.ts +1 -0
  174. package/dist/shared/api-performance.type.d.ts.map +1 -1
  175. package/dist/shared/apprivo-sync-journey.model.d.ts +1 -0
  176. package/dist/shared/apprivo-sync-journey.model.d.ts.map +1 -1
  177. package/dist/shared/checklist.model.d.ts +1 -0
  178. package/dist/shared/checklist.model.d.ts.map +1 -1
  179. package/dist/shared/encryption/encrypted-field-map.d.ts +141 -0
  180. package/dist/shared/encryption/encrypted-field-map.d.ts.map +1 -0
  181. package/dist/shared/encryption/encrypted-field-map.js +126 -0
  182. package/dist/shared/encryption/encryption.config.d.ts +55 -0
  183. package/dist/shared/encryption/encryption.config.d.ts.map +1 -0
  184. package/dist/shared/encryption/encryption.config.js +76 -0
  185. package/dist/shared/encryption/encryption.init.d.ts +66 -0
  186. package/dist/shared/encryption/encryption.init.d.ts.map +1 -0
  187. package/dist/shared/encryption/encryption.init.js +86 -0
  188. package/dist/shared/encryption/encryption.service.d.ts +110 -0
  189. package/dist/shared/encryption/encryption.service.d.ts.map +1 -0
  190. package/dist/shared/encryption/encryption.service.js +151 -0
  191. package/dist/shared/encryption/index.d.ts +6 -0
  192. package/dist/shared/encryption/index.d.ts.map +1 -0
  193. package/dist/shared/encryption/index.js +4 -0
  194. package/dist/shared/index.d.ts +2 -0
  195. package/dist/shared/index.d.ts.map +1 -1
  196. package/dist/shared/index.js +2 -0
  197. package/dist/shared/job-run.model.d.ts +1 -0
  198. package/dist/shared/job-run.model.d.ts.map +1 -1
  199. package/dist/shared/job-setting.model.d.ts +1 -0
  200. package/dist/shared/job-setting.model.d.ts.map +1 -1
  201. package/dist/shared/lookup-group.model.d.ts +1 -0
  202. package/dist/shared/lookup-group.model.d.ts.map +1 -1
  203. package/dist/shared/lookup.model.d.ts +7 -0
  204. package/dist/shared/lookup.model.d.ts.map +1 -1
  205. package/dist/shared/lookup.model.js +5 -0
  206. package/dist/shared/schema-doc.model.d.ts +1 -0
  207. package/dist/shared/schema-doc.model.d.ts.map +1 -1
  208. package/dist/shared/system-parameter.model.d.ts +1 -0
  209. package/dist/shared/system-parameter.model.d.ts.map +1 -1
  210. package/dist/shared/task-document.model.d.ts +1 -0
  211. package/dist/shared/task-document.model.d.ts.map +1 -1
  212. package/dist/shared/task.model.d.ts +1 -0
  213. package/dist/shared/task.model.d.ts.map +1 -1
  214. package/dist/shared/webhook-event.model.d.ts +1 -0
  215. package/dist/shared/webhook-event.model.d.ts.map +1 -1
  216. package/dist/shared/workflow-trigger.model.d.ts +1 -0
  217. package/dist/shared/workflow-trigger.model.d.ts.map +1 -1
  218. package/dist/shared/workflow-trigger.type.d.ts +1 -0
  219. package/dist/shared/workflow-trigger.type.d.ts.map +1 -1
  220. package/dist/shared/workflow.middleware.d.ts +1 -0
  221. package/dist/shared/workflow.middleware.d.ts.map +1 -1
  222. package/dist/shared/workflow.plugin.d.ts +1 -0
  223. package/dist/shared/workflow.plugin.d.ts.map +1 -1
  224. package/dist/types/base.types.d.ts +1 -0
  225. package/dist/types/base.types.d.ts.map +1 -1
  226. package/dist/underwriter/underwriter.model.d.ts +1 -0
  227. package/dist/underwriter/underwriter.model.d.ts.map +1 -1
  228. package/dist/users/auth-log.model.d.ts +1 -0
  229. package/dist/users/auth-log.model.d.ts.map +1 -1
  230. package/dist/users/permission.model.d.ts +1 -0
  231. package/dist/users/permission.model.d.ts.map +1 -1
  232. package/dist/users/role-group.model.d.ts +1 -0
  233. package/dist/users/role-group.model.d.ts.map +1 -1
  234. package/dist/users/role.model.d.ts +1 -0
  235. package/dist/users/role.model.d.ts.map +1 -1
  236. package/dist/users/tasks.model.d.ts +1 -0
  237. package/dist/users/tasks.model.d.ts.map +1 -1
  238. package/dist/users/user.model.d.ts +1 -0
  239. package/dist/users/user.model.d.ts.map +1 -1
  240. package/dist/users/user.type.d.ts +1 -0
  241. package/dist/users/user.type.d.ts.map +1 -1
  242. package/dist/value-objects/account-number.d.ts +1 -0
  243. package/dist/value-objects/account-number.d.ts.map +1 -1
  244. package/dist/value-objects/pound.d.ts +1 -0
  245. package/dist/value-objects/pound.d.ts.map +1 -1
  246. package/dist/value-objects/sort-code.d.ts +1 -0
  247. package/dist/value-objects/sort-code.d.ts.map +1 -1
  248. package/package.json +6 -3
  249. package/dist/applicants/applicant-direct-debit.model.d.ts +0 -86
  250. package/dist/applicants/applicant-direct-debit.model.d.ts.map +0 -1
  251. package/dist/applicants/applicant-direct-debit.model.js +0 -16
@@ -0,0 +1,86 @@
1
+ import { EncryptionConfig } from './encryption.config.js';
2
+ import { EncryptionService } from './encryption.service.js';
3
+ /**
4
+ * Process-wide bootstrap for the encryption layer, mirroring the
5
+ * `initializeWorkflowMiddleware` pattern used elsewhere in this package.
6
+ *
7
+ * Consumer services call {@link EncryptionBootstrap.initialize} exactly once
8
+ * at startup (right after connecting to MongoDB); everything else — the
9
+ * Mongoose plugin, repositories, adapters — obtains the shared singleton via
10
+ * {@link EncryptionBootstrap.getService}.
11
+ */
12
+ export class EncryptionBootstrap {
13
+ constructor() { }
14
+ /**
15
+ * Initializes the singleton {@link EncryptionService} from the
16
+ * environment and a connected client. Idempotent: repeated calls return
17
+ * the already-initialized instance.
18
+ *
19
+ * @param client - A connected {@link MongoClient}.
20
+ * @param env - Environment map, defaults to `process.env`.
21
+ * @returns The initialized singleton service.
22
+ * @throws Error when `GH_ENCRYPTION_MASTER_KEY` is missing or malformed.
23
+ * @example
24
+ * ```ts
25
+ * await mongoose.connect(uri);
26
+ * await EncryptionBootstrap.initialize(
27
+ * mongoose.connection.getClient() as unknown as MongoClient
28
+ * );
29
+ * ```
30
+ */
31
+ static async initialize(client, env = process.env) {
32
+ if (EncryptionBootstrap.service) {
33
+ return EncryptionBootstrap.service;
34
+ }
35
+ const service = new EncryptionService(EncryptionConfig.load(env));
36
+ await service.init(client);
37
+ EncryptionBootstrap.service = service;
38
+ return service;
39
+ }
40
+ /**
41
+ * Returns the initialized singleton service.
42
+ *
43
+ * @returns The shared {@link EncryptionService}.
44
+ * @throws Error when called before {@link initialize}.
45
+ * @example
46
+ * ```ts
47
+ * const ciphertext = await EncryptionBootstrap.getService().encrypt(value);
48
+ * ```
49
+ */
50
+ static getService() {
51
+ if (!EncryptionBootstrap.service) {
52
+ throw new Error('Encryption is not initialized. Call EncryptionBootstrap.initialize(client) ' +
53
+ '(initializeEncryption) at service bootstrap first.');
54
+ }
55
+ return EncryptionBootstrap.service;
56
+ }
57
+ /**
58
+ * Reports whether the encryption layer has been bootstrapped.
59
+ *
60
+ * @returns `true` after a successful {@link initialize} call.
61
+ * @example
62
+ * ```ts
63
+ * if (!EncryptionBootstrap.isInitialized()) {
64
+ * await EncryptionBootstrap.initialize(client);
65
+ * }
66
+ * ```
67
+ */
68
+ static isInitialized() {
69
+ return EncryptionBootstrap.service !== null;
70
+ }
71
+ /**
72
+ * Tears down the singleton (used by tests and graceful shutdown).
73
+ *
74
+ * @example
75
+ * ```ts
76
+ * await EncryptionBootstrap.reset();
77
+ * ```
78
+ */
79
+ static async reset() {
80
+ if (EncryptionBootstrap.service) {
81
+ await EncryptionBootstrap.service.close();
82
+ EncryptionBootstrap.service = null;
83
+ }
84
+ }
85
+ }
86
+ EncryptionBootstrap.service = null;
@@ -0,0 +1,110 @@
1
+ import { MongoClient, Binary } from 'mongodb';
2
+ import { EncryptionConfig } from './encryption.config.js';
3
+ /**
4
+ * Explicit Client-Side Field Level Encryption service.
5
+ *
6
+ * Wraps the driver's {@link ClientEncryption} with the Gatehouse conventions:
7
+ * a single shared DEK (alt name `gatehouse-dek`) stored in the
8
+ * `encryption.__keyVault` collection and wrapped by the `local` master key
9
+ * from {@link EncryptionConfig}. Only RANDOM
10
+ * (`AEAD_AES_256_CBC_HMAC_SHA_512-Random`) mode is exposed — encrypted fields
11
+ * are never queryable, by design. There is deliberately no deterministic API.
12
+ *
13
+ * Works against MongoDB Community — explicit encryption needs no mongocryptd
14
+ * or crypt_shared sidecar.
15
+ */
16
+ export declare class EncryptionService {
17
+ private readonly config;
18
+ private static readonly RANDOM_ALGORITHM;
19
+ private clientEncryption;
20
+ private dataKeyId;
21
+ constructor(config: EncryptionConfig);
22
+ /**
23
+ * Initializes the service against a connected client: ensures the key
24
+ * vault collection and its unique partial index on `keyAltNames`, then
25
+ * resolves the shared DEK by alt name — creating it on first ever run.
26
+ * Idempotent and safe to call from multiple services against the same DB.
27
+ *
28
+ * @param client - A connected {@link MongoClient} for the target cluster.
29
+ * @example
30
+ * ```ts
31
+ * const service = new EncryptionService(EncryptionConfig.load(process.env));
32
+ * await service.init(mongoClient);
33
+ * ```
34
+ */
35
+ init(client: MongoClient): Promise<void>;
36
+ /**
37
+ * Encrypts a value with the shared DEK in RANDOM mode. The same plaintext
38
+ * yields different ciphertext on every call, so encrypted fields must
39
+ * never appear in query filters, sorts, or indexes.
40
+ *
41
+ * @param value - Any BSON-serialisable value (string, number, object, array).
42
+ * @returns Ciphertext as BSON {@link Binary} subtype 6.
43
+ * @throws Error when called before {@link init}.
44
+ * @example
45
+ * ```ts
46
+ * const ciphertext = await service.encrypt('AB123456C');
47
+ * await collection.updateOne({ _id }, { $set: { niNumber: ciphertext } });
48
+ * ```
49
+ */
50
+ encrypt(value: unknown): Promise<Binary>;
51
+ /**
52
+ * Decrypts ciphertext previously produced by {@link encrypt}, restoring
53
+ * the original BSON value (string, number, object or array).
54
+ *
55
+ * @param value - BSON {@link Binary} subtype 6 ciphertext.
56
+ * @returns The original plaintext value.
57
+ * @throws Error when called before {@link init}.
58
+ * @example
59
+ * ```ts
60
+ * const plaintext = await service.decrypt(doc.niNumber);
61
+ * ```
62
+ */
63
+ decrypt<T = unknown>(value: Binary): Promise<T>;
64
+ /**
65
+ * Releases the underlying libmongocrypt resources. Call on shutdown.
66
+ *
67
+ * @example
68
+ * ```ts
69
+ * await service.close();
70
+ * ```
71
+ */
72
+ close(): Promise<void>;
73
+ /**
74
+ * Creates the key vault's unique partial index on `keyAltNames`, matching
75
+ * the official CSFLE key vault requirements. Idempotent.
76
+ *
77
+ * @param client - Connected client used to reach the key vault namespace.
78
+ * @example
79
+ * ```ts
80
+ * // internal use only — called by init()
81
+ * ```
82
+ */
83
+ private ensureKeyVaultIndex;
84
+ /**
85
+ * Resolves the shared DEK by its alt name, creating it if this is the
86
+ * very first bootstrap of the environment. The unique index guarantees a
87
+ * concurrent double-create loses cleanly, so this is race-safe.
88
+ *
89
+ * @returns The DEK id used for all encrypt operations.
90
+ * @example
91
+ * ```ts
92
+ * // internal use only — called by init()
93
+ * ```
94
+ */
95
+ private resolveOrCreateDataKey;
96
+ /**
97
+ * Guards against use before {@link init} with a descriptive error that
98
+ * tells the caller exactly what to do.
99
+ *
100
+ * @param requireKey - Whether the DEK must also be resolved already.
101
+ * @returns The non-null encryption handle and DEK id.
102
+ * @throws Error when the service has not been initialized.
103
+ * @example
104
+ * ```ts
105
+ * // internal use only
106
+ * ```
107
+ */
108
+ private requireInitialized;
109
+ }
110
+ //# sourceMappingURL=encryption.service.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"encryption.service.d.ts","sourceRoot":"","sources":["../../../shared/encryption/encryption.service.ts"],"names":[],"mappings":"AAAA,OAAO,EAAoB,WAAW,EAAE,MAAM,EAAE,MAAM,SAAS,CAAC;AAChE,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAE1D;;;;;;;;;;;;GAYG;AACH,qBAAa,iBAAiB;IAOP,OAAO,CAAC,QAAQ,CAAC,MAAM;IAN1C,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAA0C;IAElF,OAAO,CAAC,gBAAgB,CAAiC;IAEzD,OAAO,CAAC,SAAS,CAAuB;gBAEJ,MAAM,EAAE,gBAAgB;IAE5D;;;;;;;;;;;;OAYG;IACU,IAAI,CAAC,MAAM,EAAE,WAAW,GAAG,OAAO,CAAC,IAAI,CAAC;IASrD;;;;;;;;;;;;;OAaG;IACU,OAAO,CAAC,KAAK,EAAE,OAAO,GAAG,OAAO,CAAC,MAAM,CAAC;IAQrD;;;;;;;;;;;OAWG;IACU,OAAO,CAAC,CAAC,GAAG,OAAO,EAAE,KAAK,EAAE,MAAM,GAAG,OAAO,CAAC,CAAC,CAAC;IAK5D;;;;;;;OAOG;IACU,KAAK,IAAI,OAAO,CAAC,IAAI,CAAC;IAOnC;;;;;;;;;OASG;YACW,mBAAmB;IAQjC;;;;;;;;;;OAUG;YACW,sBAAsB;IAWpC;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,kBAAkB;CAe7B"}
@@ -0,0 +1,151 @@
1
+ import { ClientEncryption } from 'mongodb';
2
+ /**
3
+ * Explicit Client-Side Field Level Encryption service.
4
+ *
5
+ * Wraps the driver's {@link ClientEncryption} with the Gatehouse conventions:
6
+ * a single shared DEK (alt name `gatehouse-dek`) stored in the
7
+ * `encryption.__keyVault` collection and wrapped by the `local` master key
8
+ * from {@link EncryptionConfig}. Only RANDOM
9
+ * (`AEAD_AES_256_CBC_HMAC_SHA_512-Random`) mode is exposed — encrypted fields
10
+ * are never queryable, by design. There is deliberately no deterministic API.
11
+ *
12
+ * Works against MongoDB Community — explicit encryption needs no mongocryptd
13
+ * or crypt_shared sidecar.
14
+ */
15
+ export class EncryptionService {
16
+ constructor(config) {
17
+ this.config = config;
18
+ this.clientEncryption = null;
19
+ this.dataKeyId = null;
20
+ }
21
+ /**
22
+ * Initializes the service against a connected client: ensures the key
23
+ * vault collection and its unique partial index on `keyAltNames`, then
24
+ * resolves the shared DEK by alt name — creating it on first ever run.
25
+ * Idempotent and safe to call from multiple services against the same DB.
26
+ *
27
+ * @param client - A connected {@link MongoClient} for the target cluster.
28
+ * @example
29
+ * ```ts
30
+ * const service = new EncryptionService(EncryptionConfig.load(process.env));
31
+ * await service.init(mongoClient);
32
+ * ```
33
+ */
34
+ async init(client) {
35
+ await this.ensureKeyVaultIndex(client);
36
+ this.clientEncryption = new ClientEncryption(client, {
37
+ keyVaultNamespace: this.config.keyVaultNamespace,
38
+ kmsProviders: { local: { key: this.config.masterKey } }
39
+ });
40
+ this.dataKeyId = await this.resolveOrCreateDataKey();
41
+ }
42
+ /**
43
+ * Encrypts a value with the shared DEK in RANDOM mode. The same plaintext
44
+ * yields different ciphertext on every call, so encrypted fields must
45
+ * never appear in query filters, sorts, or indexes.
46
+ *
47
+ * @param value - Any BSON-serialisable value (string, number, object, array).
48
+ * @returns Ciphertext as BSON {@link Binary} subtype 6.
49
+ * @throws Error when called before {@link init}.
50
+ * @example
51
+ * ```ts
52
+ * const ciphertext = await service.encrypt('AB123456C');
53
+ * await collection.updateOne({ _id }, { $set: { niNumber: ciphertext } });
54
+ * ```
55
+ */
56
+ async encrypt(value) {
57
+ const { clientEncryption, dataKeyId } = this.requireInitialized();
58
+ return clientEncryption.encrypt(value, {
59
+ keyId: dataKeyId,
60
+ algorithm: EncryptionService.RANDOM_ALGORITHM
61
+ });
62
+ }
63
+ /**
64
+ * Decrypts ciphertext previously produced by {@link encrypt}, restoring
65
+ * the original BSON value (string, number, object or array).
66
+ *
67
+ * @param value - BSON {@link Binary} subtype 6 ciphertext.
68
+ * @returns The original plaintext value.
69
+ * @throws Error when called before {@link init}.
70
+ * @example
71
+ * ```ts
72
+ * const plaintext = await service.decrypt(doc.niNumber);
73
+ * ```
74
+ */
75
+ async decrypt(value) {
76
+ const { clientEncryption } = this.requireInitialized();
77
+ return clientEncryption.decrypt(value);
78
+ }
79
+ /**
80
+ * Releases the underlying libmongocrypt resources. Call on shutdown.
81
+ *
82
+ * @example
83
+ * ```ts
84
+ * await service.close();
85
+ * ```
86
+ */
87
+ async close() {
88
+ if (this.clientEncryption) {
89
+ this.clientEncryption = null;
90
+ this.dataKeyId = null;
91
+ }
92
+ }
93
+ /**
94
+ * Creates the key vault's unique partial index on `keyAltNames`, matching
95
+ * the official CSFLE key vault requirements. Idempotent.
96
+ *
97
+ * @param client - Connected client used to reach the key vault namespace.
98
+ * @example
99
+ * ```ts
100
+ * // internal use only — called by init()
101
+ * ```
102
+ */
103
+ async ensureKeyVaultIndex(client) {
104
+ const [dbName, collectionName] = this.config.keyVaultNamespace.split('.');
105
+ await client.db(dbName).collection(collectionName).createIndex({ keyAltNames: 1 }, { unique: true, partialFilterExpression: { keyAltNames: { $exists: true } } });
106
+ }
107
+ /**
108
+ * Resolves the shared DEK by its alt name, creating it if this is the
109
+ * very first bootstrap of the environment. The unique index guarantees a
110
+ * concurrent double-create loses cleanly, so this is race-safe.
111
+ *
112
+ * @returns The DEK id used for all encrypt operations.
113
+ * @example
114
+ * ```ts
115
+ * // internal use only — called by init()
116
+ * ```
117
+ */
118
+ async resolveOrCreateDataKey() {
119
+ const { clientEncryption } = this.requireInitialized(false);
120
+ const existing = await clientEncryption.getKeyByAltName(this.config.keyAltName);
121
+ if (existing) {
122
+ return existing._id;
123
+ }
124
+ return clientEncryption.createDataKey('local', {
125
+ keyAltNames: [this.config.keyAltName]
126
+ });
127
+ }
128
+ /**
129
+ * Guards against use before {@link init} with a descriptive error that
130
+ * tells the caller exactly what to do.
131
+ *
132
+ * @param requireKey - Whether the DEK must also be resolved already.
133
+ * @returns The non-null encryption handle and DEK id.
134
+ * @throws Error when the service has not been initialized.
135
+ * @example
136
+ * ```ts
137
+ * // internal use only
138
+ * ```
139
+ */
140
+ requireInitialized(requireKey = true) {
141
+ if (!this.clientEncryption || (requireKey && !this.dataKeyId)) {
142
+ throw new Error('EncryptionService is not initialized. Call init(mongoClient) at bootstrap ' +
143
+ 'before encrypting or decrypting.');
144
+ }
145
+ return {
146
+ clientEncryption: this.clientEncryption,
147
+ dataKeyId: this.dataKeyId
148
+ };
149
+ }
150
+ }
151
+ EncryptionService.RANDOM_ALGORITHM = 'AEAD_AES_256_CBC_HMAC_SHA_512-Random';
@@ -0,0 +1,6 @@
1
+ export { EncryptionConfig } from './encryption.config.js';
2
+ export { EncryptionService } from './encryption.service.js';
3
+ export { EncryptionBootstrap } from './encryption.init.js';
4
+ export { EncryptedFieldMapBuilder } from './encrypted-field-map.js';
5
+ export type { EncryptedFieldEntry, EncryptedFieldMap } from './encrypted-field-map.js';
6
+ //# sourceMappingURL=index.d.ts.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../shared/encryption/index.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,gBAAgB,EAAE,MAAM,wBAAwB,CAAC;AAC1D,OAAO,EAAE,iBAAiB,EAAE,MAAM,yBAAyB,CAAC;AAC5D,OAAO,EAAE,mBAAmB,EAAE,MAAM,sBAAsB,CAAC;AAC3D,OAAO,EAAE,wBAAwB,EAAE,MAAM,0BAA0B,CAAC;AACpE,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,0BAA0B,CAAC"}
@@ -0,0 +1,4 @@
1
+ export { EncryptionConfig } from './encryption.config.js';
2
+ export { EncryptionService } from './encryption.service.js';
3
+ export { EncryptionBootstrap } from './encryption.init.js';
4
+ export { EncryptedFieldMapBuilder } from './encrypted-field-map.js';
@@ -16,4 +16,6 @@ export { default as IWebhookEvent } from './webhook-event.type';
16
16
  export { default as ApiPerformanceLogModel } from './api-performance.model';
17
17
  export { default as IApiPerformance } from './api-performance.type';
18
18
  export { initializeWorkflowMiddleware, initializeWorkflowMiddlewareWithCheck, isWorkflowMiddlewareConfigured } from './workflow.init';
19
+ export { EncryptionConfig, EncryptionService, EncryptionBootstrap, EncryptedFieldMapBuilder } from './encryption/index.js';
20
+ export type { EncryptedFieldEntry, EncryptedFieldMap } from './encryption/index.js';
19
21
  //# sourceMappingURL=index.d.ts.map
@@ -1 +1 @@
1
- {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../shared/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,4BAA4B,EAAE,qCAAqC,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC"}
1
+ {"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../shared/index.ts"],"names":[],"mappings":"AACA,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,gBAAgB,CAAC;AACxD,OAAO,EAAE,OAAO,IAAI,oBAAoB,EAAE,MAAM,0BAA0B,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,UAAU,EAAE,MAAM,eAAe,CAAC;AACtD,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,mBAAmB,CAAA;AAC7D,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,qBAAqB,CAAA;AAChE,OAAO,EAAE,OAAO,IAAI,SAAS,EAAE,MAAM,cAAc,CAAC;AACpD,OAAO,EAAE,OAAO,IAAI,uBAAuB,EAAE,MAAM,8BAA8B,CAAC;AAClF,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,iBAAiB,EAAE,MAAM,uBAAuB,CAAC;AACrE,OAAO,EAAE,OAAO,IAAI,gBAAgB,EAAE,MAAM,sBAAsB,CAAC;AACnE,OAAO,EAAE,OAAO,IAAI,qBAAqB,EAAE,MAAM,uBAAuB,CAAC;AACzE,OAAO,EAAE,OAAO,IAAI,cAAc,EAAE,MAAM,oBAAoB,CAAC;AAC/D,OAAO,EAAE,OAAO,IAAI,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACzD,OAAO,EAAE,OAAO,IAAI,aAAa,EAAE,MAAM,sBAAsB,CAAC;AAChE,OAAO,EAAE,OAAO,IAAI,sBAAsB,EAAC,MAAM,yBAAyB,CAAC;AAC3E,OAAO,EAAE,OAAO,IAAI,eAAe,EAAE,MAAM,wBAAwB,CAAC;AAGpE,OAAO,EAAE,4BAA4B,EAAE,qCAAqC,EAAE,8BAA8B,EAAE,MAAM,iBAAiB,CAAC;AAGtI,OAAO,EAAE,gBAAgB,EAAE,iBAAiB,EAAE,mBAAmB,EAAE,wBAAwB,EAAE,MAAM,uBAAuB,CAAC;AAC3H,YAAY,EAAE,mBAAmB,EAAE,iBAAiB,EAAE,MAAM,uBAAuB,CAAC"}
@@ -14,3 +14,5 @@ export { default as ApiLogModel } from './api-log.model';
14
14
  export { default as ApiPerformanceLogModel } from './api-performance.model';
15
15
  // Workflow middleware initialization exports
16
16
  export { initializeWorkflowMiddleware, initializeWorkflowMiddlewareWithCheck, isWorkflowMiddlewareConfigured } from './workflow.init';
17
+ // Field-level encryption exports
18
+ export { EncryptionConfig, EncryptionService, EncryptionBootstrap, EncryptedFieldMapBuilder } from './encryption/index.js';
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"job-run.model.d.ts","sourceRoot":"","sources":["../../shared/job-run.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAc5C,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA0C,CAAC;AAC5D,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"job-run.model.d.ts","sourceRoot":"","sources":["../../shared/job-run.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAc5C,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA0C,CAAC;AAC5D,eAAe,WAAW,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"job-setting.model.d.ts","sourceRoot":"","sources":["../../shared/job-setting.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAWhC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAkD,CAAC;AAExE,eAAe,eAAe,CAAC"}
1
+ {"version":3,"file":"job-setting.model.d.ts","sourceRoot":"","sources":["../../shared/job-setting.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAWhC,QAAA,MAAM,eAAe;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAkD,CAAC;AAExE,eAAe,eAAe,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate.js" />
5
6
  /// <reference types="mongoose/types/callback.js" />
6
7
  /// <reference types="mongoose/types/collection.js" />
@@ -1 +1 @@
1
- {"version":3,"file":"lookup-group.model.d.ts","sourceRoot":"","sources":["../../shared/lookup-group.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAwBhC,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAmD,CAAC;AAC1E,eAAe,gBAAgB,CAAC"}
1
+ {"version":3,"file":"lookup-group.model.d.ts","sourceRoot":"","sources":["../../shared/lookup-group.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAwBhC,QAAA,MAAM,gBAAgB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAmD,CAAC;AAC1E,eAAe,gBAAgB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -36,6 +37,7 @@ declare const LookupModel: mongoose.Model<{
36
37
  name: string;
37
38
  value?: string | null | undefined;
38
39
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
40
+ orderValue?: number | null | undefined;
39
41
  }, {}, {}, {}, mongoose.Document<unknown, {}, {
40
42
  createdAt: NativeDate;
41
43
  updatedAt: NativeDate;
@@ -45,6 +47,7 @@ declare const LookupModel: mongoose.Model<{
45
47
  name: string;
46
48
  value?: string | null | undefined;
47
49
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
50
+ orderValue?: number | null | undefined;
48
51
  }, {}> & {
49
52
  createdAt: NativeDate;
50
53
  updatedAt: NativeDate;
@@ -54,6 +57,7 @@ declare const LookupModel: mongoose.Model<{
54
57
  name: string;
55
58
  value?: string | null | undefined;
56
59
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
60
+ orderValue?: number | null | undefined;
57
61
  } & {
58
62
  _id: mongoose.Types.ObjectId;
59
63
  } & {
@@ -69,6 +73,7 @@ declare const LookupModel: mongoose.Model<{
69
73
  name: string;
70
74
  value?: string | null | undefined;
71
75
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
76
+ orderValue?: number | null | undefined;
72
77
  }, mongoose.Document<unknown, {}, mongoose.FlatRecord<{
73
78
  createdAt: NativeDate;
74
79
  updatedAt: NativeDate;
@@ -78,6 +83,7 @@ declare const LookupModel: mongoose.Model<{
78
83
  name: string;
79
84
  value?: string | null | undefined;
80
85
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
86
+ orderValue?: number | null | undefined;
81
87
  }>, {}> & mongoose.FlatRecord<{
82
88
  createdAt: NativeDate;
83
89
  updatedAt: NativeDate;
@@ -87,6 +93,7 @@ declare const LookupModel: mongoose.Model<{
87
93
  name: string;
88
94
  value?: string | null | undefined;
89
95
  lookupGroupId?: mongoose.Types.ObjectId | null | undefined;
96
+ orderValue?: number | null | undefined;
90
97
  }> & {
91
98
  _id: mongoose.Types.ObjectId;
92
99
  } & {
@@ -1 +1 @@
1
- {"version":3,"file":"lookup.model.d.ts","sourceRoot":"","sources":["../../shared/lookup.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAqChC,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAyC,CAAC;AAC3D,eAAe,WAAW,CAAC"}
1
+ {"version":3,"file":"lookup.model.d.ts","sourceRoot":"","sources":["../../shared/lookup.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA0ChC,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAyC,CAAC;AAC3D,eAAe,WAAW,CAAC"}
@@ -15,6 +15,10 @@ const lookupSchema = new mongoose.Schema({
15
15
  value: {
16
16
  type: String
17
17
  },
18
+ orderValue: {
19
+ type: Number,
20
+ description: "Optional numeric dropdown display order. When set for all lookups in a group, form options sort by this field."
21
+ },
18
22
  isActive: {
19
23
  type: Boolean,
20
24
  default: true,
@@ -23,6 +27,7 @@ const lookupSchema = new mongoose.Schema({
23
27
  }, { timestamps: true });
24
28
  lookupSchema.index({ lookupGroupId: 1 });
25
29
  lookupSchema.index({ value: 1 });
30
+ lookupSchema.index({ lookupGroupId: 1, orderValue: 1 });
26
31
  // Case-insensitive index for name queries
27
32
  lookupSchema.index({ name: 1 }, { collation: { locale: "en", strength: 2 } });
28
33
  // Compound index for lookupGroupId + name queries
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"schema-doc.model.d.ts","sourceRoot":"","sources":["../../shared/schema-doc.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,MAAM,EAAS,MAAM,UAAU,CAAC;AAWzC,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAsC,CAAC;AAE3D,eAAe,cAAc,CAAC"}
1
+ {"version":3,"file":"schema-doc.model.d.ts","sourceRoot":"","sources":["../../shared/schema-doc.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,EAAE,MAAM,EAAS,MAAM,UAAU,CAAC;AAWzC,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAsC,CAAC;AAE3D,eAAe,cAAc,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"system-parameter.model.d.ts","sourceRoot":"","sources":["../../shared/system-parameter.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAgChC,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA2D,CAAC;AACtF,eAAe,oBAAoB,CAAC"}
1
+ {"version":3,"file":"system-parameter.model.d.ts","sourceRoot":"","sources":["../../shared/system-parameter.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAgChC,QAAA,MAAM,oBAAoB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA2D,CAAC;AACtF,eAAe,oBAAoB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"task-document.model.d.ts","sourceRoot":"","sources":["../../shared/task-document.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAuBhC,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6D,CAAC;AAEzF,eAAe,qBAAqB,CAAC"}
1
+ {"version":3,"file":"task-document.model.d.ts","sourceRoot":"","sources":["../../shared/task-document.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAuBhC,QAAA,MAAM,qBAAqB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6D,CAAC;AAEzF,eAAe,qBAAqB,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"task.model.d.ts","sourceRoot":"","sources":["../../shared/task.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAmBhC,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAqC,CAAC;AACrD,eAAe,SAAS,CAAC"}
1
+ {"version":3,"file":"task.model.d.ts","sourceRoot":"","sources":["../../shared/task.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAmBhC,QAAA,MAAM,SAAS;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAqC,CAAC;AACrD,eAAe,SAAS,CAAC"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"webhook-event.model.d.ts","sourceRoot":"","sources":["../../shared/webhook-event.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAC5C,OAAO,aAAa,MAAM,sBAAsB,CAAC;;;;;;AA4DjD,wBAAiF"}
1
+ {"version":3,"file":"webhook-event.model.d.ts","sourceRoot":"","sources":["../../shared/webhook-event.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;AAC5C,OAAO,aAAa,MAAM,sBAAsB,CAAC;;;;;;AA4DjD,wBAAiF"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-trigger.model.d.ts","sourceRoot":"","sources":["../../shared/workflow-trigger.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;;AAuD5C,wBAA6H"}
1
+ {"version":3,"file":"workflow-trigger.model.d.ts","sourceRoot":"","sources":["../../shared/workflow-trigger.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAoB,MAAM,UAAU,CAAC;;AAuD5C,wBAA6H"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate" />
5
6
  /// <reference types="mongoose/types/callback" />
6
7
  /// <reference types="mongoose/types/collection" />
@@ -1 +1 @@
1
- {"version":3,"file":"workflow-trigger.type.d.ts","sourceRoot":"","sources":["../../shared/workflow-trigger.type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,CAAC,OAAO,WAAW,gBAAiB,SAAQ,QAAQ;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
1
+ {"version":3,"file":"workflow-trigger.type.d.ts","sourceRoot":"","sources":["../../shared/workflow-trigger.type.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,UAAU,CAAC;AAEpC,MAAM,CAAC,OAAO,WAAW,gBAAiB,SAAQ,QAAQ;IACtD,UAAU,EAAE,MAAM,CAAC;IACnB,WAAW,EAAE,MAAM,CAAC;IACpB,QAAQ,EAAE,OAAO,CAAC;IAClB,SAAS,EAAE,MAAM,CAAC;IAClB,WAAW,EAAE,MAAM,CAAC;IACpB,iBAAiB,EAAE,MAAM,EAAE,CAAC;IAC5B,iBAAiB,CAAC,EAAE,MAAM,EAAE,CAAC;IAC7B,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,eAAe,CAAC,EAAE,GAAG,CAAC;IACtB,QAAQ,CAAC,EAAE,GAAG,CAAC;IACf,SAAS,EAAE,IAAI,CAAC;IAChB,SAAS,EAAE,IAAI,CAAC;CACnB;AAED,MAAM,WAAW,oBAAoB;IACjC,UAAU,EAAE,MAAM,CAAC;IACnB,MAAM,EAAE,MAAM,CAAC;IACf,UAAU,EAAE,MAAM,CAAC;CACtB;AAED,MAAM,WAAW,kBAAkB;IAC/B,WAAW,EAAE,MAAM,CAAC;IACpB,OAAO,EAAE,MAAM,CAAC;IAChB,SAAS,EAAE,MAAM,CAAC,MAAM,EAAE,GAAG,CAAC,CAAC;CAClC;AAED,MAAM,WAAW,yBAAyB;IACtC,cAAc,EAAE,MAAM,CAAC;IACvB,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,UAAU,CAAC,EAAE,MAAM,CAAC;CACvB"}
@@ -1,6 +1,7 @@
1
1
  /// <reference path="../value-objects/pound.d.ts" />
2
2
  /// <reference path="../value-objects/account-number.d.ts" />
3
3
  /// <reference path="../value-objects/sort-code.d.ts" />
4
+ /// <reference path="encryption/encrypted-field-map.d.ts" />
4
5
  /// <reference types="mongoose/types/aggregate.js" />
5
6
  /// <reference types="mongoose/types/callback.js" />
6
7
  /// <reference types="mongoose/types/collection.js" />