@lenne.tech/nest-server 11.13.4 → 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/interfaces/server-options.interface.d.ts +10 -0
- 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.d.ts +27 -0
- package/dist/core/modules/error-code/error-codes.js +24 -0
- 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.d.ts +12 -0
- package/dist/core/modules/system-setup/core-system-setup.controller.js +90 -0
- package/dist/core/modules/system-setup/core-system-setup.controller.js.map +1 -0
- package/dist/core/modules/system-setup/core-system-setup.module.d.ts +2 -0
- package/dist/core/modules/system-setup/core-system-setup.module.js +22 -0
- package/dist/core/modules/system-setup/core-system-setup.module.js.map +1 -0
- package/dist/core/modules/system-setup/core-system-setup.service.d.ts +30 -0
- package/dist/core/modules/system-setup/core-system-setup.service.js +158 -0
- package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -0
- 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/core.module.js +9 -9
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +3 -0
- package/dist/index.js +3 -0
- package/dist/index.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/error-code/error-codes.d.ts +3 -0
- 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/interfaces/server-options.interface.ts +76 -0
- 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 +31 -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 +108 -0
- package/src/core/modules/system-setup/README.md +275 -0
- package/src/core/modules/system-setup/core-system-setup.controller.ts +69 -0
- package/src/core/modules/system-setup/core-system-setup.module.ts +19 -0
- package/src/core/modules/system-setup/core-system-setup.service.ts +225 -0
- 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/core.module.ts +14 -9
- package/src/index.ts +8 -0
- 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
|
@@ -0,0 +1,225 @@
|
|
|
1
|
+
import { ForbiddenException, Injectable, Logger, OnApplicationBootstrap } from '@nestjs/common';
|
|
2
|
+
import { InjectConnection } from '@nestjs/mongoose';
|
|
3
|
+
import { isEmail } from 'class-validator';
|
|
4
|
+
import { Connection } from 'mongoose';
|
|
5
|
+
|
|
6
|
+
import { ConfigService } from '../../common/services/config.service';
|
|
7
|
+
import { CoreBetterAuthUserMapper } from '../better-auth/core-better-auth-user.mapper';
|
|
8
|
+
import { CoreBetterAuthService } from '../better-auth/core-better-auth.service';
|
|
9
|
+
import { ErrorCode } from '../error-code/error-codes';
|
|
10
|
+
|
|
11
|
+
/**
|
|
12
|
+
* Input for creating the initial admin user
|
|
13
|
+
*/
|
|
14
|
+
export interface SystemSetupInitInput {
|
|
15
|
+
email: string;
|
|
16
|
+
name?: string;
|
|
17
|
+
password: string;
|
|
18
|
+
}
|
|
19
|
+
|
|
20
|
+
/**
|
|
21
|
+
* Response for successful init
|
|
22
|
+
*/
|
|
23
|
+
export interface SystemSetupInitResult {
|
|
24
|
+
email: string;
|
|
25
|
+
message: string;
|
|
26
|
+
success: boolean;
|
|
27
|
+
}
|
|
28
|
+
|
|
29
|
+
/**
|
|
30
|
+
* Response for setup status check
|
|
31
|
+
*/
|
|
32
|
+
export interface SystemSetupStatus {
|
|
33
|
+
betterAuthEnabled: boolean;
|
|
34
|
+
needsSetup: boolean;
|
|
35
|
+
}
|
|
36
|
+
|
|
37
|
+
/**
|
|
38
|
+
* CoreSystemSetupService provides initial admin creation for fresh deployments.
|
|
39
|
+
*
|
|
40
|
+
* This service allows creating the first admin user when the system has zero users.
|
|
41
|
+
* It bypasses BetterAuth's disableSignUp check by using the internal adapter directly,
|
|
42
|
+
* which is the same approach used by Better-Auth's own admin plugin.
|
|
43
|
+
*
|
|
44
|
+
* Security:
|
|
45
|
+
* - Only works when zero users exist in the database
|
|
46
|
+
* - Once any user exists, the init endpoint is permanently locked
|
|
47
|
+
* - Race conditions handled by MongoDB unique email index
|
|
48
|
+
*/
|
|
49
|
+
@Injectable()
|
|
50
|
+
export class CoreSystemSetupService implements OnApplicationBootstrap {
|
|
51
|
+
private readonly logger = new Logger(CoreSystemSetupService.name);
|
|
52
|
+
|
|
53
|
+
constructor(
|
|
54
|
+
@InjectConnection() private readonly connection: Connection,
|
|
55
|
+
private readonly betterAuthService: CoreBetterAuthService,
|
|
56
|
+
private readonly userMapper: CoreBetterAuthUserMapper,
|
|
57
|
+
private readonly configService: ConfigService,
|
|
58
|
+
) {}
|
|
59
|
+
|
|
60
|
+
/**
|
|
61
|
+
* Automatically create the initial admin on server start if configured via
|
|
62
|
+
* `systemSetup.initialAdmin` in config or ENV variables.
|
|
63
|
+
*
|
|
64
|
+
* Uses OnApplicationBootstrap (not OnModuleInit) to ensure BetterAuth
|
|
65
|
+
* is fully initialized before attempting user creation.
|
|
66
|
+
*/
|
|
67
|
+
async onApplicationBootstrap(): Promise<void> {
|
|
68
|
+
const initialAdmin = this.configService.configFastButReadOnly?.systemSetup?.initialAdmin;
|
|
69
|
+
|
|
70
|
+
// No initialAdmin config at all → skip silently
|
|
71
|
+
if (!initialAdmin) {
|
|
72
|
+
return;
|
|
73
|
+
}
|
|
74
|
+
|
|
75
|
+
// Partial credentials → warn and skip
|
|
76
|
+
if (!initialAdmin.email || !initialAdmin.password) {
|
|
77
|
+
const missing = [!initialAdmin.email && 'email', !initialAdmin.password && 'password'].filter(Boolean).join(', ');
|
|
78
|
+
this.logger.warn(`Incomplete initialAdmin config - missing: ${missing}. Auto-creation skipped.`);
|
|
79
|
+
return;
|
|
80
|
+
}
|
|
81
|
+
|
|
82
|
+
// Validate email format (same validator as @IsEmail() decorator)
|
|
83
|
+
if (!isEmail(initialAdmin.email)) {
|
|
84
|
+
this.logger.warn(`Invalid initialAdmin email format: "${initialAdmin.email}". Auto-creation skipped.`);
|
|
85
|
+
return;
|
|
86
|
+
}
|
|
87
|
+
|
|
88
|
+
// Validate password is not empty/whitespace
|
|
89
|
+
if (!initialAdmin.password.trim()) {
|
|
90
|
+
this.logger.warn('Empty initialAdmin password. Auto-creation skipped.');
|
|
91
|
+
return;
|
|
92
|
+
}
|
|
93
|
+
|
|
94
|
+
const status = await this.getSetupStatus();
|
|
95
|
+
if (!status.needsSetup) {
|
|
96
|
+
return;
|
|
97
|
+
}
|
|
98
|
+
|
|
99
|
+
if (!status.betterAuthEnabled) {
|
|
100
|
+
this.logger.warn('Initial admin auto-creation skipped: BetterAuth not enabled');
|
|
101
|
+
return;
|
|
102
|
+
}
|
|
103
|
+
|
|
104
|
+
try {
|
|
105
|
+
const result = await this.createInitialAdmin({
|
|
106
|
+
email: initialAdmin.email,
|
|
107
|
+
name: initialAdmin.name,
|
|
108
|
+
password: initialAdmin.password,
|
|
109
|
+
});
|
|
110
|
+
this.logger.log(`Auto-created initial admin on startup: ${result.email}`);
|
|
111
|
+
} catch (error) {
|
|
112
|
+
if (error instanceof ForbiddenException) {
|
|
113
|
+
this.logger.log('Initial admin auto-creation skipped (users already exist)');
|
|
114
|
+
} else {
|
|
115
|
+
this.logger.warn(
|
|
116
|
+
`Initial admin auto-creation failed: ${error instanceof Error ? error.message : 'Unknown error'}`,
|
|
117
|
+
);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
}
|
|
121
|
+
|
|
122
|
+
/**
|
|
123
|
+
* Check if the system needs initial setup (zero users)
|
|
124
|
+
*/
|
|
125
|
+
async getSetupStatus(): Promise<SystemSetupStatus> {
|
|
126
|
+
const userCount = await this.connection.collection('users').countDocuments({});
|
|
127
|
+
return {
|
|
128
|
+
betterAuthEnabled: this.betterAuthService.isEnabled(),
|
|
129
|
+
needsSetup: userCount === 0,
|
|
130
|
+
};
|
|
131
|
+
}
|
|
132
|
+
|
|
133
|
+
/**
|
|
134
|
+
* Create the initial admin user when zero users exist.
|
|
135
|
+
*
|
|
136
|
+
* Uses BetterAuth's internalAdapter to bypass disableSignUp,
|
|
137
|
+
* then syncs to nest-server users collection with admin role.
|
|
138
|
+
*/
|
|
139
|
+
async createInitialAdmin(input: SystemSetupInitInput): Promise<SystemSetupInitResult> {
|
|
140
|
+
// Pre-check: only allow when zero users exist
|
|
141
|
+
const userCount = await this.connection.collection('users').countDocuments({});
|
|
142
|
+
if (userCount > 0) {
|
|
143
|
+
throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
|
|
144
|
+
}
|
|
145
|
+
|
|
146
|
+
// Ensure BetterAuth is enabled
|
|
147
|
+
if (!this.betterAuthService.isEnabled()) {
|
|
148
|
+
throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_BETTERAUTH_REQUIRED);
|
|
149
|
+
}
|
|
150
|
+
|
|
151
|
+
const authInstance = this.betterAuthService.getInstance();
|
|
152
|
+
if (!authInstance) {
|
|
153
|
+
throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_BETTERAUTH_REQUIRED);
|
|
154
|
+
}
|
|
155
|
+
|
|
156
|
+
try {
|
|
157
|
+
// Access BetterAuth internal context (same pattern as core-better-auth-api.middleware.ts)
|
|
158
|
+
const context = await authInstance.$context;
|
|
159
|
+
|
|
160
|
+
// Normalize password for IAM (SHA256 if plain text)
|
|
161
|
+
const normalizedPassword = this.userMapper.normalizePasswordForIam(input.password);
|
|
162
|
+
|
|
163
|
+
// Create user via internalAdapter (bypasses disableSignUp)
|
|
164
|
+
const iamUser = await context.internalAdapter.createUser({
|
|
165
|
+
email: input.email,
|
|
166
|
+
emailVerified: true,
|
|
167
|
+
name: input.name || input.email.split('@')[0],
|
|
168
|
+
});
|
|
169
|
+
|
|
170
|
+
if (!iamUser) {
|
|
171
|
+
throw new Error('Failed to create IAM user');
|
|
172
|
+
}
|
|
173
|
+
|
|
174
|
+
// Hash password and create credential account
|
|
175
|
+
const hashedPassword = await context.password.hash(normalizedPassword);
|
|
176
|
+
await context.internalAdapter.linkAccount({
|
|
177
|
+
accountId: iamUser.id,
|
|
178
|
+
password: hashedPassword,
|
|
179
|
+
providerId: 'credential',
|
|
180
|
+
userId: iamUser.id,
|
|
181
|
+
});
|
|
182
|
+
|
|
183
|
+
// Sync to nest-server users collection
|
|
184
|
+
const syncedUser = await this.userMapper.linkOrCreateUser({
|
|
185
|
+
email: iamUser.email,
|
|
186
|
+
emailVerified: true,
|
|
187
|
+
id: iamUser.id,
|
|
188
|
+
name: iamUser.name,
|
|
189
|
+
});
|
|
190
|
+
|
|
191
|
+
if (!syncedUser) {
|
|
192
|
+
throw new Error('Failed to sync user to nest-server collection');
|
|
193
|
+
}
|
|
194
|
+
|
|
195
|
+
// Set admin role directly
|
|
196
|
+
await this.connection
|
|
197
|
+
.collection('users')
|
|
198
|
+
.updateOne({ _id: syncedUser._id }, { $set: { roles: ['admin'], updatedAt: new Date() } });
|
|
199
|
+
|
|
200
|
+
// Sync password to Legacy Auth for backwards compatibility
|
|
201
|
+
await this.userMapper.syncPasswordToLegacy(iamUser.id, input.email, input.password);
|
|
202
|
+
|
|
203
|
+
this.logger.log(`Initial admin user created: ${input.email}`);
|
|
204
|
+
|
|
205
|
+
return {
|
|
206
|
+
email: input.email,
|
|
207
|
+
message: 'Initial admin user created successfully',
|
|
208
|
+
success: true,
|
|
209
|
+
};
|
|
210
|
+
} catch (error) {
|
|
211
|
+
// Handle duplicate email (race condition via MongoDB unique index)
|
|
212
|
+
if (error instanceof Error && (error.message?.includes('duplicate key') || error.message?.includes('E11000'))) {
|
|
213
|
+
throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
|
|
214
|
+
}
|
|
215
|
+
|
|
216
|
+
// Re-throw known exceptions
|
|
217
|
+
if (error instanceof ForbiddenException) {
|
|
218
|
+
throw error;
|
|
219
|
+
}
|
|
220
|
+
|
|
221
|
+
this.logger.error(`System setup failed: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
222
|
+
throw new ForbiddenException(ErrorCode.SYSTEM_SETUP_NOT_AVAILABLE);
|
|
223
|
+
}
|
|
224
|
+
}
|
|
225
|
+
}
|
|
@@ -8,18 +8,19 @@
|
|
|
8
8
|
|
|
9
9
|
## Do You Need This Checklist?
|
|
10
10
|
|
|
11
|
-
| Scenario
|
|
12
|
-
|
|
13
|
-
| Use TUS with defaults (everyone can upload)
|
|
14
|
-
| Require authentication for uploads
|
|
15
|
-
| Custom upload handling (notifications, etc.) | Yes - Step 2
|
|
16
|
-
| Disable TUS completely
|
|
11
|
+
| Scenario | Checklist Needed? |
|
|
12
|
+
| -------------------------------------------- | ---------------------------------------------------- |
|
|
13
|
+
| Use TUS with defaults (everyone can upload) | No - works automatically |
|
|
14
|
+
| Require authentication for uploads | Yes - Step 1 |
|
|
15
|
+
| Custom upload handling (notifications, etc.) | Yes - Step 2 |
|
|
16
|
+
| Disable TUS completely | No - just use `TusModule.forRoot({ config: false })` |
|
|
17
17
|
|
|
18
18
|
---
|
|
19
19
|
|
|
20
20
|
## Reference Implementation
|
|
21
21
|
|
|
22
22
|
**Local (in your node_modules):**
|
|
23
|
+
|
|
23
24
|
```
|
|
24
25
|
node_modules/@lenne.tech/nest-server/src/server/server.module.ts
|
|
25
26
|
```
|
|
@@ -116,13 +117,13 @@ TusModule.forRoot({
|
|
|
116
117
|
path: '/uploads',
|
|
117
118
|
expiration: { expiresIn: '12h' },
|
|
118
119
|
},
|
|
119
|
-
})
|
|
120
|
+
});
|
|
120
121
|
```
|
|
121
122
|
|
|
122
123
|
### Disable TUS
|
|
123
124
|
|
|
124
125
|
```typescript
|
|
125
|
-
TusModule.forRoot({ config: false })
|
|
126
|
+
TusModule.forRoot({ config: false });
|
|
126
127
|
```
|
|
127
128
|
|
|
128
129
|
---
|
|
@@ -140,11 +141,11 @@ TusModule.forRoot({ config: false })
|
|
|
140
141
|
|
|
141
142
|
## Common Mistakes
|
|
142
143
|
|
|
143
|
-
| Mistake
|
|
144
|
-
|
|
145
|
-
| Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot()
|
|
146
|
-
| Custom controller missing @Roles
|
|
147
|
-
| Using wrong endpoint path
|
|
144
|
+
| Mistake | Symptom | Fix |
|
|
145
|
+
| ------------------------------------ | ------------------------------ | ------------------------------------------------- |
|
|
146
|
+
| Forgot to register custom controller | Default S_EVERYONE permissions | Add `controller: TusController` to forRoot() |
|
|
147
|
+
| Custom controller missing @Roles | No authentication required | Add `@Roles(RoleEnum.S_USER)` to controller class |
|
|
148
|
+
| Using wrong endpoint path | 404 on upload | Ensure client uses same path as config |
|
|
148
149
|
|
|
149
150
|
---
|
|
150
151
|
|
|
@@ -173,4 +174,4 @@ upload.start();
|
|
|
173
174
|
## Detailed Documentation
|
|
174
175
|
|
|
175
176
|
- **README.md:** `node_modules/@lenne.tech/nest-server/src/core/modules/tus/README.md`
|
|
176
|
-
- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md
|
|
177
|
+
- **GitHub:** https://github.com/lenneTech/nest-server/blob/develop/src/core/modules/tus/README.md
|
|
@@ -12,12 +12,12 @@ Integration of the [tus.io](https://tus.io) resumable upload protocol with @lenn
|
|
|
12
12
|
TusModule.forRoot({
|
|
13
13
|
config: {
|
|
14
14
|
maxSize: 100 * 1024 * 1024, // 100 MB instead of 50 GB default
|
|
15
|
-
path: '/uploads',
|
|
15
|
+
path: '/uploads', // Custom path instead of /tus
|
|
16
16
|
},
|
|
17
|
-
})
|
|
17
|
+
});
|
|
18
18
|
|
|
19
19
|
// To disable:
|
|
20
|
-
TusModule.forRoot({ config: false })
|
|
20
|
+
TusModule.forRoot({ config: false });
|
|
21
21
|
```
|
|
22
22
|
|
|
23
23
|
**Quick Links:** [Integration Checklist](./INTEGRATION-CHECKLIST.md) | [Endpoints](#endpoints) | [Configuration](#configuration) | [Client Usage](#client-usage)
|
|
@@ -47,14 +47,14 @@ TusModule.forRoot({ config: false })
|
|
|
47
47
|
|
|
48
48
|
### TUS Protocol Extensions (All Enabled by Default)
|
|
49
49
|
|
|
50
|
-
| Extension
|
|
51
|
-
|
|
52
|
-
| **creation**
|
|
53
|
-
| **creation-with-upload** | Include data in creation request
|
|
54
|
-
| **termination**
|
|
55
|
-
| **expiration**
|
|
56
|
-
| **checksum**
|
|
57
|
-
| **concatenation**
|
|
50
|
+
| Extension | Description |
|
|
51
|
+
| ------------------------ | --------------------------------- |
|
|
52
|
+
| **creation** | Create new uploads via POST |
|
|
53
|
+
| **creation-with-upload** | Include data in creation request |
|
|
54
|
+
| **termination** | Delete incomplete uploads |
|
|
55
|
+
| **expiration** | Auto-cleanup of abandoned uploads |
|
|
56
|
+
| **checksum** | Verify data integrity |
|
|
57
|
+
| **concatenation** | Combine multiple uploads |
|
|
58
58
|
|
|
59
59
|
---
|
|
60
60
|
|
|
@@ -87,13 +87,13 @@ TUS is **enabled by default** with the following configuration:
|
|
|
87
87
|
|
|
88
88
|
All endpoints are handled by the TUS protocol via `@tus/server`:
|
|
89
89
|
|
|
90
|
-
| Method
|
|
91
|
-
|
|
92
|
-
| OPTIONS | `/tus`
|
|
93
|
-
| POST
|
|
94
|
-
| HEAD
|
|
95
|
-
| PATCH
|
|
96
|
-
| DELETE
|
|
90
|
+
| Method | Endpoint | Description |
|
|
91
|
+
| ------- | ---------- | ------------------------ |
|
|
92
|
+
| OPTIONS | `/tus` | Get server capabilities |
|
|
93
|
+
| POST | `/tus` | Create new upload |
|
|
94
|
+
| HEAD | `/tus/:id` | Get upload status/offset |
|
|
95
|
+
| PATCH | `/tus/:id` | Continue upload |
|
|
96
|
+
| DELETE | `/tus/:id` | Terminate upload |
|
|
97
97
|
|
|
98
98
|
### CORS Headers
|
|
99
99
|
|
|
@@ -115,10 +115,10 @@ The TUS server automatically handles CORS headers for browser-based clients:
|
|
|
115
115
|
|
|
116
116
|
```typescript
|
|
117
117
|
// In server.module.ts
|
|
118
|
-
TusModule.forRoot({ config: false })
|
|
118
|
+
TusModule.forRoot({ config: false });
|
|
119
119
|
|
|
120
120
|
// Or via environment config
|
|
121
|
-
tus: false
|
|
121
|
+
tus: false;
|
|
122
122
|
```
|
|
123
123
|
|
|
124
124
|
### Custom Configuration
|
|
@@ -148,29 +148,30 @@ TusModule.forRoot({
|
|
|
148
148
|
expiresIn: '12h', // Cleanup after 12 hours
|
|
149
149
|
},
|
|
150
150
|
},
|
|
151
|
-
})
|
|
151
|
+
});
|
|
152
152
|
```
|
|
153
153
|
|
|
154
154
|
### Configuration Options
|
|
155
155
|
|
|
156
|
-
| Option
|
|
157
|
-
|
|
158
|
-
| `enabled`
|
|
159
|
-
| `path`
|
|
160
|
-
| `maxSize`
|
|
161
|
-
| `allowedTypes`
|
|
162
|
-
| `allowedHeaders`
|
|
163
|
-
| `uploadDir`
|
|
164
|
-
| `creation`
|
|
165
|
-
| `creationWithUpload` | boolean
|
|
166
|
-
| `termination`
|
|
167
|
-
| `expiration`
|
|
168
|
-
| `checksum`
|
|
169
|
-
| `concatenation`
|
|
156
|
+
| Option | Type | Default | Description |
|
|
157
|
+
| -------------------- | ----------------- | ---------------------- | -------------------------------------------------------- |
|
|
158
|
+
| `enabled` | boolean | `true` | Enable/disable TUS |
|
|
159
|
+
| `path` | string | `/tus` | Endpoint path |
|
|
160
|
+
| `maxSize` | number | 50 GB | Maximum file size in bytes |
|
|
161
|
+
| `allowedTypes` | string[] | undefined | Allowed MIME types (all if undefined) |
|
|
162
|
+
| `allowedHeaders` | string[] | `[]` | Additional custom headers (TUS headers already included) |
|
|
163
|
+
| `uploadDir` | string | `uploads/tus` | Temporary upload directory |
|
|
164
|
+
| `creation` | boolean | `true` | Enable creation extension |
|
|
165
|
+
| `creationWithUpload` | boolean | `true` | Enable creation-with-upload extension |
|
|
166
|
+
| `termination` | boolean | `true` | Enable termination extension |
|
|
167
|
+
| `expiration` | boolean \| object | `{ expiresIn: '24h' }` | Expiration configuration |
|
|
168
|
+
| `checksum` | boolean | `true` | Enable checksum extension |
|
|
169
|
+
| `concatenation` | boolean | `true` | Enable concatenation extension |
|
|
170
170
|
|
|
171
171
|
**Note on `allowedHeaders`:**
|
|
172
172
|
|
|
173
173
|
`@tus/server` already includes all TUS protocol headers by default:
|
|
174
|
+
|
|
174
175
|
- Authorization, Content-Type, Location, Tus-Extension, Tus-Max-Size
|
|
175
176
|
- Tus-Resumable, Tus-Version, Upload-Concat, Upload-Defer-Length
|
|
176
177
|
- Upload-Length, Upload-Metadata, Upload-Offset, X-HTTP-Method-Override
|
|
@@ -281,7 +282,7 @@ Then register with custom controller:
|
|
|
281
282
|
// server.module.ts
|
|
282
283
|
TusModule.forRoot({
|
|
283
284
|
controller: TusController,
|
|
284
|
-
})
|
|
285
|
+
});
|
|
285
286
|
```
|
|
286
287
|
|
|
287
288
|
### Custom Upload Handler
|
|
@@ -346,13 +347,13 @@ query {
|
|
|
346
347
|
|
|
347
348
|
The following metadata is stored with each GridFS file:
|
|
348
349
|
|
|
349
|
-
| Field
|
|
350
|
-
|
|
351
|
-
| `filename`
|
|
352
|
-
| `contentType`
|
|
353
|
-
| `tusUploadId`
|
|
354
|
-
| `originalMetadata` | All TUS metadata
|
|
355
|
-
| `uploadedAt`
|
|
350
|
+
| Field | Source |
|
|
351
|
+
| ------------------ | --------------------------------- |
|
|
352
|
+
| `filename` | From TUS `Upload-Metadata` header |
|
|
353
|
+
| `contentType` | From TUS `filetype` metadata |
|
|
354
|
+
| `tusUploadId` | Original TUS upload ID |
|
|
355
|
+
| `originalMetadata` | All TUS metadata |
|
|
356
|
+
| `uploadedAt` | Completion timestamp |
|
|
356
357
|
|
|
357
358
|
---
|
|
358
359
|
|
|
@@ -363,6 +364,7 @@ The following metadata is stored with each GridFS file:
|
|
|
363
364
|
**Cause:** TUS server not initialized
|
|
364
365
|
|
|
365
366
|
**Solutions:**
|
|
367
|
+
|
|
366
368
|
1. Check if TUS is disabled in config (`tus: false`)
|
|
367
369
|
2. Verify MongoDB connection is established
|
|
368
370
|
3. Check server logs for initialization errors
|
|
@@ -372,6 +374,7 @@ The following metadata is stored with each GridFS file:
|
|
|
372
374
|
**Cause:** Upload expired or server restarted
|
|
373
375
|
|
|
374
376
|
**Solutions:**
|
|
377
|
+
|
|
375
378
|
1. Check expiration configuration (default: 24h)
|
|
376
379
|
2. Increase `expiration.expiresIn` if needed
|
|
377
380
|
3. Client should handle `onError` and create new upload
|
|
@@ -381,6 +384,7 @@ The following metadata is stored with each GridFS file:
|
|
|
381
384
|
**Cause:** Missing or incorrect CORS configuration
|
|
382
385
|
|
|
383
386
|
**Solutions:**
|
|
387
|
+
|
|
384
388
|
1. Verify client sends correct headers
|
|
385
389
|
2. Check that `Tus-Resumable` header is included
|
|
386
390
|
3. Ensure server CORS allows TUS headers
|
|
@@ -390,6 +394,7 @@ The following metadata is stored with each GridFS file:
|
|
|
390
394
|
**Cause:** Upload incomplete or migration failed
|
|
391
395
|
|
|
392
396
|
**Solutions:**
|
|
397
|
+
|
|
393
398
|
1. Verify upload completed (check `onSuccess` callback)
|
|
394
399
|
2. Check server logs for migration errors
|
|
395
400
|
3. Verify MongoDB GridFS bucket exists (`fs.files`, `fs.chunks`)
|
|
@@ -399,6 +404,7 @@ The following metadata is stored with each GridFS file:
|
|
|
399
404
|
**Cause:** File exceeds `maxSize` limit
|
|
400
405
|
|
|
401
406
|
**Solutions:**
|
|
407
|
+
|
|
402
408
|
1. Increase `maxSize` in configuration
|
|
403
409
|
2. Check for proxy/nginx upload limits
|
|
404
410
|
3. Verify client `chunkSize` is reasonable
|
|
@@ -436,4 +442,4 @@ The following metadata is stored with each GridFS file:
|
|
|
436
442
|
- [tus.io Protocol](https://tus.io/protocols/resumable-upload)
|
|
437
443
|
- [tus-js-client](https://github.com/tus/tus-js-client)
|
|
438
444
|
- [@tus/server](https://github.com/tus/tus-node-server)
|
|
439
|
-
- [FileModule Documentation](../file/README.md)
|
|
445
|
+
- [FileModule Documentation](../file/README.md)
|
|
@@ -121,8 +121,7 @@ export abstract class CoreUserService<
|
|
|
121
121
|
/**
|
|
122
122
|
* Get verified state of user by token
|
|
123
123
|
*/
|
|
124
|
-
|
|
125
|
-
async getVerifiedState(token: string, serviceOptions?: ServiceOptions): Promise<boolean> {
|
|
124
|
+
async getVerifiedState(token: string, _serviceOptions?: ServiceOptions): Promise<boolean> {
|
|
126
125
|
const user = await this.mainDbModel.findOne({ verificationToken: token }).exec();
|
|
127
126
|
|
|
128
127
|
if (!user) {
|
package/src/core.module.ts
CHANGED
|
@@ -24,6 +24,7 @@ import { CoreBetterAuthModule } from './core/modules/better-auth/core-better-aut
|
|
|
24
24
|
import { CoreBetterAuthService } from './core/modules/better-auth/core-better-auth.service';
|
|
25
25
|
import { ErrorCodeModule } from './core/modules/error-code/error-code.module';
|
|
26
26
|
import { CoreHealthCheckModule } from './core/modules/health-check/core-health-check.module';
|
|
27
|
+
import { CoreSystemSetupModule } from './core/modules/system-setup/core-system-setup.module';
|
|
27
28
|
|
|
28
29
|
/**
|
|
29
30
|
* Core module (dynamic)
|
|
@@ -143,9 +144,9 @@ export class CoreModule implements NestModule {
|
|
|
143
144
|
|
|
144
145
|
// Build GraphQL driver configuration based on auth mode
|
|
145
146
|
const graphQlDriverConfig = isIamOnlyMode
|
|
146
|
-
?
|
|
147
|
+
? isAutoRegisterDisabledEarly
|
|
147
148
|
? this.buildLazyIamGraphQlDriver(cors, options)
|
|
148
|
-
: this.buildIamOnlyGraphQlDriver(cors, options)
|
|
149
|
+
: this.buildIamOnlyGraphQlDriver(cors, options)
|
|
149
150
|
: this.buildLegacyGraphQlDriver(AuthService, AuthModule, cors, options);
|
|
150
151
|
|
|
151
152
|
const config: IServerOptions = merge(
|
|
@@ -261,16 +262,14 @@ export class CoreModule implements NestModule {
|
|
|
261
262
|
// Determine if BetterAuth is explicitly disabled
|
|
262
263
|
// In IAM-only mode: enabled by default (undefined = true), only false or { enabled: false } disables
|
|
263
264
|
// In Legacy mode: disabled by default (undefined = false), must be explicitly enabled
|
|
264
|
-
const isExplicitlyDisabled =
|
|
265
|
-
(typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false);
|
|
266
|
-
const isExplicitlyEnabled =
|
|
267
|
-
(typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false);
|
|
265
|
+
const isExplicitlyDisabled =
|
|
266
|
+
betterAuthConfig === false || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled === false);
|
|
267
|
+
const isExplicitlyEnabled =
|
|
268
|
+
betterAuthConfig === true || (typeof betterAuthConfig === 'object' && betterAuthConfig?.enabled !== false);
|
|
268
269
|
|
|
269
270
|
// IAM-only mode: enabled unless explicitly disabled
|
|
270
271
|
// Legacy mode: enabled only if explicitly enabled
|
|
271
|
-
const isBetterAuthEnabled = isIamOnlyMode
|
|
272
|
-
? !isExplicitlyDisabled
|
|
273
|
-
: isExplicitlyEnabled;
|
|
272
|
+
const isBetterAuthEnabled = isIamOnlyMode ? !isExplicitlyDisabled : isExplicitlyEnabled;
|
|
274
273
|
|
|
275
274
|
const isAutoRegister = typeof betterAuthConfig === 'object' && betterAuthConfig?.autoRegister === true;
|
|
276
275
|
// autoRegister: false means the project imports its own BetterAuthModule separately
|
|
@@ -304,6 +303,12 @@ export class CoreModule implements NestModule {
|
|
|
304
303
|
}
|
|
305
304
|
}
|
|
306
305
|
|
|
306
|
+
// Add CoreSystemSetupModule when BetterAuth is active
|
|
307
|
+
// Enabled by default - disable explicitly via systemSetup: { enabled: false }
|
|
308
|
+
if (isBetterAuthEnabled && config.systemSetup?.enabled !== false) {
|
|
309
|
+
imports.push(CoreSystemSetupModule);
|
|
310
|
+
}
|
|
311
|
+
|
|
307
312
|
// Set exports
|
|
308
313
|
const exports: any[] = [ConfigService, EmailService, TemplateService, MailjetService];
|
|
309
314
|
if (!process.env.VITEST) {
|
package/src/index.ts
CHANGED
|
@@ -167,6 +167,14 @@ export * from './core/modules/health-check/core-health-check.service';
|
|
|
167
167
|
|
|
168
168
|
export * from './core/modules/migrate';
|
|
169
169
|
|
|
170
|
+
// =====================================================================================================================
|
|
171
|
+
// Core - Modules - SystemSetup
|
|
172
|
+
// =====================================================================================================================
|
|
173
|
+
|
|
174
|
+
export * from './core/modules/system-setup/core-system-setup.controller';
|
|
175
|
+
export * from './core/modules/system-setup/core-system-setup.module';
|
|
176
|
+
export * from './core/modules/system-setup/core-system-setup.service';
|
|
177
|
+
|
|
170
178
|
// =====================================================================================================================
|
|
171
179
|
// Core - Modules - Tus
|
|
172
180
|
// =====================================================================================================================
|
|
@@ -22,15 +22,7 @@ export class AuthModule {
|
|
|
22
22
|
return {
|
|
23
23
|
controllers: [AuthController],
|
|
24
24
|
exports: [AuthController, AuthResolver, CoreAuthModule, AuthService],
|
|
25
|
-
imports: [
|
|
26
|
-
CoreAuthModule.forRoot(UserModule, UserService, {
|
|
27
|
-
...options,
|
|
28
|
-
...{
|
|
29
|
-
// imports: [], // Integrate additional Services here to resolve dependencies
|
|
30
|
-
// providers: [] // Integrate additional Providers here to resolve dependencies
|
|
31
|
-
},
|
|
32
|
-
}),
|
|
33
|
-
],
|
|
25
|
+
imports: [CoreAuthModule.forRoot(UserModule, UserService, { ...options })],
|
|
34
26
|
module: AuthModule,
|
|
35
27
|
providers: [AuthController, AuthResolver, AuthService, EmailService],
|
|
36
28
|
};
|
|
@@ -107,7 +107,9 @@ export class BetterAuthResolver extends CoreBetterAuthResolver {
|
|
|
107
107
|
nullable: true,
|
|
108
108
|
})
|
|
109
109
|
@Roles(RoleEnum.S_USER)
|
|
110
|
-
override async betterAuthListPasskeys(
|
|
110
|
+
override async betterAuthListPasskeys(
|
|
111
|
+
@Context() ctx: { req: Request },
|
|
112
|
+
): Promise<CoreBetterAuthPasskeyModel[] | null> {
|
|
111
113
|
return super.betterAuthListPasskeys(ctx);
|
|
112
114
|
}
|
|
113
115
|
|