@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.
- package/dist/applicants/applicant-additional-income.model.d.ts +1 -0
- package/dist/applicants/applicant-additional-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-additional-income.type.d.ts +1 -0
- package/dist/applicants/applicant-additional-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-creditCard.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-creditCard.model.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-loan.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-loan.model.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-mortgage.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-mortgage.model.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-residence.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-residence.model.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-secureLoan.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-secureLoan.model.d.ts.map +1 -1
- package/dist/applicants/applicant-commitment-unsecuredLoan.model.d.ts +1 -0
- package/dist/applicants/applicant-commitment-unsecuredLoan.model.d.ts.map +1 -1
- package/dist/applicants/applicant-credit-data.model.d.ts +1 -0
- package/dist/applicants/applicant-credit-data.model.d.ts.map +1 -1
- package/dist/applicants/applicant-credit-profile.model.d.ts +1 -0
- package/dist/applicants/applicant-credit-profile.model.d.ts.map +1 -1
- package/dist/applicants/applicant-credit-report.model.d.ts +1 -0
- package/dist/applicants/applicant-credit-report.model.d.ts.map +1 -1
- package/dist/applicants/applicant-credit-report.type.d.ts +1 -0
- package/dist/applicants/applicant-credit-report.type.d.ts.map +1 -1
- package/dist/applicants/applicant-employment-income.model.d.ts +1 -0
- package/dist/applicants/applicant-employment-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-employment-income.type.d.ts +1 -0
- package/dist/applicants/applicant-employment-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-employment.model.d.ts +1 -0
- package/dist/applicants/applicant-employment.model.d.ts.map +1 -1
- package/dist/applicants/applicant-expenditure.model.d.ts +1 -0
- package/dist/applicants/applicant-expenditure.model.d.ts.map +1 -1
- package/dist/applicants/applicant-expenditure.type.d.ts +1 -0
- package/dist/applicants/applicant-expenditure.type.d.ts.map +1 -1
- package/dist/applicants/applicant-income-settings.model.d.ts +1 -0
- package/dist/applicants/applicant-income-settings.model.d.ts.map +1 -1
- package/dist/applicants/applicant-income-settings.type.d.ts +1 -0
- package/dist/applicants/applicant-income-settings.type.d.ts.map +1 -1
- package/dist/applicants/applicant-income-summary.model.d.ts +1 -0
- package/dist/applicants/applicant-income-summary.model.d.ts.map +1 -1
- package/dist/applicants/applicant-income-summary.type.d.ts +1 -0
- package/dist/applicants/applicant-income-summary.type.d.ts.map +1 -1
- package/dist/applicants/applicant-large-exposure.model.d.ts +1 -0
- package/dist/applicants/applicant-large-exposure.model.d.ts.map +1 -1
- package/dist/applicants/applicant-large-exposure.type.d.ts +1 -0
- package/dist/applicants/applicant-large-exposure.type.d.ts.map +1 -1
- package/dist/applicants/applicant-pension-income.model.d.ts +1 -0
- package/dist/applicants/applicant-pension-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-pension-income.type.d.ts +1 -0
- package/dist/applicants/applicant-pension-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-property-income.model.d.ts +1 -0
- package/dist/applicants/applicant-property-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-property-income.type.d.ts +1 -0
- package/dist/applicants/applicant-property-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-risk-narrative.model.d.ts +1 -0
- package/dist/applicants/applicant-risk-narrative.model.d.ts.map +1 -1
- package/dist/applicants/applicant-self-employed-income.model.d.ts +1 -0
- package/dist/applicants/applicant-self-employed-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-self-employed-income.type.d.ts +1 -0
- package/dist/applicants/applicant-self-employed-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-self-employment.model.d.ts +1 -0
- package/dist/applicants/applicant-self-employment.model.d.ts.map +1 -1
- package/dist/applicants/applicant-sole-trader-income.model.d.ts +1 -0
- package/dist/applicants/applicant-sole-trader-income.model.d.ts.map +1 -1
- package/dist/applicants/applicant-sole-trader-income.type.d.ts +1 -0
- package/dist/applicants/applicant-sole-trader-income.type.d.ts.map +1 -1
- package/dist/applicants/applicant-uk-tax-credits.model.d.ts +1 -0
- package/dist/applicants/applicant-uk-tax-credits.model.d.ts.map +1 -1
- package/dist/applicants/applicant-uk-tax-credits.type.d.ts +1 -0
- package/dist/applicants/applicant-uk-tax-credits.type.d.ts.map +1 -1
- package/dist/applicants/applicant-welcome-call.model.d.ts +1 -0
- package/dist/applicants/applicant-welcome-call.model.d.ts.map +1 -1
- package/dist/applicants/applicant-welcome-call.type.d.ts +1 -0
- package/dist/applicants/applicant-welcome-call.type.d.ts.map +1 -1
- package/dist/applicants/applicant.model.d.ts +1 -54
- package/dist/applicants/applicant.model.d.ts.map +1 -1
- package/dist/applicants/applicant.model.js +31 -33
- package/dist/applicants/applicant.type.d.ts +1 -1
- package/dist/applicants/applicant.type.d.ts.map +1 -1
- package/dist/applications/application-audit.model.d.ts +1 -0
- package/dist/applications/application-audit.model.d.ts.map +1 -1
- package/dist/applications/application-checklist-Item.model.d.ts +1 -0
- package/dist/applications/application-checklist-Item.model.d.ts.map +1 -1
- package/dist/applications/application-company-model.d.ts +1 -0
- package/dist/applications/application-company-model.d.ts.map +1 -1
- package/dist/applications/application-credit-profile.model.d.ts +1 -0
- package/dist/applications/application-credit-profile.model.d.ts.map +1 -1
- package/dist/applications/application-direct-debit.model.d.ts +1 -0
- package/dist/applications/application-direct-debit.model.d.ts.map +1 -1
- package/dist/applications/application-direct-debit.model.js +18 -10
- package/dist/applications/application-direct-debit.type.d.ts +1 -0
- package/dist/applications/application-direct-debit.type.d.ts.map +1 -1
- package/dist/applications/application-euc.model.d.ts +1 -0
- package/dist/applications/application-euc.model.d.ts.map +1 -1
- package/dist/applications/application-euc.type.d.ts +1 -0
- package/dist/applications/application-euc.type.d.ts.map +1 -1
- package/dist/applications/application-fieldconfig.model.d.ts +1 -0
- package/dist/applications/application-fieldconfig.model.d.ts.map +1 -1
- package/dist/applications/application-illustration-model.d.ts +1 -0
- package/dist/applications/application-illustration-model.d.ts.map +1 -1
- package/dist/applications/application-legal.model.d.ts +1 -0
- package/dist/applications/application-legal.model.d.ts.map +1 -1
- package/dist/applications/application-mortgage.model.d.ts +1 -0
- package/dist/applications/application-mortgage.model.d.ts.map +1 -1
- package/dist/applications/application-mortgage.type.d.ts +1 -0
- package/dist/applications/application-mortgage.type.d.ts.map +1 -1
- package/dist/applications/application-note.model.d.ts +1 -0
- package/dist/applications/application-note.model.d.ts.map +1 -1
- package/dist/applications/application-note.type.d.ts +1 -0
- package/dist/applications/application-note.type.d.ts.map +1 -1
- package/dist/applications/application-offer.model.d.ts +1 -0
- package/dist/applications/application-offer.model.d.ts.map +1 -1
- package/dist/applications/application-offer.type.d.ts +1 -0
- package/dist/applications/application-offer.type.d.ts.map +1 -1
- package/dist/applications/application-onboarding.model.d.ts +1 -0
- package/dist/applications/application-onboarding.model.d.ts.map +1 -1
- package/dist/applications/application-product.model.d.ts +1 -0
- package/dist/applications/application-product.model.d.ts.map +1 -1
- package/dist/applications/application-product.type.d.ts +1 -0
- package/dist/applications/application-product.type.d.ts.map +1 -1
- package/dist/applications/application-productfeatures.model.d.ts +1 -0
- package/dist/applications/application-productfeatures.model.d.ts.map +1 -1
- package/dist/applications/application-productfeatures.type.d.ts +1 -0
- package/dist/applications/application-productfeatures.type.d.ts.map +1 -1
- package/dist/applications/application-rationale.model.d.ts +1 -0
- package/dist/applications/application-rationale.model.d.ts.map +1 -1
- package/dist/applications/application-rationale.type.d.ts +1 -0
- package/dist/applications/application-rationale.type.d.ts.map +1 -1
- package/dist/applications/application-risk-narrative.model.d.ts +1 -0
- package/dist/applications/application-risk-narrative.model.d.ts.map +1 -1
- package/dist/applications/application-valuation-report.model.d.ts +1 -0
- package/dist/applications/application-valuation-report.model.d.ts.map +1 -1
- package/dist/applications/application-valuation-report.type.d.ts +1 -0
- package/dist/applications/application-valuation-report.type.d.ts.map +1 -1
- package/dist/applications/application-valuation.model.d.ts +1 -0
- package/dist/applications/application-valuation.model.d.ts.map +1 -1
- package/dist/applications/application-valuation.type.d.ts +1 -0
- package/dist/applications/application-valuation.type.d.ts.map +1 -1
- package/dist/applications/application.model.d.ts +1 -0
- package/dist/applications/application.model.d.ts.map +1 -1
- package/dist/applications/applications-task.model.d.ts +1 -0
- package/dist/applications/applications-task.model.d.ts.map +1 -1
- package/dist/applications/applications-task.type.d.ts +1 -0
- package/dist/applications/applications-task.type.d.ts.map +1 -1
- package/dist/applications/broker.model.d.ts +1 -0
- package/dist/applications/broker.model.d.ts.map +1 -1
- package/dist/applications/broker.type.d.ts +1 -0
- package/dist/applications/broker.type.d.ts.map +1 -1
- package/dist/applications/solicitor.model.d.ts +1 -0
- package/dist/applications/solicitor.model.d.ts.map +1 -1
- package/dist/applications/solicitor.type.d.ts +1 -0
- package/dist/applications/solicitor.type.d.ts.map +1 -1
- package/dist/product-catalogues/product-catalogue.model.d.ts +1 -0
- package/dist/product-catalogues/product-catalogue.model.d.ts.map +1 -1
- package/dist/product-catalogues/product-definitions.model.d.ts +1 -0
- package/dist/product-catalogues/product-definitions.model.d.ts.map +1 -1
- package/dist/product-catalogues/product-definitions.type.d.ts +1 -0
- package/dist/product-catalogues/product-definitions.type.d.ts.map +1 -1
- package/dist/product-catalogues/product-variant.model.d.ts +1 -0
- package/dist/product-catalogues/product-variant.model.d.ts.map +1 -1
- package/dist/product-catalogues/product-variant.type.d.ts +1 -0
- package/dist/product-catalogues/product-variant.type.d.ts.map +1 -1
- package/dist/properties/property.model.d.ts +1 -0
- package/dist/properties/property.model.d.ts.map +1 -1
- package/dist/properties/security.model.d.ts +1 -0
- package/dist/properties/security.model.d.ts.map +1 -1
- package/dist/shared/alert.model.d.ts +1 -0
- package/dist/shared/alert.model.d.ts.map +1 -1
- package/dist/shared/api-log.model.d.ts +1 -0
- package/dist/shared/api-log.model.d.ts.map +1 -1
- package/dist/shared/api-performance.model.d.ts +1 -0
- package/dist/shared/api-performance.model.d.ts.map +1 -1
- package/dist/shared/api-performance.type.d.ts +1 -0
- package/dist/shared/api-performance.type.d.ts.map +1 -1
- package/dist/shared/apprivo-sync-journey.model.d.ts +1 -0
- package/dist/shared/apprivo-sync-journey.model.d.ts.map +1 -1
- package/dist/shared/checklist.model.d.ts +1 -0
- package/dist/shared/checklist.model.d.ts.map +1 -1
- package/dist/shared/encryption/encrypted-field-map.d.ts +141 -0
- package/dist/shared/encryption/encrypted-field-map.d.ts.map +1 -0
- package/dist/shared/encryption/encrypted-field-map.js +126 -0
- package/dist/shared/encryption/encryption.config.d.ts +55 -0
- package/dist/shared/encryption/encryption.config.d.ts.map +1 -0
- package/dist/shared/encryption/encryption.config.js +76 -0
- package/dist/shared/encryption/encryption.init.d.ts +66 -0
- package/dist/shared/encryption/encryption.init.d.ts.map +1 -0
- package/dist/shared/encryption/encryption.init.js +86 -0
- package/dist/shared/encryption/encryption.service.d.ts +110 -0
- package/dist/shared/encryption/encryption.service.d.ts.map +1 -0
- package/dist/shared/encryption/encryption.service.js +151 -0
- package/dist/shared/encryption/index.d.ts +6 -0
- package/dist/shared/encryption/index.d.ts.map +1 -0
- package/dist/shared/encryption/index.js +4 -0
- package/dist/shared/index.d.ts +2 -0
- package/dist/shared/index.d.ts.map +1 -1
- package/dist/shared/index.js +2 -0
- package/dist/shared/job-run.model.d.ts +1 -0
- package/dist/shared/job-run.model.d.ts.map +1 -1
- package/dist/shared/job-setting.model.d.ts +1 -0
- package/dist/shared/job-setting.model.d.ts.map +1 -1
- package/dist/shared/lookup-group.model.d.ts +1 -0
- package/dist/shared/lookup-group.model.d.ts.map +1 -1
- package/dist/shared/lookup.model.d.ts +7 -0
- package/dist/shared/lookup.model.d.ts.map +1 -1
- package/dist/shared/lookup.model.js +5 -0
- package/dist/shared/schema-doc.model.d.ts +1 -0
- package/dist/shared/schema-doc.model.d.ts.map +1 -1
- package/dist/shared/system-parameter.model.d.ts +1 -0
- package/dist/shared/system-parameter.model.d.ts.map +1 -1
- package/dist/shared/task-document.model.d.ts +1 -0
- package/dist/shared/task-document.model.d.ts.map +1 -1
- package/dist/shared/task.model.d.ts +1 -0
- package/dist/shared/task.model.d.ts.map +1 -1
- package/dist/shared/webhook-event.model.d.ts +1 -0
- package/dist/shared/webhook-event.model.d.ts.map +1 -1
- package/dist/shared/workflow-trigger.model.d.ts +1 -0
- package/dist/shared/workflow-trigger.model.d.ts.map +1 -1
- package/dist/shared/workflow-trigger.type.d.ts +1 -0
- package/dist/shared/workflow-trigger.type.d.ts.map +1 -1
- package/dist/shared/workflow.middleware.d.ts +1 -0
- package/dist/shared/workflow.middleware.d.ts.map +1 -1
- package/dist/shared/workflow.plugin.d.ts +1 -0
- package/dist/shared/workflow.plugin.d.ts.map +1 -1
- package/dist/types/base.types.d.ts +1 -0
- package/dist/types/base.types.d.ts.map +1 -1
- package/dist/underwriter/underwriter.model.d.ts +1 -0
- package/dist/underwriter/underwriter.model.d.ts.map +1 -1
- package/dist/users/auth-log.model.d.ts +1 -0
- package/dist/users/auth-log.model.d.ts.map +1 -1
- package/dist/users/permission.model.d.ts +1 -0
- package/dist/users/permission.model.d.ts.map +1 -1
- package/dist/users/role-group.model.d.ts +1 -0
- package/dist/users/role-group.model.d.ts.map +1 -1
- package/dist/users/role.model.d.ts +1 -0
- package/dist/users/role.model.d.ts.map +1 -1
- package/dist/users/tasks.model.d.ts +1 -0
- package/dist/users/tasks.model.d.ts.map +1 -1
- package/dist/users/user.model.d.ts +1 -0
- package/dist/users/user.model.d.ts.map +1 -1
- package/dist/users/user.type.d.ts +1 -0
- package/dist/users/user.type.d.ts.map +1 -1
- package/dist/value-objects/account-number.d.ts +1 -0
- package/dist/value-objects/account-number.d.ts.map +1 -1
- package/dist/value-objects/pound.d.ts +1 -0
- package/dist/value-objects/pound.d.ts.map +1 -1
- package/dist/value-objects/sort-code.d.ts +1 -0
- package/dist/value-objects/sort-code.d.ts.map +1 -1
- package/package.json +6 -3
- package/dist/applicants/applicant-direct-debit.model.d.ts +0 -86
- package/dist/applicants/applicant-direct-debit.model.d.ts.map +0 -1
- 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"}
|
package/dist/shared/index.d.ts
CHANGED
|
@@ -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"}
|
package/dist/shared/index.js
CHANGED
|
@@ -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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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":"
|
|
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" />
|