@dynamatix/gb-schemas 2.17.13 → 2.20.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 +33 -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 +4 -3
- package/dist/applications/application-direct-debit.model.d.ts.map +1 -1
- package/dist/applications/application-direct-debit.model.js +20 -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 +146 -0
- package/dist/shared/encryption/encrypted-field-map.d.ts.map +1 -0
- package/dist/shared/encryption/encrypted-field-map.js +130 -0
- package/dist/shared/encryption/encryption-filter.guard.d.ts +69 -0
- package/dist/shared/encryption/encryption-filter.guard.d.ts.map +1 -0
- package/dist/shared/encryption/encryption-filter.guard.js +103 -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.plugin.d.ts +225 -0
- package/dist/shared/encryption/encryption.plugin.d.ts.map +1 -0
- package/dist/shared/encryption/encryption.plugin.js +372 -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 +8 -0
- package/dist/shared/encryption/index.d.ts.map +1 -0
- package/dist/shared/encryption/index.js +6 -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
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"property.model.d.ts","sourceRoot":"","sources":["../../properties/property.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"property.model.d.ts","sourceRoot":"","sources":["../../properties/property.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,EAAE,KAAK,EAAe,MAAM,wBAAwB,CAAC;AA8J5D,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6C,CAAC;AACjE,eAAe,aAAa,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="../shared/encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"security.model.d.ts","sourceRoot":"","sources":["../../properties/security.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"security.model.d.ts","sourceRoot":"","sources":["../../properties/security.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AACA,OAAO,QAAQ,MAAM,UAAU,CAAC;AA6KhC,QAAA,MAAM,aAAa;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA6C,CAAC;AACjE,eAAe,aAAa,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"alert.model.d.ts","sourceRoot":"","sources":["../../shared/alert.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"alert.model.d.ts","sourceRoot":"","sources":["../../shared/alert.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAyBhC,QAAA,MAAM,UAAU;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAuC,CAAC;AAExD,eAAe,UAAU,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-log.model.d.ts","sourceRoot":"","sources":["../../shared/api-log.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-log.model.d.ts","sourceRoot":"","sources":["../../shared/api-log.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAyBhC;;;GAGG;AACH,QAAA,MAAM,WAAW;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA0C,CAAC;AAE5D,eAAe,WAAW,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-performance.model.d.ts","sourceRoot":"","sources":["../../shared/api-performance.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-performance.model.d.ts","sourceRoot":"","sources":["../../shared/api-performance.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAChC,OAAO,eAAe,MAAM,wBAAwB,CAAC;AAyBrD,QAAA,MAAM,sBAAsB;;;;OAAgF,CAAC;AAC7G,eAAe,sBAAsB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"api-performance.type.d.ts","sourceRoot":"","sources":["../../shared/api-performance.type.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"api-performance.type.d.ts","sourceRoot":"","sources":["../../shared/api-performance.type.ts"],"names":[],"mappings":"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"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"apprivo-sync-journey.model.d.ts","sourceRoot":"","sources":["../../shared/apprivo-sync-journey.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"apprivo-sync-journey.model.d.ts","sourceRoot":"","sources":["../../shared/apprivo-sync-journey.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAoBhC,QAAA,MAAM,uBAAuB;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAAiE,CAAC;AAC/F,eAAe,uBAAuB,CAAC"}
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/// <reference path="../value-objects/pound.d.ts" />
|
|
2
2
|
/// <reference path="../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="encryption/encrypted-field-map.d.ts" />
|
|
3
4
|
/// <reference path="../value-objects/sort-code.d.ts" />
|
|
4
5
|
/// <reference types="mongoose/types/aggregate" />
|
|
5
6
|
/// <reference types="mongoose/types/callback" />
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"checklist.model.d.ts","sourceRoot":"","sources":["../../shared/checklist.model.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"checklist.model.d.ts","sourceRoot":"","sources":["../../shared/checklist.model.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,QAAQ,MAAM,UAAU,CAAC;AAuChC,QAAA,MAAM,cAAc;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;GAA+C,CAAC;AAEpE,eAAe,cAAc,CAAC"}
|
|
@@ -0,0 +1,146 @@
|
|
|
1
|
+
/// <reference path="../../value-objects/pound.d.ts" />
|
|
2
|
+
/// <reference path="../../value-objects/account-number.d.ts" />
|
|
3
|
+
/// <reference path="../../value-objects/sort-code.d.ts" />
|
|
4
|
+
/// <reference types="mongoose/types/aggregate" />
|
|
5
|
+
/// <reference types="mongoose/types/callback" />
|
|
6
|
+
/// <reference types="mongoose/types/collection" />
|
|
7
|
+
/// <reference types="mongoose/types/connection" />
|
|
8
|
+
/// <reference types="mongoose/types/cursor" />
|
|
9
|
+
/// <reference types="mongoose/types/document" />
|
|
10
|
+
/// <reference types="mongoose/types/error" />
|
|
11
|
+
/// <reference types="mongoose/types/expressions" />
|
|
12
|
+
/// <reference types="mongoose/types/helpers" />
|
|
13
|
+
/// <reference types="mongoose/types/middlewares" />
|
|
14
|
+
/// <reference types="mongoose/types/indexes" />
|
|
15
|
+
/// <reference types="mongoose/types/models" />
|
|
16
|
+
/// <reference types="mongoose/types/mongooseoptions" />
|
|
17
|
+
/// <reference types="mongoose/types/pipelinestage" />
|
|
18
|
+
/// <reference types="mongoose/types/populate" />
|
|
19
|
+
/// <reference types="mongoose/types/query" />
|
|
20
|
+
/// <reference types="mongoose/types/schemaoptions" />
|
|
21
|
+
/// <reference types="mongoose/types/session" />
|
|
22
|
+
/// <reference types="mongoose/types/types" />
|
|
23
|
+
/// <reference types="mongoose/types/utility" />
|
|
24
|
+
/// <reference types="mongoose/types/validation" />
|
|
25
|
+
/// <reference types="mongoose/types/virtuals" />
|
|
26
|
+
/// <reference types="mongoose/types/schematypes" />
|
|
27
|
+
/// <reference types="mongoose/types/inferschematype" />
|
|
28
|
+
/// <reference types="mongoose/types/inferrawdoctype" />
|
|
29
|
+
import { Schema, Model } from 'mongoose';
|
|
30
|
+
/**
|
|
31
|
+
* Augments Mongoose's per-path options with the `ghEncrypt` annotation so a
|
|
32
|
+
* field is marked for encryption with exactly one line in its schema:
|
|
33
|
+
*
|
|
34
|
+
* ```ts
|
|
35
|
+
* firstName: { type: String, required: true, ghEncrypt: true }
|
|
36
|
+
* ```
|
|
37
|
+
*/
|
|
38
|
+
declare module 'mongoose' {
|
|
39
|
+
interface SchemaTypeOptions<T> {
|
|
40
|
+
/**
|
|
41
|
+
* Marks this path for RANDOM-mode field-level encryption.
|
|
42
|
+
* Named `ghEncrypt` because Mongoose reserves `encrypt` for its own
|
|
43
|
+
* (Enterprise-only) CSFLE schema option.
|
|
44
|
+
*/
|
|
45
|
+
ghEncrypt?: boolean;
|
|
46
|
+
/**
|
|
47
|
+
* Original BSON type of a `ghEncrypt` path, stashed by the plugin
|
|
48
|
+
* when it re-types the path to `Mixed` (ciphertext is Binary).
|
|
49
|
+
*/
|
|
50
|
+
ghOriginalType?: string;
|
|
51
|
+
}
|
|
52
|
+
}
|
|
53
|
+
/** One encrypted path of a collection, as consumed by the plugin/backfill. */
|
|
54
|
+
export interface EncryptedFieldEntry {
|
|
55
|
+
/** Dot path of the field (array element paths have no numeric segment). */
|
|
56
|
+
path: string;
|
|
57
|
+
/** Encryption mode — always `random`; deterministic is not supported. */
|
|
58
|
+
mode: 'random';
|
|
59
|
+
/** Mongoose type instance name (String, Number, Date, …) for tooling. */
|
|
60
|
+
bsonType: string;
|
|
61
|
+
}
|
|
62
|
+
/** Physical collection name → encrypted field entries. */
|
|
63
|
+
export type EncryptedFieldMap = Record<string, EncryptedFieldEntry[]>;
|
|
64
|
+
/**
|
|
65
|
+
* Builds the encrypted-field map from `ghEncrypt: true` schema annotations.
|
|
66
|
+
*
|
|
67
|
+
* The map is the single source of truth consumed by the Mongoose encryption
|
|
68
|
+
* plugin (Enc-4), the backfill migration (Enc-6) and — via {@link toJson} —
|
|
69
|
+
* non-Mongoose consumers such as cat-workflow-engine's decrypt adapter.
|
|
70
|
+
*
|
|
71
|
+
* Validation is fail-loud at startup: an annotation on an indexed path, an
|
|
72
|
+
* ObjectId reference or `_id` throws immediately, because RANDOM ciphertext
|
|
73
|
+
* can never be queried, joined on, or indexed.
|
|
74
|
+
*/
|
|
75
|
+
export declare class EncryptedFieldMapBuilder {
|
|
76
|
+
private constructor();
|
|
77
|
+
/**
|
|
78
|
+
* Collects all validated `ghEncrypt: true` paths of one schema, recursing
|
|
79
|
+
* into embedded subdocument schemas and subdocument arrays.
|
|
80
|
+
*
|
|
81
|
+
* @param schema - The Mongoose schema to scan.
|
|
82
|
+
* @param prefix - Path prefix used during recursion; omit at call sites.
|
|
83
|
+
* @returns Entries sorted in schema declaration order.
|
|
84
|
+
* @throws Error when an annotated path is indexed, unique, ObjectId or `_id`.
|
|
85
|
+
* @example
|
|
86
|
+
* ```ts
|
|
87
|
+
* const entries = EncryptedFieldMapBuilder.buildForSchema(applicantSchema);
|
|
88
|
+
* // → [{ path: 'firstName', mode: 'random', bsonType: 'String' }, …]
|
|
89
|
+
* ```
|
|
90
|
+
*/
|
|
91
|
+
static buildForSchema(schema: Schema, prefix?: string): EncryptedFieldEntry[];
|
|
92
|
+
/**
|
|
93
|
+
* Builds the full map for a set of models, keyed by physical collection
|
|
94
|
+
* name. Models without any annotated field are omitted.
|
|
95
|
+
*
|
|
96
|
+
* @param models - Registered Mongoose models to scan.
|
|
97
|
+
* @returns Collection name → encrypted field entries.
|
|
98
|
+
* @example
|
|
99
|
+
* ```ts
|
|
100
|
+
* const map = EncryptedFieldMapBuilder.buildForModels([
|
|
101
|
+
* ApplicantModel, ApplicationDirectDebitModel
|
|
102
|
+
* ]);
|
|
103
|
+
* // → { applicants: […], application_directdebits: […] }
|
|
104
|
+
* ```
|
|
105
|
+
*/
|
|
106
|
+
static buildForModels(models: Model<unknown>[]): EncryptedFieldMap;
|
|
107
|
+
/**
|
|
108
|
+
* Serialises a map as plain JSON for non-Mongoose consumers (e.g. the
|
|
109
|
+
* cat-workflow-engine decrypt-on-read adapter).
|
|
110
|
+
*
|
|
111
|
+
* @param map - Map produced by {@link buildForModels}.
|
|
112
|
+
* @returns Pretty-printed JSON string.
|
|
113
|
+
* @example
|
|
114
|
+
* ```ts
|
|
115
|
+
* fs.writeFileSync('encrypted-fields.json', EncryptedFieldMapBuilder.toJson(map));
|
|
116
|
+
* ```
|
|
117
|
+
*/
|
|
118
|
+
static toJson(map: EncryptedFieldMap): string;
|
|
119
|
+
/**
|
|
120
|
+
* Fail-loud validation of a single annotated path.
|
|
121
|
+
*
|
|
122
|
+
* @param path - Full dot path of the annotated field.
|
|
123
|
+
* @param schemaType - The path's resolved schema type.
|
|
124
|
+
* @param schema - The owning schema (for schema-level index lookup).
|
|
125
|
+
* @throws Error describing exactly which rule the annotation violates.
|
|
126
|
+
* @example
|
|
127
|
+
* ```ts
|
|
128
|
+
* // internal use only — called by buildForSchema()
|
|
129
|
+
* ```
|
|
130
|
+
*/
|
|
131
|
+
private static validatePath;
|
|
132
|
+
/**
|
|
133
|
+
* Detects path-level (`index`/`unique`) and schema-level index coverage.
|
|
134
|
+
*
|
|
135
|
+
* @param path - Full dot path relative to the checked schema.
|
|
136
|
+
* @param schemaType - The path's resolved schema type.
|
|
137
|
+
* @param schema - The owning schema.
|
|
138
|
+
* @returns `true` when any index covers the path.
|
|
139
|
+
* @example
|
|
140
|
+
* ```ts
|
|
141
|
+
* // internal use only — called by validatePath()
|
|
142
|
+
* ```
|
|
143
|
+
*/
|
|
144
|
+
private static isIndexed;
|
|
145
|
+
}
|
|
146
|
+
//# sourceMappingURL=encrypted-field-map.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encrypted-field-map.d.ts","sourceRoot":"","sources":["../../../shared/encryption/encrypted-field-map.ts"],"names":[],"mappings":";;;;;;;;;;;;;;;;;;;;;;;;;;;;AAAA,OAAO,EAAE,MAAM,EAAc,KAAK,EAAE,MAAM,UAAU,CAAC;AAErD;;;;;;;GAOG;AACH,OAAO,QAAQ,UAAU,CAAC;IACtB,UAAU,iBAAiB,CAAC,CAAC;QACzB;;;;WAIG;QACH,SAAS,CAAC,EAAE,OAAO,CAAC;QACpB;;;WAGG;QACH,cAAc,CAAC,EAAE,MAAM,CAAC;KAC3B;CACJ;AAED,8EAA8E;AAC9E,MAAM,WAAW,mBAAmB;IAChC,2EAA2E;IAC3E,IAAI,EAAE,MAAM,CAAC;IACb,yEAAyE;IACzE,IAAI,EAAE,QAAQ,CAAC;IACf,yEAAyE;IACzE,QAAQ,EAAE,MAAM,CAAC;CACpB;AAED,0DAA0D;AAC1D,MAAM,MAAM,iBAAiB,GAAG,MAAM,CAAC,MAAM,EAAE,mBAAmB,EAAE,CAAC,CAAC;AAEtE;;;;;;;;;;GAUG;AACH,qBAAa,wBAAwB;IACjC,OAAO;IAEP;;;;;;;;;;;;;OAaG;WACW,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,SAAK,GAAG,mBAAmB,EAAE;IAqBhF;;;;;;;;;;;;;OAaG;WACW,cAAc,CAAC,MAAM,EAAE,KAAK,CAAC,OAAO,CAAC,EAAE,GAAG,iBAAiB;IAWzE;;;;;;;;;;OAUG;WACW,MAAM,CAAC,GAAG,EAAE,iBAAiB,GAAG,MAAM;IAIpD;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,YAAY;IAkB3B;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,SAAS;CAS3B"}
|
|
@@ -0,0 +1,130 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Builds the encrypted-field map from `ghEncrypt: true` schema annotations.
|
|
3
|
+
*
|
|
4
|
+
* The map is the single source of truth consumed by the Mongoose encryption
|
|
5
|
+
* plugin (Enc-4), the backfill migration (Enc-6) and — via {@link toJson} —
|
|
6
|
+
* non-Mongoose consumers such as cat-workflow-engine's decrypt adapter.
|
|
7
|
+
*
|
|
8
|
+
* Validation is fail-loud at startup: an annotation on an indexed path, an
|
|
9
|
+
* ObjectId reference or `_id` throws immediately, because RANDOM ciphertext
|
|
10
|
+
* can never be queried, joined on, or indexed.
|
|
11
|
+
*/
|
|
12
|
+
export class EncryptedFieldMapBuilder {
|
|
13
|
+
constructor() { }
|
|
14
|
+
/**
|
|
15
|
+
* Collects all validated `ghEncrypt: true` paths of one schema, recursing
|
|
16
|
+
* into embedded subdocument schemas and subdocument arrays.
|
|
17
|
+
*
|
|
18
|
+
* @param schema - The Mongoose schema to scan.
|
|
19
|
+
* @param prefix - Path prefix used during recursion; omit at call sites.
|
|
20
|
+
* @returns Entries sorted in schema declaration order.
|
|
21
|
+
* @throws Error when an annotated path is indexed, unique, ObjectId or `_id`.
|
|
22
|
+
* @example
|
|
23
|
+
* ```ts
|
|
24
|
+
* const entries = EncryptedFieldMapBuilder.buildForSchema(applicantSchema);
|
|
25
|
+
* // → [{ path: 'firstName', mode: 'random', bsonType: 'String' }, …]
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
static buildForSchema(schema, prefix = '') {
|
|
29
|
+
const entries = [];
|
|
30
|
+
schema.eachPath((path, schemaType) => {
|
|
31
|
+
const fullPath = prefix ? `${prefix}.${path}` : path;
|
|
32
|
+
const childSchema = schemaType.schema;
|
|
33
|
+
if (childSchema) {
|
|
34
|
+
entries.push(...EncryptedFieldMapBuilder.buildForSchema(childSchema, fullPath));
|
|
35
|
+
return;
|
|
36
|
+
}
|
|
37
|
+
if (schemaType.options?.ghEncrypt === true) {
|
|
38
|
+
EncryptedFieldMapBuilder.validatePath(fullPath, schemaType, schema);
|
|
39
|
+
entries.push({
|
|
40
|
+
path: fullPath,
|
|
41
|
+
mode: 'random',
|
|
42
|
+
bsonType: schemaType.options?.ghOriginalType ?? schemaType.instance
|
|
43
|
+
});
|
|
44
|
+
}
|
|
45
|
+
});
|
|
46
|
+
return entries;
|
|
47
|
+
}
|
|
48
|
+
/**
|
|
49
|
+
* Builds the full map for a set of models, keyed by physical collection
|
|
50
|
+
* name. Models without any annotated field are omitted.
|
|
51
|
+
*
|
|
52
|
+
* @param models - Registered Mongoose models to scan.
|
|
53
|
+
* @returns Collection name → encrypted field entries.
|
|
54
|
+
* @example
|
|
55
|
+
* ```ts
|
|
56
|
+
* const map = EncryptedFieldMapBuilder.buildForModels([
|
|
57
|
+
* ApplicantModel, ApplicationDirectDebitModel
|
|
58
|
+
* ]);
|
|
59
|
+
* // → { applicants: […], application_directdebits: […] }
|
|
60
|
+
* ```
|
|
61
|
+
*/
|
|
62
|
+
static buildForModels(models) {
|
|
63
|
+
const map = {};
|
|
64
|
+
for (const model of models) {
|
|
65
|
+
const entries = EncryptedFieldMapBuilder.buildForSchema(model.schema);
|
|
66
|
+
if (entries.length > 0) {
|
|
67
|
+
map[model.collection.collectionName] = entries;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
return map;
|
|
71
|
+
}
|
|
72
|
+
/**
|
|
73
|
+
* Serialises a map as plain JSON for non-Mongoose consumers (e.g. the
|
|
74
|
+
* cat-workflow-engine decrypt-on-read adapter).
|
|
75
|
+
*
|
|
76
|
+
* @param map - Map produced by {@link buildForModels}.
|
|
77
|
+
* @returns Pretty-printed JSON string.
|
|
78
|
+
* @example
|
|
79
|
+
* ```ts
|
|
80
|
+
* fs.writeFileSync('encrypted-fields.json', EncryptedFieldMapBuilder.toJson(map));
|
|
81
|
+
* ```
|
|
82
|
+
*/
|
|
83
|
+
static toJson(map) {
|
|
84
|
+
return JSON.stringify(map, null, 2);
|
|
85
|
+
}
|
|
86
|
+
/**
|
|
87
|
+
* Fail-loud validation of a single annotated path.
|
|
88
|
+
*
|
|
89
|
+
* @param path - Full dot path of the annotated field.
|
|
90
|
+
* @param schemaType - The path's resolved schema type.
|
|
91
|
+
* @param schema - The owning schema (for schema-level index lookup).
|
|
92
|
+
* @throws Error describing exactly which rule the annotation violates.
|
|
93
|
+
* @example
|
|
94
|
+
* ```ts
|
|
95
|
+
* // internal use only — called by buildForSchema()
|
|
96
|
+
* ```
|
|
97
|
+
*/
|
|
98
|
+
static validatePath(path, schemaType, schema) {
|
|
99
|
+
if (path === '_id' || path.endsWith('._id')) {
|
|
100
|
+
throw new Error(`Encrypted-field annotation on '${path}': _id can never be encrypted.`);
|
|
101
|
+
}
|
|
102
|
+
if (schemaType.instance === 'ObjectId') {
|
|
103
|
+
throw new Error(`Encrypted-field annotation on '${path}': ObjectId references cannot be encrypted ` +
|
|
104
|
+
'(they are join/lookup keys).');
|
|
105
|
+
}
|
|
106
|
+
if (EncryptedFieldMapBuilder.isIndexed(path, schemaType, schema)) {
|
|
107
|
+
throw new Error(`Encrypted-field annotation on '${path}': the path is indexed. RANDOM ciphertext ` +
|
|
108
|
+
'is unqueryable — drop the index or remove the annotation.');
|
|
109
|
+
}
|
|
110
|
+
}
|
|
111
|
+
/**
|
|
112
|
+
* Detects path-level (`index`/`unique`) and schema-level index coverage.
|
|
113
|
+
*
|
|
114
|
+
* @param path - Full dot path relative to the checked schema.
|
|
115
|
+
* @param schemaType - The path's resolved schema type.
|
|
116
|
+
* @param schema - The owning schema.
|
|
117
|
+
* @returns `true` when any index covers the path.
|
|
118
|
+
* @example
|
|
119
|
+
* ```ts
|
|
120
|
+
* // internal use only — called by validatePath()
|
|
121
|
+
* ```
|
|
122
|
+
*/
|
|
123
|
+
static isIndexed(path, schemaType, schema) {
|
|
124
|
+
if (schemaType.options?.index || schemaType.options?.unique) {
|
|
125
|
+
return true;
|
|
126
|
+
}
|
|
127
|
+
const relativePath = path.split('.').pop();
|
|
128
|
+
return schema.indexes().some(([keys]) => Object.keys(keys).includes(path) || Object.keys(keys).includes(relativePath));
|
|
129
|
+
}
|
|
130
|
+
}
|
|
@@ -0,0 +1,69 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fail-loud guard for queries that touch RANDOM-encrypted fields.
|
|
3
|
+
*
|
|
4
|
+
* RANDOM ciphertext is unqueryable: any filter, equality, range, regex or
|
|
5
|
+
* sort on an encrypted path would silently match nothing (or garbage).
|
|
6
|
+
* The guard converts that class of production data bug into an immediate,
|
|
7
|
+
* descriptive error at the call site — in CI, not in front of a customer.
|
|
8
|
+
*/
|
|
9
|
+
export declare class EncryptionFilterGuard {
|
|
10
|
+
private constructor();
|
|
11
|
+
/**
|
|
12
|
+
* Asserts that neither the filter nor the sort of a query references an
|
|
13
|
+
* encrypted path. Recurses through `$and` / `$or` / `$nor` branches and
|
|
14
|
+
* flags parent-object matches (e.g. filtering on a whole subdocument
|
|
15
|
+
* that contains encrypted leaves).
|
|
16
|
+
*
|
|
17
|
+
* @param filter - The query filter as returned by `Query.getFilter()`.
|
|
18
|
+
* @param sort - The sort spec (object or string form) from query options.
|
|
19
|
+
* @param encryptedPaths - Dot paths of all encrypted fields of the model.
|
|
20
|
+
* @throws Error naming the offending path when the query is unsafe.
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* EncryptionFilterGuard.assertQuerySafe(
|
|
24
|
+
* { $or: [{ firstName: 'Ann' }] }, undefined, ['firstName']
|
|
25
|
+
* ); // → throws: firstName is RANDOM-encrypted and cannot be filtered
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
static assertQuerySafe(filter: Record<string, unknown> | null | undefined, sort: Record<string, unknown> | string | null | undefined, encryptedPaths: string[]): void;
|
|
29
|
+
/**
|
|
30
|
+
* Recursively walks one filter node, throwing on any encrypted-path key.
|
|
31
|
+
*
|
|
32
|
+
* @param node - Filter object or logical-operator branch.
|
|
33
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
34
|
+
* @throws Error when a key covers an encrypted path.
|
|
35
|
+
* @example
|
|
36
|
+
* ```ts
|
|
37
|
+
* // internal use only — called by assertQuerySafe()
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
private static walkFilter;
|
|
41
|
+
/**
|
|
42
|
+
* Asserts that no sort key covers an encrypted path (random ciphertext
|
|
43
|
+
* has no meaningful order).
|
|
44
|
+
*
|
|
45
|
+
* @param sort - Sort spec in object (`{ field: 1 }`) or string (`'-field'`) form.
|
|
46
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
47
|
+
* @throws Error when a sort key covers an encrypted path.
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* // internal use only — called by assertQuerySafe()
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
private static assertSortSafe;
|
|
54
|
+
/**
|
|
55
|
+
* Matches a filter/sort key against the encrypted paths, including
|
|
56
|
+
* parent-object keys (`bankWizardCheck` covers its encrypted leaves)
|
|
57
|
+
* and child keys under an encrypted leaf.
|
|
58
|
+
*
|
|
59
|
+
* @param key - The filter or sort key to test.
|
|
60
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
61
|
+
* @returns The covered encrypted path, or `undefined` when safe.
|
|
62
|
+
* @example
|
|
63
|
+
* ```ts
|
|
64
|
+
* // internal use only
|
|
65
|
+
* ```
|
|
66
|
+
*/
|
|
67
|
+
private static matchEncryptedPath;
|
|
68
|
+
}
|
|
69
|
+
//# sourceMappingURL=encryption-filter.guard.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption-filter.guard.d.ts","sourceRoot":"","sources":["../../../shared/encryption/encryption-filter.guard.ts"],"names":[],"mappings":"AAAA;;;;;;;GAOG;AACH,qBAAa,qBAAqB;IAC9B,OAAO;IAEP;;;;;;;;;;;;;;;;OAgBG;WACW,eAAe,CACzB,MAAM,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,IAAI,GAAG,SAAS,EAClD,IAAI,EAAE,MAAM,CAAC,MAAM,EAAE,OAAO,CAAC,GAAG,MAAM,GAAG,IAAI,GAAG,SAAS,EACzD,cAAc,EAAE,MAAM,EAAE,GACzB,IAAI;IAOP;;;;;;;;;;OAUG;IACH,OAAO,CAAC,MAAM,CAAC,UAAU;IAkBzB;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,cAAc;IAqB7B;;;;;;;;;;;;OAYG;IACH,OAAO,CAAC,MAAM,CAAC,kBAAkB;CAKpC"}
|
|
@@ -0,0 +1,103 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Fail-loud guard for queries that touch RANDOM-encrypted fields.
|
|
3
|
+
*
|
|
4
|
+
* RANDOM ciphertext is unqueryable: any filter, equality, range, regex or
|
|
5
|
+
* sort on an encrypted path would silently match nothing (or garbage).
|
|
6
|
+
* The guard converts that class of production data bug into an immediate,
|
|
7
|
+
* descriptive error at the call site — in CI, not in front of a customer.
|
|
8
|
+
*/
|
|
9
|
+
export class EncryptionFilterGuard {
|
|
10
|
+
constructor() { }
|
|
11
|
+
/**
|
|
12
|
+
* Asserts that neither the filter nor the sort of a query references an
|
|
13
|
+
* encrypted path. Recurses through `$and` / `$or` / `$nor` branches and
|
|
14
|
+
* flags parent-object matches (e.g. filtering on a whole subdocument
|
|
15
|
+
* that contains encrypted leaves).
|
|
16
|
+
*
|
|
17
|
+
* @param filter - The query filter as returned by `Query.getFilter()`.
|
|
18
|
+
* @param sort - The sort spec (object or string form) from query options.
|
|
19
|
+
* @param encryptedPaths - Dot paths of all encrypted fields of the model.
|
|
20
|
+
* @throws Error naming the offending path when the query is unsafe.
|
|
21
|
+
* @example
|
|
22
|
+
* ```ts
|
|
23
|
+
* EncryptionFilterGuard.assertQuerySafe(
|
|
24
|
+
* { $or: [{ firstName: 'Ann' }] }, undefined, ['firstName']
|
|
25
|
+
* ); // → throws: firstName is RANDOM-encrypted and cannot be filtered
|
|
26
|
+
* ```
|
|
27
|
+
*/
|
|
28
|
+
static assertQuerySafe(filter, sort, encryptedPaths) {
|
|
29
|
+
EncryptionFilterGuard.assertSortSafe(sort, encryptedPaths);
|
|
30
|
+
if (filter) {
|
|
31
|
+
EncryptionFilterGuard.walkFilter(filter, encryptedPaths);
|
|
32
|
+
}
|
|
33
|
+
}
|
|
34
|
+
/**
|
|
35
|
+
* Recursively walks one filter node, throwing on any encrypted-path key.
|
|
36
|
+
*
|
|
37
|
+
* @param node - Filter object or logical-operator branch.
|
|
38
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
39
|
+
* @throws Error when a key covers an encrypted path.
|
|
40
|
+
* @example
|
|
41
|
+
* ```ts
|
|
42
|
+
* // internal use only — called by assertQuerySafe()
|
|
43
|
+
* ```
|
|
44
|
+
*/
|
|
45
|
+
static walkFilter(node, encryptedPaths) {
|
|
46
|
+
for (const [key, value] of Object.entries(node)) {
|
|
47
|
+
if (key === '$and' || key === '$or' || key === '$nor') {
|
|
48
|
+
for (const branch of value ?? []) {
|
|
49
|
+
EncryptionFilterGuard.walkFilter(branch, encryptedPaths);
|
|
50
|
+
}
|
|
51
|
+
continue;
|
|
52
|
+
}
|
|
53
|
+
const hit = EncryptionFilterGuard.matchEncryptedPath(key, encryptedPaths);
|
|
54
|
+
if (hit) {
|
|
55
|
+
throw new Error(`Query filter references '${key}': '${hit}' is RANDOM-encrypted and can never be ` +
|
|
56
|
+
'filtered, matched or compared. Query a plaintext predicate field instead.');
|
|
57
|
+
}
|
|
58
|
+
}
|
|
59
|
+
}
|
|
60
|
+
/**
|
|
61
|
+
* Asserts that no sort key covers an encrypted path (random ciphertext
|
|
62
|
+
* has no meaningful order).
|
|
63
|
+
*
|
|
64
|
+
* @param sort - Sort spec in object (`{ field: 1 }`) or string (`'-field'`) form.
|
|
65
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
66
|
+
* @throws Error when a sort key covers an encrypted path.
|
|
67
|
+
* @example
|
|
68
|
+
* ```ts
|
|
69
|
+
* // internal use only — called by assertQuerySafe()
|
|
70
|
+
* ```
|
|
71
|
+
*/
|
|
72
|
+
static assertSortSafe(sort, encryptedPaths) {
|
|
73
|
+
if (!sort) {
|
|
74
|
+
return;
|
|
75
|
+
}
|
|
76
|
+
const keys = typeof sort === 'string'
|
|
77
|
+
? sort.split(/\s+/).filter(Boolean).map((key) => key.replace(/^-/, ''))
|
|
78
|
+
: Object.keys(sort);
|
|
79
|
+
for (const key of keys) {
|
|
80
|
+
const hit = EncryptionFilterGuard.matchEncryptedPath(key, encryptedPaths);
|
|
81
|
+
if (hit) {
|
|
82
|
+
throw new Error(`Sort key '${key}': '${hit}' is RANDOM-encrypted — ciphertext has no meaningful ` +
|
|
83
|
+
'order. Sort on a plaintext field instead.');
|
|
84
|
+
}
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
/**
|
|
88
|
+
* Matches a filter/sort key against the encrypted paths, including
|
|
89
|
+
* parent-object keys (`bankWizardCheck` covers its encrypted leaves)
|
|
90
|
+
* and child keys under an encrypted leaf.
|
|
91
|
+
*
|
|
92
|
+
* @param key - The filter or sort key to test.
|
|
93
|
+
* @param encryptedPaths - Dot paths of all encrypted fields.
|
|
94
|
+
* @returns The covered encrypted path, or `undefined` when safe.
|
|
95
|
+
* @example
|
|
96
|
+
* ```ts
|
|
97
|
+
* // internal use only
|
|
98
|
+
* ```
|
|
99
|
+
*/
|
|
100
|
+
static matchEncryptedPath(key, encryptedPaths) {
|
|
101
|
+
return encryptedPaths.find((path) => key === path || path.startsWith(`${key}.`) || key.startsWith(`${path}.`));
|
|
102
|
+
}
|
|
103
|
+
}
|
|
@@ -0,0 +1,55 @@
|
|
|
1
|
+
/// <reference types="node" />
|
|
2
|
+
/// <reference types="node" />
|
|
3
|
+
/**
|
|
4
|
+
* Immutable configuration for the field-level encryption layer.
|
|
5
|
+
*
|
|
6
|
+
* The master key is supplied via the `GH_ENCRYPTION_MASTER_KEY` environment
|
|
7
|
+
* variable as a base64-encoded 96-byte value and acts as the `local` KMS
|
|
8
|
+
* provider key for MongoDB Client-Side Field Level Encryption. Validation is
|
|
9
|
+
* fail-fast: a missing or malformed key throws at bootstrap so services never
|
|
10
|
+
* start half-configured. Key material is never echoed in error messages.
|
|
11
|
+
*/
|
|
12
|
+
export declare class EncryptionConfig {
|
|
13
|
+
/** Decoded 96-byte master key used as the `local` KMS provider key. */
|
|
14
|
+
readonly masterKey: Buffer;
|
|
15
|
+
/** `db.collection` namespace of the key vault. */
|
|
16
|
+
readonly keyVaultNamespace: string;
|
|
17
|
+
/** keyAltName used to resolve/provision the single shared DEK. */
|
|
18
|
+
readonly keyAltName: string;
|
|
19
|
+
/** Fixed key vault namespace shared by every Gatehouse service. */
|
|
20
|
+
static readonly KEY_VAULT_NAMESPACE = "encryption.__keyVault";
|
|
21
|
+
/** Alt name of the single shared data encryption key (DEK). */
|
|
22
|
+
static readonly KEY_ALT_NAME = "gatehouse-dek";
|
|
23
|
+
/** Name of the environment variable carrying the master key. */
|
|
24
|
+
static readonly MASTER_KEY_ENV_VAR = "GH_ENCRYPTION_MASTER_KEY";
|
|
25
|
+
/** Required master key length in bytes for the `local` KMS provider. */
|
|
26
|
+
private static readonly MASTER_KEY_BYTES;
|
|
27
|
+
private constructor();
|
|
28
|
+
/**
|
|
29
|
+
* Builds a validated configuration from an environment map.
|
|
30
|
+
*
|
|
31
|
+
* @param env - Environment map, typically `process.env`.
|
|
32
|
+
* @returns A frozen, validated {@link EncryptionConfig}.
|
|
33
|
+
* @throws Error when the env var is missing, not base64, or not 96 bytes.
|
|
34
|
+
* @example
|
|
35
|
+
* ```ts
|
|
36
|
+
* const config = EncryptionConfig.load(process.env);
|
|
37
|
+
* const service = new EncryptionService(config);
|
|
38
|
+
* ```
|
|
39
|
+
*/
|
|
40
|
+
static load(env: Record<string, string | undefined>): EncryptionConfig;
|
|
41
|
+
/**
|
|
42
|
+
* Decodes and validates the base64 master key without ever including the
|
|
43
|
+
* supplied value in error messages.
|
|
44
|
+
*
|
|
45
|
+
* @param raw - Raw base64 string from the environment.
|
|
46
|
+
* @returns The decoded 96-byte key.
|
|
47
|
+
* @throws Error when the value is not strict base64 or has a wrong length.
|
|
48
|
+
* @example
|
|
49
|
+
* ```ts
|
|
50
|
+
* // internal use only — called by EncryptionConfig.load()
|
|
51
|
+
* ```
|
|
52
|
+
*/
|
|
53
|
+
private static decodeMasterKey;
|
|
54
|
+
}
|
|
55
|
+
//# sourceMappingURL=encryption.config.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"encryption.config.d.ts","sourceRoot":"","sources":["../../../shared/encryption/encryption.config.ts"],"names":[],"mappings":";;AAAA;;;;;;;;GAQG;AACH,qBAAa,gBAAgB;IAcrB,uEAAuE;aACvD,SAAS,EAAE,MAAM;IACjC,kDAAkD;aAClC,iBAAiB,EAAE,MAAM;IACzC,kEAAkE;aAClD,UAAU,EAAE,MAAM;IAlBtC,mEAAmE;IACnE,gBAAuB,mBAAmB,2BAA2B;IAErE,+DAA+D;IAC/D,gBAAuB,YAAY,mBAAmB;IAEtD,gEAAgE;IAChE,gBAAuB,kBAAkB,8BAA8B;IAEvE,wEAAwE;IACxE,OAAO,CAAC,MAAM,CAAC,QAAQ,CAAC,gBAAgB,CAAM;IAE9C,OAAO;IASP;;;;;;;;;;;OAWG;WACW,IAAI,CAAC,GAAG,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,GAAG,SAAS,CAAC,GAAG,gBAAgB;IAgB7E;;;;;;;;;;;OAWG;IACH,OAAO,CAAC,MAAM,CAAC,eAAe;CAiBjC"}
|