@digitaldefiance/node-express-suite 1.0.2
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/LICENSE +21 -0
- package/README.md +673 -0
- package/dist/application-base.d.ts +112 -0
- package/dist/application-base.d.ts.map +1 -0
- package/dist/application-base.js +301 -0
- package/dist/application-base.js.map +1 -0
- package/dist/application.d.ts +22 -0
- package/dist/application.d.ts.map +1 -0
- package/dist/application.js +123 -0
- package/dist/application.js.map +1 -0
- package/dist/backup-code.d.ts +67 -0
- package/dist/backup-code.d.ts.map +1 -0
- package/dist/backup-code.js +270 -0
- package/dist/backup-code.js.map +1 -0
- package/dist/constants.d.ts +16 -0
- package/dist/constants.d.ts.map +1 -0
- package/dist/constants.js +54 -0
- package/dist/constants.js.map +1 -0
- package/dist/controllers/base.d.ts +60 -0
- package/dist/controllers/base.d.ts.map +1 -0
- package/dist/controllers/base.js +270 -0
- package/dist/controllers/base.js.map +1 -0
- package/dist/controllers/index.d.ts +3 -0
- package/dist/controllers/index.d.ts.map +1 -0
- package/dist/controllers/index.js +19 -0
- package/dist/controllers/index.js.map +1 -0
- package/dist/controllers/user.d.ts +42 -0
- package/dist/controllers/user.d.ts.map +1 -0
- package/dist/controllers/user.js +750 -0
- package/dist/controllers/user.js.map +1 -0
- package/dist/decorators/base-controller.d.ts +9 -0
- package/dist/decorators/base-controller.d.ts.map +1 -0
- package/dist/decorators/base-controller.js +49 -0
- package/dist/decorators/base-controller.js.map +1 -0
- package/dist/decorators/controller.d.ts +31 -0
- package/dist/decorators/controller.d.ts.map +1 -0
- package/dist/decorators/controller.js +67 -0
- package/dist/decorators/controller.js.map +1 -0
- package/dist/decorators/index.d.ts +4 -0
- package/dist/decorators/index.d.ts.map +1 -0
- package/dist/decorators/index.js +20 -0
- package/dist/decorators/index.js.map +1 -0
- package/dist/decorators/zod-validation.d.ts +5 -0
- package/dist/decorators/zod-validation.d.ts.map +1 -0
- package/dist/decorators/zod-validation.js +47 -0
- package/dist/decorators/zod-validation.js.map +1 -0
- package/dist/defaults.d.ts +7 -0
- package/dist/defaults.d.ts.map +1 -0
- package/dist/defaults.js +83 -0
- package/dist/defaults.js.map +1 -0
- package/dist/documents/base.d.ts +3 -0
- package/dist/documents/base.d.ts.map +1 -0
- package/dist/documents/base.js +3 -0
- package/dist/documents/base.js.map +1 -0
- package/dist/documents/email-token.d.ts +8 -0
- package/dist/documents/email-token.d.ts.map +1 -0
- package/dist/documents/email-token.js +3 -0
- package/dist/documents/email-token.js.map +1 -0
- package/dist/documents/index.d.ts +8 -0
- package/dist/documents/index.d.ts.map +1 -0
- package/dist/documents/index.js +3 -0
- package/dist/documents/index.js.map +1 -0
- package/dist/documents/mnemonic.d.ts +8 -0
- package/dist/documents/mnemonic.d.ts.map +1 -0
- package/dist/documents/mnemonic.js +3 -0
- package/dist/documents/mnemonic.js.map +1 -0
- package/dist/documents/role.d.ts +8 -0
- package/dist/documents/role.d.ts.map +1 -0
- package/dist/documents/role.js +3 -0
- package/dist/documents/role.js.map +1 -0
- package/dist/documents/used-direct-login-token.d.ts +5 -0
- package/dist/documents/used-direct-login-token.d.ts.map +1 -0
- package/dist/documents/used-direct-login-token.js +3 -0
- package/dist/documents/used-direct-login-token.js.map +1 -0
- package/dist/documents/user-role.d.ts +8 -0
- package/dist/documents/user-role.d.ts.map +1 -0
- package/dist/documents/user-role.js +3 -0
- package/dist/documents/user-role.js.map +1 -0
- package/dist/documents/user.d.ts +9 -0
- package/dist/documents/user.d.ts.map +1 -0
- package/dist/documents/user.js +3 -0
- package/dist/documents/user.js.map +1 -0
- package/dist/enumerations/base-model-name.d.ts +38 -0
- package/dist/enumerations/base-model-name.d.ts.map +1 -0
- package/dist/enumerations/base-model-name.js +34 -0
- package/dist/enumerations/base-model-name.js.map +1 -0
- package/dist/enumerations/index.d.ts +4 -0
- package/dist/enumerations/index.d.ts.map +1 -0
- package/dist/enumerations/index.js +20 -0
- package/dist/enumerations/index.js.map +1 -0
- package/dist/enumerations/length-encoding-type.d.ts +7 -0
- package/dist/enumerations/length-encoding-type.d.ts.map +1 -0
- package/dist/enumerations/length-encoding-type.js +11 -0
- package/dist/enumerations/length-encoding-type.js.map +1 -0
- package/dist/enumerations/schema-collection.d.ts +34 -0
- package/dist/enumerations/schema-collection.d.ts.map +1 -0
- package/dist/enumerations/schema-collection.js +38 -0
- package/dist/enumerations/schema-collection.js.map +1 -0
- package/dist/enumerations/symmetric-error-type.d.ts +5 -0
- package/dist/enumerations/symmetric-error-type.d.ts.map +1 -0
- package/dist/enumerations/symmetric-error-type.js +9 -0
- package/dist/enumerations/symmetric-error-type.js.map +1 -0
- package/dist/environment.d.ts +189 -0
- package/dist/environment.d.ts.map +1 -0
- package/dist/environment.js +618 -0
- package/dist/environment.js.map +1 -0
- package/dist/error-factory.d.ts +6 -0
- package/dist/error-factory.d.ts.map +1 -0
- package/dist/error-factory.js +15 -0
- package/dist/error-factory.js.map +1 -0
- package/dist/errors/express-validation.d.ts +9 -0
- package/dist/errors/express-validation.d.ts.map +1 -0
- package/dist/errors/express-validation.js +17 -0
- package/dist/errors/express-validation.js.map +1 -0
- package/dist/errors/index.d.ts +13 -0
- package/dist/errors/index.d.ts.map +1 -0
- package/dist/errors/index.js +29 -0
- package/dist/errors/index.js.map +1 -0
- package/dist/errors/invalid-backup-code-version.d.ts +6 -0
- package/dist/errors/invalid-backup-code-version.d.ts.map +1 -0
- package/dist/errors/invalid-backup-code-version.js +14 -0
- package/dist/errors/invalid-backup-code-version.js.map +1 -0
- package/dist/errors/invalid-jwt-token.d.ts +5 -0
- package/dist/errors/invalid-jwt-token.d.ts.map +1 -0
- package/dist/errors/invalid-jwt-token.js +11 -0
- package/dist/errors/invalid-jwt-token.js.map +1 -0
- package/dist/errors/invalid-model.d.ts +6 -0
- package/dist/errors/invalid-model.d.ts.map +1 -0
- package/dist/errors/invalid-model.js +13 -0
- package/dist/errors/invalid-model.js.map +1 -0
- package/dist/errors/invalid-new-password.d.ts +5 -0
- package/dist/errors/invalid-new-password.d.ts.map +1 -0
- package/dist/errors/invalid-new-password.js +14 -0
- package/dist/errors/invalid-new-password.js.map +1 -0
- package/dist/errors/invalid-password.d.ts +5 -0
- package/dist/errors/invalid-password.d.ts.map +1 -0
- package/dist/errors/invalid-password.js +14 -0
- package/dist/errors/invalid-password.js.map +1 -0
- package/dist/errors/missing-validated-data.d.ts +7 -0
- package/dist/errors/missing-validated-data.d.ts.map +1 -0
- package/dist/errors/missing-validated-data.js +34 -0
- package/dist/errors/missing-validated-data.js.map +1 -0
- package/dist/errors/mnemonic-or-password-required.d.ts +5 -0
- package/dist/errors/mnemonic-or-password-required.d.ts.map +1 -0
- package/dist/errors/mnemonic-or-password-required.js +13 -0
- package/dist/errors/mnemonic-or-password-required.js.map +1 -0
- package/dist/errors/model-not-registered.d.ts +5 -0
- package/dist/errors/model-not-registered.d.ts.map +1 -0
- package/dist/errors/model-not-registered.js +12 -0
- package/dist/errors/model-not-registered.js.map +1 -0
- package/dist/errors/mongoose-validation.d.ts +11 -0
- package/dist/errors/mongoose-validation.d.ts.map +1 -0
- package/dist/errors/mongoose-validation.js +16 -0
- package/dist/errors/mongoose-validation.js.map +1 -0
- package/dist/errors/symmetric.d.ts +8 -0
- package/dist/errors/symmetric.d.ts.map +1 -0
- package/dist/errors/symmetric.js +23 -0
- package/dist/errors/symmetric.js.map +1 -0
- package/dist/errors/token-expired.d.ts +5 -0
- package/dist/errors/token-expired.d.ts.map +1 -0
- package/dist/errors/token-expired.js +11 -0
- package/dist/errors/token-expired.js.map +1 -0
- package/dist/get-language.d.ts +2 -0
- package/dist/get-language.d.ts.map +1 -0
- package/dist/get-language.js +30 -0
- package/dist/get-language.js.map +1 -0
- package/dist/get-timezone.d.ts +3 -0
- package/dist/get-timezone.d.ts.map +1 -0
- package/dist/get-timezone.js +31 -0
- package/dist/get-timezone.js.map +1 -0
- package/dist/index.d.ts +23 -0
- package/dist/index.d.ts.map +1 -0
- package/dist/index.js +39 -0
- package/dist/index.js.map +1 -0
- package/dist/interfaces/api-error-response.d.ts +5 -0
- package/dist/interfaces/api-error-response.d.ts.map +1 -0
- package/dist/interfaces/api-error-response.js +3 -0
- package/dist/interfaces/api-error-response.js.map +1 -0
- package/dist/interfaces/api-express-validation-error-response.d.ts +7 -0
- package/dist/interfaces/api-express-validation-error-response.d.ts.map +1 -0
- package/dist/interfaces/api-express-validation-error-response.js +3 -0
- package/dist/interfaces/api-express-validation-error-response.js.map +1 -0
- package/dist/interfaces/api-message-response.d.ts +4 -0
- package/dist/interfaces/api-message-response.d.ts.map +1 -0
- package/dist/interfaces/api-message-response.js +3 -0
- package/dist/interfaces/api-message-response.js.map +1 -0
- package/dist/interfaces/api-mongo-validation-error-response.d.ts +6 -0
- package/dist/interfaces/api-mongo-validation-error-response.d.ts.map +1 -0
- package/dist/interfaces/api-mongo-validation-error-response.js +3 -0
- package/dist/interfaces/api-mongo-validation-error-response.js.map +1 -0
- package/dist/interfaces/api-responses/backup-codes-response.d.ts +5 -0
- package/dist/interfaces/api-responses/backup-codes-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/backup-codes-response.js +3 -0
- package/dist/interfaces/api-responses/backup-codes-response.js.map +1 -0
- package/dist/interfaces/api-responses/challenge-response.d.ts +6 -0
- package/dist/interfaces/api-responses/challenge-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/challenge-response.js +3 -0
- package/dist/interfaces/api-responses/challenge-response.js.map +1 -0
- package/dist/interfaces/api-responses/code-count-response.d.ts +5 -0
- package/dist/interfaces/api-responses/code-count-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/code-count-response.js +3 -0
- package/dist/interfaces/api-responses/code-count-response.js.map +1 -0
- package/dist/interfaces/api-responses/index.d.ts +8 -0
- package/dist/interfaces/api-responses/index.d.ts.map +1 -0
- package/dist/interfaces/api-responses/index.js +24 -0
- package/dist/interfaces/api-responses/index.js.map +1 -0
- package/dist/interfaces/api-responses/login-response.d.ts +8 -0
- package/dist/interfaces/api-responses/login-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/login-response.js +3 -0
- package/dist/interfaces/api-responses/login-response.js.map +1 -0
- package/dist/interfaces/api-responses/mnemonic-response.d.ts +5 -0
- package/dist/interfaces/api-responses/mnemonic-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/mnemonic-response.js +3 -0
- package/dist/interfaces/api-responses/mnemonic-response.js.map +1 -0
- package/dist/interfaces/api-responses/registration-response.d.ts +6 -0
- package/dist/interfaces/api-responses/registration-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/registration-response.js +3 -0
- package/dist/interfaces/api-responses/registration-response.js.map +1 -0
- package/dist/interfaces/api-responses/request-user-response.d.ts +6 -0
- package/dist/interfaces/api-responses/request-user-response.d.ts.map +1 -0
- package/dist/interfaces/api-responses/request-user-response.js +3 -0
- package/dist/interfaces/api-responses/request-user-response.js.map +1 -0
- package/dist/interfaces/application.d.ts +12 -0
- package/dist/interfaces/application.d.ts.map +1 -0
- package/dist/interfaces/application.js +3 -0
- package/dist/interfaces/application.js.map +1 -0
- package/dist/interfaces/backend-objects/email-token.d.ts +4 -0
- package/dist/interfaces/backend-objects/email-token.d.ts.map +1 -0
- package/dist/interfaces/backend-objects/email-token.js +3 -0
- package/dist/interfaces/backend-objects/email-token.js.map +1 -0
- package/dist/interfaces/backend-objects/index.d.ts +5 -0
- package/dist/interfaces/backend-objects/index.d.ts.map +1 -0
- package/dist/interfaces/backend-objects/index.js +21 -0
- package/dist/interfaces/backend-objects/index.js.map +1 -0
- package/dist/interfaces/backend-objects/request-user.d.ts +5 -0
- package/dist/interfaces/backend-objects/request-user.d.ts.map +1 -0
- package/dist/interfaces/backend-objects/request-user.js +3 -0
- package/dist/interfaces/backend-objects/request-user.js.map +1 -0
- package/dist/interfaces/backend-objects/role.d.ts +4 -0
- package/dist/interfaces/backend-objects/role.d.ts.map +1 -0
- package/dist/interfaces/backend-objects/role.js +3 -0
- package/dist/interfaces/backend-objects/role.js.map +1 -0
- package/dist/interfaces/backend-objects/user.d.ts +4 -0
- package/dist/interfaces/backend-objects/user.d.ts.map +1 -0
- package/dist/interfaces/backend-objects/user.js +3 -0
- package/dist/interfaces/backend-objects/user.js.map +1 -0
- package/dist/interfaces/checksum-config.d.ts +5 -0
- package/dist/interfaces/checksum-config.d.ts.map +1 -0
- package/dist/interfaces/checksum-config.js +3 -0
- package/dist/interfaces/checksum-config.js.map +1 -0
- package/dist/interfaces/checksum-consts.d.ts +11 -0
- package/dist/interfaces/checksum-consts.d.ts.map +1 -0
- package/dist/interfaces/checksum-consts.js +3 -0
- package/dist/interfaces/checksum-consts.js.map +1 -0
- package/dist/interfaces/constants.d.ts +12 -0
- package/dist/interfaces/constants.d.ts.map +1 -0
- package/dist/interfaces/constants.js +3 -0
- package/dist/interfaces/constants.js.map +1 -0
- package/dist/interfaces/create-user-basics.d.ts +18 -0
- package/dist/interfaces/create-user-basics.d.ts.map +1 -0
- package/dist/interfaces/create-user-basics.js +3 -0
- package/dist/interfaces/create-user-basics.js.map +1 -0
- package/dist/interfaces/csp-config.d.ts +14 -0
- package/dist/interfaces/csp-config.d.ts.map +1 -0
- package/dist/interfaces/csp-config.js +3 -0
- package/dist/interfaces/csp-config.js.map +1 -0
- package/dist/interfaces/deep-partial.d.ts +4 -0
- package/dist/interfaces/deep-partial.d.ts.map +1 -0
- package/dist/interfaces/deep-partial.js +3 -0
- package/dist/interfaces/deep-partial.js.map +1 -0
- package/dist/interfaces/discriminator-collections.d.ts +7 -0
- package/dist/interfaces/discriminator-collections.d.ts.map +1 -0
- package/dist/interfaces/discriminator-collections.js +3 -0
- package/dist/interfaces/discriminator-collections.js.map +1 -0
- package/dist/interfaces/email-service.d.ts +4 -0
- package/dist/interfaces/email-service.d.ts.map +1 -0
- package/dist/interfaces/email-service.js +3 -0
- package/dist/interfaces/email-service.js.map +1 -0
- package/dist/interfaces/environment-mongo.d.ts +76 -0
- package/dist/interfaces/environment-mongo.d.ts.map +1 -0
- package/dist/interfaces/environment-mongo.js +3 -0
- package/dist/interfaces/environment-mongo.js.map +1 -0
- package/dist/interfaces/environment.d.ts +181 -0
- package/dist/interfaces/environment.d.ts.map +1 -0
- package/dist/interfaces/environment.js +3 -0
- package/dist/interfaces/environment.js.map +1 -0
- package/dist/interfaces/failable-result.d.ts +7 -0
- package/dist/interfaces/failable-result.d.ts.map +1 -0
- package/dist/interfaces/failable-result.js +3 -0
- package/dist/interfaces/failable-result.js.map +1 -0
- package/dist/interfaces/fec-consts.d.ts +5 -0
- package/dist/interfaces/fec-consts.d.ts.map +1 -0
- package/dist/interfaces/fec-consts.js +3 -0
- package/dist/interfaces/fec-consts.js.map +1 -0
- package/dist/interfaces/handleable-error-options.d.ts +7 -0
- package/dist/interfaces/handleable-error-options.d.ts.map +1 -0
- package/dist/interfaces/handleable-error-options.js +3 -0
- package/dist/interfaces/handleable-error-options.js.map +1 -0
- package/dist/interfaces/index.d.ts +30 -0
- package/dist/interfaces/index.d.ts.map +1 -0
- package/dist/interfaces/index.js +46 -0
- package/dist/interfaces/index.js.map +1 -0
- package/dist/interfaces/jwt-consts.d.ts +11 -0
- package/dist/interfaces/jwt-consts.d.ts.map +1 -0
- package/dist/interfaces/jwt-consts.js +3 -0
- package/dist/interfaces/jwt-consts.js.map +1 -0
- package/dist/interfaces/jwt-sign-response.d.ts +11 -0
- package/dist/interfaces/jwt-sign-response.d.ts.map +1 -0
- package/dist/interfaces/jwt-sign-response.js +3 -0
- package/dist/interfaces/jwt-sign-response.js.map +1 -0
- package/dist/interfaces/mongo-errors.d.ts +5 -0
- package/dist/interfaces/mongo-errors.d.ts.map +1 -0
- package/dist/interfaces/mongo-errors.js +3 -0
- package/dist/interfaces/mongo-errors.js.map +1 -0
- package/dist/interfaces/request-user.d.ts +42 -0
- package/dist/interfaces/request-user.d.ts.map +1 -0
- package/dist/interfaces/request-user.js +3 -0
- package/dist/interfaces/request-user.js.map +1 -0
- package/dist/interfaces/required-string-keys.d.ts +22 -0
- package/dist/interfaces/required-string-keys.d.ts.map +1 -0
- package/dist/interfaces/required-string-keys.js +3 -0
- package/dist/interfaces/required-string-keys.js.map +1 -0
- package/dist/interfaces/schema.d.ts +29 -0
- package/dist/interfaces/schema.d.ts.map +1 -0
- package/dist/interfaces/schema.js +3 -0
- package/dist/interfaces/schema.js.map +1 -0
- package/dist/interfaces/server-init-result.d.ts +35 -0
- package/dist/interfaces/server-init-result.d.ts.map +1 -0
- package/dist/interfaces/server-init-result.js +3 -0
- package/dist/interfaces/server-init-result.js.map +1 -0
- package/dist/interfaces/status-code-response.d.ts +7 -0
- package/dist/interfaces/status-code-response.d.ts.map +1 -0
- package/dist/interfaces/status-code-response.js +3 -0
- package/dist/interfaces/status-code-response.js.map +1 -0
- package/dist/interfaces/symmetric-encryption-results.d.ts +5 -0
- package/dist/interfaces/symmetric-encryption-results.d.ts.map +1 -0
- package/dist/interfaces/symmetric-encryption-results.js +3 -0
- package/dist/interfaces/symmetric-encryption-results.js.map +1 -0
- package/dist/interfaces/token-response.d.ts +5 -0
- package/dist/interfaces/token-response.d.ts.map +1 -0
- package/dist/interfaces/token-response.js +3 -0
- package/dist/interfaces/token-response.js.map +1 -0
- package/dist/middlewares/authenticate-crypto.d.ts +9 -0
- package/dist/middlewares/authenticate-crypto.d.ts.map +1 -0
- package/dist/middlewares/authenticate-crypto.js +146 -0
- package/dist/middlewares/authenticate-crypto.js.map +1 -0
- package/dist/middlewares/authenticate-token.d.ts +21 -0
- package/dist/middlewares/authenticate-token.d.ts.map +1 -0
- package/dist/middlewares/authenticate-token.js +102 -0
- package/dist/middlewares/authenticate-token.js.map +1 -0
- package/dist/middlewares/cleanup-crypto.d.ts +7 -0
- package/dist/middlewares/cleanup-crypto.d.ts.map +1 -0
- package/dist/middlewares/cleanup-crypto.js +32 -0
- package/dist/middlewares/cleanup-crypto.js.map +1 -0
- package/dist/middlewares/index.d.ts +5 -0
- package/dist/middlewares/index.d.ts.map +1 -0
- package/dist/middlewares/index.js +21 -0
- package/dist/middlewares/index.js.map +1 -0
- package/dist/middlewares/set-global-context-language.d.ts +3 -0
- package/dist/middlewares/set-global-context-language.d.ts.map +1 -0
- package/dist/middlewares/set-global-context-language.js +14 -0
- package/dist/middlewares/set-global-context-language.js.map +1 -0
- package/dist/middlewares.d.ts +18 -0
- package/dist/middlewares.d.ts.map +1 -0
- package/dist/middlewares.js +76 -0
- package/dist/middlewares.js.map +1 -0
- package/dist/model-registry.d.ts +23 -0
- package/dist/model-registry.d.ts.map +1 -0
- package/dist/model-registry.js +47 -0
- package/dist/model-registry.js.map +1 -0
- package/dist/models/email-token.d.ts +11 -0
- package/dist/models/email-token.d.ts.map +1 -0
- package/dist/models/email-token.js +11 -0
- package/dist/models/email-token.js.map +1 -0
- package/dist/models/index.d.ts +7 -0
- package/dist/models/index.d.ts.map +1 -0
- package/dist/models/index.js +23 -0
- package/dist/models/index.js.map +1 -0
- package/dist/models/mnemonic.d.ts +11 -0
- package/dist/models/mnemonic.d.ts.map +1 -0
- package/dist/models/mnemonic.js +11 -0
- package/dist/models/mnemonic.js.map +1 -0
- package/dist/models/role.d.ts +11 -0
- package/dist/models/role.d.ts.map +1 -0
- package/dist/models/role.js +11 -0
- package/dist/models/role.js.map +1 -0
- package/dist/models/used-direct-login-token.d.ts +11 -0
- package/dist/models/used-direct-login-token.d.ts.map +1 -0
- package/dist/models/used-direct-login-token.js +11 -0
- package/dist/models/used-direct-login-token.js.map +1 -0
- package/dist/models/user-role.d.ts +6 -0
- package/dist/models/user-role.d.ts.map +1 -0
- package/dist/models/user-role.js +10 -0
- package/dist/models/user-role.js.map +1 -0
- package/dist/models/user.d.ts +7 -0
- package/dist/models/user.d.ts.map +1 -0
- package/dist/models/user.js +11 -0
- package/dist/models/user.js.map +1 -0
- package/dist/registry/email-service-registry.d.ts +9 -0
- package/dist/registry/email-service-registry.d.ts.map +1 -0
- package/dist/registry/email-service-registry.js +17 -0
- package/dist/registry/email-service-registry.js.map +1 -0
- package/dist/registry/index.d.ts +2 -0
- package/dist/registry/index.d.ts.map +1 -0
- package/dist/registry/index.js +6 -0
- package/dist/registry/index.js.map +1 -0
- package/dist/routers/api.d.ts +23 -0
- package/dist/routers/api.d.ts.map +1 -0
- package/dist/routers/api.js +44 -0
- package/dist/routers/api.js.map +1 -0
- package/dist/routers/app.d.ts +24 -0
- package/dist/routers/app.d.ts.map +1 -0
- package/dist/routers/app.js +182 -0
- package/dist/routers/app.js.map +1 -0
- package/dist/routers/base.d.ts +8 -0
- package/dist/routers/base.d.ts.map +1 -0
- package/dist/routers/base.js +12 -0
- package/dist/routers/base.js.map +1 -0
- package/dist/routers/index.d.ts +3 -0
- package/dist/routers/index.d.ts.map +1 -0
- package/dist/routers/index.js +19 -0
- package/dist/routers/index.js.map +1 -0
- package/dist/schemas/email-token.d.ts +38 -0
- package/dist/schemas/email-token.d.ts.map +1 -0
- package/dist/schemas/email-token.js +56 -0
- package/dist/schemas/email-token.js.map +1 -0
- package/dist/schemas/mnemonic.d.ts +20 -0
- package/dist/schemas/mnemonic.d.ts.map +1 -0
- package/dist/schemas/mnemonic.js +30 -0
- package/dist/schemas/mnemonic.js.map +1 -0
- package/dist/schemas/role.d.ts +32 -0
- package/dist/schemas/role.d.ts.map +1 -0
- package/dist/schemas/role.js +86 -0
- package/dist/schemas/role.js.map +1 -0
- package/dist/schemas/schema.d.ts +40 -0
- package/dist/schemas/schema.d.ts.map +1 -0
- package/dist/schemas/schema.js +64 -0
- package/dist/schemas/schema.js.map +1 -0
- package/dist/schemas/used-direct-login-token.d.ts +27 -0
- package/dist/schemas/used-direct-login-token.d.ts.map +1 -0
- package/dist/schemas/used-direct-login-token.js +23 -0
- package/dist/schemas/used-direct-login-token.js.map +1 -0
- package/dist/schemas/user-role.d.ts +29 -0
- package/dist/schemas/user-role.d.ts.map +1 -0
- package/dist/schemas/user-role.js +54 -0
- package/dist/schemas/user-role.js.map +1 -0
- package/dist/schemas/user.d.ts +21 -0
- package/dist/schemas/user.d.ts.map +1 -0
- package/dist/schemas/user.js +178 -0
- package/dist/schemas/user.js.map +1 -0
- package/dist/services/backup-code.d.ts +76 -0
- package/dist/services/backup-code.d.ts.map +1 -0
- package/dist/services/backup-code.js +180 -0
- package/dist/services/backup-code.js.map +1 -0
- package/dist/services/base.d.ts +10 -0
- package/dist/services/base.d.ts.map +1 -0
- package/dist/services/base.js +14 -0
- package/dist/services/base.js.map +1 -0
- package/dist/services/checksum.d.ts +67 -0
- package/dist/services/checksum.d.ts.map +1 -0
- package/dist/services/checksum.js +175 -0
- package/dist/services/checksum.js.map +1 -0
- package/dist/services/crc.d.ts +87 -0
- package/dist/services/crc.d.ts.map +1 -0
- package/dist/services/crc.js +198 -0
- package/dist/services/crc.js.map +1 -0
- package/dist/services/database-initialization.d.ts +101 -0
- package/dist/services/database-initialization.d.ts.map +1 -0
- package/dist/services/database-initialization.js +779 -0
- package/dist/services/database-initialization.js.map +1 -0
- package/dist/services/direct-login-token.d.ts +6 -0
- package/dist/services/direct-login-token.d.ts.map +1 -0
- package/dist/services/direct-login-token.js +41 -0
- package/dist/services/direct-login-token.js.map +1 -0
- package/dist/services/fec-usage-example.d.ts +38 -0
- package/dist/services/fec-usage-example.d.ts.map +1 -0
- package/dist/services/fec-usage-example.js +77 -0
- package/dist/services/fec-usage-example.js.map +1 -0
- package/dist/services/fec.d.ts +46 -0
- package/dist/services/fec.d.ts.map +1 -0
- package/dist/services/fec.js +192 -0
- package/dist/services/fec.js.map +1 -0
- package/dist/services/index.d.ts +19 -0
- package/dist/services/index.d.ts.map +1 -0
- package/dist/services/index.js +35 -0
- package/dist/services/index.js.map +1 -0
- package/dist/services/jwt.d.ts +30 -0
- package/dist/services/jwt.d.ts.map +1 -0
- package/dist/services/jwt.js +90 -0
- package/dist/services/jwt.js.map +1 -0
- package/dist/services/key-wrapping.d.ts +60 -0
- package/dist/services/key-wrapping.d.ts.map +1 -0
- package/dist/services/key-wrapping.js +311 -0
- package/dist/services/key-wrapping.js.map +1 -0
- package/dist/services/mnemonic.d.ts +61 -0
- package/dist/services/mnemonic.d.ts.map +1 -0
- package/dist/services/mnemonic.js +112 -0
- package/dist/services/mnemonic.js.map +1 -0
- package/dist/services/request-user.d.ts +20 -0
- package/dist/services/request-user.d.ts.map +1 -0
- package/dist/services/request-user.js +50 -0
- package/dist/services/request-user.js.map +1 -0
- package/dist/services/role.d.ts +85 -0
- package/dist/services/role.d.ts.map +1 -0
- package/dist/services/role.js +254 -0
- package/dist/services/role.js.map +1 -0
- package/dist/services/symmetric.d.ts +42 -0
- package/dist/services/symmetric.d.ts.map +1 -0
- package/dist/services/symmetric.js +101 -0
- package/dist/services/symmetric.js.map +1 -0
- package/dist/services/system-user.d.ts +17 -0
- package/dist/services/system-user.d.ts.map +1 -0
- package/dist/services/system-user.js +46 -0
- package/dist/services/system-user.js.map +1 -0
- package/dist/services/user.d.ts +317 -0
- package/dist/services/user.d.ts.map +1 -0
- package/dist/services/user.js +1364 -0
- package/dist/services/user.js.map +1 -0
- package/dist/services/xor.d.ts +24 -0
- package/dist/services/xor.d.ts.map +1 -0
- package/dist/services/xor.js +37 -0
- package/dist/services/xor.js.map +1 -0
- package/dist/types.d.ts +70 -0
- package/dist/types.d.ts.map +1 -0
- package/dist/types.js +14 -0
- package/dist/types.js.map +1 -0
- package/dist/utils.d.ts +202 -0
- package/dist/utils.d.ts.map +1 -0
- package/dist/utils.js +786 -0
- package/dist/utils.js.map +1 -0
- package/package.json +60 -0
package/LICENSE
ADDED
|
@@ -0,0 +1,21 @@
|
|
|
1
|
+
MIT License
|
|
2
|
+
|
|
3
|
+
Copyright (c) 2025 Digital Defiance
|
|
4
|
+
|
|
5
|
+
Permission is hereby granted, free of charge, to any person obtaining a copy
|
|
6
|
+
of this software and associated documentation files (the "Software"), to deal
|
|
7
|
+
in the Software without restriction, including without limitation the rights
|
|
8
|
+
to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
|
|
9
|
+
copies of the Software, and to permit persons to whom the Software is
|
|
10
|
+
furnished to do so, subject to the following conditions:
|
|
11
|
+
|
|
12
|
+
The above copyright notice and this permission notice shall be included in all
|
|
13
|
+
copies or substantial portions of the Software.
|
|
14
|
+
|
|
15
|
+
THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
|
|
16
|
+
IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
|
|
17
|
+
FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE
|
|
18
|
+
AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
|
|
19
|
+
LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
|
|
20
|
+
OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE
|
|
21
|
+
SOFTWARE.
|
package/README.md
ADDED
|
@@ -0,0 +1,673 @@
|
|
|
1
|
+
# @digitaldefiance/node-express-suite
|
|
2
|
+
|
|
3
|
+
An opinionated, secure, extensible Node.js/Express service framework built on Digital Defiance cryptography libraries, providing complete backend infrastructure for secure applications.
|
|
4
|
+
|
|
5
|
+
It is an 'out of the box' solution with a specific recipe (Mongo, Express, React, Node, (MERN) stack) with ejs templating, JWT authentication, role-based access control, custom multi-language support via @digitaldefiance/i18n-lib, and a dynamic model registry system. You might either find it limiting or freeing, depending on your use case. It includes mnemonic authentication, ECIES encryption/decryption, PBKDF2 key derivation, email token workflows, and more.
|
|
6
|
+
|
|
7
|
+
## Features
|
|
8
|
+
|
|
9
|
+
- **🔐 ECIES Encryption/Decryption**: End-to-end encryption using elliptic curve cryptography
|
|
10
|
+
- **🔑 PBKDF2 Key Derivation**: Secure password hashing with configurable profiles
|
|
11
|
+
- **👥 Role-Based Access Control (RBAC)**: Flexible permission system with user roles
|
|
12
|
+
- **🌍 Multi-Language i18n**: Plugin-based internationalization with 8+ languages
|
|
13
|
+
- **📊 Dynamic Model Registry**: Extensible document model system
|
|
14
|
+
- **🔧 Runtime Configuration**: Override defaults at runtime for advanced use cases
|
|
15
|
+
- **🛡️ JWT Authentication**: Secure token-based authentication
|
|
16
|
+
- **📧 Email Token System**: Verification, password reset, and recovery workflows
|
|
17
|
+
- **💾 MongoDB Integration**: Full database layer with Mongoose schemas
|
|
18
|
+
- **🧪 Comprehensive Testing**: 100+ tests covering all major functionality
|
|
19
|
+
|
|
20
|
+
## Installation
|
|
21
|
+
|
|
22
|
+
```bash
|
|
23
|
+
npm install @digitaldefiance/node-express-suite
|
|
24
|
+
# or
|
|
25
|
+
yarn add @digitaldefiance/node-express-suite
|
|
26
|
+
```
|
|
27
|
+
|
|
28
|
+
## Quick Start
|
|
29
|
+
|
|
30
|
+
### Basic Server Setup
|
|
31
|
+
|
|
32
|
+
```typescript
|
|
33
|
+
import { Application, DatabaseInitializationService, emailServiceRegistry } from '@digitaldefiance/node-express-suite';
|
|
34
|
+
import { CoreLanguage } from '@digitaldefiance/i18n-lib';
|
|
35
|
+
import { EmailService } from './services/email'; // Your concrete implementation
|
|
36
|
+
|
|
37
|
+
// Create application instance
|
|
38
|
+
const app = new Application({
|
|
39
|
+
port: 3000,
|
|
40
|
+
mongoUri: 'mongodb://localhost:27017/myapp',
|
|
41
|
+
jwtSecret: process.env.JWT_SECRET,
|
|
42
|
+
defaultLanguage: CoreLanguage.EnglishUS
|
|
43
|
+
});
|
|
44
|
+
|
|
45
|
+
// Configure email service (required before using middleware)
|
|
46
|
+
emailServiceRegistry.setService(new EmailService(app));
|
|
47
|
+
|
|
48
|
+
// Initialize database with default users and roles
|
|
49
|
+
const initResult = await DatabaseInitializationService.initUserDb(app);
|
|
50
|
+
|
|
51
|
+
// Start server
|
|
52
|
+
await app.start();
|
|
53
|
+
console.log(`Server running on port ${app.environment.port}`);
|
|
54
|
+
```
|
|
55
|
+
|
|
56
|
+
### User Authentication
|
|
57
|
+
|
|
58
|
+
```typescript
|
|
59
|
+
import { JwtService, UserService } from '@digitaldefiance/node-express-suite';
|
|
60
|
+
|
|
61
|
+
// Create services
|
|
62
|
+
const jwtService = new JwtService(app);
|
|
63
|
+
const userService = new UserService(app);
|
|
64
|
+
|
|
65
|
+
// Sign in user
|
|
66
|
+
const user = await userService.findByUsername('alice');
|
|
67
|
+
const { token, roles } = await jwtService.signToken(user, app.environment.jwtSecret);
|
|
68
|
+
|
|
69
|
+
// Verify token
|
|
70
|
+
const tokenUser = await jwtService.verifyToken(token);
|
|
71
|
+
console.log(`User ${tokenUser.userId} authenticated with roles:`, tokenUser.roles);
|
|
72
|
+
```
|
|
73
|
+
|
|
74
|
+
## Core Components
|
|
75
|
+
|
|
76
|
+
### Dynamic Model Registry
|
|
77
|
+
|
|
78
|
+
The package uses a dynamic model registration system for extensibility:
|
|
79
|
+
|
|
80
|
+
```typescript
|
|
81
|
+
import { ModelRegistry } from '@digitaldefiance/node-express-suite';
|
|
82
|
+
|
|
83
|
+
// Register a custom model
|
|
84
|
+
ModelRegistry.instance.register({
|
|
85
|
+
modelName: 'Organization',
|
|
86
|
+
schema: organizationSchema,
|
|
87
|
+
model: OrganizationModel,
|
|
88
|
+
collection: 'organizations',
|
|
89
|
+
});
|
|
90
|
+
|
|
91
|
+
// Retrieve model anywhere in your app
|
|
92
|
+
const OrgModel = ModelRegistry.instance.get<IOrganizationDocument>('Organization').model;
|
|
93
|
+
|
|
94
|
+
// Use the model
|
|
95
|
+
const org = await OrgModel.findById(orgId);
|
|
96
|
+
```
|
|
97
|
+
|
|
98
|
+
### Built-in Models
|
|
99
|
+
|
|
100
|
+
The framework includes these pre-registered models:
|
|
101
|
+
|
|
102
|
+
- **User**: User accounts with authentication
|
|
103
|
+
- **Role**: Permission roles for RBAC
|
|
104
|
+
- **UserRole**: User-to-role associations
|
|
105
|
+
- **EmailToken**: Email verification and recovery tokens
|
|
106
|
+
- **Mnemonic**: Encrypted mnemonic storage
|
|
107
|
+
- **UsedDirectLoginToken**: One-time login token tracking
|
|
108
|
+
|
|
109
|
+
### Extending Models and Schemas
|
|
110
|
+
|
|
111
|
+
All model functions support generic type parameters for custom model names and collections:
|
|
112
|
+
|
|
113
|
+
```typescript
|
|
114
|
+
import { UserModel, EmailTokenModel } from '@digitaldefiance/node-express-suite';
|
|
115
|
+
|
|
116
|
+
// Use with default enums
|
|
117
|
+
const defaultUserModel = UserModel(connection);
|
|
118
|
+
|
|
119
|
+
// Use with custom model names and collections
|
|
120
|
+
const customUserModel = UserModel(
|
|
121
|
+
connection,
|
|
122
|
+
'CustomUser',
|
|
123
|
+
'custom_users'
|
|
124
|
+
);
|
|
125
|
+
```
|
|
126
|
+
|
|
127
|
+
#### Extending Schemas
|
|
128
|
+
|
|
129
|
+
Clone and extend base schemas with additional fields:
|
|
130
|
+
|
|
131
|
+
```typescript
|
|
132
|
+
import { EmailTokenSchema } from '@digitaldefiance/node-express-suite';
|
|
133
|
+
import { Schema } from 'mongoose';
|
|
134
|
+
|
|
135
|
+
// Clone and extend the schema
|
|
136
|
+
const ExtendedEmailTokenSchema = EmailTokenSchema.clone();
|
|
137
|
+
ExtendedEmailTokenSchema.add({
|
|
138
|
+
customField: { type: String, required: false },
|
|
139
|
+
metadata: { type: Schema.Types.Mixed, required: false },
|
|
140
|
+
});
|
|
141
|
+
|
|
142
|
+
// Use with custom model
|
|
143
|
+
const MyEmailTokenModel = connection.model(
|
|
144
|
+
'ExtendedEmailToken',
|
|
145
|
+
ExtendedEmailTokenSchema,
|
|
146
|
+
'extended_email_tokens'
|
|
147
|
+
);
|
|
148
|
+
```
|
|
149
|
+
|
|
150
|
+
#### Extending Model Functions
|
|
151
|
+
|
|
152
|
+
Create custom model functions that wrap extended schemas:
|
|
153
|
+
|
|
154
|
+
```typescript
|
|
155
|
+
import { IEmailTokenDocument } from '@digitaldefiance/node-express-suite';
|
|
156
|
+
import { Connection, Model } from 'mongoose';
|
|
157
|
+
|
|
158
|
+
// Extend the document interface
|
|
159
|
+
interface IExtendedEmailTokenDocument extends IEmailTokenDocument {
|
|
160
|
+
customField?: string;
|
|
161
|
+
metadata?: any;
|
|
162
|
+
}
|
|
163
|
+
|
|
164
|
+
// Create extended schema (as shown above)
|
|
165
|
+
const ExtendedEmailTokenSchema = EmailTokenSchema.clone();
|
|
166
|
+
ExtendedEmailTokenSchema.add({
|
|
167
|
+
customField: { type: String },
|
|
168
|
+
metadata: { type: Schema.Types.Mixed },
|
|
169
|
+
});
|
|
170
|
+
|
|
171
|
+
// Create custom model function
|
|
172
|
+
export function ExtendedEmailTokenModel<
|
|
173
|
+
TModelName extends string = 'ExtendedEmailToken',
|
|
174
|
+
TCollection extends string = 'extended_email_tokens'
|
|
175
|
+
>(
|
|
176
|
+
connection: Connection,
|
|
177
|
+
modelName: TModelName = 'ExtendedEmailToken' as TModelName,
|
|
178
|
+
collection: TCollection = 'extended_email_tokens' as TCollection,
|
|
179
|
+
): Model<IExtendedEmailTokenDocument> {
|
|
180
|
+
return connection.model<IExtendedEmailTokenDocument>(
|
|
181
|
+
modelName,
|
|
182
|
+
ExtendedEmailTokenSchema,
|
|
183
|
+
collection,
|
|
184
|
+
);
|
|
185
|
+
}
|
|
186
|
+
|
|
187
|
+
// Use the extended model
|
|
188
|
+
const model = ExtendedEmailTokenModel(connection);
|
|
189
|
+
const token = await model.create({
|
|
190
|
+
userId,
|
|
191
|
+
type: EmailTokenType.AccountVerification,
|
|
192
|
+
token: 'abc123',
|
|
193
|
+
email: 'user@example.com',
|
|
194
|
+
customField: 'custom value',
|
|
195
|
+
metadata: { source: 'api' },
|
|
196
|
+
});
|
|
197
|
+
```
|
|
198
|
+
|
|
199
|
+
#### Custom Enumerations
|
|
200
|
+
|
|
201
|
+
Extend the base enumerations for your application:
|
|
202
|
+
|
|
203
|
+
```typescript
|
|
204
|
+
import { BaseModelName, SchemaCollection } from '@digitaldefiance/node-express-suite';
|
|
205
|
+
|
|
206
|
+
// Extend base enums
|
|
207
|
+
enum MyModelName {
|
|
208
|
+
User = BaseModelName.User,
|
|
209
|
+
Role = BaseModelName.Role,
|
|
210
|
+
Organization = 'Organization',
|
|
211
|
+
Project = 'Project',
|
|
212
|
+
}
|
|
213
|
+
|
|
214
|
+
enum MyCollection {
|
|
215
|
+
User = SchemaCollection.User,
|
|
216
|
+
Role = SchemaCollection.Role,
|
|
217
|
+
Organization = 'organizations',
|
|
218
|
+
Project = 'projects',
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
// Use with model functions
|
|
222
|
+
const orgModel = UserModel<MyModelName, MyCollection>(
|
|
223
|
+
connection,
|
|
224
|
+
MyModelName.Organization,
|
|
225
|
+
MyCollection.Organization
|
|
226
|
+
);
|
|
227
|
+
```
|
|
228
|
+
|
|
229
|
+
#### Complete Extension Example
|
|
230
|
+
|
|
231
|
+
Combining schemas, documents, and model functions:
|
|
232
|
+
|
|
233
|
+
```typescript
|
|
234
|
+
import { IUserDocument, UserSchema } from '@digitaldefiance/node-express-suite';
|
|
235
|
+
import { Connection, Model, Schema } from 'mongoose';
|
|
236
|
+
|
|
237
|
+
// 1. Extend document interface
|
|
238
|
+
interface IOrganizationUserDocument extends IUserDocument {
|
|
239
|
+
organizationId: string;
|
|
240
|
+
department?: string;
|
|
241
|
+
}
|
|
242
|
+
|
|
243
|
+
// 2. Extend schema
|
|
244
|
+
const OrganizationUserSchema = UserSchema.clone();
|
|
245
|
+
OrganizationUserSchema.add({
|
|
246
|
+
organizationId: { type: String, required: true },
|
|
247
|
+
department: { type: String },
|
|
248
|
+
});
|
|
249
|
+
|
|
250
|
+
// 3. Create model function
|
|
251
|
+
export function OrganizationUserModel(
|
|
252
|
+
connection: Connection,
|
|
253
|
+
): Model<IOrganizationUserDocument> {
|
|
254
|
+
return connection.model<IOrganizationUserDocument>(
|
|
255
|
+
'OrganizationUser',
|
|
256
|
+
OrganizationUserSchema,
|
|
257
|
+
'organization_users',
|
|
258
|
+
);
|
|
259
|
+
}
|
|
260
|
+
|
|
261
|
+
// 4. Use in application
|
|
262
|
+
const model = OrganizationUserModel(connection);
|
|
263
|
+
const user = await model.create({
|
|
264
|
+
username: 'alice',
|
|
265
|
+
email: 'alice@example.com',
|
|
266
|
+
organizationId: 'org-123',
|
|
267
|
+
department: 'Engineering',
|
|
268
|
+
});
|
|
269
|
+
```
|
|
270
|
+
|
|
271
|
+
### Services
|
|
272
|
+
|
|
273
|
+
#### ECIESService
|
|
274
|
+
|
|
275
|
+
Encryption and key management:
|
|
276
|
+
|
|
277
|
+
```typescript
|
|
278
|
+
import { ECIESService } from '@digitaldefiance/node-express-suite';
|
|
279
|
+
|
|
280
|
+
const eciesService = new ECIESService();
|
|
281
|
+
|
|
282
|
+
// Generate mnemonic
|
|
283
|
+
const mnemonic = eciesService.generateNewMnemonic();
|
|
284
|
+
|
|
285
|
+
// Encrypt data
|
|
286
|
+
const encrypted = await eciesService.encryptSimpleOrSingle(
|
|
287
|
+
false, // single mode
|
|
288
|
+
recipientPublicKey,
|
|
289
|
+
Buffer.from('secret message')
|
|
290
|
+
);
|
|
291
|
+
|
|
292
|
+
// Decrypt data
|
|
293
|
+
const decrypted = await eciesService.decryptSimpleOrSingleWithHeader(
|
|
294
|
+
false,
|
|
295
|
+
privateKey,
|
|
296
|
+
encrypted
|
|
297
|
+
);
|
|
298
|
+
```
|
|
299
|
+
|
|
300
|
+
#### KeyWrappingService
|
|
301
|
+
|
|
302
|
+
Secure key storage and retrieval:
|
|
303
|
+
|
|
304
|
+
```typescript
|
|
305
|
+
import { KeyWrappingService } from '@digitaldefiance/node-express-suite';
|
|
306
|
+
|
|
307
|
+
const keyWrapping = new KeyWrappingService(app);
|
|
308
|
+
|
|
309
|
+
// Wrap a key with password
|
|
310
|
+
const wrapped = await keyWrapping.wrapKey(
|
|
311
|
+
privateKey,
|
|
312
|
+
password,
|
|
313
|
+
salt
|
|
314
|
+
);
|
|
315
|
+
|
|
316
|
+
// Unwrap key
|
|
317
|
+
const unwrapped = await keyWrapping.unwrapKey(
|
|
318
|
+
wrapped,
|
|
319
|
+
password,
|
|
320
|
+
salt
|
|
321
|
+
);
|
|
322
|
+
```
|
|
323
|
+
|
|
324
|
+
#### RoleService
|
|
325
|
+
|
|
326
|
+
Role and permission management:
|
|
327
|
+
|
|
328
|
+
```typescript
|
|
329
|
+
import { RoleService } from '@digitaldefiance/node-express-suite';
|
|
330
|
+
|
|
331
|
+
const roleService = new RoleService(app);
|
|
332
|
+
|
|
333
|
+
// Get user roles
|
|
334
|
+
const roles = await roleService.getUserRoles(userId);
|
|
335
|
+
|
|
336
|
+
// Check permissions
|
|
337
|
+
const hasPermission = await roleService.userHasRole(userId, 'admin');
|
|
338
|
+
|
|
339
|
+
// Create role
|
|
340
|
+
const adminRole = await roleService.createRole({
|
|
341
|
+
name: 'admin',
|
|
342
|
+
description: 'Administrator role',
|
|
343
|
+
permissions: ['read', 'write', 'delete']
|
|
344
|
+
});
|
|
345
|
+
```
|
|
346
|
+
|
|
347
|
+
#### BackupCodeService
|
|
348
|
+
|
|
349
|
+
Backup code generation and validation:
|
|
350
|
+
|
|
351
|
+
```typescript
|
|
352
|
+
import { BackupCodeService } from '@digitaldefiance/node-express-suite';
|
|
353
|
+
|
|
354
|
+
const backupCodeService = new BackupCodeService(app);
|
|
355
|
+
|
|
356
|
+
// Generate backup codes
|
|
357
|
+
const codes = await backupCodeService.generateBackupCodes(userId);
|
|
358
|
+
|
|
359
|
+
// Validate code
|
|
360
|
+
const isValid = await backupCodeService.validateBackupCode(userId, userCode);
|
|
361
|
+
|
|
362
|
+
// Mark code as used
|
|
363
|
+
await backupCodeService.useBackupCode(userId, userCode);
|
|
364
|
+
```
|
|
365
|
+
|
|
366
|
+
### Database Initialization
|
|
367
|
+
|
|
368
|
+
Initialize database with default users and roles:
|
|
369
|
+
|
|
370
|
+
```typescript
|
|
371
|
+
import { DatabaseInitializationService } from '@digitaldefiance/node-express-suite';
|
|
372
|
+
|
|
373
|
+
// Initialize with default admin, member, and system users
|
|
374
|
+
const result = await DatabaseInitializationService.initUserDb(app);
|
|
375
|
+
|
|
376
|
+
if (result.success) {
|
|
377
|
+
console.log('Admin user:', result.data.adminUsername);
|
|
378
|
+
console.log('Admin password:', result.data.adminPassword);
|
|
379
|
+
console.log('Admin mnemonic:', result.data.adminMnemonic);
|
|
380
|
+
console.log('Backup codes:', result.data.adminBackupCodes);
|
|
381
|
+
}
|
|
382
|
+
```
|
|
383
|
+
|
|
384
|
+
### Middleware
|
|
385
|
+
|
|
386
|
+
#### Email Service Configuration
|
|
387
|
+
|
|
388
|
+
Before using middleware that requires email functionality, configure the email service:
|
|
389
|
+
|
|
390
|
+
```typescript
|
|
391
|
+
import { emailServiceRegistry, IEmailService } from '@digitaldefiance/node-express-suite';
|
|
392
|
+
|
|
393
|
+
// Implement the IEmailService interface
|
|
394
|
+
class MyEmailService implements IEmailService {
|
|
395
|
+
async sendEmail(to: string, subject: string, text: string, html: string): Promise<void> {
|
|
396
|
+
// Your email implementation (AWS SES, SendGrid, etc.)
|
|
397
|
+
}
|
|
398
|
+
}
|
|
399
|
+
|
|
400
|
+
// Register at application startup
|
|
401
|
+
emailServiceRegistry.setService(new MyEmailService());
|
|
402
|
+
```
|
|
403
|
+
|
|
404
|
+
#### Authentication Middleware
|
|
405
|
+
|
|
406
|
+
```typescript
|
|
407
|
+
import { authMiddleware } from '@digitaldefiance/node-express-suite';
|
|
408
|
+
|
|
409
|
+
// Protect routes with JWT authentication
|
|
410
|
+
app.get('/api/protected', authMiddleware, (req, res) => {
|
|
411
|
+
// req.user contains authenticated user info
|
|
412
|
+
res.json({ user: req.user });
|
|
413
|
+
});
|
|
414
|
+
```
|
|
415
|
+
|
|
416
|
+
#### Role-Based Authorization
|
|
417
|
+
|
|
418
|
+
```typescript
|
|
419
|
+
import { requireRole } from '@digitaldefiance/node-express-suite';
|
|
420
|
+
|
|
421
|
+
// Require specific role
|
|
422
|
+
app.delete('/api/users/:id',
|
|
423
|
+
authMiddleware,
|
|
424
|
+
requireRole('admin'),
|
|
425
|
+
async (req, res) => {
|
|
426
|
+
// Only admins can access this route
|
|
427
|
+
await userService.deleteUser(req.params.id);
|
|
428
|
+
res.json({ success: true });
|
|
429
|
+
}
|
|
430
|
+
);
|
|
431
|
+
```
|
|
432
|
+
|
|
433
|
+
## Runtime Configuration Registry
|
|
434
|
+
|
|
435
|
+
Override defaults at runtime for advanced use cases:
|
|
436
|
+
|
|
437
|
+
```typescript
|
|
438
|
+
import {
|
|
439
|
+
getExpressRuntimeConfiguration,
|
|
440
|
+
registerExpressRuntimeConfiguration,
|
|
441
|
+
} from '@digitaldefiance/node-express-suite';
|
|
442
|
+
|
|
443
|
+
// Get current configuration
|
|
444
|
+
const config = getExpressRuntimeConfiguration();
|
|
445
|
+
console.log('Bcrypt rounds:', config.BcryptRounds);
|
|
446
|
+
|
|
447
|
+
// Register custom configuration
|
|
448
|
+
const customKey = Symbol('custom-express-config');
|
|
449
|
+
registerExpressRuntimeConfiguration(customKey, {
|
|
450
|
+
BcryptRounds: 12,
|
|
451
|
+
JWT: {
|
|
452
|
+
ALGORITHM: 'HS512',
|
|
453
|
+
EXPIRATION_SEC: 7200
|
|
454
|
+
}
|
|
455
|
+
});
|
|
456
|
+
|
|
457
|
+
// Use custom configuration
|
|
458
|
+
const customConfig = getExpressRuntimeConfiguration(customKey);
|
|
459
|
+
```
|
|
460
|
+
|
|
461
|
+
### Available Configuration Options
|
|
462
|
+
|
|
463
|
+
```typescript
|
|
464
|
+
interface IExpressRuntimeConfiguration {
|
|
465
|
+
BcryptRounds: number;
|
|
466
|
+
JWT: {
|
|
467
|
+
ALGORITHM: string;
|
|
468
|
+
EXPIRATION_SEC: number;
|
|
469
|
+
};
|
|
470
|
+
BACKUP_CODES: {
|
|
471
|
+
Count: number;
|
|
472
|
+
Length: number;
|
|
473
|
+
};
|
|
474
|
+
// ... more options
|
|
475
|
+
}
|
|
476
|
+
```
|
|
477
|
+
|
|
478
|
+
## Internationalization
|
|
479
|
+
|
|
480
|
+
Built-in support for multiple languages using the plugin-based i18n architecture:
|
|
481
|
+
|
|
482
|
+
```typescript
|
|
483
|
+
import { getGlobalI18nEngine, translateExpressSuite } from '@digitaldefiance/node-express-suite';
|
|
484
|
+
import { CoreLanguage } from '@digitaldefiance/i18n-lib';
|
|
485
|
+
|
|
486
|
+
// Get the global i18n engine
|
|
487
|
+
const i18n = getGlobalI18nEngine();
|
|
488
|
+
|
|
489
|
+
// Translate strings
|
|
490
|
+
const message = translateExpressSuite(
|
|
491
|
+
ExpressSuiteStringKey.Common_Ready,
|
|
492
|
+
{},
|
|
493
|
+
CoreLanguage.French
|
|
494
|
+
);
|
|
495
|
+
// "Prêt"
|
|
496
|
+
|
|
497
|
+
// Change language globally
|
|
498
|
+
i18n.setLanguage(CoreLanguage.Spanish);
|
|
499
|
+
```
|
|
500
|
+
|
|
501
|
+
### Supported Languages
|
|
502
|
+
|
|
503
|
+
- English (US)
|
|
504
|
+
- Spanish
|
|
505
|
+
- French
|
|
506
|
+
- Mandarin Chinese
|
|
507
|
+
- Japanese
|
|
508
|
+
- German
|
|
509
|
+
- Ukrainian
|
|
510
|
+
|
|
511
|
+
## Error Handling
|
|
512
|
+
|
|
513
|
+
Comprehensive error types with localization:
|
|
514
|
+
|
|
515
|
+
```typescript
|
|
516
|
+
import {
|
|
517
|
+
TranslatableError,
|
|
518
|
+
InvalidJwtTokenError,
|
|
519
|
+
TokenExpiredError,
|
|
520
|
+
UserNotFoundError
|
|
521
|
+
} from '@digitaldefiance/node-express-suite';
|
|
522
|
+
|
|
523
|
+
try {
|
|
524
|
+
const user = await userService.findByEmail(email);
|
|
525
|
+
} catch (error) {
|
|
526
|
+
if (error instanceof UserNotFoundError) {
|
|
527
|
+
// Handle user not found
|
|
528
|
+
res.status(404).json({
|
|
529
|
+
error: error.message // Automatically localized
|
|
530
|
+
});
|
|
531
|
+
} else if (error instanceof TranslatableError) {
|
|
532
|
+
// Handle other translatable errors
|
|
533
|
+
res.status(400).json({ error: error.message });
|
|
534
|
+
}
|
|
535
|
+
}
|
|
536
|
+
```
|
|
537
|
+
|
|
538
|
+
## Testing
|
|
539
|
+
|
|
540
|
+
Comprehensive test suite with 100+ tests:
|
|
541
|
+
|
|
542
|
+
```bash
|
|
543
|
+
# Run all tests
|
|
544
|
+
npm test
|
|
545
|
+
|
|
546
|
+
# Run specific test suites
|
|
547
|
+
npm test -- database-initialization.spec.ts
|
|
548
|
+
npm test -- jwt.spec.ts
|
|
549
|
+
npm test -- role.spec.ts
|
|
550
|
+
|
|
551
|
+
# Run with coverage
|
|
552
|
+
npm test -- --coverage
|
|
553
|
+
```
|
|
554
|
+
|
|
555
|
+
## Best Practices
|
|
556
|
+
|
|
557
|
+
### Security
|
|
558
|
+
|
|
559
|
+
1. **Always use environment variables** for sensitive configuration:
|
|
560
|
+
|
|
561
|
+
```typescript
|
|
562
|
+
const app = new Application({
|
|
563
|
+
jwtSecret: process.env.JWT_SECRET,
|
|
564
|
+
mongoUri: process.env.MONGO_URI,
|
|
565
|
+
});
|
|
566
|
+
```
|
|
567
|
+
|
|
568
|
+
2. **Validate all user input** before processing:
|
|
569
|
+
|
|
570
|
+
```typescript
|
|
571
|
+
import { EmailString } from '@digitaldefiance/ecies-lib';
|
|
572
|
+
|
|
573
|
+
try {
|
|
574
|
+
const email = new EmailString(userInput);
|
|
575
|
+
// Email is validated
|
|
576
|
+
} catch (error) {
|
|
577
|
+
// Invalid email format
|
|
578
|
+
}
|
|
579
|
+
```
|
|
580
|
+
|
|
581
|
+
3. **Use secure password hashing** with appropriate bcrypt rounds:
|
|
582
|
+
|
|
583
|
+
```typescript
|
|
584
|
+
const config = getExpressRuntimeConfiguration();
|
|
585
|
+
const hashedPassword = await bcrypt.hash(password, config.BcryptRounds);
|
|
586
|
+
```
|
|
587
|
+
|
|
588
|
+
### Performance
|
|
589
|
+
|
|
590
|
+
1. **Use async operations** to avoid blocking:
|
|
591
|
+
|
|
592
|
+
```typescript
|
|
593
|
+
const [user, roles] = await Promise.all([
|
|
594
|
+
userService.findById(userId),
|
|
595
|
+
roleService.getUserRoles(userId)
|
|
596
|
+
]);
|
|
597
|
+
```
|
|
598
|
+
|
|
599
|
+
2. **Implement caching** for frequently accessed data:
|
|
600
|
+
|
|
601
|
+
```typescript
|
|
602
|
+
const cachedRoles = await cache.get(`user:${userId}:roles`);
|
|
603
|
+
if (!cachedRoles) {
|
|
604
|
+
const roles = await roleService.getUserRoles(userId);
|
|
605
|
+
await cache.set(`user:${userId}:roles`, roles, 3600);
|
|
606
|
+
}
|
|
607
|
+
```
|
|
608
|
+
|
|
609
|
+
3. **Use database indexes** for common queries:
|
|
610
|
+
|
|
611
|
+
```typescript
|
|
612
|
+
userSchema.index({ email: 1 }, { unique: true });
|
|
613
|
+
userSchema.index({ username: 1 }, { unique: true });
|
|
614
|
+
```
|
|
615
|
+
|
|
616
|
+
## API Reference
|
|
617
|
+
|
|
618
|
+
### Application
|
|
619
|
+
|
|
620
|
+
- `new Application(config)` - Create application instance
|
|
621
|
+
- `start()` - Start the Express server
|
|
622
|
+
- `stop()` - Stop the server gracefully
|
|
623
|
+
- `environment` - Access configuration
|
|
624
|
+
|
|
625
|
+
### Services
|
|
626
|
+
|
|
627
|
+
- `ECIESService` - Encryption and key management
|
|
628
|
+
- `KeyWrappingService` - Secure key storage
|
|
629
|
+
- `JwtService` - JWT token operations
|
|
630
|
+
- `RoleService` - Role and permission management
|
|
631
|
+
- `UserService` - User account operations
|
|
632
|
+
- `BackupCodeService` - Backup code management
|
|
633
|
+
- `MnemonicService` - Mnemonic storage and retrieval
|
|
634
|
+
- `SystemUserService` - System user operations
|
|
635
|
+
|
|
636
|
+
### Utilities
|
|
637
|
+
|
|
638
|
+
- `ModelRegistry` - Dynamic model registration
|
|
639
|
+
- `debugLog()` - Conditional logging utility
|
|
640
|
+
- `withTransaction()` - MongoDB transaction wrapper
|
|
641
|
+
|
|
642
|
+
## License
|
|
643
|
+
|
|
644
|
+
MIT © Digital Defiance
|
|
645
|
+
|
|
646
|
+
## Related Packages
|
|
647
|
+
|
|
648
|
+
- `@digitaldefiance/ecies-lib` - Core ECIES encryption library
|
|
649
|
+
- `@digitaldefiance/node-ecies-lib` - Node.js ECIES implementation
|
|
650
|
+
- `@digitaldefiance/i18n-lib` - Internationalization framework
|
|
651
|
+
- `@digitaldefiance/suite-core-lib` - Core user management primitives
|
|
652
|
+
|
|
653
|
+
## Contributing
|
|
654
|
+
|
|
655
|
+
Contributions are welcome! Please read the contributing guidelines in the main repository.
|
|
656
|
+
|
|
657
|
+
## Support
|
|
658
|
+
|
|
659
|
+
For issues and questions:
|
|
660
|
+
|
|
661
|
+
- GitHub Issues: <https://github.com/Digital-Defiance/node-express-suite/issues>
|
|
662
|
+
- Email: <support@digitaldefiance.org>
|
|
663
|
+
|
|
664
|
+
## ChangeLog
|
|
665
|
+
|
|
666
|
+
### Version 1.0.0 (Current)
|
|
667
|
+
|
|
668
|
+
- Initial release with complete Express.js framework
|
|
669
|
+
- Dynamic model registry system
|
|
670
|
+
- JWT authentication and RBAC
|
|
671
|
+
- Multi-language i18n support
|
|
672
|
+
- Comprehensive service layer
|
|
673
|
+
- Database initialization utilities
|