@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,911 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
/**
|
|
3
|
+
* @fileoverview Service for initializing the database with default users, roles, and relationships.
|
|
4
|
+
* Handles creation of system, admin, and member users with encrypted credentials and backup codes.
|
|
5
|
+
* @module services/database-initialization
|
|
6
|
+
*/
|
|
7
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
8
|
+
exports.DatabaseInitializationService = void 0;
|
|
9
|
+
const tslib_1 = require("tslib");
|
|
10
|
+
const ecies_lib_1 = require("@digitaldefiance/ecies-lib");
|
|
11
|
+
const i18n_lib_1 = require("@digitaldefiance/i18n-lib");
|
|
12
|
+
const node_ecies_lib_1 = require("@digitaldefiance/node-ecies-lib");
|
|
13
|
+
const suite_core_lib_1 = require("@digitaldefiance/suite-core-lib");
|
|
14
|
+
const crc_1 = require("crc");
|
|
15
|
+
const crypto_1 = require("crypto");
|
|
16
|
+
const fs = tslib_1.__importStar(require("fs"));
|
|
17
|
+
const path = tslib_1.__importStar(require("path"));
|
|
18
|
+
const node_express_suite_1 = require("@digitaldefiance/node-express-suite");
|
|
19
|
+
const mongo_transaction_1 = require("../utils/mongo-transaction");
|
|
20
|
+
const model_registry_1 = require("../model-registry");
|
|
21
|
+
const mnemonic_1 = require("./mnemonic");
|
|
22
|
+
const base_model_name_1 = require("../enumerations/base-model-name");
|
|
23
|
+
const backup_code_1 = require("./backup-code");
|
|
24
|
+
const role_1 = require("./role");
|
|
25
|
+
/**
|
|
26
|
+
* Service for initializing the database with default users, roles, and relationships.
|
|
27
|
+
* Manages creation of system, admin, and member accounts with encrypted credentials.
|
|
28
|
+
*/
|
|
29
|
+
class DatabaseInitializationService {
|
|
30
|
+
/**
|
|
31
|
+
* Static initialization state management to prevent concurrent initialization.
|
|
32
|
+
* @private
|
|
33
|
+
*/
|
|
34
|
+
static initializationPromises = new Map();
|
|
35
|
+
/** Initialization lock to prevent race conditions */
|
|
36
|
+
static initializationLock = new Map();
|
|
37
|
+
/**
|
|
38
|
+
* Default i18n translation function for database initialization messages.
|
|
39
|
+
* @param str String key to translate
|
|
40
|
+
* @param variables Template variables
|
|
41
|
+
* @param language Target language
|
|
42
|
+
* @param application Application instance
|
|
43
|
+
* @returns Translated string
|
|
44
|
+
*/
|
|
45
|
+
static defaultI18nTFunc(str, variables, language, application) {
|
|
46
|
+
// Handles template strings with {{component.key}} syntax
|
|
47
|
+
return (0, suite_core_lib_1.getSuiteCoreI18nEngine)(application ? { constants: application.constants } : undefined).t(str, variables, language);
|
|
48
|
+
}
|
|
49
|
+
/**
|
|
50
|
+
* Gets the mnemonic or generates a new one if not present.
|
|
51
|
+
* @template TID Platform-specific ID type
|
|
52
|
+
* @param mnemonic Existing mnemonic or undefined
|
|
53
|
+
* @param eciesService ECIES service to generate a new mnemonic
|
|
54
|
+
* @returns Existing or new mnemonic
|
|
55
|
+
*/
|
|
56
|
+
static mnemonicOrNew(mnemonic, eciesService) {
|
|
57
|
+
return mnemonic && mnemonic.hasValue
|
|
58
|
+
? mnemonic
|
|
59
|
+
: eciesService.generateNewMnemonic();
|
|
60
|
+
}
|
|
61
|
+
/**
|
|
62
|
+
* Generates a cache key for a user based on their details.
|
|
63
|
+
* @template TID Platform-specific ID type
|
|
64
|
+
* @param username Username
|
|
65
|
+
* @param email Email address
|
|
66
|
+
* @param mnemonic Mnemonic
|
|
67
|
+
* @param id User ID
|
|
68
|
+
* @returns Generated cache key as hex string
|
|
69
|
+
*/
|
|
70
|
+
static cacheKey(username, email, mnemonic, id) {
|
|
71
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
72
|
+
const combined = `${username}|${email.email}|${mnemonic.value}|${idProvider.idToString(id)}`;
|
|
73
|
+
const buffer = (0, ecies_lib_1.stringToUint8Array)(combined);
|
|
74
|
+
const crcHash = (0, crc_1.crc32)(Buffer.from(buffer));
|
|
75
|
+
return crcHash.toString(16).padStart(8, '0');
|
|
76
|
+
}
|
|
77
|
+
/**
|
|
78
|
+
* Gets a cached BackendMember or creates a new one if not cached.
|
|
79
|
+
* @template TID Platform-specific ID type
|
|
80
|
+
* @param username Username
|
|
81
|
+
* @param email Email address
|
|
82
|
+
* @param mnemonic Mnemonic or undefined to generate a new one
|
|
83
|
+
* @param memberType Type of member (Admin, Member, System)
|
|
84
|
+
* @param eciesService ECIES service to handle key generation
|
|
85
|
+
* @param memberId Optional specific member ID to use
|
|
86
|
+
* @param createdBy Optional ID of the user who created this member
|
|
87
|
+
* @returns Cached or newly created BackendMember and the mnemonic used
|
|
88
|
+
*/
|
|
89
|
+
static cacheOrNew(username, email, mnemonic, memberType, eciesService, memberId, createdBy) {
|
|
90
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
91
|
+
const m = this.mnemonicOrNew(mnemonic, eciesService);
|
|
92
|
+
const newId = memberId ? memberId : idProvider.generateTyped();
|
|
93
|
+
const key = DatabaseInitializationService.cacheKey(username, email, m, newId);
|
|
94
|
+
if (!global.__MEMBER_CACHE__) {
|
|
95
|
+
global.__MEMBER_CACHE__ = new Map();
|
|
96
|
+
}
|
|
97
|
+
if (!global.__MEMBER_CACHE__.has(key)) {
|
|
98
|
+
const { wallet } = eciesService.walletAndSeedFromMnemonic(m);
|
|
99
|
+
// Get private key from wallet
|
|
100
|
+
const privateKey = wallet.getPrivateKey();
|
|
101
|
+
// Get compressed public key (already includes prefix)
|
|
102
|
+
const publicKeyWithPrefix = eciesService.getPublicKey(Buffer.from(privateKey));
|
|
103
|
+
const user = new node_ecies_lib_1.Member(eciesService, memberType, username, email, publicKeyWithPrefix, new ecies_lib_1.SecureBuffer(privateKey), wallet, newId, undefined, undefined, createdBy);
|
|
104
|
+
global.__MEMBER_CACHE__.set(key, {
|
|
105
|
+
mnemonic: m,
|
|
106
|
+
member: user,
|
|
107
|
+
});
|
|
108
|
+
return { mnemonic: m, member: user };
|
|
109
|
+
}
|
|
110
|
+
else {
|
|
111
|
+
return global.__MEMBER_CACHE__.get(key);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
/**
|
|
115
|
+
* Generates a random password meeting security requirements.
|
|
116
|
+
* @param length Length of the password
|
|
117
|
+
* @returns Generated password string
|
|
118
|
+
*/
|
|
119
|
+
static generatePassword(length) {
|
|
120
|
+
const specialCharacters = "!@#$%^&*()_+-=[]{};':|,.<>/?";
|
|
121
|
+
const numbers = '0123456789';
|
|
122
|
+
const letters = 'abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ';
|
|
123
|
+
// Get a random character from a string
|
|
124
|
+
const getRandomChar = (chars) => {
|
|
125
|
+
// amazonq-ignore-next-line false positive
|
|
126
|
+
const randomIndex = (0, crypto_1.randomBytes)(1)[0] % chars.length;
|
|
127
|
+
return chars[randomIndex];
|
|
128
|
+
};
|
|
129
|
+
// Start with one of each required character type
|
|
130
|
+
// amazonq-ignore-next-line false positive
|
|
131
|
+
let password = '';
|
|
132
|
+
password += getRandomChar(letters);
|
|
133
|
+
password += getRandomChar(numbers);
|
|
134
|
+
password += getRandomChar(specialCharacters);
|
|
135
|
+
// Fill the rest with random characters from all types
|
|
136
|
+
const allCharacters = specialCharacters + numbers + letters;
|
|
137
|
+
for (let i = password.length; i < length; i++) {
|
|
138
|
+
password += getRandomChar(allCharacters);
|
|
139
|
+
}
|
|
140
|
+
// Shuffle the password characters to avoid predictable pattern
|
|
141
|
+
const chars = password.split('');
|
|
142
|
+
for (let i = chars.length - 1; i > 0; i--) {
|
|
143
|
+
// amazonq-ignore-next-line already fixed
|
|
144
|
+
const j = (0, crypto_1.randomBytes)(1)[0] % (i + 1);
|
|
145
|
+
[chars[i], chars[j]] = [chars[j], chars[i]];
|
|
146
|
+
}
|
|
147
|
+
return chars.join('');
|
|
148
|
+
}
|
|
149
|
+
/**
|
|
150
|
+
* Drops the database.
|
|
151
|
+
* @param connection Database connection
|
|
152
|
+
* @returns True if the database was dropped, false if not connected
|
|
153
|
+
*/
|
|
154
|
+
static async dropDatabase(connection) {
|
|
155
|
+
if (!connection.db)
|
|
156
|
+
return false;
|
|
157
|
+
(0, node_express_suite_1.debugLog)(true, 'warn', this.defaultI18nTFunc('{{SuiteCoreStringKey.Admin_DroppingDatabase}}'));
|
|
158
|
+
return connection.db.dropDatabase();
|
|
159
|
+
}
|
|
160
|
+
static getInitOptions(application) {
|
|
161
|
+
const env = application.environment;
|
|
162
|
+
return {
|
|
163
|
+
adminId: env.adminId,
|
|
164
|
+
adminMnemonic: env.adminMnemonic?.hasValue
|
|
165
|
+
? env.adminMnemonic
|
|
166
|
+
: undefined,
|
|
167
|
+
adminPassword: env.adminPassword?.hasValue
|
|
168
|
+
? env.adminPassword
|
|
169
|
+
: undefined,
|
|
170
|
+
adminRoleId: env.adminRoleId,
|
|
171
|
+
adminUserRoleId: env.adminUserRoleId,
|
|
172
|
+
adminBackupCodes: env.adminBackupCodes,
|
|
173
|
+
memberId: env.memberId,
|
|
174
|
+
memberMnemonic: env.memberMnemonic?.hasValue
|
|
175
|
+
? env.memberMnemonic
|
|
176
|
+
: undefined,
|
|
177
|
+
memberPassword: env.memberPassword?.hasValue
|
|
178
|
+
? env.memberPassword
|
|
179
|
+
: undefined,
|
|
180
|
+
memberRoleId: env.memberRoleId,
|
|
181
|
+
memberUserRoleId: env.memberUserRoleId,
|
|
182
|
+
memberBackupCodes: env.memberBackupCodes,
|
|
183
|
+
systemId: env.systemId,
|
|
184
|
+
systemMnemonic: env.systemMnemonic?.hasValue
|
|
185
|
+
? env.systemMnemonic
|
|
186
|
+
: undefined,
|
|
187
|
+
systemPassword: env.systemPassword?.hasValue
|
|
188
|
+
? env.systemPassword
|
|
189
|
+
: undefined,
|
|
190
|
+
systemRoleId: env.systemRoleId,
|
|
191
|
+
systemUserRoleId: env.systemUserRoleId,
|
|
192
|
+
systemBackupCodes: env.systemBackupCodes,
|
|
193
|
+
};
|
|
194
|
+
}
|
|
195
|
+
static serverInitResultHash(serverInitResult) {
|
|
196
|
+
const h = (0, crypto_1.createHash)('sha256');
|
|
197
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
198
|
+
h.update(idProvider.idToString(serverInitResult.adminUser._id));
|
|
199
|
+
h.update(idProvider.idToString(serverInitResult.adminRole._id));
|
|
200
|
+
h.update(idProvider.idToString(serverInitResult.adminUserRole._id));
|
|
201
|
+
h.update(serverInitResult.adminUsername);
|
|
202
|
+
h.update(serverInitResult.adminEmail);
|
|
203
|
+
h.update(serverInitResult.adminMnemonic);
|
|
204
|
+
h.update(serverInitResult.adminPassword);
|
|
205
|
+
h.update(serverInitResult.adminUser.publicKey);
|
|
206
|
+
serverInitResult.adminBackupCodes.map((bc) => h.update(bc));
|
|
207
|
+
h.update(idProvider.idToString(serverInitResult.memberUser._id));
|
|
208
|
+
h.update(idProvider.idToString(serverInitResult.memberRole._id));
|
|
209
|
+
h.update(idProvider.idToString(serverInitResult.memberUserRole._id));
|
|
210
|
+
h.update(serverInitResult.memberUsername);
|
|
211
|
+
h.update(serverInitResult.memberEmail);
|
|
212
|
+
h.update(serverInitResult.memberMnemonic);
|
|
213
|
+
h.update(serverInitResult.memberPassword);
|
|
214
|
+
h.update(serverInitResult.memberUser.publicKey);
|
|
215
|
+
serverInitResult.memberBackupCodes.map((bc) => h.update(bc));
|
|
216
|
+
h.update(idProvider.idToString(serverInitResult.systemUser._id));
|
|
217
|
+
h.update(idProvider.idToString(serverInitResult.systemRole._id));
|
|
218
|
+
h.update(idProvider.idToString(serverInitResult.systemUserRole._id));
|
|
219
|
+
h.update(serverInitResult.systemUsername);
|
|
220
|
+
h.update(serverInitResult.systemEmail);
|
|
221
|
+
h.update(serverInitResult.systemMnemonic);
|
|
222
|
+
h.update(serverInitResult.systemPassword);
|
|
223
|
+
h.update(serverInitResult.systemUser.publicKey);
|
|
224
|
+
serverInitResult.systemBackupCodes.map((bc) => h.update(bc));
|
|
225
|
+
return h.digest('hex');
|
|
226
|
+
}
|
|
227
|
+
/**
|
|
228
|
+
* Initializes the user database with default users and roles using dependency injection.
|
|
229
|
+
* @template TID Platform-specific ID type
|
|
230
|
+
* @param application Application instance
|
|
231
|
+
* @param keyWrappingService Key wrapping service
|
|
232
|
+
* @param mnemonicService Mnemonic service
|
|
233
|
+
* @param eciesService ECIES service
|
|
234
|
+
* @param roleService Role service
|
|
235
|
+
* @param backupCodeService Backup code service
|
|
236
|
+
* @returns Result of the initialization
|
|
237
|
+
*/
|
|
238
|
+
static async initUserDbWithServices(application, keyWrappingService, mnemonicService, eciesService, roleService, backupCodeService) {
|
|
239
|
+
const engine = (0, suite_core_lib_1.getSuiteCoreI18nEngine)({ constants: application.constants });
|
|
240
|
+
const isTestEnvironment = process.env['NODE_ENV'] === 'test';
|
|
241
|
+
const options = DatabaseInitializationService.getInitOptions(application);
|
|
242
|
+
const effectiveIdGenerator = (() => application.constants.idProvider.fromBytes(application.constants.idProvider.generate()));
|
|
243
|
+
const UserModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.User);
|
|
244
|
+
const RoleModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.Role);
|
|
245
|
+
const adminUserId = options.adminId ?? effectiveIdGenerator();
|
|
246
|
+
const adminRoleId = options.adminRoleId ?? effectiveIdGenerator();
|
|
247
|
+
const adminUserRoleId = options.adminUserRoleId ?? effectiveIdGenerator();
|
|
248
|
+
const memberUserId = options.memberId ?? effectiveIdGenerator();
|
|
249
|
+
const memberRoleId = options.memberRoleId ?? effectiveIdGenerator();
|
|
250
|
+
const memberUserRoleId = options.memberUserRoleId ?? effectiveIdGenerator();
|
|
251
|
+
const systemUserId = options.systemId ?? effectiveIdGenerator();
|
|
252
|
+
const systemRoleId = options.systemRoleId ?? effectiveIdGenerator();
|
|
253
|
+
const systemUserRoleId = options.systemUserRoleId ?? effectiveIdGenerator();
|
|
254
|
+
// Check for existing users and roles with optimized queries
|
|
255
|
+
// Use lean() for better performance on read-only operations
|
|
256
|
+
const [existingUsers, existingRoles] = await Promise.all([
|
|
257
|
+
UserModel.find({
|
|
258
|
+
username: {
|
|
259
|
+
$in: [
|
|
260
|
+
application.constants.SystemUser,
|
|
261
|
+
application.constants.AdministratorUser,
|
|
262
|
+
application.constants.MemberUser,
|
|
263
|
+
],
|
|
264
|
+
},
|
|
265
|
+
}).lean(),
|
|
266
|
+
RoleModel.find({
|
|
267
|
+
name: {
|
|
268
|
+
$in: [
|
|
269
|
+
application.constants.AdministratorRole,
|
|
270
|
+
application.constants.MemberRole,
|
|
271
|
+
application.constants.SystemRole,
|
|
272
|
+
],
|
|
273
|
+
},
|
|
274
|
+
}).lean(),
|
|
275
|
+
]);
|
|
276
|
+
if (existingUsers.length > 0 || existingRoles.length > 0) {
|
|
277
|
+
// Database is already initialized, return the existing data
|
|
278
|
+
const existingAdminUser = existingUsers.find((u) => u.username === application.constants.AdministratorUser);
|
|
279
|
+
const existingMemberUser = existingUsers.find((u) => u.username === application.constants.MemberUser);
|
|
280
|
+
const existingSystemUser = existingUsers.find((u) => u.username === application.constants.SystemUser);
|
|
281
|
+
if (existingAdminUser && existingMemberUser && existingSystemUser) {
|
|
282
|
+
const adminUserDoc = UserModel.hydrate(existingAdminUser);
|
|
283
|
+
const memberUserDoc = UserModel.hydrate(existingMemberUser);
|
|
284
|
+
const systemUserDoc = UserModel.hydrate(existingSystemUser);
|
|
285
|
+
// Try to construct a minimal result from existing data
|
|
286
|
+
// Note: This is a fallback case and some data may not be available
|
|
287
|
+
const UserRoleModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.UserRole);
|
|
288
|
+
const [adminRole, memberRole, systemRole, adminUserRole, memberUserRole, systemUserRole,] = await Promise.all([
|
|
289
|
+
RoleModel.findOne({ name: application.constants.AdministratorRole }),
|
|
290
|
+
RoleModel.findOne({ name: application.constants.MemberRole }),
|
|
291
|
+
RoleModel.findOne({ name: application.constants.SystemRole }),
|
|
292
|
+
UserRoleModel.findOne({ userId: adminUserDoc._id }),
|
|
293
|
+
UserRoleModel.findOne({ userId: memberUserDoc._id }),
|
|
294
|
+
UserRoleModel.findOne({ userId: systemUserDoc._id }),
|
|
295
|
+
]);
|
|
296
|
+
// detailed case
|
|
297
|
+
if (adminRole &&
|
|
298
|
+
memberRole &&
|
|
299
|
+
systemRole &&
|
|
300
|
+
adminUserRole &&
|
|
301
|
+
memberUserRole &&
|
|
302
|
+
systemUserRole) {
|
|
303
|
+
return {
|
|
304
|
+
alreadyInitialized: true,
|
|
305
|
+
success: false,
|
|
306
|
+
data: {
|
|
307
|
+
adminRole,
|
|
308
|
+
adminUserRole,
|
|
309
|
+
adminUser: adminUserDoc,
|
|
310
|
+
adminUsername: adminUserDoc.username,
|
|
311
|
+
adminEmail: adminUserDoc.email,
|
|
312
|
+
adminMnemonic: '', // Not available in fallback
|
|
313
|
+
adminPassword: '', // Not available in fallback
|
|
314
|
+
adminBackupCodes: [], // Not available in fallback
|
|
315
|
+
adminMember: {}, // Not available in fallback
|
|
316
|
+
memberRole,
|
|
317
|
+
memberUserRole,
|
|
318
|
+
memberUser: memberUserDoc,
|
|
319
|
+
memberUsername: memberUserDoc.username,
|
|
320
|
+
memberEmail: memberUserDoc.email,
|
|
321
|
+
memberMnemonic: '', // Not available in fallback
|
|
322
|
+
memberPassword: '', // Not available in fallback
|
|
323
|
+
memberBackupCodes: [], // Not available in fallback
|
|
324
|
+
memberMember: {}, // Not available in fallback
|
|
325
|
+
systemRole,
|
|
326
|
+
systemUserRole,
|
|
327
|
+
systemUser: systemUserDoc,
|
|
328
|
+
systemUsername: systemUserDoc.username,
|
|
329
|
+
systemEmail: systemUserDoc.email,
|
|
330
|
+
systemMnemonic: '', // Not available in fallback
|
|
331
|
+
systemPassword: '', // Not available in fallback
|
|
332
|
+
systemBackupCodes: [], // Not available in fallback
|
|
333
|
+
systemMember: {}, // Not available in fallback
|
|
334
|
+
},
|
|
335
|
+
message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized),
|
|
336
|
+
error: new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized)),
|
|
337
|
+
};
|
|
338
|
+
}
|
|
339
|
+
}
|
|
340
|
+
// basic case
|
|
341
|
+
return {
|
|
342
|
+
alreadyInitialized: true,
|
|
343
|
+
success: false,
|
|
344
|
+
message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized),
|
|
345
|
+
error: new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_DatabaseAlreadyInitialized)),
|
|
346
|
+
};
|
|
347
|
+
}
|
|
348
|
+
(0, node_express_suite_1.debugLog)(application.environment.detailedDebug, 'log', engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_SettingUpUsersAndRoles));
|
|
349
|
+
const now = new Date();
|
|
350
|
+
// Add a small random delay in test environments to reduce collision probability
|
|
351
|
+
if (isTestEnvironment) {
|
|
352
|
+
const delay = ((0, crypto_1.randomBytes)(1)[0] % 50) + 10; // 10-60ms random delay (reduced)
|
|
353
|
+
await new Promise((resolve) => setTimeout(resolve, delay));
|
|
354
|
+
}
|
|
355
|
+
try {
|
|
356
|
+
// Use test-optimized settings for better performance
|
|
357
|
+
const transactionOptions = isTestEnvironment
|
|
358
|
+
? { timeoutMs: 15000, retryAttempts: 2 } // Reduced timeout and retries for tests
|
|
359
|
+
: { timeoutMs: 120000 }; // Keep original production timeout
|
|
360
|
+
const result = await (0, mongo_transaction_1.withMongoTransaction)(application.db.connection, application.environment.mongo.useTransactions, undefined, async (sess) => {
|
|
361
|
+
// Check if admin role already exists
|
|
362
|
+
let adminRole = await RoleModel.findOne({
|
|
363
|
+
name: application.constants.AdministratorRole,
|
|
364
|
+
}).session(sess ?? null);
|
|
365
|
+
if (!adminRole) {
|
|
366
|
+
const adminRoleDocs = await RoleModel.create([
|
|
367
|
+
{
|
|
368
|
+
_id: adminRoleId,
|
|
369
|
+
name: application.constants.AdministratorRole,
|
|
370
|
+
admin: true,
|
|
371
|
+
member: true,
|
|
372
|
+
system: false,
|
|
373
|
+
child: false,
|
|
374
|
+
createdAt: now,
|
|
375
|
+
updatedAt: now,
|
|
376
|
+
createdBy: systemUserId,
|
|
377
|
+
updatedBy: systemUserId,
|
|
378
|
+
},
|
|
379
|
+
], { session: sess });
|
|
380
|
+
if (adminRoleDocs.length !== 1) {
|
|
381
|
+
throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate, {
|
|
382
|
+
NAME: application.constants.AdministratorRole,
|
|
383
|
+
});
|
|
384
|
+
}
|
|
385
|
+
adminRole = adminRoleDocs[0];
|
|
386
|
+
}
|
|
387
|
+
// Check if member role already exists
|
|
388
|
+
let memberRole = await RoleModel.findOne({
|
|
389
|
+
name: application.constants.MemberRole,
|
|
390
|
+
}).session(sess ?? null);
|
|
391
|
+
if (!memberRole) {
|
|
392
|
+
const memberRoleDocs = await RoleModel.create([
|
|
393
|
+
{
|
|
394
|
+
_id: memberRoleId,
|
|
395
|
+
name: application.constants.MemberRole,
|
|
396
|
+
admin: false,
|
|
397
|
+
member: true,
|
|
398
|
+
child: false,
|
|
399
|
+
system: false,
|
|
400
|
+
createdAt: now,
|
|
401
|
+
updatedAt: now,
|
|
402
|
+
createdBy: systemUserId,
|
|
403
|
+
updatedBy: systemUserId,
|
|
404
|
+
},
|
|
405
|
+
], { session: sess });
|
|
406
|
+
if (memberRoleDocs.length !== 1) {
|
|
407
|
+
throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate, {
|
|
408
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
|
|
409
|
+
});
|
|
410
|
+
}
|
|
411
|
+
memberRole = memberRoleDocs[0];
|
|
412
|
+
}
|
|
413
|
+
// Check if system role already exists
|
|
414
|
+
let systemRole = await RoleModel.findOne({
|
|
415
|
+
name: application.constants.SystemRole,
|
|
416
|
+
}).session(sess ?? null);
|
|
417
|
+
if (!systemRole) {
|
|
418
|
+
const systemRoleDocs = await RoleModel.create([
|
|
419
|
+
{
|
|
420
|
+
_id: systemRoleId,
|
|
421
|
+
name: application.constants.SystemRole,
|
|
422
|
+
admin: true,
|
|
423
|
+
member: true,
|
|
424
|
+
system: true,
|
|
425
|
+
child: false,
|
|
426
|
+
createdAt: now,
|
|
427
|
+
updatedAt: now,
|
|
428
|
+
createdBy: systemUserId,
|
|
429
|
+
updatedBy: systemUserId,
|
|
430
|
+
},
|
|
431
|
+
], { session: sess });
|
|
432
|
+
if (systemRoleDocs.length !== 1) {
|
|
433
|
+
throw new suite_core_lib_1.TranslatableSuiteError(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateRoleTemplate);
|
|
434
|
+
}
|
|
435
|
+
systemRole = systemRoleDocs[0];
|
|
436
|
+
}
|
|
437
|
+
const systemUser = DatabaseInitializationService.cacheOrNew(application.constants.SystemUser, application.environment.systemEmail, options.systemMnemonic, ecies_lib_1.MemberType.System, eciesService, systemUserId, systemUserId);
|
|
438
|
+
backupCodeService.setSystemUser(systemUser.member);
|
|
439
|
+
node_express_suite_1.SystemUserService.setSystemUser(systemUser.member, application.constants);
|
|
440
|
+
// Encrypt mnemonic for recovery
|
|
441
|
+
const systemEncryptedMnemonic = systemUser.member
|
|
442
|
+
.encryptData(Buffer.from(systemUser.mnemonic.value ?? '', 'utf-8'))
|
|
443
|
+
.toString('hex');
|
|
444
|
+
const systemMnemonicDoc = await mnemonicService.addMnemonic(systemUser.mnemonic, sess);
|
|
445
|
+
if (!systemMnemonicDoc) {
|
|
446
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
|
|
447
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_System),
|
|
448
|
+
}));
|
|
449
|
+
}
|
|
450
|
+
const systemPasswordSecure = options.systemPassword
|
|
451
|
+
? options.systemPassword
|
|
452
|
+
: new ecies_lib_1.SecureString(this.generatePassword(16));
|
|
453
|
+
const systemWrapped = keyWrappingService.wrapSecret(systemUser.member.privateKey, systemPasswordSecure, application.constants);
|
|
454
|
+
const systemBackupCodes = options.systemBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
|
|
455
|
+
const encryptedSystemBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(systemUser.member, systemUser.member, systemBackupCodes);
|
|
456
|
+
const systemDocs = await UserModel.create([
|
|
457
|
+
{
|
|
458
|
+
_id: systemUserId,
|
|
459
|
+
username: application.constants.SystemUser,
|
|
460
|
+
email: application.environment.systemEmail.toString(),
|
|
461
|
+
publicKey: systemUser.member.publicKey.toString('hex'),
|
|
462
|
+
duressPasswords: [],
|
|
463
|
+
mnemonicRecovery: systemEncryptedMnemonic,
|
|
464
|
+
mnemonicId: systemMnemonicDoc._id,
|
|
465
|
+
passwordWrappedPrivateKey: systemWrapped,
|
|
466
|
+
backupCodes: encryptedSystemBackupCodes,
|
|
467
|
+
timezone: application.environment.timezone,
|
|
468
|
+
siteLanguage: 'en-US',
|
|
469
|
+
emailVerified: true,
|
|
470
|
+
darkMode: false,
|
|
471
|
+
accountStatus: suite_core_lib_1.AccountStatus.Active,
|
|
472
|
+
directChallenge: true, // allow direct challenge login by default
|
|
473
|
+
createdAt: now,
|
|
474
|
+
updatedAt: now,
|
|
475
|
+
createdBy: systemUserId,
|
|
476
|
+
updatedBy: systemUserId,
|
|
477
|
+
},
|
|
478
|
+
], { session: sess });
|
|
479
|
+
if (systemDocs.length !== 1) {
|
|
480
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
|
|
481
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_System),
|
|
482
|
+
}));
|
|
483
|
+
}
|
|
484
|
+
const systemDoc = systemDocs[0];
|
|
485
|
+
// Create admin user-role relationship
|
|
486
|
+
const systemUserRoleDoc = await roleService.addUserToRole(systemRoleId, systemUserId, systemUserId, sess, systemUserRoleId);
|
|
487
|
+
if (!systemUser.mnemonic.value) {
|
|
488
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
|
|
489
|
+
NAME: suite_core_lib_1.SuiteCoreStringKey.Common_System,
|
|
490
|
+
}));
|
|
491
|
+
}
|
|
492
|
+
const adminUser = DatabaseInitializationService.cacheOrNew(application.constants.AdministratorUser, application.environment.adminEmail, options.adminMnemonic, ecies_lib_1.MemberType.User, eciesService, adminUserId, systemDoc._id);
|
|
493
|
+
// Encrypt mnemonic for recovery
|
|
494
|
+
const adminEncryptedMnemonic = adminUser.member
|
|
495
|
+
.encryptData(Buffer.from(adminUser.mnemonic.value ?? '', 'utf-8'))
|
|
496
|
+
.toString('hex');
|
|
497
|
+
const adminMnemonicDoc = await mnemonicService.addMnemonic(adminUser.mnemonic, sess);
|
|
498
|
+
if (!adminMnemonicDoc) {
|
|
499
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
|
|
500
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
|
|
501
|
+
}));
|
|
502
|
+
}
|
|
503
|
+
const adminPasswordSecure = options.adminPassword
|
|
504
|
+
? options.adminPassword
|
|
505
|
+
: new ecies_lib_1.SecureString(this.generatePassword(16));
|
|
506
|
+
const adminWrapped = keyWrappingService.wrapSecret(adminUser.member.privateKey, adminPasswordSecure);
|
|
507
|
+
const adminBackupCodes = options.adminBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
|
|
508
|
+
const encryptedAdminBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(adminUser.member, systemUser.member, adminBackupCodes);
|
|
509
|
+
const adminDocs = await UserModel.create([
|
|
510
|
+
{
|
|
511
|
+
_id: adminUserId,
|
|
512
|
+
username: application.constants.AdministratorUser,
|
|
513
|
+
email: application.environment.adminEmail.toString(),
|
|
514
|
+
publicKey: adminUser.member.publicKey.toString('hex'),
|
|
515
|
+
duressPasswords: [],
|
|
516
|
+
mnemonicRecovery: adminEncryptedMnemonic,
|
|
517
|
+
mnemonicId: adminMnemonicDoc._id,
|
|
518
|
+
passwordWrappedPrivateKey: adminWrapped,
|
|
519
|
+
backupCodes: encryptedAdminBackupCodes,
|
|
520
|
+
timezone: application.environment.timezone,
|
|
521
|
+
siteLanguage: 'en-US',
|
|
522
|
+
emailVerified: true,
|
|
523
|
+
accountStatus: suite_core_lib_1.AccountStatus.Active,
|
|
524
|
+
directChallenge: true,
|
|
525
|
+
createdAt: now,
|
|
526
|
+
updatedAt: now,
|
|
527
|
+
createdBy: systemUserId,
|
|
528
|
+
updatedBy: systemUserId,
|
|
529
|
+
},
|
|
530
|
+
], { session: sess });
|
|
531
|
+
if (adminDocs.length !== 1) {
|
|
532
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
|
|
533
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
|
|
534
|
+
}));
|
|
535
|
+
}
|
|
536
|
+
const adminDoc = adminDocs[0];
|
|
537
|
+
// Create admin user-role relationship
|
|
538
|
+
const adminUserRoleDoc = await roleService.addUserToRole(adminRoleId, adminUserId, systemUserId, sess, adminUserRoleId);
|
|
539
|
+
if (!adminUser.mnemonic.value) {
|
|
540
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
|
|
541
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Admin),
|
|
542
|
+
}));
|
|
543
|
+
}
|
|
544
|
+
const memberUser = DatabaseInitializationService.cacheOrNew(application.constants.MemberUser, application.environment.memberEmail, options.memberMnemonic, ecies_lib_1.MemberType.User, eciesService, memberUserId, systemDoc._id);
|
|
545
|
+
const memberPasswordSecure = options.memberPassword
|
|
546
|
+
? options.memberPassword
|
|
547
|
+
: new ecies_lib_1.SecureString(this.generatePassword(16));
|
|
548
|
+
const memberMnemonicDoc = await mnemonicService.addMnemonic(memberUser.mnemonic, sess);
|
|
549
|
+
if (!memberMnemonicDoc) {
|
|
550
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToStoreUserMnemonicTemplate, {
|
|
551
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
|
|
552
|
+
}));
|
|
553
|
+
}
|
|
554
|
+
// Encrypt mnemonic for recovery
|
|
555
|
+
const encryptedMemberMnemonic = memberUser.member
|
|
556
|
+
.encryptData(Buffer.from(memberUser.mnemonic.value ?? '', 'utf-8'))
|
|
557
|
+
.toString('hex');
|
|
558
|
+
const memberWrapped = keyWrappingService.wrapSecret(memberUser.member.privateKey, memberPasswordSecure);
|
|
559
|
+
const memberBackupCodes = options.memberBackupCodes ?? node_express_suite_1.BackupCode.generateBackupCodes();
|
|
560
|
+
const encryptedMemberBackupCodes = await node_express_suite_1.BackupCode.encryptBackupCodes(memberUser.member, systemUser.member, memberBackupCodes);
|
|
561
|
+
const memberDocs = await UserModel.create([
|
|
562
|
+
{
|
|
563
|
+
_id: memberUserId,
|
|
564
|
+
username: application.constants.MemberUser,
|
|
565
|
+
email: application.environment.memberEmail.toString(),
|
|
566
|
+
publicKey: memberUser.member.publicKey.toString('hex'),
|
|
567
|
+
mnemonicId: memberMnemonicDoc._id,
|
|
568
|
+
mnemonicRecovery: encryptedMemberMnemonic,
|
|
569
|
+
passwordWrappedPrivateKey: memberWrapped,
|
|
570
|
+
backupCodes: encryptedMemberBackupCodes,
|
|
571
|
+
duressPasswords: [],
|
|
572
|
+
timezone: application.environment.timezone,
|
|
573
|
+
siteLanguage: 'en-US',
|
|
574
|
+
emailVerified: true,
|
|
575
|
+
accountStatus: suite_core_lib_1.AccountStatus.Active,
|
|
576
|
+
directChallenge: true,
|
|
577
|
+
createdAt: now,
|
|
578
|
+
updatedAt: now,
|
|
579
|
+
createdBy: systemUserId,
|
|
580
|
+
updatedBy: systemUserId,
|
|
581
|
+
},
|
|
582
|
+
], { session: sess });
|
|
583
|
+
if (memberDocs.length !== 1) {
|
|
584
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_FailedToCreateUserTemplate, {
|
|
585
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
|
|
586
|
+
}));
|
|
587
|
+
}
|
|
588
|
+
const memberDoc = memberDocs[0];
|
|
589
|
+
// Create member user-role relationship
|
|
590
|
+
const memberUserRoleDoc = await roleService.addUserToRole(memberRoleId, memberUserId, systemUserId, sess, memberUserRoleId);
|
|
591
|
+
if (!memberUser.mnemonic.value) {
|
|
592
|
+
throw new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Error_MnemonicIsNullTemplate, {
|
|
593
|
+
NAME: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Common_Member),
|
|
594
|
+
}));
|
|
595
|
+
}
|
|
596
|
+
return {
|
|
597
|
+
adminRole,
|
|
598
|
+
memberRole,
|
|
599
|
+
systemRole,
|
|
600
|
+
systemDoc,
|
|
601
|
+
systemUserRoleDoc,
|
|
602
|
+
systemPassword: systemPasswordSecure.notNullValue,
|
|
603
|
+
systemMnemonic: systemUser.mnemonic.notNullValue,
|
|
604
|
+
systemBackupCodes: systemBackupCodes,
|
|
605
|
+
systemMember: systemUser.member,
|
|
606
|
+
adminDoc,
|
|
607
|
+
adminUserRoleDoc,
|
|
608
|
+
adminPassword: adminPasswordSecure.notNullValue,
|
|
609
|
+
adminMnemonic: adminUser.mnemonic.notNullValue,
|
|
610
|
+
adminBackupCodes: adminBackupCodes,
|
|
611
|
+
adminMember: adminUser.member,
|
|
612
|
+
memberDoc,
|
|
613
|
+
memberUserRoleDoc,
|
|
614
|
+
memberPassword: memberPasswordSecure.notNullValue,
|
|
615
|
+
memberMnemonic: memberUser.mnemonic.notNullValue,
|
|
616
|
+
memberBackupCodes: memberBackupCodes,
|
|
617
|
+
memberUser: memberUser.member,
|
|
618
|
+
};
|
|
619
|
+
}, transactionOptions);
|
|
620
|
+
return {
|
|
621
|
+
alreadyInitialized: false,
|
|
622
|
+
success: true,
|
|
623
|
+
data: {
|
|
624
|
+
adminRole: result.adminRole,
|
|
625
|
+
adminUserRole: result.adminUserRoleDoc,
|
|
626
|
+
adminUser: result.adminDoc,
|
|
627
|
+
adminUsername: result.adminDoc.username,
|
|
628
|
+
adminEmail: result.adminDoc.email,
|
|
629
|
+
adminMnemonic: result.adminMnemonic,
|
|
630
|
+
adminPassword: result.adminPassword,
|
|
631
|
+
adminBackupCodes: result.adminBackupCodes.map((bc) => bc.value ?? ''),
|
|
632
|
+
adminMember: result.adminMember,
|
|
633
|
+
memberRole: result.memberRole,
|
|
634
|
+
memberUserRole: result.memberUserRoleDoc,
|
|
635
|
+
memberUser: result.memberDoc,
|
|
636
|
+
memberUsername: result.memberDoc.username,
|
|
637
|
+
memberEmail: result.memberDoc.email,
|
|
638
|
+
memberMnemonic: result.memberMnemonic,
|
|
639
|
+
memberPassword: result.memberPassword,
|
|
640
|
+
memberBackupCodes: result.memberBackupCodes.map((bc) => bc.value ?? ''),
|
|
641
|
+
memberMember: result.memberUser,
|
|
642
|
+
systemRole: result.systemRole,
|
|
643
|
+
systemUserRole: result.systemUserRoleDoc,
|
|
644
|
+
systemUser: result.systemDoc,
|
|
645
|
+
systemUsername: result.systemDoc.username,
|
|
646
|
+
systemEmail: result.systemDoc.email,
|
|
647
|
+
systemMnemonic: result.systemMnemonic,
|
|
648
|
+
systemPassword: result.systemPassword,
|
|
649
|
+
systemBackupCodes: result.systemBackupCodes.map((bc) => bc.value ?? ''),
|
|
650
|
+
systemMember: result.systemMember,
|
|
651
|
+
},
|
|
652
|
+
};
|
|
653
|
+
}
|
|
654
|
+
catch (error) {
|
|
655
|
+
// Check if it's a translatable error and display cleanly
|
|
656
|
+
if (error instanceof i18n_lib_1.TranslatableGenericError ||
|
|
657
|
+
error instanceof i18n_lib_1.TranslatableHandleableGenericError ||
|
|
658
|
+
error instanceof suite_core_lib_1.TranslatableSuiteError ||
|
|
659
|
+
error instanceof suite_core_lib_1.TranslatableSuiteHandleableError) {
|
|
660
|
+
return {
|
|
661
|
+
alreadyInitialized: false,
|
|
662
|
+
success: false,
|
|
663
|
+
message: error.message,
|
|
664
|
+
error: error,
|
|
665
|
+
};
|
|
666
|
+
}
|
|
667
|
+
return {
|
|
668
|
+
alreadyInitialized: false,
|
|
669
|
+
success: false,
|
|
670
|
+
message: engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase),
|
|
671
|
+
error: error instanceof Error
|
|
672
|
+
? error
|
|
673
|
+
: new Error(engine.translateStringKey(suite_core_lib_1.SuiteCoreStringKey.Admin_Error_FailedToInitializeUserDatabase)),
|
|
674
|
+
};
|
|
675
|
+
}
|
|
676
|
+
}
|
|
677
|
+
static serverInitResultsToDotEnv(serverInitResult) {
|
|
678
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
679
|
+
return `ADMIN_ID="${idProvider.idToString(serverInitResult.adminUser._id)}"
|
|
680
|
+
ADMIN_EMAIL="${serverInitResult.adminEmail}"
|
|
681
|
+
ADMIN_MNEMONIC="${serverInitResult.adminMnemonic}"
|
|
682
|
+
ADMIN_ROLE_ID="${idProvider.idToString(serverInitResult.adminRole._id)}"
|
|
683
|
+
ADMIN_USER_ROLE_ID="${idProvider.idToString(serverInitResult.adminUserRole._id)}"
|
|
684
|
+
ADMIN_PASSWORD="${serverInitResult.adminPassword}"
|
|
685
|
+
MEMBER_ID="${idProvider.idToString(serverInitResult.memberUser._id)}"
|
|
686
|
+
MEMBER_EMAIL="${serverInitResult.memberEmail}"
|
|
687
|
+
MEMBER_MNEMONIC="${serverInitResult.memberMnemonic}"
|
|
688
|
+
MEMBER_ROLE_ID="${idProvider.idToString(serverInitResult.memberRole._id)}"
|
|
689
|
+
MEMBER_USER_ROLE_ID="${idProvider.idToString(serverInitResult.memberUserRole._id)}"
|
|
690
|
+
MEMBER_PASSWORD="${serverInitResult.memberPassword}"
|
|
691
|
+
SYSTEM_ID="${idProvider.idToString(serverInitResult.systemUser._id)}"
|
|
692
|
+
SYSTEM_EMAIL="${serverInitResult.systemEmail}"
|
|
693
|
+
SYSTEM_MNEMONIC="${serverInitResult.systemMnemonic}"
|
|
694
|
+
SYSTEM_PUBLIC_KEY="${serverInitResult.systemUser.publicKey}"
|
|
695
|
+
SYSTEM_ROLE_ID="${idProvider.idToString(serverInitResult.systemRole._id)}"
|
|
696
|
+
SYSTEM_USER_ROLE_ID="${idProvider.idToString(serverInitResult.systemUserRole._id)}"
|
|
697
|
+
SYSTEM_PASSWORD="${serverInitResult.systemPassword}"
|
|
698
|
+
`;
|
|
699
|
+
}
|
|
700
|
+
static printServerInitResults(result, printDotEnv = true) {
|
|
701
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
702
|
+
(0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('\n=== {{SuiteCoreStringKey.Admin_AccountCredentials}} ==='));
|
|
703
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
|
|
704
|
+
id: idProvider.idToString(result.systemUser._id),
|
|
705
|
+
}));
|
|
706
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
|
|
707
|
+
roleName: result.systemRole.name,
|
|
708
|
+
}));
|
|
709
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
|
|
710
|
+
roleId: idProvider.idToString(result.systemRole._id),
|
|
711
|
+
}));
|
|
712
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
|
|
713
|
+
userRoleId: idProvider.idToString(result.systemUserRole._id),
|
|
714
|
+
}));
|
|
715
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
|
|
716
|
+
username: result.systemUsername,
|
|
717
|
+
}));
|
|
718
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
|
|
719
|
+
email: result.systemEmail,
|
|
720
|
+
}));
|
|
721
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
|
|
722
|
+
password: result.systemPassword,
|
|
723
|
+
}));
|
|
724
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
|
|
725
|
+
mnemonic: result.systemMnemonic,
|
|
726
|
+
}));
|
|
727
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
|
|
728
|
+
publicKey: result.systemUser.publicKey,
|
|
729
|
+
}));
|
|
730
|
+
(0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_System}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.systemBackupCodes.join(', ')}`);
|
|
731
|
+
(0, node_express_suite_1.directLog)(true, 'log', '');
|
|
732
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
|
|
733
|
+
id: idProvider.idToString(result.adminUser._id),
|
|
734
|
+
}));
|
|
735
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
|
|
736
|
+
roleName: result.adminRole.name,
|
|
737
|
+
}));
|
|
738
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
|
|
739
|
+
roleId: idProvider.idToString(result.adminRole._id),
|
|
740
|
+
}));
|
|
741
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
|
|
742
|
+
userRoleId: idProvider.idToString(result.adminUserRole._id),
|
|
743
|
+
}));
|
|
744
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
|
|
745
|
+
username: result.adminUsername,
|
|
746
|
+
}));
|
|
747
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
|
|
748
|
+
email: result.adminEmail,
|
|
749
|
+
}));
|
|
750
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
|
|
751
|
+
password: result.adminPassword,
|
|
752
|
+
}));
|
|
753
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
|
|
754
|
+
mnemonic: result.adminMnemonic,
|
|
755
|
+
}));
|
|
756
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
|
|
757
|
+
publicKey: result.adminUser.publicKey,
|
|
758
|
+
}));
|
|
759
|
+
(0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Admin}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.adminBackupCodes.join(', ')}`);
|
|
760
|
+
(0, node_express_suite_1.directLog)(true, 'log', '');
|
|
761
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_ID}}: {id}', {
|
|
762
|
+
id: idProvider.idToString(result.memberUser._id),
|
|
763
|
+
}));
|
|
764
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}}: {roleName}', {
|
|
765
|
+
roleName: result.memberRole.name,
|
|
766
|
+
}));
|
|
767
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {roleId}', {
|
|
768
|
+
roleId: idProvider.idToString(result.memberRole._id),
|
|
769
|
+
}));
|
|
770
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_User}} {{SuiteCoreStringKey.Common_Role}} {{SuiteCoreStringKey.Common_ID}}: {userRoleId}', {
|
|
771
|
+
userRoleId: idProvider.idToString(result.memberUserRole._id),
|
|
772
|
+
}));
|
|
773
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Username}}: {username}', {
|
|
774
|
+
username: result.memberUsername,
|
|
775
|
+
}));
|
|
776
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Email}}: {email}', {
|
|
777
|
+
email: result.memberEmail,
|
|
778
|
+
}));
|
|
779
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Password}}: {password}', {
|
|
780
|
+
password: result.memberPassword,
|
|
781
|
+
}));
|
|
782
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_Mnemonic}}: {mnemonic}', {
|
|
783
|
+
mnemonic: result.memberMnemonic,
|
|
784
|
+
}));
|
|
785
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_PublicKey}}: {publicKey}', {
|
|
786
|
+
publicKey: result.memberUser.publicKey,
|
|
787
|
+
}));
|
|
788
|
+
(0, node_express_suite_1.directLog)(true, 'log', `${this.defaultI18nTFunc('{{SuiteCoreStringKey.Common_Member}} {{SuiteCoreStringKey.Common_BackupCodes}}')}: ${result.memberBackupCodes.join(', ')}`);
|
|
789
|
+
(0, node_express_suite_1.directLog)(true, 'log', this.defaultI18nTFunc('\n=== {{SuiteCoreStringKey.Admin_EndCredentials}} ==='));
|
|
790
|
+
if (printDotEnv) {
|
|
791
|
+
(0, node_express_suite_1.directLog)(true, 'log', '');
|
|
792
|
+
(0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('=== {{SuiteCoreStringKey.Admin_DotEnvFormat}} ==='));
|
|
793
|
+
(0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('=== {{SuiteCoreStringKey.Admin_EndDotEnvFormat}} ==='));
|
|
794
|
+
}
|
|
795
|
+
}
|
|
796
|
+
static setEnvFromInitResults(result) {
|
|
797
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
798
|
+
process.env['ADMIN_ID'] = idProvider.idToString(result.adminUser._id);
|
|
799
|
+
process.env['ADMIN_PUBLIC_KEY'] = result.adminUser.publicKey;
|
|
800
|
+
process.env['ADMIN_EMAIL'] = result.adminEmail;
|
|
801
|
+
process.env['ADMIN_MNEMONIC'] = result.adminMnemonic;
|
|
802
|
+
process.env['ADMIN_PASSWORD'] = result.adminPassword;
|
|
803
|
+
process.env['ADMIN_ROLE_ID'] = idProvider.idToString(result.adminRole._id);
|
|
804
|
+
process.env['ADMIN_USER_ROLE_ID'] = idProvider.idToString(result.adminUserRole._id);
|
|
805
|
+
//
|
|
806
|
+
process.env['MEMBER_ID'] = idProvider.idToString(result.memberUser._id);
|
|
807
|
+
process.env['MEMBER_PUBLIC_KEY'] = result.memberUser.publicKey;
|
|
808
|
+
process.env['MEMBER_EMAIL'] = result.memberEmail;
|
|
809
|
+
process.env['MEMBER_MNEMONIC'] = result.memberMnemonic;
|
|
810
|
+
process.env['MEMBER_PASSWORD'] = result.memberPassword;
|
|
811
|
+
process.env['MEMBER_ROLE_ID'] = idProvider.idToString(result.memberRole._id);
|
|
812
|
+
process.env['MEMBER_USER_ROLE_ID'] = idProvider.idToString(result.memberUserRole._id);
|
|
813
|
+
//
|
|
814
|
+
process.env['SYSTEM_ID'] = idProvider.idToString(result.systemUser._id);
|
|
815
|
+
process.env['SYSTEM_PUBLIC_KEY'] = result.systemUser.publicKey;
|
|
816
|
+
process.env['SYSTEM_EMAIL'] = result.systemEmail;
|
|
817
|
+
process.env['SYSTEM_MNEMONIC'] = result.systemMnemonic;
|
|
818
|
+
process.env['SYSTEM_PASSWORD'] = result.systemPassword;
|
|
819
|
+
process.env['SYSTEM_ROLE_ID'] = idProvider.idToString(result.systemRole._id);
|
|
820
|
+
process.env['SYSTEM_USER_ROLE_ID'] = idProvider.idToString(result.systemUserRole._id);
|
|
821
|
+
}
|
|
822
|
+
/**
|
|
823
|
+
* Write initialization results to a .env file
|
|
824
|
+
* Updates or adds the credential variables in the specified .env file
|
|
825
|
+
* @param envFilePath Path to the .env file to update
|
|
826
|
+
* @param result The initialization results containing credentials
|
|
827
|
+
* @param idToString Function to convert IDs to strings
|
|
828
|
+
*/
|
|
829
|
+
static writeEnvFile(envFilePath, result) {
|
|
830
|
+
const idProvider = (0, node_ecies_lib_1.getEnhancedNodeIdProvider)();
|
|
831
|
+
// Ensure the directory exists
|
|
832
|
+
const dir = path.dirname(envFilePath);
|
|
833
|
+
if (!fs.existsSync(dir)) {
|
|
834
|
+
fs.mkdirSync(dir, { recursive: true });
|
|
835
|
+
}
|
|
836
|
+
// Read existing .env file or create empty content
|
|
837
|
+
let envContent = '';
|
|
838
|
+
if (fs.existsSync(envFilePath)) {
|
|
839
|
+
envContent = fs.readFileSync(envFilePath, 'utf-8');
|
|
840
|
+
}
|
|
841
|
+
// Define the credentials to update
|
|
842
|
+
const credentials = {
|
|
843
|
+
ADMIN_ID: idProvider.idToString(result.adminUser._id),
|
|
844
|
+
ADMIN_EMAIL: result.adminEmail,
|
|
845
|
+
ADMIN_MNEMONIC: result.adminMnemonic,
|
|
846
|
+
ADMIN_ROLE_ID: idProvider.idToString(result.adminRole._id),
|
|
847
|
+
ADMIN_USER_ROLE_ID: idProvider.idToString(result.adminUserRole._id),
|
|
848
|
+
ADMIN_PASSWORD: result.adminPassword,
|
|
849
|
+
MEMBER_ID: idProvider.idToString(result.memberUser._id),
|
|
850
|
+
MEMBER_EMAIL: result.memberEmail,
|
|
851
|
+
MEMBER_MNEMONIC: result.memberMnemonic,
|
|
852
|
+
MEMBER_ROLE_ID: idProvider.idToString(result.memberRole._id),
|
|
853
|
+
MEMBER_USER_ROLE_ID: idProvider.idToString(result.memberUserRole._id),
|
|
854
|
+
MEMBER_PASSWORD: result.memberPassword,
|
|
855
|
+
SYSTEM_ID: idProvider.idToString(result.systemUser._id),
|
|
856
|
+
SYSTEM_EMAIL: result.systemEmail,
|
|
857
|
+
SYSTEM_MNEMONIC: result.systemMnemonic,
|
|
858
|
+
SYSTEM_PUBLIC_KEY: result.systemUser.publicKey,
|
|
859
|
+
SYSTEM_ROLE_ID: idProvider.idToString(result.systemRole._id),
|
|
860
|
+
SYSTEM_USER_ROLE_ID: idProvider.idToString(result.systemUserRole._id),
|
|
861
|
+
SYSTEM_PASSWORD: result.systemPassword,
|
|
862
|
+
};
|
|
863
|
+
// Update or add each credential
|
|
864
|
+
for (const [key, value] of Object.entries(credentials)) {
|
|
865
|
+
const regex = new RegExp(`^${key}=.*$`, 'm');
|
|
866
|
+
const newLine = `${key}="${value}"`;
|
|
867
|
+
if (regex.test(envContent)) {
|
|
868
|
+
// Update existing line
|
|
869
|
+
envContent = envContent.replace(regex, newLine);
|
|
870
|
+
}
|
|
871
|
+
else {
|
|
872
|
+
// Add new line (append to end)
|
|
873
|
+
if (envContent && !envContent.endsWith('\n')) {
|
|
874
|
+
envContent += '\n';
|
|
875
|
+
}
|
|
876
|
+
envContent += newLine + '\n';
|
|
877
|
+
}
|
|
878
|
+
}
|
|
879
|
+
// Write back to file
|
|
880
|
+
fs.writeFileSync(envFilePath, envContent, 'utf-8');
|
|
881
|
+
(0, node_express_suite_1.debugLog)(true, 'log', this.defaultI18nTFunc('{{SuiteCoreStringKey.Admin_CredentialsWrittenToEnv}}', {
|
|
882
|
+
path: envFilePath,
|
|
883
|
+
}));
|
|
884
|
+
}
|
|
885
|
+
/**
|
|
886
|
+
* Initializes the user database with default users and roles (convenience method).
|
|
887
|
+
* Creates necessary services and calls initUserDbWithServices.
|
|
888
|
+
* @template TID Platform-specific ID type
|
|
889
|
+
* @param application Application instance
|
|
890
|
+
* @returns Result of the initialization
|
|
891
|
+
*/
|
|
892
|
+
static async initUserDb(application) {
|
|
893
|
+
const mnemonicModel = model_registry_1.ModelRegistry.instance.getTypedModel(base_model_name_1.BaseModelName.Mnemonic);
|
|
894
|
+
const mnemonicService = new mnemonic_1.MnemonicService(mnemonicModel, application.environment.mnemonicHmacSecret, application.constants);
|
|
895
|
+
const config = {
|
|
896
|
+
curveName: ecies_lib_1.ECIES.CURVE_NAME,
|
|
897
|
+
primaryKeyDerivationPath: ecies_lib_1.ECIES.PRIMARY_KEY_DERIVATION_PATH,
|
|
898
|
+
mnemonicStrength: ecies_lib_1.ECIES.MNEMONIC_STRENGTH,
|
|
899
|
+
symmetricAlgorithm: ecies_lib_1.ECIES.SYMMETRIC_ALGORITHM_CONFIGURATION,
|
|
900
|
+
symmetricKeyBits: ecies_lib_1.ECIES.SYMMETRIC.KEY_BITS,
|
|
901
|
+
symmetricKeyMode: ecies_lib_1.ECIES.SYMMETRIC.MODE,
|
|
902
|
+
};
|
|
903
|
+
const eciesService = new node_ecies_lib_1.ECIESService(config);
|
|
904
|
+
const roleService = new role_1.RoleService(application);
|
|
905
|
+
const keyWrappingService = new node_express_suite_1.KeyWrappingService();
|
|
906
|
+
const backupCodeService = new backup_code_1.BackupCodeService(application, eciesService, keyWrappingService, roleService);
|
|
907
|
+
return this.initUserDbWithServices(application, keyWrappingService, mnemonicService, eciesService, roleService, backupCodeService);
|
|
908
|
+
}
|
|
909
|
+
}
|
|
910
|
+
exports.DatabaseInitializationService = DatabaseInitializationService;
|
|
911
|
+
//# sourceMappingURL=database-initialization.js.map
|