@lenne.tech/nest-server 11.13.5 → 11.14.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 +1 -3
- package/dist/core/common/args/filter.args.js +3 -6
- package/dist/core/common/args/filter.args.js.map +1 -1
- package/dist/core/common/args/pagination.args.js +6 -9
- package/dist/core/common/args/pagination.args.js.map +1 -1
- package/dist/core/common/decorators/translatable.decorator.js +1 -1
- package/dist/core/common/decorators/translatable.decorator.js.map +1 -1
- package/dist/core/common/enums/role.enum.js.map +1 -1
- package/dist/core/common/filters/http-exception-log.filter.js +3 -1
- package/dist/core/common/filters/http-exception-log.filter.js.map +1 -1
- package/dist/core/common/helpers/config.helper.js +2 -2
- package/dist/core/common/helpers/config.helper.js.map +1 -1
- package/dist/core/common/helpers/db.helper.js +12 -12
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/graphql.helper.js +1 -1
- package/dist/core/common/helpers/graphql.helper.js.map +1 -1
- package/dist/core/common/helpers/input.helper.js +7 -4
- package/dist/core/common/helpers/input.helper.js.map +1 -1
- package/dist/core/common/helpers/scim.helper.js +2 -2
- package/dist/core/common/helpers/scim.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +1 -1
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/inputs/combined-filter.input.js +3 -6
- package/dist/core/common/inputs/combined-filter.input.js.map +1 -1
- package/dist/core/common/inputs/core-input.input.js +1 -1
- package/dist/core/common/inputs/core-input.input.js.map +1 -1
- package/dist/core/common/inputs/filter.input.js +3 -6
- package/dist/core/common/inputs/filter.input.js.map +1 -1
- package/dist/core/common/inputs/single-filter.input.js +9 -12
- package/dist/core/common/inputs/single-filter.input.js.map +1 -1
- package/dist/core/common/inputs/sort.input.js +2 -5
- package/dist/core/common/inputs/sort.input.js.map +1 -1
- package/dist/core/common/interceptors/check-response.interceptor.js +12 -11
- package/dist/core/common/interceptors/check-response.interceptor.js.map +1 -1
- package/dist/core/common/interceptors/check-security.interceptor.js +5 -4
- package/dist/core/common/interceptors/check-security.interceptor.js.map +1 -1
- package/dist/core/common/models/core-model.model.d.ts +2 -2
- package/dist/core/common/models/core-model.model.js +2 -2
- package/dist/core/common/models/core-model.model.js.map +1 -1
- package/dist/core/common/models/core-persistence.model.js +3 -6
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/models/pagination-info.model.js +6 -0
- package/dist/core/common/models/pagination-info.model.js.map +1 -1
- package/dist/core/common/pipes/check-input.pipe.js +1 -0
- package/dist/core/common/pipes/check-input.pipe.js.map +1 -1
- package/dist/core/common/plugins/complexity.plugin.js +2 -0
- package/dist/core/common/plugins/complexity.plugin.js.map +1 -1
- package/dist/core/common/scalars/any.scalar.js +2 -4
- package/dist/core/common/scalars/any.scalar.js.map +1 -1
- package/dist/core/common/scalars/date-timestamp.scalar.js +1 -3
- package/dist/core/common/scalars/date-timestamp.scalar.js.map +1 -1
- package/dist/core/common/scalars/date.scalar.js +1 -3
- package/dist/core/common/scalars/date.scalar.js.map +1 -1
- package/dist/core/common/scalars/json.scalar.js +2 -4
- package/dist/core/common/scalars/json.scalar.js.map +1 -1
- package/dist/core/common/services/brevo.service.js +3 -0
- package/dist/core/common/services/brevo.service.js.map +1 -1
- package/dist/core/common/services/config.service.js +15 -8
- package/dist/core/common/services/config.service.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.js +10 -7
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.js +1 -9
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/email.service.js +2 -0
- package/dist/core/common/services/email.service.js.map +1 -1
- package/dist/core/common/services/mailjet.service.js +5 -4
- package/dist/core/common/services/mailjet.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.js +1 -0
- package/dist/core/common/services/model-doc.service.js.map +1 -1
- package/dist/core/common/services/module.service.js +6 -3
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/services/template.service.js +2 -1
- package/dist/core/common/services/template.service.js.map +1 -1
- package/dist/core/common/types/array-element.type.d.ts +1 -1
- package/dist/core/modules/auth/core-auth.controller.js +2 -0
- package/dist/core/modules/auth/core-auth.controller.js.map +1 -1
- package/dist/core/modules/auth/core-auth.model.js +3 -6
- package/dist/core/modules/auth/core-auth.model.js.map +1 -1
- package/dist/core/modules/auth/core-auth.resolver.js +2 -0
- package/dist/core/modules/auth/core-auth.resolver.js.map +1 -1
- package/dist/core/modules/auth/guards/auth.guard.js +6 -4
- package/dist/core/modules/auth/guards/auth.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -0
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/roles-guard-registry.js +3 -3
- package/dist/core/modules/auth/guards/roles-guard-registry.js.map +1 -1
- package/dist/core/modules/auth/guards/roles.guard.js +15 -7
- package/dist/core/modules/auth/guards/roles.guard.js.map +1 -1
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js +4 -7
- package/dist/core/modules/auth/inputs/core-auth-sign-in.input.js.map +1 -1
- package/dist/core/modules/auth/services/core-auth.service.js +6 -1
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js +4 -4
- package/dist/core/modules/auth/services/legacy-auth-rate-limiter.service.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js +2 -0
- package/dist/core/modules/auth/strategies/jwt-refresh.strategy.js.map +1 -1
- package/dist/core/modules/auth/strategies/jwt.strategy.js +2 -0
- package/dist/core/modules/auth/strategies/jwt.strategy.js.map +1 -1
- package/dist/core/modules/auth/tokens.decorator.js +2 -2
- package/dist/core/modules/auth/tokens.decorator.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-roles.guard.js +2 -4
- package/dist/core/modules/better-auth/better-auth-roles.guard.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js +3 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.resolver.js +4 -0
- package/dist/core/modules/better-auth/better-auth.resolver.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.types.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -3
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-auth.model.js +7 -0
- package/dist/core/modules/better-auth/core-better-auth-auth.model.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +6 -4
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js +3 -0
- package/dist/core/modules/better-auth/core-better-auth-cookie.helper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js +13 -8
- package/dist/core/modules/better-auth/core-better-auth-email-verification.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js +8 -0
- package/dist/core/modules/better-auth/core-better-auth-migration-status.model.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-models.js +31 -0
- package/dist/core/modules/better-auth/core-better-auth-models.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js +2 -0
- package/dist/core/modules/better-auth/core-better-auth-rate-limit.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js +4 -4
- package/dist/core/modules/better-auth/core-better-auth-rate-limiter.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js +3 -2
- package/dist/core/modules/better-auth/core-better-auth-signup-validator.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +2 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.controller.js +27 -1
- package/dist/core/modules/better-auth/core-better-auth.controller.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.middleware.js +3 -1
- package/dist/core/modules/better-auth/core-better-auth.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.js +23 -18
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.resolver.js +5 -1
- package/dist/core/modules/better-auth/core-better-auth.resolver.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.service.js +6 -1
- package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
- package/dist/core/modules/error-code/core-error-code.controller.js +1 -0
- package/dist/core/modules/error-code/core-error-code.controller.js.map +1 -1
- package/dist/core/modules/error-code/core-error-code.service.js +3 -3
- package/dist/core/modules/error-code/core-error-code.service.js.map +1 -1
- package/dist/core/modules/error-code/error-codes.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.js +6 -9
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.controller.js +1 -0
- package/dist/core/modules/file/core-file.controller.js.map +1 -1
- package/dist/core/modules/file/core-file.resolver.js +1 -0
- package/dist/core/modules/file/core-file.resolver.js.map +1 -1
- package/dist/core/modules/file/core-file.service.d.ts +1 -1
- package/dist/core/modules/file/core-file.service.js +4 -4
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check-result.model.js +4 -7
- package/dist/core/modules/health-check/core-health-check-result.model.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.controller.js +1 -0
- package/dist/core/modules/health-check/core-health-check.controller.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.resolver.js +1 -0
- package/dist/core/modules/health-check/core-health-check.resolver.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.service.js +5 -0
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
- package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
- package/dist/core/modules/migrate/helpers/migration.helper.js +11 -19
- package/dist/core/modules/migrate/helpers/migration.helper.js.map +1 -1
- package/dist/core/modules/migrate/migration-runner.js +2 -0
- package/dist/core/modules/migrate/migration-runner.js.map +1 -1
- package/dist/core/modules/migrate/mongo-state-store.js +3 -0
- package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
- package/dist/core/modules/system-setup/core-system-setup.controller.js +4 -0
- package/dist/core/modules/system-setup/core-system-setup.controller.js.map +1 -1
- package/dist/core/modules/system-setup/core-system-setup.service.js +6 -5
- package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
- package/dist/core/modules/tus/core-tus.controller.js +2 -1
- package/dist/core/modules/tus/core-tus.controller.js.map +1 -1
- package/dist/core/modules/tus/core-tus.service.js +6 -3
- package/dist/core/modules/tus/core-tus.service.js.map +1 -1
- package/dist/core/modules/tus/tus.module.js +7 -5
- package/dist/core/modules/tus/tus.module.js.map +1 -1
- package/dist/core/modules/user/core-user.model.js +15 -18
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +1 -1
- package/dist/core/modules/user/core-user.service.js +7 -2
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user-create.input.js +1 -4
- package/dist/core/modules/user/inputs/core-user-create.input.js.map +1 -1
- package/dist/core/modules/user/inputs/core-user.input.js +6 -9
- package/dist/core/modules/user/inputs/core-user.input.js.map +1 -1
- package/dist/server/common/models/persistence.model.js +2 -5
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/common/services/cron-jobs.service.js +2 -0
- package/dist/server/common/services/cron-jobs.service.js.map +1 -1
- package/dist/server/modules/auth/auth.controller.js +2 -0
- package/dist/server/modules/auth/auth.controller.js.map +1 -1
- package/dist/server/modules/auth/auth.model.js +1 -4
- package/dist/server/modules/auth/auth.model.js.map +1 -1
- package/dist/server/modules/auth/auth.module.js +1 -6
- package/dist/server/modules/auth/auth.module.js.map +1 -1
- package/dist/server/modules/auth/auth.resolver.js +2 -0
- package/dist/server/modules/auth/auth.resolver.js.map +1 -1
- package/dist/server/modules/auth/auth.service.js +4 -0
- package/dist/server/modules/auth/auth.service.js.map +1 -1
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js +2 -5
- package/dist/server/modules/auth/inputs/auth-sign-up.input.js.map +1 -1
- package/dist/server/modules/better-auth/better-auth.controller.js +3 -0
- package/dist/server/modules/better-auth/better-auth.controller.js.map +1 -1
- package/dist/server/modules/better-auth/better-auth.resolver.js +4 -0
- package/dist/server/modules/better-auth/better-auth.resolver.js.map +1 -1
- package/dist/server/modules/error-code/error-code.controller.js +1 -0
- package/dist/server/modules/error-code/error-code.controller.js.map +1 -1
- package/dist/server/modules/file/file-info.model.d.ts +2 -2
- package/dist/server/modules/file/file.controller.js +1 -0
- package/dist/server/modules/file/file.controller.js.map +1 -1
- package/dist/server/modules/file/file.resolver.js +2 -1
- package/dist/server/modules/file/file.resolver.js.map +1 -1
- package/dist/server/modules/file/file.service.js +2 -3
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/user/avatar.controller.js +1 -0
- package/dist/server/modules/user/avatar.controller.js.map +1 -1
- package/dist/server/modules/user/inputs/user-create.input.js +1 -4
- package/dist/server/modules/user/inputs/user-create.input.js.map +1 -1
- package/dist/server/modules/user/inputs/user.input.js +1 -4
- package/dist/server/modules/user/inputs/user.input.js.map +1 -1
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js +3 -0
- package/dist/server/modules/user/outputs/find-and-count-users-result.output.js.map +1 -1
- package/dist/server/modules/user/user.controller.js +1 -0
- package/dist/server/modules/user/user.controller.js.map +1 -1
- package/dist/server/modules/user/user.model.js +7 -10
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.resolver.js +3 -1
- package/dist/server/modules/user/user.resolver.js.map +1 -1
- package/dist/server/modules/user/user.service.js +6 -0
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/server/server.controller.js +1 -0
- package/dist/server/server.controller.js.map +1 -1
- package/dist/test/test.helper.js +18 -10
- package/dist/test/test.helper.js.map +1 -1
- package/dist/tsconfig.build.tsbuildinfo +1 -1
- package/package.json +26 -58
- package/src/core/common/args/filter.args.ts +1 -1
- package/src/core/common/args/pagination.args.ts +1 -1
- package/src/core/common/decorators/translatable.decorator.ts +1 -1
- package/src/core/common/enums/role.enum.ts +0 -1
- package/src/core/common/filters/http-exception-log.filter.ts +3 -3
- package/src/core/common/helpers/config.helper.ts +2 -2
- package/src/core/common/helpers/db.helper.ts +12 -12
- package/src/core/common/helpers/graphql.helper.ts +1 -1
- package/src/core/common/helpers/input.helper.ts +7 -4
- package/src/core/common/helpers/scim.helper.ts +16 -13
- package/src/core/common/helpers/service.helper.ts +1 -1
- package/src/core/common/inputs/combined-filter.input.ts +1 -1
- package/src/core/common/inputs/core-input.input.ts +1 -1
- package/src/core/common/inputs/filter.input.ts +13 -13
- package/src/core/common/inputs/single-filter.input.ts +2 -2
- package/src/core/common/interceptors/check-response.interceptor.ts +2 -2
- package/src/core/common/interfaces/cron-job-config-with-time-zone.interface.ts +4 -2
- package/src/core/common/interfaces/cron-job-config-with-utc-offset.interface.ts +4 -2
- package/src/core/common/interfaces/scim-array-filter-node.interface.ts +1 -1
- package/src/core/common/interfaces/scim-condition-node.interface.ts +1 -1
- package/src/core/common/interfaces/scim-logical-node.interface.ts +1 -1
- package/src/core/common/models/core-model.model.ts +2 -4
- package/src/core/common/scalars/any.scalar.ts +1 -1
- package/src/core/common/scalars/json.scalar.ts +3 -3
- package/src/core/common/services/config.service.ts +17 -11
- package/src/core/common/services/core-cron-jobs.service.ts +6 -6
- package/src/core/common/services/crud.service.ts +3 -12
- package/src/core/common/services/mailjet.service.ts +4 -5
- package/src/core/common/services/module.service.ts +3 -3
- package/src/core/common/types/array-element.type.ts +3 -2
- package/src/core/common/types/require-only-one.type.ts +2 -2
- package/src/core/common/types/required-at-least-one.type.ts +2 -2
- package/src/core/common/types/scim-comparator.type.ts +1 -1
- package/src/core/common/types/scim-logical-operator.type.ts +1 -1
- package/src/core/common/types/scim-node.type.ts +1 -1
- package/src/core/modules/auth/guards/auth.guard.ts +4 -2
- package/src/core/modules/auth/guards/roles.guard.ts +17 -3
- package/src/core/modules/auth/tokens.decorator.ts +3 -3
- package/src/core/modules/better-auth/ARCHITECTURE.md +23 -20
- package/src/core/modules/better-auth/CUSTOMIZATION.md +64 -56
- package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +67 -40
- package/src/core/modules/better-auth/README.md +268 -230
- package/src/core/modules/better-auth/better-auth-roles.guard.ts +8 -1
- package/src/core/modules/better-auth/better-auth-token.service.ts +10 -3
- package/src/core/modules/better-auth/better-auth.resolver.ts +3 -1
- package/src/core/modules/better-auth/better-auth.types.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth-email-verification.service.ts +30 -25
- package/src/core/modules/better-auth/core-better-auth-signup-validator.service.ts +3 -1
- package/src/core/modules/better-auth/core-better-auth.middleware.ts +6 -2
- package/src/core/modules/error-code/INTEGRATION-CHECKLIST.md +28 -21
- package/src/core/modules/error-code/error-codes.ts +0 -2
- package/src/core/modules/file/README.md +12 -10
- package/src/core/modules/file/core-file.service.ts +5 -9
- package/src/core/modules/migrate/MIGRATION_FROM_NODEPIT.md +21 -9
- package/src/core/modules/migrate/README.md +30 -28
- package/src/core/modules/migrate/cli/migrate-cli.ts +0 -3
- package/src/core/modules/migrate/helpers/migration.helper.ts +13 -21
- package/src/core/modules/migrate/migration-runner.ts +0 -3
- package/src/core/modules/system-setup/INTEGRATION-CHECKLIST.md +15 -14
- package/src/core/modules/system-setup/README.md +28 -20
- package/src/core/modules/system-setup/core-system-setup.service.ts +4 -5
- package/src/core/modules/tus/INTEGRATION-CHECKLIST.md +15 -14
- package/src/core/modules/tus/README.md +50 -44
- package/src/core/modules/user/core-user.service.ts +1 -2
- package/src/server/modules/auth/auth.module.ts +1 -9
- package/src/server/modules/better-auth/better-auth.resolver.ts +3 -1
- package/src/server/modules/error-code/README.md +19 -16
- package/src/server/modules/error-code/error-code.controller.ts +4 -1
- package/src/server/modules/file/file.resolver.ts +1 -1
- package/src/server/modules/file/file.service.ts +1 -3
- package/src/server/modules/user/user.resolver.ts +1 -1
- package/src/test/README.md +31 -27
- package/src/test/test.helper.ts +18 -10
|
@@ -38,14 +38,14 @@ export class ConfigService {
|
|
|
38
38
|
/**
|
|
39
39
|
* BehaviorSubject for config
|
|
40
40
|
*/
|
|
41
|
-
protected static _configSubject$: BehaviorSubject<Partial<IServerOptions> & { [key: string]: any }>
|
|
42
|
-
|
|
41
|
+
protected static _configSubject$: BehaviorSubject<Partial<IServerOptions> & { [key: string]: any }> =
|
|
42
|
+
new BehaviorSubject(undefined);
|
|
43
43
|
|
|
44
44
|
/**
|
|
45
45
|
* BehaviorSubject for frozen config
|
|
46
46
|
*/
|
|
47
|
-
protected static _frozenConfigSubject$: BehaviorSubject<Partial<IServerOptions> & { [key: string]: any }>
|
|
48
|
-
|
|
47
|
+
protected static _frozenConfigSubject$: BehaviorSubject<Partial<IServerOptions> & { [key: string]: any }> =
|
|
48
|
+
new BehaviorSubject(undefined);
|
|
49
49
|
|
|
50
50
|
/**
|
|
51
51
|
* Singleton instance of ConfigService
|
|
@@ -82,8 +82,14 @@ export class ConfigService {
|
|
|
82
82
|
// Set config before setting instance
|
|
83
83
|
if (typeof configObject === 'object') {
|
|
84
84
|
isInitialized
|
|
85
|
-
? ConfigService.mergeConfig(configObject, {
|
|
86
|
-
|
|
85
|
+
? ConfigService.mergeConfig(configObject, {
|
|
86
|
+
...config,
|
|
87
|
+
init: false,
|
|
88
|
+
})
|
|
89
|
+
: ConfigService.setConfig(configObject, {
|
|
90
|
+
...config,
|
|
91
|
+
init: false,
|
|
92
|
+
});
|
|
87
93
|
}
|
|
88
94
|
|
|
89
95
|
// Set instance if not yet initialized
|
|
@@ -181,8 +187,8 @@ export class ConfigService {
|
|
|
181
187
|
*/
|
|
182
188
|
static get observable() {
|
|
183
189
|
return ConfigService._configSubject$.asObservable().pipe(
|
|
184
|
-
filter(config => !config),
|
|
185
|
-
map(config => clone(config, { circles: false })),
|
|
190
|
+
filter((config) => !config),
|
|
191
|
+
map((config) => clone(config, { circles: false })),
|
|
186
192
|
);
|
|
187
193
|
}
|
|
188
194
|
|
|
@@ -197,7 +203,7 @@ export class ConfigService {
|
|
|
197
203
|
* Get observable for faster but read-only deep-frozen configuration
|
|
198
204
|
*/
|
|
199
205
|
static get observableFastButReadOnly() {
|
|
200
|
-
return ConfigService._frozenConfigSubject$.asObservable().pipe(filter(config => !config));
|
|
206
|
+
return ConfigService._frozenConfigSubject$.asObservable().pipe(filter((config) => !config));
|
|
201
207
|
}
|
|
202
208
|
|
|
203
209
|
/**
|
|
@@ -343,8 +349,8 @@ export class ConfigService {
|
|
|
343
349
|
// Check for unintentional overwriting
|
|
344
350
|
if (!firstInitialization && !config.reInit) {
|
|
345
351
|
throw new Error(
|
|
346
|
-
'Unintentional overwriting of the configuration. '
|
|
347
|
-
|
|
352
|
+
'Unintentional overwriting of the configuration. ' +
|
|
353
|
+
'If overwriting is desired, please set `reInit` in setConfig of ConfigService to `true`.',
|
|
348
354
|
);
|
|
349
355
|
}
|
|
350
356
|
|
|
@@ -68,8 +68,8 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap {
|
|
|
68
68
|
for (const [name, CronExpressionOrConfig] of Object.entries(this.cronJobs)) {
|
|
69
69
|
// Check config
|
|
70
70
|
if (
|
|
71
|
-
!CronExpressionOrConfig
|
|
72
|
-
|
|
71
|
+
!CronExpressionOrConfig ||
|
|
72
|
+
(typeof CronExpressionOrConfig === 'object' && (CronExpressionOrConfig as CronJobConfigWithTimeZone).disabled)
|
|
73
73
|
) {
|
|
74
74
|
continue;
|
|
75
75
|
}
|
|
@@ -116,8 +116,8 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap {
|
|
|
116
116
|
|
|
117
117
|
// Check if parallel execution is allowed and if so how many can run in parallel
|
|
118
118
|
if (
|
|
119
|
-
dates?.length
|
|
120
|
-
|
|
119
|
+
dates?.length &&
|
|
120
|
+
(!config.runParallel || (typeof config.runParallel === 'number' && dates.length >= config.runParallel))
|
|
121
121
|
) {
|
|
122
122
|
return;
|
|
123
123
|
}
|
|
@@ -134,7 +134,7 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap {
|
|
|
134
134
|
await this[name]();
|
|
135
135
|
} catch (e) {
|
|
136
136
|
// Remove job from running list
|
|
137
|
-
this.runningJobs[name] = this.runningJobs[name].filter(item => item !== date);
|
|
137
|
+
this.runningJobs[name] = this.runningJobs[name].filter((item) => item !== date);
|
|
138
138
|
if (config.throwException) {
|
|
139
139
|
throw e;
|
|
140
140
|
} else {
|
|
@@ -143,7 +143,7 @@ export abstract class CoreCronJobs implements OnApplicationBootstrap {
|
|
|
143
143
|
}
|
|
144
144
|
|
|
145
145
|
// Remove job from running list
|
|
146
|
-
this.runningJobs[name] = this.runningJobs[name].filter(item => item !== date);
|
|
146
|
+
this.runningJobs[name] = this.runningJobs[name].filter((item) => item !== date);
|
|
147
147
|
},
|
|
148
148
|
null,
|
|
149
149
|
true,
|
|
@@ -313,7 +313,7 @@ export abstract class CrudService<
|
|
|
313
313
|
async findAndCountForce(
|
|
314
314
|
filter?: FilterArgs | { filterQuery?: QueryFilter<any>; queryOptions?: QueryOptions; samples?: number },
|
|
315
315
|
serviceOptions: ServiceOptions = {},
|
|
316
|
-
): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number
|
|
316
|
+
): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number }> {
|
|
317
317
|
serviceOptions.raw = true;
|
|
318
318
|
return this.findAndCount(filter, serviceOptions);
|
|
319
319
|
}
|
|
@@ -325,7 +325,7 @@ export abstract class CrudService<
|
|
|
325
325
|
async findAndCountRaw(
|
|
326
326
|
filter?: FilterArgs | { filterQuery?: QueryFilter<any>; queryOptions?: QueryOptions; samples?: number },
|
|
327
327
|
serviceOptions: ServiceOptions = {},
|
|
328
|
-
): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number
|
|
328
|
+
): Promise<{ items: Model[]; pagination: PaginationInfo; totalCount: number }> {
|
|
329
329
|
serviceOptions = serviceOptions || {};
|
|
330
330
|
serviceOptions.raw = true;
|
|
331
331
|
return this.findAndCountForce(filter, serviceOptions);
|
|
@@ -345,16 +345,7 @@ export abstract class CrudService<
|
|
|
345
345
|
}
|
|
346
346
|
const promises: Promise<Model>[] = [];
|
|
347
347
|
for (const dbItem of dbItems) {
|
|
348
|
-
promises.push(
|
|
349
|
-
new Promise(async (resolve, reject) => {
|
|
350
|
-
try {
|
|
351
|
-
const item = await this.update(getStringIds(dbItem as any), update, serviceOptions);
|
|
352
|
-
resolve(item);
|
|
353
|
-
} catch (e) {
|
|
354
|
-
reject(e);
|
|
355
|
-
}
|
|
356
|
-
}),
|
|
357
|
-
);
|
|
348
|
+
promises.push(this.update(getStringIds(dbItem as any), update, serviceOptions));
|
|
358
349
|
}
|
|
359
350
|
return await Promise.all(promises);
|
|
360
351
|
}
|
|
@@ -3,7 +3,6 @@ const Mailjet = require('node-mailjet');
|
|
|
3
3
|
|
|
4
4
|
import { ConfigService } from './config.service';
|
|
5
5
|
|
|
6
|
-
|
|
7
6
|
/**
|
|
8
7
|
* Mailjet service
|
|
9
8
|
*/
|
|
@@ -83,8 +82,8 @@ export class MailjetService {
|
|
|
83
82
|
});
|
|
84
83
|
} catch (e) {
|
|
85
84
|
if (
|
|
86
|
-
this.configService.getFastButReadOnly('email.mailjet.api_key_public')
|
|
87
|
-
|
|
85
|
+
this.configService.getFastButReadOnly('email.mailjet.api_key_public') &&
|
|
86
|
+
this.configService.getFastButReadOnly('email.mailjet.api_key_private')
|
|
88
87
|
) {
|
|
89
88
|
throw new HttpException('Cannot connect to mailjet.', 502);
|
|
90
89
|
}
|
|
@@ -95,8 +94,8 @@ export class MailjetService {
|
|
|
95
94
|
this.configService.getFastButReadOnly('email.mailjet.api_key_private') || 'missing',
|
|
96
95
|
'email.mailjet.api_key_public':
|
|
97
96
|
this.configService.getFastButReadOnly('email.mailjet.api_key_public') || 'missing',
|
|
98
|
-
|
|
99
|
-
|
|
97
|
+
info: 'Mailjet credentials are missing',
|
|
98
|
+
templateData: templateData,
|
|
100
99
|
},
|
|
101
100
|
null,
|
|
102
101
|
2,
|
|
@@ -96,7 +96,7 @@ export abstract class ModuleService<T extends CoreModel = any> {
|
|
|
96
96
|
processFieldSelection: {},
|
|
97
97
|
pubSub: true,
|
|
98
98
|
setCreateOrUpdateUserId: false,
|
|
99
|
-
...
|
|
99
|
+
...options?.serviceOptions,
|
|
100
100
|
};
|
|
101
101
|
|
|
102
102
|
// Note raw configuration
|
|
@@ -143,8 +143,8 @@ export abstract class ModuleService<T extends CoreModel = any> {
|
|
|
143
143
|
const preparedInput = await this.prepareInput(config.input, config);
|
|
144
144
|
new Promise(() => {
|
|
145
145
|
if (
|
|
146
|
-
inputJSON?.replace(/"password":\s*"[^"]*"/, '')
|
|
147
|
-
|
|
146
|
+
inputJSON?.replace(/"password":\s*"[^"]*"/, '') !==
|
|
147
|
+
JSON.stringify(preparedInput)?.replace(/"password":\s*"[^"]*"/, '')
|
|
148
148
|
) {
|
|
149
149
|
console.debug(
|
|
150
150
|
'CheckSecurityInterceptor: securityCheck changed input of type',
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
/**
|
|
2
2
|
* Get type of array elements
|
|
3
3
|
*/
|
|
4
|
-
export type ArrayElement<ArrayType extends
|
|
5
|
-
|
|
4
|
+
export type ArrayElement<ArrayType extends unknown | unknown[]> = ArrayType extends readonly (infer ElementType)[]
|
|
5
|
+
? ElementType
|
|
6
|
+
: ArrayType;
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type RequireOnlyOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &
|
|
6
6
|
{
|
|
7
|
-
|
|
8
|
-
}[Keys];
|
|
7
|
+
[K in Keys]-?: Partial<Record<Exclude<Keys, K>, undefined>> & Required<Pick<T, K>>;
|
|
8
|
+
}[Keys];
|
|
@@ -4,5 +4,5 @@
|
|
|
4
4
|
*/
|
|
5
5
|
export type RequireAtLeastOne<T, Keys extends keyof T = keyof T> = Pick<T, Exclude<keyof T, Keys>> &
|
|
6
6
|
{
|
|
7
|
-
|
|
8
|
-
}[Keys];
|
|
7
|
+
[K in Keys]-?: Partial<Pick<T, Exclude<Keys, K>>> & Required<Pick<T, K>>;
|
|
8
|
+
}[Keys];
|
|
@@ -1,2 +1,2 @@
|
|
|
1
1
|
/** Supported SCIM comparison operators */
|
|
2
|
-
export type Comparator = 'aco' | 'co' | 'eq' | 'ew' | 'ge' | 'gt' | 'le' | 'lt' | 'pr' | 'sw';
|
|
2
|
+
export type Comparator = 'aco' | 'co' | 'eq' | 'ew' | 'ge' | 'gt' | 'le' | 'lt' | 'pr' | 'sw';
|
|
@@ -1 +1 @@
|
|
|
1
|
-
export type LogicalOperator = 'and' | 'or';
|
|
1
|
+
export type LogicalOperator = 'and' | 'or';
|
|
@@ -3,4 +3,4 @@ import { ConditionNode } from '../interfaces/scim-condition-node.interface';
|
|
|
3
3
|
import { LogicalNode } from '../interfaces/scim-logical-node.interface';
|
|
4
4
|
|
|
5
5
|
/** Union type representing any valid SCIM node */
|
|
6
|
-
export type ScimNode = ArrayFilterNode | ConditionNode | LogicalNode;
|
|
6
|
+
export type ScimNode = ArrayFilterNode | ConditionNode | LogicalNode;
|
|
@@ -139,8 +139,10 @@ function createAuthGuard(type?: AuthGuardStrategy | string | string[]): Type<IAu
|
|
|
139
139
|
// Proceed with Passport authentication for other strategies
|
|
140
140
|
const response = context?.switchToHttp()?.getResponse();
|
|
141
141
|
const passportFn = createPassportContext(request, response);
|
|
142
|
-
const user = await passportFn(
|
|
143
|
-
this.
|
|
142
|
+
const user = await passportFn(
|
|
143
|
+
type || this.options?.defaultStrategy,
|
|
144
|
+
options,
|
|
145
|
+
(err: any, currentUser: any, info: any) => this.handleRequest(err, currentUser, info, context),
|
|
144
146
|
);
|
|
145
147
|
request[options.property || defaultOptions.property] = user;
|
|
146
148
|
return true;
|
|
@@ -1,4 +1,12 @@
|
|
|
1
|
-
import {
|
|
1
|
+
import {
|
|
2
|
+
ExecutionContext,
|
|
3
|
+
ForbiddenException,
|
|
4
|
+
Inject,
|
|
5
|
+
Injectable,
|
|
6
|
+
Logger,
|
|
7
|
+
Optional,
|
|
8
|
+
UnauthorizedException,
|
|
9
|
+
} from '@nestjs/common';
|
|
2
10
|
import { ModuleRef, Reflector } from '@nestjs/core';
|
|
3
11
|
import { GqlExecutionContext } from '@nestjs/graphql';
|
|
4
12
|
import { firstValueFrom, isObservable } from 'rxjs';
|
|
@@ -122,7 +130,10 @@ export class RolesGuard extends AuthGuard(AuthGuardStrategy.JWT) {
|
|
|
122
130
|
*/
|
|
123
131
|
override async canActivate(context: ExecutionContext): Promise<boolean> {
|
|
124
132
|
// Get roles FIRST to check if authentication is even needed
|
|
125
|
-
const reflectorRoles = this.ensureReflector().getAll<string[][]>('roles', [
|
|
133
|
+
const reflectorRoles = this.ensureReflector().getAll<string[][]>('roles', [
|
|
134
|
+
context.getHandler(),
|
|
135
|
+
context.getClass(),
|
|
136
|
+
]);
|
|
126
137
|
const roles: string[] = reflectorRoles[0]
|
|
127
138
|
? reflectorRoles[1]
|
|
128
139
|
? [...reflectorRoles[0], ...reflectorRoles[1]]
|
|
@@ -279,7 +290,10 @@ export class RolesGuard extends AuthGuard(AuthGuardStrategy.JWT) {
|
|
|
279
290
|
*/
|
|
280
291
|
override handleRequest(err: Error | null, user: any, info: any, context: ExecutionContext) {
|
|
281
292
|
// Get roles
|
|
282
|
-
const reflectorRoles = this.ensureReflector().getAll<string[][]>('roles', [
|
|
293
|
+
const reflectorRoles = this.ensureReflector().getAll<string[][]>('roles', [
|
|
294
|
+
context.getHandler(),
|
|
295
|
+
context.getClass(),
|
|
296
|
+
]);
|
|
283
297
|
const roles: string[] = reflectorRoles[0]
|
|
284
298
|
? reflectorRoles[1]
|
|
285
299
|
? [...reflectorRoles[0], ...reflectorRoles[1]]
|
|
@@ -14,9 +14,9 @@ export const Tokens = createParamDecorator(
|
|
|
14
14
|
const context = getContextData(ctx);
|
|
15
15
|
|
|
16
16
|
// Get token from cookie or authorization header
|
|
17
|
-
const token
|
|
18
|
-
|
|
19
|
-
|
|
17
|
+
const token =
|
|
18
|
+
context?.request?.cookies?.['token'] ||
|
|
19
|
+
context?.request
|
|
20
20
|
?.get('Authorization')
|
|
21
21
|
?.replace(/bearer/i, '')
|
|
22
22
|
.trim();
|
|
@@ -5,6 +5,7 @@ The `CoreBetterAuthController` implements custom endpoints instead of directly u
|
|
|
5
5
|
## 1. Hybrid-Auth-System (Legacy + Better-Auth)
|
|
6
6
|
|
|
7
7
|
The nest-server supports bidirectional authentication:
|
|
8
|
+
|
|
8
9
|
- **Legacy Auth → Better-Auth**: Users created via Legacy Auth can sign in via Better-Auth
|
|
9
10
|
- **Better-Auth → Legacy Auth**: Users created via Better-Auth can sign in via Legacy Auth
|
|
10
11
|
|
|
@@ -14,14 +15,14 @@ This requires custom logic that cannot be implemented via Better-Auth hooks alon
|
|
|
14
15
|
|
|
15
16
|
Better-Auth hooks have fundamental limitations that prevent full implementation of our requirements:
|
|
16
17
|
|
|
17
|
-
| Requirement
|
|
18
|
-
|
|
19
|
-
| Legacy user migration
|
|
20
|
-
| Password sync to Legacy | ❌ No
|
|
21
|
-
| Custom response format
|
|
22
|
-
| Multi-cookie setting
|
|
23
|
-
| User mapping with roles | ❌ No
|
|
24
|
-
| Session token injection | ❌ No
|
|
18
|
+
| Requirement | Hook Support | Reason |
|
|
19
|
+
| ----------------------- | ------------ | ------------------------------------------------------- |
|
|
20
|
+
| Legacy user migration | ⚠️ Partial | Requires global DB access outside NestJS DI |
|
|
21
|
+
| Password sync to Legacy | ❌ No | **After-hooks don't have access to plaintext password** |
|
|
22
|
+
| Custom response format | ❌ No | **Hooks cannot modify HTTP response** |
|
|
23
|
+
| Multi-cookie setting | ❌ No | **Hooks cannot set cookies** |
|
|
24
|
+
| User mapping with roles | ❌ No | Requires NestJS Dependency Injection |
|
|
25
|
+
| Session token injection | ❌ No | Before-hooks cannot inject tokens into requests |
|
|
25
26
|
|
|
26
27
|
## 3. Hook Limitations Explained
|
|
27
28
|
|
|
@@ -68,35 +69,37 @@ export const auth = betterAuth({
|
|
|
68
69
|
|
|
69
70
|
## 4. What Custom Endpoints Do
|
|
70
71
|
|
|
71
|
-
| Endpoint
|
|
72
|
-
|
|
72
|
+
| Endpoint | Custom Logic | Why Required |
|
|
73
|
+
| ---------------- | ------------------------------------------------ | ---------------------------------- |
|
|
73
74
|
| `/sign-in/email` | Legacy migration, PW normalization, 2FA handling | Migration needs plaintext password |
|
|
74
|
-
| `/sign-up/email` | PW normalization, Legacy sync, User linking
|
|
75
|
-
| `/sign-out`
|
|
76
|
-
| `/session`
|
|
77
|
-
| Plugin routes
|
|
75
|
+
| `/sign-up/email` | PW normalization, Legacy sync, User linking | Sync needs plaintext password |
|
|
76
|
+
| `/sign-out` | Multi-cookie clearing | Response modification |
|
|
77
|
+
| `/session` | User mapping with roles | NestJS service access |
|
|
78
|
+
| Plugin routes | Session token injection | Request modification |
|
|
78
79
|
|
|
79
80
|
## 5. Native Handler Where Possible
|
|
80
81
|
|
|
81
82
|
Despite custom endpoints, we use Better-Auth's native handler where appropriate:
|
|
83
|
+
|
|
82
84
|
- **Plugin routes** (Passkey, 2FA, OAuth) → `authInstance.handler()`
|
|
83
85
|
- **2FA verification flow** → Native handler for correct cookie setting
|
|
84
86
|
- **Passkey authentication** → Native WebAuthn handling
|
|
85
87
|
|
|
86
88
|
## 6. Alternative Approaches Considered
|
|
87
89
|
|
|
88
|
-
| Approach
|
|
89
|
-
|
|
90
|
-
| **Full Hook Approach**
|
|
91
|
-
| **Hybrid with Global DB**
|
|
92
|
-
| **Custom Controller (current)** | ✅ Best balance - NestJS DI access, testable, maintainable
|
|
90
|
+
| Approach | Evaluation |
|
|
91
|
+
| ------------------------------- | ---------------------------------------------------------------------- |
|
|
92
|
+
| **Full Hook Approach** | ❌ Not feasible - missing plaintext password, no response modification |
|
|
93
|
+
| **Hybrid with Global DB** | ⚠️ Possible but anti-pattern - bypasses NestJS DI, harder to test |
|
|
94
|
+
| **Custom Controller (current)** | ✅ Best balance - NestJS DI access, testable, maintainable |
|
|
93
95
|
|
|
94
96
|
## Conclusion
|
|
95
97
|
|
|
96
98
|
The custom controller architecture is **necessary complexity**, not unnecessary overhead. It enables:
|
|
99
|
+
|
|
97
100
|
- ✅ Legacy Auth compatibility
|
|
98
101
|
- ✅ Bidirectional password synchronization
|
|
99
102
|
- ✅ Multi-cookie support
|
|
100
103
|
- ✅ Custom user mapping with roles
|
|
101
104
|
- ✅ Proper 2FA cookie handling
|
|
102
|
-
- ✅ Full NestJS Dependency Injection access
|
|
105
|
+
- ✅ Full NestJS Dependency Injection access
|