@digitaldefiance/node-express-suite-mongo 4.23.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +152 -0
- package/package.json +51 -0
- package/src/__tests__/fixtures/index.d.ts +2 -0
- package/src/__tests__/fixtures/index.d.ts.map +1 -0
- package/src/__tests__/fixtures/index.js +5 -0
- package/src/__tests__/fixtures/index.js.map +1 -0
- package/src/__tests__/fixtures/model-mocks.mock.d.ts +12 -0
- package/src/__tests__/fixtures/model-mocks.mock.d.ts.map +1 -0
- package/src/__tests__/fixtures/model-mocks.mock.js +102 -0
- package/src/__tests__/fixtures/model-mocks.mock.js.map +1 -0
- package/src/__tests__/helpers/application.mock.d.ts +4 -0
- package/src/__tests__/helpers/application.mock.d.ts.map +1 -0
- package/src/__tests__/helpers/application.mock.js +35 -0
- package/src/__tests__/helpers/application.mock.js.map +1 -0
- package/src/__tests__/helpers/index.d.ts +5 -0
- package/src/__tests__/helpers/index.d.ts.map +1 -0
- package/src/__tests__/helpers/index.js +8 -0
- package/src/__tests__/helpers/index.js.map +1 -0
- package/src/__tests__/helpers/mongoose-memory.d.ts +14 -0
- package/src/__tests__/helpers/mongoose-memory.d.ts.map +1 -0
- package/src/__tests__/helpers/mongoose-memory.js +49 -0
- package/src/__tests__/helpers/mongoose-memory.js.map +1 -0
- package/src/__tests__/helpers/setup-test-env.d.ts +13 -0
- package/src/__tests__/helpers/setup-test-env.d.ts.map +1 -0
- package/src/__tests__/helpers/setup-test-env.js +131 -0
- package/src/__tests__/helpers/setup-test-env.js.map +1 -0
- package/src/__tests__/index.d.ts +3 -0
- package/src/__tests__/index.d.ts.map +1 -0
- package/src/__tests__/index.js +6 -0
- package/src/__tests__/index.js.map +1 -0
- package/src/builders/application-builder.d.ts +38 -0
- package/src/builders/application-builder.d.ts.map +1 -0
- package/src/builders/application-builder.js +82 -0
- package/src/builders/application-builder.js.map +1 -0
- package/src/builders/index.d.ts +2 -0
- package/src/builders/index.d.ts.map +1 -0
- package/src/builders/index.js +5 -0
- package/src/builders/index.js.map +1 -0
- package/src/controllers/index.d.ts +3 -0
- package/src/controllers/index.d.ts.map +1 -0
- package/src/controllers/index.js +6 -0
- package/src/controllers/index.js.map +1 -0
- package/src/controllers/mongo-base.d.ts +55 -0
- package/src/controllers/mongo-base.d.ts.map +1 -0
- package/src/controllers/mongo-base.js +108 -0
- package/src/controllers/mongo-base.js.map +1 -0
- package/src/controllers/user.d.ts +61 -0
- package/src/controllers/user.d.ts.map +1 -0
- package/src/controllers/user.js +944 -0
- package/src/controllers/user.js.map +1 -0
- package/src/documents/base.d.ts +15 -0
- package/src/documents/base.d.ts.map +1 -0
- package/src/documents/base.js +8 -0
- package/src/documents/base.js.map +1 -0
- package/src/documents/email-token.d.ts +15 -0
- package/src/documents/email-token.d.ts.map +1 -0
- package/src/documents/email-token.js +8 -0
- package/src/documents/email-token.js.map +1 -0
- package/src/documents/index.d.ts +8 -0
- package/src/documents/index.d.ts.map +1 -0
- package/src/documents/index.js +3 -0
- package/src/documents/index.js.map +1 -0
- package/src/documents/mnemonic.d.ts +16 -0
- package/src/documents/mnemonic.d.ts.map +1 -0
- package/src/documents/mnemonic.js +8 -0
- package/src/documents/mnemonic.js.map +1 -0
- package/src/documents/role.d.ts +15 -0
- package/src/documents/role.d.ts.map +1 -0
- package/src/documents/role.js +8 -0
- package/src/documents/role.js.map +1 -0
- package/src/documents/used-direct-login-token.d.ts +16 -0
- package/src/documents/used-direct-login-token.d.ts.map +1 -0
- package/src/documents/used-direct-login-token.js +8 -0
- package/src/documents/used-direct-login-token.js.map +1 -0
- package/src/documents/user-role.d.ts +16 -0
- package/src/documents/user-role.d.ts.map +1 -0
- package/src/documents/user-role.js +8 -0
- package/src/documents/user-role.js.map +1 -0
- package/src/documents/user.d.ts +16 -0
- package/src/documents/user.d.ts.map +1 -0
- package/src/documents/user.js +8 -0
- package/src/documents/user.js.map +1 -0
- package/src/enumerations/base-model-name.d.ts +43 -0
- package/src/enumerations/base-model-name.d.ts.map +1 -0
- package/src/enumerations/base-model-name.js +39 -0
- package/src/enumerations/base-model-name.js.map +1 -0
- package/src/enumerations/index.d.ts +3 -0
- package/src/enumerations/index.d.ts.map +1 -0
- package/src/enumerations/index.js +6 -0
- package/src/enumerations/index.js.map +1 -0
- package/src/enumerations/schema-collection.d.ts +39 -0
- package/src/enumerations/schema-collection.d.ts.map +1 -0
- package/src/enumerations/schema-collection.js +43 -0
- package/src/enumerations/schema-collection.js.map +1 -0
- package/src/errors/index.d.ts +5 -0
- package/src/errors/index.d.ts.map +1 -0
- package/src/errors/index.js +8 -0
- package/src/errors/index.js.map +1 -0
- package/src/errors/invalid-backup-code-version.d.ts +5 -0
- package/src/errors/invalid-backup-code-version.d.ts.map +1 -0
- package/src/errors/invalid-backup-code-version.js +14 -0
- package/src/errors/invalid-backup-code-version.js.map +1 -0
- package/src/errors/invalid-model.d.ts +18 -0
- package/src/errors/invalid-model.d.ts.map +1 -0
- package/src/errors/invalid-model.js +26 -0
- package/src/errors/invalid-model.js.map +1 -0
- package/src/errors/model-not-registered.d.ts +18 -0
- package/src/errors/model-not-registered.d.ts.map +1 -0
- package/src/errors/model-not-registered.js +26 -0
- package/src/errors/model-not-registered.js.map +1 -0
- package/src/errors/mongoose-validation.d.ts +28 -0
- package/src/errors/mongoose-validation.d.ts.map +1 -0
- package/src/errors/mongoose-validation.js +33 -0
- package/src/errors/mongoose-validation.js.map +1 -0
- package/src/index.d.ts +19 -0
- package/src/index.d.ts.map +1 -0
- package/src/index.js +31 -0
- package/src/index.js.map +1 -0
- package/src/interfaces/api-mongo-validation-error-response.d.ts +16 -0
- package/src/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
- package/src/interfaces/api-mongo-validation-error-response.js +8 -0
- package/src/interfaces/api-mongo-validation-error-response.js.map +1 -0
- package/src/interfaces/database-init-result-tx.d.ts +27 -0
- package/src/interfaces/database-init-result-tx.d.ts.map +1 -0
- package/src/interfaces/database-init-result-tx.js +3 -0
- package/src/interfaces/database-init-result-tx.js.map +1 -0
- package/src/interfaces/db-init-result.d.ts +16 -0
- package/src/interfaces/db-init-result.d.ts.map +1 -0
- package/src/interfaces/db-init-result.js +8 -0
- package/src/interfaces/db-init-result.js.map +1 -0
- package/src/interfaces/discriminator-collections.d.ts +17 -0
- package/src/interfaces/discriminator-collections.d.ts.map +1 -0
- package/src/interfaces/discriminator-collections.js +8 -0
- package/src/interfaces/discriminator-collections.js.map +1 -0
- package/src/interfaces/environment-mongo.d.ts +88 -0
- package/src/interfaces/environment-mongo.d.ts.map +1 -0
- package/src/interfaces/environment-mongo.js +8 -0
- package/src/interfaces/environment-mongo.js.map +1 -0
- package/src/interfaces/index.d.ts +13 -0
- package/src/interfaces/index.d.ts.map +1 -0
- package/src/interfaces/index.js +16 -0
- package/src/interfaces/index.js.map +1 -0
- package/src/interfaces/models/email-token.d.ts +12 -0
- package/src/interfaces/models/email-token.d.ts.map +1 -0
- package/src/interfaces/models/email-token.js +8 -0
- package/src/interfaces/models/email-token.js.map +1 -0
- package/src/interfaces/models/index.d.ts +8 -0
- package/src/interfaces/models/index.d.ts.map +1 -0
- package/src/interfaces/models/index.js +11 -0
- package/src/interfaces/models/index.js.map +1 -0
- package/src/interfaces/models/mnemonic.d.ts +13 -0
- package/src/interfaces/models/mnemonic.d.ts.map +1 -0
- package/src/interfaces/models/mnemonic.js +8 -0
- package/src/interfaces/models/mnemonic.js.map +1 -0
- package/src/interfaces/models/role.d.ts +12 -0
- package/src/interfaces/models/role.d.ts.map +1 -0
- package/src/interfaces/models/role.js +8 -0
- package/src/interfaces/models/role.js.map +1 -0
- package/src/interfaces/models/token-role.d.ts +19 -0
- package/src/interfaces/models/token-role.d.ts.map +1 -0
- package/src/interfaces/models/token-role.js +8 -0
- package/src/interfaces/models/token-role.js.map +1 -0
- package/src/interfaces/models/used-direct-login-token.d.ts +19 -0
- package/src/interfaces/models/used-direct-login-token.d.ts.map +1 -0
- package/src/interfaces/models/used-direct-login-token.js +8 -0
- package/src/interfaces/models/used-direct-login-token.js.map +1 -0
- package/src/interfaces/models/user-role.d.ts +19 -0
- package/src/interfaces/models/user-role.d.ts.map +1 -0
- package/src/interfaces/models/user-role.js +8 -0
- package/src/interfaces/models/user-role.js.map +1 -0
- package/src/interfaces/models/user.d.ts +21 -0
- package/src/interfaces/models/user.d.ts.map +1 -0
- package/src/interfaces/models/user.js +8 -0
- package/src/interfaces/models/user.js.map +1 -0
- package/src/interfaces/mongo-application.d.ts +47 -0
- package/src/interfaces/mongo-application.d.ts.map +1 -0
- package/src/interfaces/mongo-application.js +10 -0
- package/src/interfaces/mongo-application.js.map +1 -0
- package/src/interfaces/mongo-errors.d.ts +13 -0
- package/src/interfaces/mongo-errors.d.ts.map +1 -0
- package/src/interfaces/mongo-errors.js +8 -0
- package/src/interfaces/mongo-errors.js.map +1 -0
- package/src/interfaces/mongoose-document-store.d.ts +42 -0
- package/src/interfaces/mongoose-document-store.d.ts.map +1 -0
- package/src/interfaces/mongoose-document-store.js +10 -0
- package/src/interfaces/mongoose-document-store.js.map +1 -0
- package/src/interfaces/schema.d.ts +37 -0
- package/src/interfaces/schema.d.ts.map +1 -0
- package/src/interfaces/schema.js +8 -0
- package/src/interfaces/schema.js.map +1 -0
- package/src/interfaces/server-init-result.d.ts +45 -0
- package/src/interfaces/server-init-result.d.ts.map +1 -0
- package/src/interfaces/server-init-result.js +8 -0
- package/src/interfaces/server-init-result.js.map +1 -0
- package/src/interfaces/test-environment.d.ts +22 -0
- package/src/interfaces/test-environment.d.ts.map +1 -0
- package/src/interfaces/test-environment.js +8 -0
- package/src/interfaces/test-environment.js.map +1 -0
- package/src/model-registry.d.ts +79 -0
- package/src/model-registry.d.ts.map +1 -0
- package/src/model-registry.js +97 -0
- package/src/model-registry.js.map +1 -0
- package/src/models/email-token.d.ts +24 -0
- package/src/models/email-token.d.ts.map +1 -0
- package/src/models/email-token.js +16 -0
- package/src/models/email-token.js.map +1 -0
- package/src/models/index.d.ts +7 -0
- package/src/models/index.d.ts.map +1 -0
- package/src/models/index.js +10 -0
- package/src/models/index.js.map +1 -0
- package/src/models/mnemonic.d.ts +24 -0
- package/src/models/mnemonic.d.ts.map +1 -0
- package/src/models/mnemonic.js +27 -0
- package/src/models/mnemonic.js.map +1 -0
- package/src/models/role.d.ts +24 -0
- package/src/models/role.d.ts.map +1 -0
- package/src/models/role.js +27 -0
- package/src/models/role.js.map +1 -0
- package/src/models/used-direct-login-token.d.ts +24 -0
- package/src/models/used-direct-login-token.d.ts.map +1 -0
- package/src/models/used-direct-login-token.js +16 -0
- package/src/models/used-direct-login-token.js.map +1 -0
- package/src/models/user-role.d.ts +23 -0
- package/src/models/user-role.d.ts.map +1 -0
- package/src/models/user-role.js +26 -0
- package/src/models/user-role.js.map +1 -0
- package/src/models/user.d.ts +24 -0
- package/src/models/user.d.ts.map +1 -0
- package/src/models/user.js +27 -0
- package/src/models/user.js.map +1 -0
- package/src/mongo-application-concrete.d.ts +30 -0
- package/src/mongo-application-concrete.d.ts.map +1 -0
- package/src/mongo-application-concrete.js +46 -0
- package/src/mongo-application-concrete.js.map +1 -0
- package/src/plugins/index.d.ts +2 -0
- package/src/plugins/index.d.ts.map +1 -0
- package/src/plugins/index.js +5 -0
- package/src/plugins/index.js.map +1 -0
- package/src/plugins/mongo-database-plugin.d.ts +116 -0
- package/src/plugins/mongo-database-plugin.d.ts.map +1 -0
- package/src/plugins/mongo-database-plugin.js +230 -0
- package/src/plugins/mongo-database-plugin.js.map +1 -0
- package/src/routers/api.d.ts +29 -0
- package/src/routers/api.d.ts.map +1 -0
- package/src/routers/api.js +84 -0
- package/src/routers/api.js.map +1 -0
- package/src/routers/index.d.ts +2 -0
- package/src/routers/index.d.ts.map +1 -0
- package/src/routers/index.js +5 -0
- package/src/routers/index.js.map +1 -0
- package/src/schemas/email-token.d.ts +65 -0
- package/src/schemas/email-token.d.ts.map +1 -0
- package/src/schemas/email-token.js +68 -0
- package/src/schemas/email-token.js.map +1 -0
- package/src/schemas/index.d.ts +8 -0
- package/src/schemas/index.d.ts.map +1 -0
- package/src/schemas/index.js +11 -0
- package/src/schemas/index.js.map +1 -0
- package/src/schemas/mnemonic.d.ts +37 -0
- package/src/schemas/mnemonic.d.ts.map +1 -0
- package/src/schemas/mnemonic.js +41 -0
- package/src/schemas/mnemonic.js.map +1 -0
- package/src/schemas/role.d.ts +57 -0
- package/src/schemas/role.d.ts.map +1 -0
- package/src/schemas/role.js +102 -0
- package/src/schemas/role.js.map +1 -0
- package/src/schemas/schema.d.ts +62 -0
- package/src/schemas/schema.d.ts.map +1 -0
- package/src/schemas/schema.js +81 -0
- package/src/schemas/schema.js.map +1 -0
- package/src/schemas/used-direct-login-token.d.ts +49 -0
- package/src/schemas/used-direct-login-token.d.ts.map +1 -0
- package/src/schemas/used-direct-login-token.js +35 -0
- package/src/schemas/used-direct-login-token.js.map +1 -0
- package/src/schemas/user-role.d.ts +52 -0
- package/src/schemas/user-role.d.ts.map +1 -0
- package/src/schemas/user-role.js +67 -0
- package/src/schemas/user-role.js.map +1 -0
- package/src/schemas/user.d.ts +43 -0
- package/src/schemas/user.d.ts.map +1 -0
- package/src/schemas/user.js +214 -0
- package/src/schemas/user.js.map +1 -0
- package/src/services/backup-code.d.ts +118 -0
- package/src/services/backup-code.d.ts.map +1 -0
- package/src/services/backup-code.js +320 -0
- package/src/services/backup-code.js.map +1 -0
- package/src/services/database-initialization.d.ts +137 -0
- package/src/services/database-initialization.d.ts.map +1 -0
- package/src/services/database-initialization.js +911 -0
- package/src/services/database-initialization.js.map +1 -0
- package/src/services/db-init-cache.d.ts +18 -0
- package/src/services/db-init-cache.d.ts.map +1 -0
- package/src/services/db-init-cache.js +7 -0
- package/src/services/db-init-cache.js.map +1 -0
- package/src/services/direct-login-token.d.ts +28 -0
- package/src/services/direct-login-token.d.ts.map +1 -0
- package/src/services/direct-login-token.js +62 -0
- package/src/services/direct-login-token.js.map +1 -0
- package/src/services/index.d.ts +17 -0
- package/src/services/index.d.ts.map +1 -0
- package/src/services/index.js +20 -0
- package/src/services/index.js.map +1 -0
- package/src/services/jwt.d.ts +20 -0
- package/src/services/jwt.d.ts.map +1 -0
- package/src/services/jwt.js +79 -0
- package/src/services/jwt.js.map +1 -0
- package/src/services/mnemonic.d.ts +30 -0
- package/src/services/mnemonic.d.ts.map +1 -0
- package/src/services/mnemonic.js +80 -0
- package/src/services/mnemonic.js.map +1 -0
- package/src/services/mongo-authentication-provider.d.ts +27 -0
- package/src/services/mongo-authentication-provider.d.ts.map +1 -0
- package/src/services/mongo-authentication-provider.js +97 -0
- package/src/services/mongo-authentication-provider.js.map +1 -0
- package/src/services/mongo-backup-code-store.d.ts +40 -0
- package/src/services/mongo-backup-code-store.d.ts.map +1 -0
- package/src/services/mongo-backup-code-store.js +104 -0
- package/src/services/mongo-backup-code-store.js.map +1 -0
- package/src/services/mongo-base.d.ts +24 -0
- package/src/services/mongo-base.d.ts.map +1 -0
- package/src/services/mongo-base.js +28 -0
- package/src/services/mongo-base.js.map +1 -0
- package/src/services/mongoose-collection.d.ts +52 -0
- package/src/services/mongoose-collection.d.ts.map +1 -0
- package/src/services/mongoose-collection.js +326 -0
- package/src/services/mongoose-collection.js.map +1 -0
- package/src/services/mongoose-database.d.ts +64 -0
- package/src/services/mongoose-database.d.ts.map +1 -0
- package/src/services/mongoose-database.js +121 -0
- package/src/services/mongoose-database.js.map +1 -0
- package/src/services/mongoose-document-store.d.ts +108 -0
- package/src/services/mongoose-document-store.d.ts.map +1 -0
- package/src/services/mongoose-document-store.js +265 -0
- package/src/services/mongoose-document-store.js.map +1 -0
- package/src/services/mongoose-session-adapter.d.ts +39 -0
- package/src/services/mongoose-session-adapter.d.ts.map +1 -0
- package/src/services/mongoose-session-adapter.js +63 -0
- package/src/services/mongoose-session-adapter.js.map +1 -0
- package/src/services/request-user.d.ts +22 -0
- package/src/services/request-user.d.ts.map +1 -0
- package/src/services/request-user.js +66 -0
- package/src/services/request-user.js.map +1 -0
- package/src/services/role.d.ts +97 -0
- package/src/services/role.d.ts.map +1 -0
- package/src/services/role.js +288 -0
- package/src/services/role.js.map +1 -0
- package/src/services/user.d.ts +362 -0
- package/src/services/user.d.ts.map +1 -0
- package/src/services/user.js +1504 -0
- package/src/services/user.js.map +1 -0
- package/src/testing.d.ts +9 -0
- package/src/testing.d.ts.map +1 -0
- package/src/testing.js +12 -0
- package/src/testing.js.map +1 -0
- package/src/transactions/index.d.ts +2 -0
- package/src/transactions/index.d.ts.map +1 -0
- package/src/transactions/index.js +5 -0
- package/src/transactions/index.js.map +1 -0
- package/src/transactions/transaction-manager.d.ts +37 -0
- package/src/transactions/transaction-manager.d.ts.map +1 -0
- package/src/transactions/transaction-manager.js +50 -0
- package/src/transactions/transaction-manager.js.map +1 -0
- package/src/types/index.d.ts +26 -0
- package/src/types/index.d.ts.map +1 -0
- package/src/types/index.js +9 -0
- package/src/types/index.js.map +1 -0
- package/src/types/mongoose-helpers.d.ts +16 -0
- package/src/types/mongoose-helpers.d.ts.map +1 -0
- package/src/types/mongoose-helpers.js +8 -0
- package/src/types/mongoose-helpers.js.map +1 -0
- package/src/utils/default-mongo-uri-validator.d.ts +15 -0
- package/src/utils/default-mongo-uri-validator.d.ts.map +1 -0
- package/src/utils/default-mongo-uri-validator.js +46 -0
- package/src/utils/default-mongo-uri-validator.js.map +1 -0
- package/src/utils/index.d.ts +5 -0
- package/src/utils/index.d.ts.map +1 -0
- package/src/utils/index.js +8 -0
- package/src/utils/index.js.map +1 -0
- package/src/utils/mongo-error-response.d.ts +17 -0
- package/src/utils/mongo-error-response.d.ts.map +1 -0
- package/src/utils/mongo-error-response.js +21 -0
- package/src/utils/mongo-error-response.js.map +1 -0
- package/src/utils/mongo-transaction.d.ts +39 -0
- package/src/utils/mongo-transaction.d.ts.map +1 -0
- package/src/utils/mongo-transaction.js +131 -0
- package/src/utils/mongo-transaction.js.map +1 -0
- package/src/utils/object-id.d.ts +11 -0
- package/src/utils/object-id.d.ts.map +1 -0
- package/src/utils/object-id.js +17 -0
- package/src/utils/object-id.js.map +1 -0
|
@@ -0,0 +1,67 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview User-role relationship schema factory for MongoDB.
|
|
4
|
+
* Creates schema for many-to-many user-role associations.
|
|
5
|
+
* @module schemas/user-role
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.UserRoleSchema = void 0;
|
|
9
|
+
exports.createUserRoleSchema = createUserRoleSchema;
|
|
10
|
+
const mongoose_types_1 = require("@digitaldefiance/mongoose-types");
|
|
11
|
+
const enumerations_1 = require("../enumerations");
|
|
12
|
+
/**
|
|
13
|
+
* Factory function to create an extensible user-role schema.
|
|
14
|
+
* Includes compound unique index and separate indexes for queries.
|
|
15
|
+
* @template TModelName - Model name type (defaults to BaseModelName)
|
|
16
|
+
* @template TConstants - Constants type (defaults to IConstants)
|
|
17
|
+
* @param {UserRoleSchemaOptions<TModelName>} options - Schema configuration options
|
|
18
|
+
* @param {TConstants} [_constants] - Optional constants (reserved for future use)
|
|
19
|
+
* @returns {Schema} Configured user-role schema with indexes
|
|
20
|
+
*/
|
|
21
|
+
function createUserRoleSchema(options = {}, _constants) {
|
|
22
|
+
const { userModelName = enumerations_1.BaseModelName.User, roleModelName = enumerations_1.BaseModelName.Role, idType = mongoose_types_1.Schema.Types.ObjectId, } = options;
|
|
23
|
+
const definition = {
|
|
24
|
+
userId: {
|
|
25
|
+
type: idType,
|
|
26
|
+
ref: userModelName,
|
|
27
|
+
required: true,
|
|
28
|
+
},
|
|
29
|
+
roleId: {
|
|
30
|
+
type: idType,
|
|
31
|
+
ref: roleModelName,
|
|
32
|
+
required: true,
|
|
33
|
+
},
|
|
34
|
+
createdBy: {
|
|
35
|
+
type: idType,
|
|
36
|
+
ref: userModelName,
|
|
37
|
+
required: true,
|
|
38
|
+
immutable: true,
|
|
39
|
+
},
|
|
40
|
+
updatedBy: {
|
|
41
|
+
type: idType,
|
|
42
|
+
ref: userModelName,
|
|
43
|
+
required: true,
|
|
44
|
+
},
|
|
45
|
+
deletedAt: {
|
|
46
|
+
type: Date,
|
|
47
|
+
optional: true,
|
|
48
|
+
},
|
|
49
|
+
deletedBy: {
|
|
50
|
+
type: idType,
|
|
51
|
+
ref: userModelName,
|
|
52
|
+
required: false,
|
|
53
|
+
optional: true,
|
|
54
|
+
},
|
|
55
|
+
};
|
|
56
|
+
const schema = new mongoose_types_1.Schema(definition, { timestamps: true });
|
|
57
|
+
schema.index({ userId: 1, roleId: 1 }, { unique: true });
|
|
58
|
+
schema.index({ userId: 1 });
|
|
59
|
+
schema.index({ roleId: 1 });
|
|
60
|
+
return schema;
|
|
61
|
+
}
|
|
62
|
+
/**
|
|
63
|
+
* Default user-role schema with base configuration.
|
|
64
|
+
* Pre-configured schema with compound unique index on userId and roleId.
|
|
65
|
+
*/
|
|
66
|
+
exports.UserRoleSchema = createUserRoleSchema();
|
|
67
|
+
//# sourceMappingURL=user-role.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user-role.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/schemas/user-role.ts"],"names":[],"mappings":";AAAA;;;;GAIG;;;AA8BH,oDAoDC;AAhFD,oEAAyD;AACzD,kDAAgD;AAkBhD;;;;;;;;GAQG;AACH,SAAgB,oBAAoB,CAIlC,UAA6C,EAAE,EAC/C,UAAuB;IAEvB,MAAM,EACJ,aAAa,GAAG,4BAAa,CAAC,IAAkB,EAChD,aAAa,GAAG,4BAAa,CAAC,IAAkB,EAChD,MAAM,GAAG,uBAAM,CAAC,KAAK,CAAC,QAAQ,GAC/B,GAAG,OAAO,CAAC;IAEZ,MAAM,UAAU,GAAG;QACjB,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,IAAI;SACf;QACD,MAAM,EAAE;YACN,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,IAAI;SACf;QACD,SAAS,EAAE;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,IAAI;YACd,SAAS,EAAE,IAAI;SAChB;QACD,SAAS,EAAE;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,IAAI;SACf;QACD,SAAS,EAAE;YACT,IAAI,EAAE,IAAI;YACV,QAAQ,EAAE,IAAI;SACf;QACD,SAAS,EAAE;YACT,IAAI,EAAE,MAAM;YACZ,GAAG,EAAE,aAAa;YAClB,QAAQ,EAAE,KAAK;YACf,QAAQ,EAAE,IAAI;SACf;KACF,CAAC;IAEF,MAAM,MAAM,GAAG,IAAI,uBAAM,CAAC,UAAU,EAAE,EAAE,UAAU,EAAE,IAAI,EAAE,CAAC,CAAC;IAC5D,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,EAAE,EAAE,MAAM,EAAE,IAAI,EAAE,CAAC,CAAC;IACzD,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5B,MAAM,CAAC,KAAK,CAAC,EAAE,MAAM,EAAE,CAAC,EAAE,CAAC,CAAC;IAC5B,OAAO,MAAM,CAAC;AAChB,CAAC;AAED;;;GAGG;AACU,QAAA,cAAc,GAAG,oBAAoB,EAAE,CAAC"}
|
|
@@ -0,0 +1,43 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview User schema factory for MongoDB with comprehensive validation.
|
|
3
|
+
* Creates schema for user management with authentication and preferences.
|
|
4
|
+
* @module schemas/user
|
|
5
|
+
*/
|
|
6
|
+
import { Schema } from '@digitaldefiance/mongoose-types';
|
|
7
|
+
import { IConstants } from '@digitaldefiance/node-express-suite';
|
|
8
|
+
/**
|
|
9
|
+
* Creates a user schema with custom or default constants.
|
|
10
|
+
* Includes validation for username, email, timezone, currency, and language.
|
|
11
|
+
* @template T - Constants type extending IConstants
|
|
12
|
+
* @param {Function} [usernameValidationMessage] - Custom username validation message
|
|
13
|
+
* @param {Function} [emailValidationMessage] - Custom email validation message
|
|
14
|
+
* @param {Function} [timezoneValidationMessage] - Custom timezone validation message
|
|
15
|
+
* @param {Function} [currencyValidationMessage] - Custom currency validation message
|
|
16
|
+
* @param {readonly string[]} [supportedLanguages] - Supported language codes
|
|
17
|
+
* @param {any} idType - ID type for references (defaults to ObjectId)
|
|
18
|
+
* @param {T} constants - Constants for validation (defaults to AppConstants)
|
|
19
|
+
* @returns {Schema} Configured user schema with timestamps
|
|
20
|
+
*/
|
|
21
|
+
export declare function createUserSchema<T extends IConstants = IConstants>(usernameValidationMessage?: () => string, emailValidationMessage?: () => string, timezoneValidationMessage?: () => string, currencyValidationMessage?: () => string, supportedLanguages?: readonly string[], idType?: any, constants?: T): Schema;
|
|
22
|
+
/**
|
|
23
|
+
* Default user schema with base configuration.
|
|
24
|
+
* Pre-configured schema with standard validation and supported languages.
|
|
25
|
+
*/
|
|
26
|
+
export declare const UserSchema: Schema<any, import("mongoose").Model<any, any, any, any, any, any>, {}, {}, {}, {}, import("mongoose").DefaultSchemaOptions, {
|
|
27
|
+
[x: number]: unknown;
|
|
28
|
+
[x: symbol]: unknown;
|
|
29
|
+
[x: string]: unknown;
|
|
30
|
+
}, import("mongoose").Document<unknown, {}, import("mongoose").FlatRecord<{
|
|
31
|
+
[x: number]: unknown;
|
|
32
|
+
[x: symbol]: unknown;
|
|
33
|
+
[x: string]: unknown;
|
|
34
|
+
}>, {}, import("mongoose").ResolveSchemaOptions<import("mongoose").DefaultSchemaOptions>> & import("mongoose").FlatRecord<{
|
|
35
|
+
[x: number]: unknown;
|
|
36
|
+
[x: symbol]: unknown;
|
|
37
|
+
[x: string]: unknown;
|
|
38
|
+
}> & Required<{
|
|
39
|
+
_id: unknown;
|
|
40
|
+
}> & {
|
|
41
|
+
__v: number;
|
|
42
|
+
}>;
|
|
43
|
+
//# sourceMappingURL=user.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/schemas/user.ts"],"names":[],"mappings":"AAAA;;;;GAIG;AAGH,OAAO,EAAE,MAAM,EAAE,MAAM,iCAAiC,CAAC;AAQzD,OAAO,EAEL,UAAU,EACX,MAAM,qCAAqC,CAAC;AAG7C;;;;;;;;;;;;GAYG;AACH,wBAAgB,gBAAgB,CAAC,CAAC,SAAS,UAAU,GAAG,UAAU,EAChE,yBAAyB,CAAC,EAAE,MAAM,MAAM,EACxC,sBAAsB,CAAC,EAAE,MAAM,MAAM,EACrC,yBAAyB,CAAC,EAAE,MAAM,MAAM,EACxC,yBAAyB,CAAC,EAAE,MAAM,MAAM,EACxC,kBAAkB,CAAC,EAAE,SAAS,MAAM,EAAE,EACtC,MAAM,GAAE,GAA2B,EACnC,SAAS,GAAE,CAAqB,GAC/B,MAAM,CAqMR;AAED;;;GAGG;AACH,eAAO,MAAM,UAAU;;;;;;;;;;;;;;;;EAAqB,CAAC"}
|
|
@@ -0,0 +1,214 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview User schema factory for MongoDB with comprehensive validation.
|
|
4
|
+
* Creates schema for user management with authentication and preferences.
|
|
5
|
+
* @module schemas/user
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.UserSchema = void 0;
|
|
9
|
+
exports.createUserSchema = createUserSchema;
|
|
10
|
+
const tslib_1 = require("tslib");
|
|
11
|
+
const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
|
|
12
|
+
const mongoose_types_1 = require("@digitaldefiance/mongoose-types");
|
|
13
|
+
const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
|
|
14
|
+
const currency_codes_1 = require("currency-codes");
|
|
15
|
+
const validator_1 = tslib_1.__importDefault(require("validator"));
|
|
16
|
+
const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
|
|
17
|
+
const enumerations_1 = require("../enumerations");
|
|
18
|
+
/**
|
|
19
|
+
* Creates a user schema with custom or default constants.
|
|
20
|
+
* Includes validation for username, email, timezone, currency, and language.
|
|
21
|
+
* @template T - Constants type extending IConstants
|
|
22
|
+
* @param {Function} [usernameValidationMessage] - Custom username validation message
|
|
23
|
+
* @param {Function} [emailValidationMessage] - Custom email validation message
|
|
24
|
+
* @param {Function} [timezoneValidationMessage] - Custom timezone validation message
|
|
25
|
+
* @param {Function} [currencyValidationMessage] - Custom currency validation message
|
|
26
|
+
* @param {readonly string[]} [supportedLanguages] - Supported language codes
|
|
27
|
+
* @param {any} idType - ID type for references (defaults to ObjectId)
|
|
28
|
+
* @param {T} constants - Constants for validation (defaults to AppConstants)
|
|
29
|
+
* @returns {Schema} Configured user schema with timestamps
|
|
30
|
+
*/
|
|
31
|
+
function createUserSchema(usernameValidationMessage, emailValidationMessage, timezoneValidationMessage, currencyValidationMessage, supportedLanguages, idType = mongoose_types_1.Schema.Types.ObjectId, constants = node_express_suite_1.LocalhostConstants) {
|
|
32
|
+
const definition = {
|
|
33
|
+
/**
|
|
34
|
+
* The unique identifier for the user
|
|
35
|
+
*/
|
|
36
|
+
username: {
|
|
37
|
+
type: String,
|
|
38
|
+
required: true,
|
|
39
|
+
unique: true,
|
|
40
|
+
validate: {
|
|
41
|
+
validator: (v) => constants.UsernameRegex.test(v),
|
|
42
|
+
message: usernameValidationMessage ||
|
|
43
|
+
(() => (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Validation_UsernameRegexErrorTemplate)),
|
|
44
|
+
},
|
|
45
|
+
},
|
|
46
|
+
/**
|
|
47
|
+
* The email address for the user
|
|
48
|
+
*/
|
|
49
|
+
email: {
|
|
50
|
+
type: String,
|
|
51
|
+
required: true,
|
|
52
|
+
unique: true,
|
|
53
|
+
validate: {
|
|
54
|
+
validator: (v) => validator_1.default.isEmail(v),
|
|
55
|
+
message: emailValidationMessage ||
|
|
56
|
+
((props) => (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Error_InvalidEmailTemplate, { email: props.value })),
|
|
57
|
+
},
|
|
58
|
+
},
|
|
59
|
+
/**
|
|
60
|
+
* The user's public key, stored in hex format.
|
|
61
|
+
*/
|
|
62
|
+
publicKey: {
|
|
63
|
+
type: String,
|
|
64
|
+
required: true,
|
|
65
|
+
unique: true,
|
|
66
|
+
},
|
|
67
|
+
/**
|
|
68
|
+
* The timezone for the user
|
|
69
|
+
*/
|
|
70
|
+
timezone: {
|
|
71
|
+
type: String,
|
|
72
|
+
required: true,
|
|
73
|
+
default: 'UTC',
|
|
74
|
+
validate: {
|
|
75
|
+
validator: function (v) {
|
|
76
|
+
return (0, i18n_lib_1.isValidTimezone)(v);
|
|
77
|
+
},
|
|
78
|
+
message: timezoneValidationMessage ||
|
|
79
|
+
((props) => (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NotValidTimeZoneTemplate, { timezone: props.value })),
|
|
80
|
+
},
|
|
81
|
+
},
|
|
82
|
+
currency: {
|
|
83
|
+
type: String,
|
|
84
|
+
required: true,
|
|
85
|
+
default: 'USD',
|
|
86
|
+
validate: {
|
|
87
|
+
validator: function (v) {
|
|
88
|
+
return (0, currency_codes_1.codes)().includes(v);
|
|
89
|
+
},
|
|
90
|
+
message: currencyValidationMessage ||
|
|
91
|
+
((props) => (0, suite_core_lib_1.getSuiteCoreTranslation)(suite_core_lib_1.SuiteCoreStringKey.Common_NotValidCurrencyTemplate, { currency: props.value })),
|
|
92
|
+
},
|
|
93
|
+
},
|
|
94
|
+
/**
|
|
95
|
+
* The language of the site for the user
|
|
96
|
+
*/
|
|
97
|
+
siteLanguage: {
|
|
98
|
+
type: String,
|
|
99
|
+
enum: supportedLanguages || Object.values(i18n_lib_1.LanguageCodes),
|
|
100
|
+
default: i18n_lib_1.LanguageCodes.EN_US,
|
|
101
|
+
required: true,
|
|
102
|
+
},
|
|
103
|
+
/**
|
|
104
|
+
* Whether the user prefers dark mode
|
|
105
|
+
*/
|
|
106
|
+
darkMode: {
|
|
107
|
+
type: Boolean,
|
|
108
|
+
default: false,
|
|
109
|
+
required: true,
|
|
110
|
+
},
|
|
111
|
+
/**
|
|
112
|
+
* Whether to enable direct challenge login for the user
|
|
113
|
+
*/
|
|
114
|
+
directChallenge: {
|
|
115
|
+
type: Boolean,
|
|
116
|
+
default: true,
|
|
117
|
+
required: true,
|
|
118
|
+
},
|
|
119
|
+
/**
|
|
120
|
+
* The date the user last logged in
|
|
121
|
+
*/
|
|
122
|
+
lastLogin: { type: Date, required: false },
|
|
123
|
+
/**
|
|
124
|
+
* Whether the user has verified their email address
|
|
125
|
+
*/
|
|
126
|
+
emailVerified: { type: Boolean, default: false },
|
|
127
|
+
/**
|
|
128
|
+
* The status of the user's account
|
|
129
|
+
*/
|
|
130
|
+
accountStatus: {
|
|
131
|
+
type: String,
|
|
132
|
+
enum: Object.values(suite_core_lib_1.AccountStatus),
|
|
133
|
+
default: suite_core_lib_1.AccountStatus.PendingEmailVerification,
|
|
134
|
+
},
|
|
135
|
+
/**
|
|
136
|
+
* The user who created the user.
|
|
137
|
+
*/
|
|
138
|
+
createdBy: {
|
|
139
|
+
type: idType,
|
|
140
|
+
ref: enumerations_1.BaseModelName.User,
|
|
141
|
+
required: true,
|
|
142
|
+
immutable: true,
|
|
143
|
+
},
|
|
144
|
+
/**
|
|
145
|
+
* The user who last updated the user.
|
|
146
|
+
*/
|
|
147
|
+
updatedBy: {
|
|
148
|
+
type: idType,
|
|
149
|
+
ref: enumerations_1.BaseModelName.User,
|
|
150
|
+
optional: true,
|
|
151
|
+
},
|
|
152
|
+
/**
|
|
153
|
+
* The date/time the user was deleted.
|
|
154
|
+
*/
|
|
155
|
+
deletedAt: { type: Date, optional: true },
|
|
156
|
+
/**
|
|
157
|
+
* The user who deleted the user.
|
|
158
|
+
*/
|
|
159
|
+
deletedBy: {
|
|
160
|
+
type: idType,
|
|
161
|
+
ref: enumerations_1.BaseModelName.User,
|
|
162
|
+
optional: true,
|
|
163
|
+
},
|
|
164
|
+
/**
|
|
165
|
+
* Reference to the mnemonic document
|
|
166
|
+
*/
|
|
167
|
+
mnemonicId: {
|
|
168
|
+
type: idType,
|
|
169
|
+
ref: enumerations_1.BaseModelName.Mnemonic,
|
|
170
|
+
required: false,
|
|
171
|
+
},
|
|
172
|
+
/**
|
|
173
|
+
* Copy of the mnemonic encrypted with the user's public key
|
|
174
|
+
*/
|
|
175
|
+
mnemonicRecovery: {
|
|
176
|
+
type: String,
|
|
177
|
+
required: false,
|
|
178
|
+
},
|
|
179
|
+
/**
|
|
180
|
+
* Password-wrapped ECIES private key (Option B)
|
|
181
|
+
*/
|
|
182
|
+
passwordWrappedPrivateKey: {
|
|
183
|
+
type: {
|
|
184
|
+
salt: { type: String, required: true },
|
|
185
|
+
iv: { type: String, required: true },
|
|
186
|
+
authTag: { type: String, required: true },
|
|
187
|
+
ciphertext: { type: String, required: true },
|
|
188
|
+
iterations: { type: Number, required: true },
|
|
189
|
+
},
|
|
190
|
+
required: false,
|
|
191
|
+
},
|
|
192
|
+
/**
|
|
193
|
+
* Array of backup codes to recover mnemonic/private key
|
|
194
|
+
*/
|
|
195
|
+
backupCodes: {
|
|
196
|
+
type: [
|
|
197
|
+
{
|
|
198
|
+
version: { type: String, required: true },
|
|
199
|
+
checksumSalt: { type: String, required: true },
|
|
200
|
+
checksum: { type: String, required: true },
|
|
201
|
+
encrypted: { type: String, required: true },
|
|
202
|
+
},
|
|
203
|
+
],
|
|
204
|
+
default: [],
|
|
205
|
+
},
|
|
206
|
+
};
|
|
207
|
+
return new mongoose_types_1.Schema(definition, { timestamps: true });
|
|
208
|
+
}
|
|
209
|
+
/**
|
|
210
|
+
* Default user schema with base configuration.
|
|
211
|
+
* Pre-configured schema with standard validation and supported languages.
|
|
212
|
+
*/
|
|
213
|
+
exports.UserSchema = createUserSchema();
|
|
214
|
+
//# sourceMappingURL=user.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"user.js","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/schemas/user.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,118 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* @fileoverview Backup code service for secure account recovery.
|
|
3
|
+
* Implements v1.0.0 backup code scheme with Argon2id KDF and HKDF-SHA256 checksums.
|
|
4
|
+
*
|
|
5
|
+
* Storage-agnostic: accepts an optional {@link IBackupCodeStore} for persistence.
|
|
6
|
+
* When no store is provided, falls back to direct UserDocument manipulation
|
|
7
|
+
* (backward-compatible Mongoose path).
|
|
8
|
+
*
|
|
9
|
+
* @module services/backup-code
|
|
10
|
+
*/
|
|
11
|
+
import { SecureString } from '@digitaldefiance/ecies-lib';
|
|
12
|
+
import { ClientSession } from '@digitaldefiance/mongoose-types';
|
|
13
|
+
import { Member as BackendMember, ECIESService, PlatformID } from '@digitaldefiance/node-ecies-lib';
|
|
14
|
+
import { IBackupCode, ITokenRole } from '@digitaldefiance/suite-core-lib';
|
|
15
|
+
import { BaseService, KeyWrappingService } from '@digitaldefiance/node-express-suite';
|
|
16
|
+
import type { IApplication, IBackupCodeStore, IBackupCodeUserRecord } from '@digitaldefiance/node-express-suite';
|
|
17
|
+
import { UserDocument } from '../documents';
|
|
18
|
+
import { RoleService } from './role';
|
|
19
|
+
/**
|
|
20
|
+
* Service for backup code generation, validation, and key recovery.
|
|
21
|
+
* Implements secure backup code scheme with constant-time validation and key wrapping.
|
|
22
|
+
*
|
|
23
|
+
* Storage is abstracted via {@link IBackupCodeStore}. When a store is provided,
|
|
24
|
+
* all persistence goes through the store interface. When omitted, the service
|
|
25
|
+
* falls back to direct UserDocument manipulation for backward compatibility
|
|
26
|
+
* with existing Mongoose-based consumers.
|
|
27
|
+
*
|
|
28
|
+
* @template TID - Platform ID type (defaults to Buffer)
|
|
29
|
+
* @template TDate - Date type (defaults to Date)
|
|
30
|
+
* @template TTokenRole - Token role interface type
|
|
31
|
+
* @template TApplication - Application interface type
|
|
32
|
+
* @extends {BaseService<TID>}
|
|
33
|
+
*/
|
|
34
|
+
export declare class BackupCodeService<TID extends PlatformID = Buffer, TDate extends Date = Date, TTokenRole extends ITokenRole<TID, TDate> = ITokenRole<TID, TDate>, TApplication extends IApplication<TID> = IApplication<TID>> extends BaseService<TID> {
|
|
35
|
+
private readonly eciesService;
|
|
36
|
+
private systemUser?;
|
|
37
|
+
private readonly keyWrappingService;
|
|
38
|
+
private readonly roleService;
|
|
39
|
+
private readonly store?;
|
|
40
|
+
/**
|
|
41
|
+
* Construct a BackupCodeService.
|
|
42
|
+
* @param application - The application instance
|
|
43
|
+
* @param eciesService - ECIES cryptographic service
|
|
44
|
+
* @param keyWrappingService - Key wrapping service for password-based key protection
|
|
45
|
+
* @param roleService - Role service for member type resolution
|
|
46
|
+
* @param store - Optional storage adapter. When omitted, falls back to direct
|
|
47
|
+
* UserDocument manipulation (Mongoose). Provide an IBackupCodeStore implementation
|
|
48
|
+
* for non-Mongoose backends (e.g. BrightDB).
|
|
49
|
+
*/
|
|
50
|
+
constructor(application: TApplication, eciesService: ECIESService<TID>, keyWrappingService: KeyWrappingService, roleService: RoleService<TID, TDate, TTokenRole>, store?: IBackupCodeStore<TID>);
|
|
51
|
+
/**
|
|
52
|
+
* Get the lazily-initialized system user for key wrapping/unwrapping.
|
|
53
|
+
*/
|
|
54
|
+
private getSystemUser;
|
|
55
|
+
/**
|
|
56
|
+
* Forcibly set the system user (for database initialization)
|
|
57
|
+
* @param user
|
|
58
|
+
*/
|
|
59
|
+
setSystemUser(user: BackendMember<TID>): void;
|
|
60
|
+
/**
|
|
61
|
+
* v1: Consume (validate and remove) a backup code via constant-time checksum match.
|
|
62
|
+
*/
|
|
63
|
+
useBackupCodeV1(encryptedBackupCodes: Array<IBackupCode>, backupCode: string): {
|
|
64
|
+
newCodesArray: Array<IBackupCode>;
|
|
65
|
+
code: IBackupCode;
|
|
66
|
+
};
|
|
67
|
+
/**
|
|
68
|
+
* Consume a backup code by first detecting the version and then dispatching to the appropriate handler.
|
|
69
|
+
*/
|
|
70
|
+
useBackupCode(encryptedBackupCodes: Array<IBackupCode>, backupCode: string): {
|
|
71
|
+
newCodesArray: Array<IBackupCode>;
|
|
72
|
+
code: IBackupCode;
|
|
73
|
+
};
|
|
74
|
+
/**
|
|
75
|
+
* Recover a user's private key using a backup code.
|
|
76
|
+
* Storage-agnostic: uses IBackupCodeStore when available, otherwise
|
|
77
|
+
* falls back to the legacy UserDocument path.
|
|
78
|
+
*
|
|
79
|
+
* @param userOrId - Either a UserDocument (legacy) or a user ID (store-based)
|
|
80
|
+
* @param backupCode - The plaintext backup code
|
|
81
|
+
* @param newPassword - Optional new password to re-wrap the private key
|
|
82
|
+
* @param session - Optional database session for transactional consistency
|
|
83
|
+
*/
|
|
84
|
+
recoverKeyWithBackupCodeV1(userOrId: UserDocument<string, TID> | TID, backupCode: string, newPassword?: SecureString, session?: ClientSession): Promise<{
|
|
85
|
+
userDoc?: UserDocument<string, TID>;
|
|
86
|
+
userRecord?: IBackupCodeUserRecord<TID>;
|
|
87
|
+
user: BackendMember<TID>;
|
|
88
|
+
codeCount: number;
|
|
89
|
+
}>;
|
|
90
|
+
/**
|
|
91
|
+
* Recover a user's private key using a backup code (version-dispatched).
|
|
92
|
+
* Accepts either a UserDocument (legacy) or a user ID (store-based).
|
|
93
|
+
*/
|
|
94
|
+
recoverKeyWithBackupCode(userOrId: UserDocument<string, TID> | TID, backupCode: string, newPassword?: SecureString, session?: ClientSession): Promise<{
|
|
95
|
+
userDoc?: UserDocument<string, TID>;
|
|
96
|
+
userRecord?: IBackupCodeUserRecord<TID>;
|
|
97
|
+
user: BackendMember<TID>;
|
|
98
|
+
codeCount: number;
|
|
99
|
+
}>;
|
|
100
|
+
/**
|
|
101
|
+
* Rewrap system-wrapped AEAD blobs from old system key to new one.
|
|
102
|
+
*
|
|
103
|
+
* When a store is provided, uses the store's fetchBatch/updateUserRecord.
|
|
104
|
+
* Otherwise falls back to the legacy callback-based approach.
|
|
105
|
+
*/
|
|
106
|
+
rewrapAllUsersBackupCodes(fetchBatchOrOldSystem: ((afterId?: string, limit?: number) => Promise<UserDocument<string, TID>[]>) | BackendMember, saveUserOrNewSystem: ((user: UserDocument<string, TID>) => Promise<void>) | BackendMember, oldSystemOrOptions?: BackendMember | {
|
|
107
|
+
batchSize?: number;
|
|
108
|
+
onProgress?: (count: number) => void;
|
|
109
|
+
}, newSystemOrUndefined?: BackendMember, options?: {
|
|
110
|
+
batchSize?: number;
|
|
111
|
+
onProgress?: (count: number) => void;
|
|
112
|
+
}): Promise<number>;
|
|
113
|
+
private _recoverViaStore;
|
|
114
|
+
private _recoverViaUserDoc;
|
|
115
|
+
private _rewrapViaStore;
|
|
116
|
+
private _rewrapViaCallbacks;
|
|
117
|
+
}
|
|
118
|
+
//# sourceMappingURL=backup-code.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"backup-code.d.ts","sourceRoot":"","sources":["../../../../../packages/digitaldefiance-node-express-suite-mongo/src/services/backup-code.ts"],"names":[],"mappings":"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"}
|