@lenne.tech/nest-server 12.0.0 → 12.1.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/.claude/rules/architecture.md +6 -1
- package/.claude/rules/better-auth.md +46 -0
- package/.claude/rules/configurable-features.md +3 -2
- package/.claude/rules/package-management.md +24 -2
- package/.claude/rules/persistence.md +100 -0
- package/.claude/rules/role-system.md +9 -0
- package/.claude/rules/testing.md +116 -18
- package/CLAUDE.md +21 -2
- package/FRAMEWORK-API.md +6 -4
- package/README.md +106 -34
- package/dist/core/common/decorators/unified-field.decorator.d.ts +2 -1
- package/dist/core/common/decorators/unified-field.decorator.js +4 -1
- package/dist/core/common/decorators/unified-field.decorator.js.map +1 -1
- package/dist/core/common/filters/mongoose-cast-error.filter.d.ts +7 -5
- package/dist/core/common/filters/mongoose-cast-error.filter.js +3 -2
- package/dist/core/common/filters/mongoose-cast-error.filter.js.map +1 -1
- package/dist/core/common/helpers/db.helper.d.ts +2 -1
- package/dist/core/common/helpers/db.helper.js +32 -26
- package/dist/core/common/helpers/db.helper.js.map +1 -1
- package/dist/core/common/helpers/decorator.helper.d.ts +1 -1
- package/dist/core/common/helpers/filter.helper.d.ts +2 -1
- package/dist/core/common/helpers/filter.helper.js.map +1 -1
- package/dist/core/common/helpers/gridfs.helper.d.ts +4 -4
- package/dist/core/common/helpers/gridfs.helper.js +14 -6
- package/dist/core/common/helpers/gridfs.helper.js.map +1 -1
- package/dist/core/common/helpers/id.helper.d.ts +4 -1
- package/dist/core/common/helpers/id.helper.js +10 -4
- package/dist/core/common/helpers/id.helper.js.map +1 -1
- package/dist/core/common/helpers/model.helper.js +5 -5
- package/dist/core/common/helpers/model.helper.js.map +1 -1
- package/dist/core/common/helpers/service.helper.js +3 -3
- package/dist/core/common/helpers/service.helper.js.map +1 -1
- package/dist/core/common/interfaces/server-options.interface.d.ts +18 -2
- package/dist/core/common/interfaces/service-options.interface.d.ts +2 -2
- package/dist/core/common/models/core-persistence.model.d.ts +1 -2
- package/dist/core/common/models/core-persistence.model.js +3 -3
- package/dist/core/common/models/core-persistence.model.js.map +1 -1
- package/dist/core/common/persistence/core-persistence.lifecycle.d.ts +9 -0
- package/dist/core/common/persistence/core-persistence.lifecycle.js +38 -0
- package/dist/core/common/persistence/core-persistence.lifecycle.js.map +1 -0
- package/dist/core/common/persistence/core-persistence.module.d.ts +9 -0
- package/dist/core/common/persistence/core-persistence.module.js +76 -0
- package/dist/core/common/persistence/core-persistence.module.js.map +1 -0
- package/dist/core/common/persistence/data-source.config.d.ts +33 -0
- package/dist/core/common/persistence/data-source.config.js +151 -0
- package/dist/core/common/persistence/data-source.config.js.map +1 -0
- package/dist/core/common/persistence/data-source.runtime.d.ts +45 -0
- package/dist/core/common/persistence/data-source.runtime.js +278 -0
- package/dist/core/common/persistence/data-source.runtime.js.map +1 -0
- package/dist/core/common/persistence/data-store.interface.d.ts +73 -0
- package/dist/core/common/persistence/data-store.interface.js +2 -0
- package/dist/core/common/persistence/data-store.interface.js.map +1 -0
- package/dist/core/common/persistence/expiry-sweep.d.ts +12 -0
- package/dist/core/common/persistence/expiry-sweep.js +55 -0
- package/dist/core/common/persistence/expiry-sweep.js.map +1 -0
- package/dist/core/common/persistence/id-format.d.ts +3 -0
- package/dist/core/common/persistence/id-format.js +21 -0
- package/dist/core/common/persistence/id-format.js.map +1 -0
- package/dist/core/common/persistence/infrastructure-locks.d.ts +13 -0
- package/dist/core/common/persistence/infrastructure-locks.js +35 -0
- package/dist/core/common/persistence/infrastructure-locks.js.map +1 -0
- package/dist/core/common/persistence/inject-store.decorator.d.ts +1 -0
- package/dist/core/common/persistence/inject-store.decorator.js +6 -0
- package/dist/core/common/persistence/inject-store.decorator.js.map +1 -0
- package/dist/core/common/persistence/lock-store.interface.d.ts +5 -0
- package/dist/core/common/persistence/lock-store.interface.js +2 -0
- package/dist/core/common/persistence/lock-store.interface.js.map +1 -0
- package/dist/core/common/persistence/model-descriptor.interface.d.ts +36 -0
- package/dist/core/common/persistence/model-descriptor.interface.js +2 -0
- package/dist/core/common/persistence/model-descriptor.interface.js.map +1 -0
- package/dist/core/common/persistence/model-metadata.registry.d.ts +14 -0
- package/dist/core/common/persistence/model-metadata.registry.js +194 -0
- package/dist/core/common/persistence/model-metadata.registry.js.map +1 -0
- package/dist/core/common/persistence/mongo/collection-name.d.ts +2 -0
- package/dist/core/common/persistence/mongo/collection-name.js +73 -0
- package/dist/core/common/persistence/mongo/collection-name.js.map +1 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.d.ts +11 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.js +292 -0
- package/dist/core/common/persistence/mongo/declared-schema.view.js.map +1 -0
- package/dist/core/common/persistence/mongo/hex-object-id.d.ts +13 -0
- package/dist/core/common/persistence/mongo/hex-object-id.js +54 -0
- package/dist/core/common/persistence/mongo/hex-object-id.js.map +1 -0
- package/dist/core/common/persistence/mongo/model-declarations.d.ts +35 -0
- package/dist/core/common/persistence/mongo/model-declarations.js +80 -0
- package/dist/core/common/persistence/mongo/model-declarations.js.map +1 -0
- package/dist/core/common/persistence/mongo/mongo-packages.d.ts +15 -0
- package/dist/core/common/persistence/mongo/mongo-packages.js +66 -0
- package/dist/core/common/persistence/mongo/mongo-packages.js.map +1 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.d.ts +22 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.js +65 -0
- package/dist/core/common/persistence/mongo/mongoose-compat.js.map +1 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.d.ts +2 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.js +19 -0
- package/dist/core/common/persistence/mongo/no-mongo-connection.module.js.map +1 -0
- package/dist/core/common/persistence/mongo-lock-store.d.ts +21 -0
- package/dist/core/common/persistence/mongo-lock-store.js +72 -0
- package/dist/core/common/persistence/mongo-lock-store.js.map +1 -0
- package/dist/core/common/persistence/mongoose-data-store.d.ts +33 -0
- package/dist/core/common/persistence/mongoose-data-store.js +187 -0
- package/dist/core/common/persistence/mongoose-data-store.js.map +1 -0
- package/dist/core/common/persistence/neutral-populate.d.ts +6 -0
- package/dist/core/common/persistence/neutral-populate.js +72 -0
- package/dist/core/common/persistence/neutral-populate.js.map +1 -0
- package/dist/core/common/persistence/persisted-model.decorator.d.ts +6 -0
- package/dist/core/common/persistence/persisted-model.decorator.js +24 -0
- package/dist/core/common/persistence/persisted-model.decorator.js.map +1 -0
- package/dist/core/common/persistence/persistence-runtime.registry.d.ts +61 -0
- package/dist/core/common/persistence/persistence-runtime.registry.js +47 -0
- package/dist/core/common/persistence/persistence-runtime.registry.js.map +1 -0
- package/dist/core/common/persistence/persistence.tokens.d.ts +1 -0
- package/dist/core/common/persistence/persistence.tokens.js +4 -0
- package/dist/core/common/persistence/persistence.tokens.js.map +1 -0
- package/dist/core/common/persistence/policies/audit.policy.d.ts +8 -0
- package/dist/core/common/persistence/policies/audit.policy.js +37 -0
- package/dist/core/common/persistence/policies/audit.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/password.policy.d.ts +3 -0
- package/dist/core/common/persistence/policies/password.policy.js +46 -0
- package/dist/core/common/persistence/policies/password.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/role-guard.policy.d.ts +3 -0
- package/dist/core/common/persistence/policies/role-guard.policy.js +46 -0
- package/dist/core/common/persistence/policies/role-guard.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/system-role.policy.d.ts +5 -0
- package/dist/core/common/persistence/policies/system-role.policy.js +46 -0
- package/dist/core/common/persistence/policies/system-role.policy.js.map +1 -0
- package/dist/core/common/persistence/policies/tenant.policy.d.ts +19 -0
- package/dist/core/common/persistence/policies/tenant.policy.js +120 -0
- package/dist/core/common/persistence/policies/tenant.policy.js.map +1 -0
- package/dist/core/common/persistence/routed-model.guard.d.ts +4 -0
- package/dist/core/common/persistence/routed-model.guard.js +73 -0
- package/dist/core/common/persistence/routed-model.guard.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.d.ts +46 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js +350 -0
- package/dist/core/common/persistence/sql/mysql/mysql-data-store.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.d.ts +13 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.js +194 -0
- package/dist/core/common/persistence/sql/mysql/mysql-executor.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.d.ts +11 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js +55 -0
- package/dist/core/common/persistence/sql/mysql/mysql-lock-store.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.d.ts +36 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js +288 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.d.ts +19 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js +328 -0
- package/dist/core/common/persistence/sql/mysql/mysql-schema.migrator.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.d.ts +13 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.js +85 -0
- package/dist/core/common/persistence/sql/mysql/mysql-session.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.d.ts +9 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js +264 -0
- package/dist/core/common/persistence/sql/mysql/mysql-update.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.d.ts +20 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js +519 -0
- package/dist/core/common/persistence/sql/mysql/mysql-where.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.d.ts +11 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js +44 -0
- package/dist/core/common/persistence/sql/postgres/postgres-lock-store.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.d.ts +42 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js +220 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.d.ts +12 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js +315 -0
- package/dist/core/common/persistence/sql/postgres/postgres-schema.migrator.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.d.ts +5 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js +225 -0
- package/dist/core/common/persistence/sql/postgres/postgres-update.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.d.ts +13 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js +484 -0
- package/dist/core/common/persistence/sql/postgres/postgres-where.compiler.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-cast.d.ts +2 -0
- package/dist/core/common/persistence/sql/sql-cast.js +194 -0
- package/dist/core/common/persistence/sql/sql-cast.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-data-store.d.ts +79 -0
- package/dist/core/common/persistence/sql/sql-data-store.js +592 -0
- package/dist/core/common/persistence/sql/sql-data-store.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-dialect.d.ts +20 -0
- package/dist/core/common/persistence/sql/sql-dialect.js +38 -0
- package/dist/core/common/persistence/sql/sql-dialect.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-errors.d.ts +17 -0
- package/dist/core/common/persistence/sql/sql-errors.js +25 -0
- package/dist/core/common/persistence/sql/sql-errors.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.d.ts +11 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.js +199 -0
- package/dist/core/common/persistence/sql/sql-executor.factory.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.d.ts +32 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.js +2 -0
- package/dist/core/common/persistence/sql/sql-executor.interface.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-naming.d.ts +15 -0
- package/dist/core/common/persistence/sql/sql-naming.js +90 -0
- package/dist/core/common/persistence/sql/sql-naming.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.d.ts +25 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.js +69 -0
- package/dist/core/common/persistence/sql/sql-schema.shared.js.map +1 -0
- package/dist/core/common/persistence/sql/sql-session.d.ts +6 -0
- package/dist/core/common/persistence/sql/sql-session.js +78 -0
- package/dist/core/common/persistence/sql/sql-session.js.map +1 -0
- package/dist/core/common/persistence/sql/where-shared.d.ts +18 -0
- package/dist/core/common/persistence/sql/where-shared.js +93 -0
- package/dist/core/common/persistence/sql/where-shared.js.map +1 -0
- package/dist/core/common/persistence/store-guards.d.ts +10 -0
- package/dist/core/common/persistence/store-guards.js +49 -0
- package/dist/core/common/persistence/store-guards.js.map +1 -0
- package/dist/core/common/persistence/store-upsert.d.ts +2 -0
- package/dist/core/common/persistence/store-upsert.js +20 -0
- package/dist/core/common/persistence/store-upsert.js.map +1 -0
- package/dist/core/common/persistence/unavailable-store.d.ts +2 -0
- package/dist/core/common/persistence/unavailable-store.js +53 -0
- package/dist/core/common/persistence/unavailable-store.js.map +1 -0
- package/dist/core/common/persistence/unsupported-capability.error.d.ts +3 -0
- package/dist/core/common/persistence/unsupported-capability.error.js +4 -0
- package/dist/core/common/persistence/unsupported-capability.error.js.map +1 -0
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js +24 -68
- package/dist/core/common/plugins/mongoose-audit-fields.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-id.plugin.js +3 -0
- package/dist/core/common/plugins/mongoose-id.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-password.plugin.d.ts +1 -3
- package/dist/core/common/plugins/mongoose-password.plugin.js +2 -45
- package/dist/core/common/plugins/mongoose-password.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js +5 -46
- package/dist/core/common/plugins/mongoose-role-guard.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-system-role.plugin.js +2 -43
- package/dist/core/common/plugins/mongoose-system-role.plugin.js.map +1 -1
- package/dist/core/common/plugins/mongoose-tenant.plugin.js +10 -70
- package/dist/core/common/plugins/mongoose-tenant.plugin.js.map +1 -1
- package/dist/core/common/scalars/upload.scalar.js +1 -1
- package/dist/core/common/scalars/upload.scalar.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.initializer.js +1 -1
- package/dist/core/common/services/core-cron-jobs.initializer.js.map +1 -1
- package/dist/core/common/services/core-cron-jobs.service.d.ts +1 -0
- package/dist/core/common/services/core-cron-jobs.service.js +23 -14
- package/dist/core/common/services/core-cron-jobs.service.js.map +1 -1
- package/dist/core/common/services/crud.service.d.ts +4 -1
- package/dist/core/common/services/crud.service.js +132 -23
- package/dist/core/common/services/crud.service.js.map +1 -1
- package/dist/core/common/services/model-doc.service.js +1 -1
- package/dist/core/common/services/model-doc.service.js.map +1 -1
- package/dist/core/common/services/module.service.d.ts +9 -2
- package/dist/core/common/services/module.service.js +51 -6
- package/dist/core/common/services/module.service.js.map +1 -1
- package/dist/core/common/types/field-selection.type.d.ts +1 -1
- package/dist/core/common/types/id.type.d.ts +4 -4
- package/dist/core/common/types/object-id-like.type.d.ts +3 -0
- package/dist/core/common/types/object-id-like.type.js +2 -0
- package/dist/core/common/types/object-id-like.type.js.map +1 -0
- package/dist/core/common/types/populate-config.type.d.ts +1 -1
- package/dist/core/common/types/string-or-object-id.type.d.ts +2 -2
- package/dist/core/modules/ai/core-ai.constants.d.ts +4 -0
- package/dist/core/modules/ai/core-ai.constants.js +4 -0
- package/dist/core/modules/ai/core-ai.constants.js.map +1 -1
- package/dist/core/modules/ai/core-ai.module.js +21 -17
- package/dist/core/modules/ai/core-ai.module.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.d.ts +2 -92
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-budget-limit.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.d.ts +2 -87
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-connection-preference.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-connection.model.d.ts +2 -177
- package/dist/core/modules/ai/models/core-ai-connection.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-connection.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-conversation.model.d.ts +2 -92
- package/dist/core/modules/ai/models/core-ai-conversation.model.js +3 -4
- package/dist/core/modules/ai/models/core-ai-conversation.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-interaction.model.d.ts +2 -120
- package/dist/core/modules/ai/models/core-ai-interaction.model.js +2 -3
- package/dist/core/modules/ai/models/core-ai-interaction.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.d.ts +3 -0
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js +21 -0
- package/dist/core/modules/ai/models/core-ai-mcp-oauth.models.js.map +1 -0
- package/dist/core/modules/ai/models/core-ai-mode.model.d.ts +2 -102
- package/dist/core/modules/ai/models/core-ai-mode.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-mode.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.d.ts +2 -97
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt-hint.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt.model.d.ts +2 -112
- package/dist/core/modules/ai/models/core-ai-prompt.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-prompt.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-slot.model.d.ts +2 -112
- package/dist/core/modules/ai/models/core-ai-slot.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-slot.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.d.ts +2 -97
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-grant.model.js.map +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.d.ts +2 -103
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js +1 -1
- package/dist/core/modules/ai/models/core-ai-tool-policy.model.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-budget.service.d.ts +3 -1
- package/dist/core/modules/ai/services/core-ai-budget.service.js +15 -5
- package/dist/core/modules/ai/services/core-ai-budget.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js +6 -10
- package/dist/core/modules/ai/services/core-ai-connection-preference.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-connection.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-connection.service.js +20 -42
- package/dist/core/modules/ai/services/core-ai-connection.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-conversation.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-conversation.service.js +28 -29
- package/dist/core/modules/ai/services/core-ai-conversation.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-interaction.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-interaction.service.js +3 -4
- package/dist/core/modules/ai/services/core-ai-interaction.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.d.ts +8 -0
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js +70 -18
- package/dist/core/modules/ai/services/core-ai-mcp-oauth.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-mode.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-mode.service.js +3 -7
- package/dist/core/modules/ai/services/core-ai-mode.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.d.ts +8 -1
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js +32 -26
- package/dist/core/modules/ai/services/core-ai-prompt-hint.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-prompt.service.js +10 -13
- package/dist/core/modules/ai/services/core-ai-prompt.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-slot.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-slot.service.js +14 -25
- package/dist/core/modules/ai/services/core-ai-slot.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js +6 -18
- package/dist/core/modules/ai/services/core-ai-tool-grant.service.js.map +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.d.ts +1 -1
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js +4 -8
- package/dist/core/modules/ai/services/core-ai-tool-policy.service.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.model.js +1 -1
- package/dist/core/modules/api-token/core-api-token.model.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.module.js +3 -2
- package/dist/core/modules/api-token/core-api-token.module.js.map +1 -1
- package/dist/core/modules/api-token/core-api-token.service.d.ts +8 -2
- package/dist/core/modules/api-token/core-api-token.service.js +106 -39
- package/dist/core/modules/api-token/core-api-token.service.js.map +1 -1
- package/dist/core/modules/auth/core-auth.module.js +2 -0
- package/dist/core/modules/auth/core-auth.module.js.map +1 -1
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js +1 -2
- package/dist/core/modules/auth/guards/legacy-auth-rate-limit.guard.js.map +1 -1
- package/dist/core/modules/auth/guards/role-guard.token.d.ts +1 -0
- package/dist/core/modules/auth/guards/role-guard.token.js +2 -0
- package/dist/core/modules/auth/guards/role-guard.token.js.map +1 -0
- package/dist/core/modules/auth/services/core-auth.service.js +4 -2
- package/dist/core/modules/auth/services/core-auth.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth-sql.helper.d.ts +6 -0
- package/dist/core/modules/better-auth/better-auth-sql.helper.js +113 -0
- package/dist/core/modules/better-auth/better-auth-sql.helper.js.map +1 -0
- package/dist/core/modules/better-auth/better-auth-token.service.d.ts +3 -1
- package/dist/core/modules/better-auth/better-auth-token.service.js +15 -24
- package/dist/core/modules/better-auth/better-auth-token.service.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.config.d.ts +7 -0
- package/dist/core/modules/better-auth/better-auth.config.js +16 -5
- package/dist/core/modules/better-auth/better-auth.config.js.map +1 -1
- package/dist/core/modules/better-auth/better-auth.types.d.ts +1 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.d.ts +1 -0
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js +6 -1
- package/dist/core/modules/better-auth/core-better-auth-api.middleware.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js +30 -15
- package/dist/core/modules/better-auth/core-better-auth-challenge.service.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.d.ts +10 -0
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.js +24 -0
- package/dist/core/modules/better-auth/core-better-auth-mongo.users.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.d.ts +3 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.js +8 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.registry.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.d.ts +71 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js +190 -0
- package/dist/core/modules/better-auth/core-better-auth-sql.store.js.map +1 -0
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.d.ts +24 -1
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js +308 -32
- package/dist/core/modules/better-auth/core-better-auth-user.mapper.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.module.d.ts +2 -0
- package/dist/core/modules/better-auth/core-better-auth.module.js +54 -32
- package/dist/core/modules/better-auth/core-better-auth.module.js.map +1 -1
- package/dist/core/modules/better-auth/core-better-auth.service.d.ts +7 -2
- package/dist/core/modules/better-auth/core-better-auth.service.js +61 -9
- package/dist/core/modules/better-auth/core-better-auth.service.js.map +1 -1
- package/dist/core/modules/file/core-file-info.model.d.ts +1 -2
- package/dist/core/modules/file/core-file-info.model.js +2 -2
- package/dist/core/modules/file/core-file-info.model.js.map +1 -1
- package/dist/core/modules/file/core-file.service.d.ts +5 -3
- package/dist/core/modules/file/core-file.service.js +16 -9
- package/dist/core/modules/file/core-file.service.js.map +1 -1
- package/dist/core/modules/file/file-metadata.helper.d.ts +1 -1
- package/dist/core/modules/file/file-metadata.helper.js +2 -2
- package/dist/core/modules/file/file-metadata.helper.js.map +1 -1
- package/dist/core/modules/file/file-metadata.models.d.ts +35 -0
- package/dist/core/modules/file/file-metadata.models.js +20 -0
- package/dist/core/modules/file/file-metadata.models.js.map +1 -0
- package/dist/core/modules/file/file-metadata.store.d.ts +6 -0
- package/dist/core/modules/file/file-metadata.store.js +77 -0
- package/dist/core/modules/file/file-metadata.store.js.map +1 -0
- package/dist/core/modules/file/file-storage.helper.d.ts +1 -0
- package/dist/core/modules/file/file-storage.helper.js +34 -0
- package/dist/core/modules/file/file-storage.helper.js.map +1 -1
- package/dist/core/modules/file/filesystem-file.helper.d.ts +1 -1
- package/dist/core/modules/file/filesystem-file.helper.js +4 -4
- package/dist/core/modules/file/filesystem-file.helper.js.map +1 -1
- package/dist/core/modules/file/s3-file.helper.d.ts +1 -1
- package/dist/core/modules/file/s3-file.helper.js +5 -5
- package/dist/core/modules/file/s3-file.helper.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.module.js +12 -2
- package/dist/core/modules/health-check/core-health-check.module.js.map +1 -1
- package/dist/core/modules/health-check/core-health-check.service.d.ts +4 -3
- package/dist/core/modules/health-check/core-health-check.service.js +26 -5
- package/dist/core/modules/health-check/core-health-check.service.js.map +1 -1
- package/dist/core/modules/hub/core-hub.controller.d.ts +1 -0
- package/dist/core/modules/hub/core-hub.controller.js +10 -0
- package/dist/core/modules/hub/core-hub.controller.js.map +1 -1
- package/dist/core/modules/hub/core-hub.service.js +1 -1
- package/dist/core/modules/hub/core-hub.service.js.map +1 -1
- package/dist/core/modules/hub/helpers/hub-client-js.helper.js +23 -0
- package/dist/core/modules/hub/helpers/hub-client-js.helper.js.map +1 -1
- package/dist/core/modules/hub/hub-action-messages.d.ts +2 -0
- package/dist/core/modules/hub/hub-action-messages.js +2 -0
- package/dist/core/modules/hub/hub-action-messages.js.map +1 -1
- package/dist/core/modules/hub/hub-nav.js +1 -0
- package/dist/core/modules/hub/hub-nav.js.map +1 -1
- package/dist/core/modules/hub/interfaces/hub-panels.interface.d.ts +17 -1
- package/dist/core/modules/hub/services/core-hub-db.service.d.ts +6 -1
- package/dist/core/modules/hub/services/core-hub-db.service.js +16 -14
- package/dist/core/modules/hub/services/core-hub-db.service.js.map +1 -1
- package/dist/core/modules/hub/services/core-hub-migrations.service.d.ts +5 -0
- package/dist/core/modules/hub/services/core-hub-migrations.service.js +74 -1
- package/dist/core/modules/hub/services/core-hub-migrations.service.js.map +1 -1
- package/dist/core/modules/hub/services/core-hub-sources.service.d.ts +2 -1
- package/dist/core/modules/hub/services/core-hub-sources.service.js +32 -0
- package/dist/core/modules/hub/services/core-hub-sources.service.js.map +1 -1
- package/dist/core/modules/hub/services/hub-query-profiler.service.js +1 -1
- package/dist/core/modules/hub/services/hub-query-profiler.service.js.map +1 -1
- package/dist/core/modules/migrate/cli/migrate-cli.d.ts +2 -0
- package/dist/core/modules/migrate/cli/migrate-cli.js +35 -1
- package/dist/core/modules/migrate/cli/migrate-cli.js.map +1 -1
- package/dist/core/modules/migrate/index.d.ts +3 -0
- package/dist/core/modules/migrate/index.js +3 -0
- package/dist/core/modules/migrate/index.js.map +1 -1
- package/dist/core/modules/migrate/migration-runner.d.ts +2 -2
- package/dist/core/modules/migrate/migration-runner.js.map +1 -1
- package/dist/core/modules/migrate/migration-state-store.interface.d.ts +16 -0
- package/dist/core/modules/migrate/migration-state-store.interface.js +2 -0
- package/dist/core/modules/migrate/migration-state-store.interface.js.map +1 -0
- package/dist/core/modules/migrate/migration.helper.d.ts +3 -2
- package/dist/core/modules/migrate/migration.helper.js +21 -6
- package/dist/core/modules/migrate/migration.helper.js.map +1 -1
- package/dist/core/modules/migrate/mongo-state-store.d.ts +5 -12
- package/dist/core/modules/migrate/mongo-state-store.js +30 -24
- package/dist/core/modules/migrate/mongo-state-store.js.map +1 -1
- package/dist/core/modules/migrate/sql-migration.helper.d.ts +4 -0
- package/dist/core/modules/migrate/sql-migration.helper.js +34 -0
- package/dist/core/modules/migrate/sql-migration.helper.js.map +1 -0
- package/dist/core/modules/migrate/sql-state-store.d.ts +24 -0
- package/dist/core/modules/migrate/sql-state-store.js +129 -0
- package/dist/core/modules/migrate/sql-state-store.js.map +1 -0
- package/dist/core/modules/system-setup/core-system-setup.service.d.ts +8 -0
- package/dist/core/modules/system-setup/core-system-setup.service.js +41 -25
- package/dist/core/modules/system-setup/core-system-setup.service.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant-member.model.js +1 -1
- package/dist/core/modules/tenant/core-tenant-member.model.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant-member.store.d.ts +2 -0
- package/dist/core/modules/tenant/core-tenant-member.store.js +6 -0
- package/dist/core/modules/tenant/core-tenant-member.store.js.map +1 -0
- package/dist/core/modules/tenant/core-tenant.guard.d.ts +8 -3
- package/dist/core/modules/tenant/core-tenant.guard.js +57 -28
- package/dist/core/modules/tenant/core-tenant.guard.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.module.js +3 -2
- package/dist/core/modules/tenant/core-tenant.module.js.map +1 -1
- package/dist/core/modules/tenant/core-tenant.service.d.ts +3 -1
- package/dist/core/modules/tenant/core-tenant.service.js +48 -28
- package/dist/core/modules/tenant/core-tenant.service.js.map +1 -1
- package/dist/core/modules/tus/core-tus.service.d.ts +1 -1
- package/dist/core/modules/tus/core-tus.service.js +8 -7
- package/dist/core/modules/tus/core-tus.service.js.map +1 -1
- package/dist/core/modules/tus/tus.module.js +1 -1
- package/dist/core/modules/tus/tus.module.js.map +1 -1
- package/dist/core/modules/user/core-user.model.d.ts +1 -1
- package/dist/core/modules/user/core-user.model.js +1 -1
- package/dist/core/modules/user/core-user.model.js.map +1 -1
- package/dist/core/modules/user/core-user.service.d.ts +3 -1
- package/dist/core/modules/user/core-user.service.js +71 -16
- package/dist/core/modules/user/core-user.service.js.map +1 -1
- package/dist/core.module.js +39 -5
- package/dist/core.module.js.map +1 -1
- package/dist/index.d.ts +26 -0
- package/dist/index.js +26 -0
- package/dist/index.js.map +1 -1
- package/dist/server/common/models/persistence.model.d.ts +1 -1
- package/dist/server/common/models/persistence.model.js +3 -3
- package/dist/server/common/models/persistence.model.js.map +1 -1
- package/dist/server/modules/file/file-info.model.d.ts +1 -77
- package/dist/server/modules/file/file-info.model.js +1 -1
- package/dist/server/modules/file/file-info.model.js.map +1 -1
- package/dist/server/modules/file/file.service.js +1 -1
- package/dist/server/modules/file/file.service.js.map +1 -1
- package/dist/server/modules/user/user.model.d.ts +2 -186
- package/dist/server/modules/user/user.model.js +4 -5
- package/dist/server/modules/user/user.model.js.map +1 -1
- package/dist/server/modules/user/user.module.js +4 -3
- package/dist/server/modules/user/user.module.js.map +1 -1
- package/dist/server/modules/user/user.service.d.ts +1 -1
- package/dist/server/modules/user/user.service.js +5 -8
- package/dist/server/modules/user/user.service.js.map +1 -1
- package/dist/test/test.helper.js +2 -2
- package/dist/test/test.helper.js.map +1 -1
- package/dist/types/graphql-upload.d.ts +10 -7
- package/docs/REQUEST-LIFECYCLE.md +6 -3
- package/docs/choosing-a-database.md +107 -0
- package/docs/native-driver-security.md +29 -0
- package/docs/security-overrides.md +15 -6
- package/migration-guides/12.0.x-to-12.1.x.md +255 -0
- package/package.json +75 -29
- package/src/core/common/decorators/unified-field.decorator.ts +11 -1
- package/src/core/common/filters/mongoose-cast-error.filter.ts +12 -6
- package/src/core/common/helpers/db.helper.ts +40 -25
- package/src/core/common/helpers/decorator.helper.ts +1 -1
- package/src/core/common/helpers/filter.helper.ts +2 -1
- package/src/core/common/helpers/gridfs.helper.ts +28 -9
- package/src/core/common/helpers/id.helper.ts +21 -4
- package/src/core/common/helpers/model.helper.ts +5 -6
- package/src/core/common/helpers/service.helper.ts +3 -3
- package/src/core/common/interfaces/server-options.interface.ts +118 -10
- package/src/core/common/interfaces/service-options.interface.ts +2 -2
- package/src/core/common/models/core-persistence.model.ts +3 -3
- package/src/core/common/persistence/core-persistence.lifecycle.ts +47 -0
- package/src/core/common/persistence/core-persistence.module.ts +109 -0
- package/src/core/common/persistence/data-source.config.ts +271 -0
- package/src/core/common/persistence/data-source.runtime.ts +351 -0
- package/src/core/common/persistence/data-store.interface.ts +155 -0
- package/src/core/common/persistence/expiry-sweep.ts +105 -0
- package/src/core/common/persistence/id-format.ts +43 -0
- package/src/core/common/persistence/infrastructure-locks.ts +66 -0
- package/src/core/common/persistence/inject-store.decorator.ts +16 -0
- package/src/core/common/persistence/lock-store.interface.ts +17 -0
- package/src/core/common/persistence/model-descriptor.interface.ts +90 -0
- package/src/core/common/persistence/model-metadata.registry.ts +285 -0
- package/src/core/common/persistence/mongo/collection-name.ts +87 -0
- package/src/core/common/persistence/mongo/declared-schema.view.ts +378 -0
- package/src/core/common/persistence/mongo/hex-object-id.ts +75 -0
- package/src/core/common/persistence/mongo/model-declarations.ts +135 -0
- package/src/core/common/persistence/mongo/mongo-packages.ts +130 -0
- package/src/core/common/persistence/mongo/mongoose-compat.ts +129 -0
- package/src/core/common/persistence/mongo/no-mongo-connection.module.ts +18 -0
- package/src/core/common/persistence/mongo-lock-store.ts +121 -0
- package/src/core/common/persistence/mongoose-data-store.ts +232 -0
- package/src/core/common/persistence/neutral-populate.ts +98 -0
- package/src/core/common/persistence/persisted-model.decorator.ts +61 -0
- package/src/core/common/persistence/persistence-runtime.registry.ts +152 -0
- package/src/core/common/persistence/persistence.tokens.ts +9 -0
- package/src/core/common/persistence/policies/audit.policy.ts +80 -0
- package/src/core/common/persistence/policies/password.policy.ts +69 -0
- package/src/core/common/persistence/policies/role-guard.policy.ts +74 -0
- package/src/core/common/persistence/policies/system-role.policy.ts +90 -0
- package/src/core/common/persistence/policies/tenant.policy.ts +245 -0
- package/src/core/common/persistence/routed-model.guard.ts +107 -0
- package/src/core/common/persistence/sql/mysql/mysql-data-store.ts +503 -0
- package/src/core/common/persistence/sql/mysql/mysql-executor.ts +281 -0
- package/src/core/common/persistence/sql/mysql/mysql-lock-store.ts +87 -0
- package/src/core/common/persistence/sql/mysql/mysql-schema.compiler.ts +424 -0
- package/src/core/common/persistence/sql/mysql/mysql-schema.migrator.ts +453 -0
- package/src/core/common/persistence/sql/mysql/mysql-session.ts +131 -0
- package/src/core/common/persistence/sql/mysql/mysql-update.compiler.ts +379 -0
- package/src/core/common/persistence/sql/mysql/mysql-where.compiler.ts +686 -0
- package/src/core/common/persistence/sql/postgres/postgres-lock-store.ts +76 -0
- package/src/core/common/persistence/sql/postgres/postgres-schema.compiler.ts +328 -0
- package/src/core/common/persistence/sql/postgres/postgres-schema.migrator.ts +448 -0
- package/src/core/common/persistence/sql/postgres/postgres-update.compiler.ts +310 -0
- package/src/core/common/persistence/sql/postgres/postgres-where.compiler.ts +638 -0
- package/src/core/common/persistence/sql/sql-cast.ts +227 -0
- package/src/core/common/persistence/sql/sql-data-store.ts +762 -0
- package/src/core/common/persistence/sql/sql-dialect.ts +85 -0
- package/src/core/common/persistence/sql/sql-errors.ts +49 -0
- package/src/core/common/persistence/sql/sql-executor.factory.ts +282 -0
- package/src/core/common/persistence/sql/sql-executor.interface.ts +57 -0
- package/src/core/common/persistence/sql/sql-naming.ts +133 -0
- package/src/core/common/persistence/sql/sql-schema.shared.ts +105 -0
- package/src/core/common/persistence/sql/sql-session.ts +158 -0
- package/src/core/common/persistence/sql/where-shared.ts +118 -0
- package/src/core/common/persistence/store-guards.ts +73 -0
- package/src/core/common/persistence/store-upsert.ts +36 -0
- package/src/core/common/persistence/unavailable-store.ts +63 -0
- package/src/core/common/persistence/unsupported-capability.error.ts +7 -0
- package/src/core/common/plugins/mongoose-audit-fields.plugin.ts +33 -74
- package/src/core/common/plugins/mongoose-id.plugin.ts +9 -0
- package/src/core/common/plugins/mongoose-password.plugin.ts +6 -62
- package/src/core/common/plugins/mongoose-role-guard.plugin.ts +11 -63
- package/src/core/common/plugins/mongoose-system-role.plugin.ts +7 -78
- package/src/core/common/plugins/mongoose-tenant.plugin.ts +23 -144
- package/src/core/common/scalars/upload.scalar.ts +8 -3
- package/src/core/common/services/core-cron-jobs.initializer.ts +1 -1
- package/src/core/common/services/core-cron-jobs.service.ts +33 -22
- package/src/core/common/services/crud.service.ts +166 -35
- package/src/core/common/services/model-doc.service.ts +1 -1
- package/src/core/common/services/module.service.ts +78 -6
- package/src/core/common/types/field-selection.type.ts +1 -1
- package/src/core/common/types/id.type.ts +2 -2
- package/src/core/common/types/object-id-like.type.ts +11 -0
- package/src/core/common/types/populate-config.type.ts +1 -1
- package/src/core/common/types/string-or-object-id.type.ts +2 -2
- package/src/core/modules/ai/README.md +15 -2
- package/src/core/modules/ai/core-ai.constants.ts +10 -0
- package/src/core/modules/ai/core-ai.module.ts +32 -17
- package/src/core/modules/ai/models/core-ai-budget-limit.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-connection-preference.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-connection.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-conversation.model.ts +8 -4
- package/src/core/modules/ai/models/core-ai-interaction.model.ts +3 -3
- package/src/core/modules/ai/models/core-ai-mcp-oauth.models.ts +46 -0
- package/src/core/modules/ai/models/core-ai-mode.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-prompt-hint.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-prompt.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-slot.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-tool-grant.model.ts +2 -2
- package/src/core/modules/ai/models/core-ai-tool-policy.model.ts +2 -2
- package/src/core/modules/ai/services/core-ai-budget.service.ts +22 -4
- package/src/core/modules/ai/services/core-ai-connection-preference.service.ts +6 -13
- package/src/core/modules/ai/services/core-ai-connection.service.ts +34 -44
- package/src/core/modules/ai/services/core-ai-conversation.service.ts +31 -29
- package/src/core/modules/ai/services/core-ai-interaction.service.ts +3 -3
- package/src/core/modules/ai/services/core-ai-mcp-oauth.service.ts +93 -20
- package/src/core/modules/ai/services/core-ai-mode.service.ts +3 -6
- package/src/core/modules/ai/services/core-ai-prompt-hint.service.ts +43 -26
- package/src/core/modules/ai/services/core-ai-prompt.service.ts +15 -12
- package/src/core/modules/ai/services/core-ai-slot.service.ts +20 -24
- package/src/core/modules/ai/services/core-ai-tool-grant.service.ts +17 -27
- package/src/core/modules/ai/services/core-ai-tool-policy.service.ts +7 -10
- package/src/core/modules/api-token/core-api-token.model.ts +1 -1
- package/src/core/modules/api-token/core-api-token.module.ts +4 -2
- package/src/core/modules/api-token/core-api-token.service.ts +118 -43
- package/src/core/modules/auth/core-auth.module.ts +2 -0
- package/src/core/modules/auth/guards/legacy-auth-rate-limit.guard.ts +4 -3
- package/src/core/modules/auth/guards/role-guard.token.ts +7 -0
- package/src/core/modules/auth/services/core-auth.service.ts +16 -2
- package/src/core/modules/better-auth/INTEGRATION-CHECKLIST.md +1 -1
- package/src/core/modules/better-auth/README.md +10 -1
- package/src/core/modules/better-auth/better-auth-sql.helper.ts +191 -0
- package/src/core/modules/better-auth/better-auth-token.service.ts +26 -35
- package/src/core/modules/better-auth/better-auth.config.ts +43 -7
- package/src/core/modules/better-auth/better-auth.types.ts +1 -1
- package/src/core/modules/better-auth/core-better-auth-api.middleware.ts +13 -1
- package/src/core/modules/better-auth/core-better-auth-challenge.service.ts +36 -18
- package/src/core/modules/better-auth/core-better-auth-mongo.users.ts +35 -0
- package/src/core/modules/better-auth/core-better-auth-sql.registry.ts +20 -0
- package/src/core/modules/better-auth/core-better-auth-sql.store.ts +309 -0
- package/src/core/modules/better-auth/core-better-auth-user.mapper.ts +418 -40
- package/src/core/modules/better-auth/core-better-auth.module.ts +71 -35
- package/src/core/modules/better-auth/core-better-auth.service.ts +81 -12
- package/src/core/modules/file/README.md +16 -3
- package/src/core/modules/file/core-file-info.model.ts +2 -2
- package/src/core/modules/file/core-file.service.ts +27 -18
- package/src/core/modules/file/file-metadata.helper.ts +7 -3
- package/src/core/modules/file/file-metadata.models.ts +44 -0
- package/src/core/modules/file/file-metadata.store.ts +109 -0
- package/src/core/modules/file/file-storage.helper.ts +47 -2
- package/src/core/modules/file/filesystem-file.helper.ts +11 -8
- package/src/core/modules/file/s3-file.helper.ts +11 -7
- package/src/core/modules/health-check/core-health-check.module.ts +16 -2
- package/src/core/modules/health-check/core-health-check.service.ts +25 -3
- package/src/core/modules/hub/README.md +20 -11
- package/src/core/modules/hub/core-hub.controller.ts +5 -0
- package/src/core/modules/hub/core-hub.service.ts +1 -1
- package/src/core/modules/hub/helpers/hub-client-js.helper.ts +23 -0
- package/src/core/modules/hub/hub-action-messages.ts +6 -0
- package/src/core/modules/hub/hub-nav.ts +1 -0
- package/src/core/modules/hub/interfaces/hub-panels.interface.ts +8 -1
- package/src/core/modules/hub/services/core-hub-db.service.ts +35 -17
- package/src/core/modules/hub/services/core-hub-migrations.service.ts +96 -2
- package/src/core/modules/hub/services/core-hub-sources.service.ts +47 -1
- package/src/core/modules/hub/services/hub-query-profiler.service.ts +1 -1
- package/src/core/modules/migrate/README.md +54 -0
- package/src/core/modules/migrate/cli/migrate-cli.ts +44 -3
- package/src/core/modules/migrate/index.ts +3 -0
- package/src/core/modules/migrate/migration-runner.ts +3 -2
- package/src/core/modules/migrate/migration-state-store.interface.ts +24 -0
- package/src/core/modules/migrate/migration.helper.ts +35 -10
- package/src/core/modules/migrate/mongo-state-store.ts +64 -65
- package/src/core/modules/migrate/sql-migration.helper.ts +48 -0
- package/src/core/modules/migrate/sql-state-store.ts +198 -0
- package/src/core/modules/system-setup/README.md +14 -2
- package/src/core/modules/system-setup/core-system-setup.service.ts +77 -45
- package/src/core/modules/tenant/README.md +9 -2
- package/src/core/modules/tenant/core-tenant-member.model.ts +1 -1
- package/src/core/modules/tenant/core-tenant-member.store.ts +13 -0
- package/src/core/modules/tenant/core-tenant.guard.ts +77 -24
- package/src/core/modules/tenant/core-tenant.module.ts +6 -3
- package/src/core/modules/tenant/core-tenant.service.ts +59 -42
- package/src/core/modules/tus/core-tus.service.ts +11 -12
- package/src/core/modules/tus/tus.module.ts +1 -1
- package/src/core/modules/user/core-user.model.ts +2 -2
- package/src/core/modules/user/core-user.service.ts +98 -20
- package/src/core.module.ts +60 -5
- package/src/index.ts +26 -0
- package/src/server/common/models/persistence.model.ts +4 -4
- package/src/server/modules/file/file-info.model.ts +1 -1
- package/src/server/modules/file/file.service.ts +1 -1
- package/src/server/modules/user/user.model.ts +10 -5
- package/src/server/modules/user/user.module.ts +9 -3
- package/src/server/modules/user/user.service.ts +9 -11
- package/src/test/test.helper.ts +2 -2
- package/src/types/graphql-upload.d.ts +10 -7
|
@@ -1,7 +1,8 @@
|
|
|
1
1
|
import { Inject, Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
import { InjectModel } from '
|
|
3
|
-
import { Model } from 'mongoose';
|
|
2
|
+
import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
|
|
3
|
+
import type { Model } from 'mongoose';
|
|
4
4
|
|
|
5
|
+
import { upsertRecord } from '../../../common/persistence/store-upsert.js';
|
|
5
6
|
import { CrudService } from '../../../common/services/crud.service.js';
|
|
6
7
|
import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
|
|
7
8
|
import { AiToolGrantDocument, CoreAiToolGrant } from '../models/core-ai-tool-grant.model.js';
|
|
@@ -60,17 +61,14 @@ export class CoreAiToolGrantService extends CrudService<CoreAiToolGrant, CoreAiT
|
|
|
60
61
|
const now = new Date();
|
|
61
62
|
for (const c of candidates) {
|
|
62
63
|
try {
|
|
63
|
-
const grant = await this.
|
|
64
|
-
|
|
65
|
-
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
})
|
|
72
|
-
.lean<CoreAiToolGrant>()
|
|
73
|
-
.exec();
|
|
64
|
+
const grant = await this.dataStore.findOne({
|
|
65
|
+
$or: [{ expiresAt: { $exists: false } }, { expiresAt: null }, { expiresAt: { $gt: now } }],
|
|
66
|
+
decision: { $ne: 'deny' },
|
|
67
|
+
enabled: { $ne: false },
|
|
68
|
+
refId: c.refId,
|
|
69
|
+
scope: c.scope,
|
|
70
|
+
tool,
|
|
71
|
+
});
|
|
74
72
|
if (grant) {
|
|
75
73
|
return c.scope;
|
|
76
74
|
}
|
|
@@ -90,20 +88,12 @@ export class CoreAiToolGrantService extends CrudService<CoreAiToolGrant, CoreAiT
|
|
|
90
88
|
return;
|
|
91
89
|
}
|
|
92
90
|
try {
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
99
|
-
enabled: true,
|
|
100
|
-
expiresAt: options?.expiresAt ?? null,
|
|
101
|
-
},
|
|
102
|
-
$setOnInsert: { refId, scope, tool },
|
|
103
|
-
},
|
|
104
|
-
{ upsert: true },
|
|
105
|
-
)
|
|
106
|
-
.exec();
|
|
91
|
+
// Upserts on the unique (scope, refId, tool) index
|
|
92
|
+
await upsertRecord(
|
|
93
|
+
this.dataStore,
|
|
94
|
+
{ refId, scope, tool },
|
|
95
|
+
{ decision: 'allow', enabled: true, expiresAt: options?.expiresAt ?? null },
|
|
96
|
+
);
|
|
107
97
|
} catch (err) {
|
|
108
98
|
this.logger.warn(`Could not persist tool grant (${scope}:${refId}:${tool}): ${(err as Error).message}`);
|
|
109
99
|
}
|
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
import { Inject, Injectable, Logger } from '@nestjs/common';
|
|
2
|
-
import { InjectModel } from '
|
|
3
|
-
import { Model } from 'mongoose';
|
|
2
|
+
import { InjectModel } from '../../../common/persistence/mongo/mongoose-compat.js';
|
|
3
|
+
import type { Model } from 'mongoose';
|
|
4
4
|
|
|
5
5
|
import { CrudService } from '../../../common/services/crud.service.js';
|
|
6
6
|
import type { CoreModelConstructor } from '../../../common/types/core-model-constructor.type.js';
|
|
@@ -77,14 +77,11 @@ export class CoreAiToolPolicyService extends CrudService<CoreAiToolPolicy, CoreA
|
|
|
77
77
|
|
|
78
78
|
let policies: CoreAiToolPolicy[] = [];
|
|
79
79
|
try {
|
|
80
|
-
policies = await this.
|
|
81
|
-
.
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
})
|
|
86
|
-
.lean<CoreAiToolPolicy[]>()
|
|
87
|
-
.exec();
|
|
80
|
+
policies = (await this.dataStore.find({
|
|
81
|
+
$or: refCandidates.map((c) => ({ refId: c.refId ?? null, scope: c.scope })),
|
|
82
|
+
enabled: { $ne: false },
|
|
83
|
+
tool,
|
|
84
|
+
})) as CoreAiToolPolicy[];
|
|
88
85
|
} catch {
|
|
89
86
|
return undefined;
|
|
90
87
|
}
|
|
@@ -1,5 +1,5 @@
|
|
|
1
1
|
import { ObjectType } from '@nestjs/graphql';
|
|
2
|
-
import { Schema } from '
|
|
2
|
+
import { Schema } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
3
3
|
|
|
4
4
|
import { Restricted } from '../../common/decorators/restricted.decorator.js';
|
|
5
5
|
import { UnifiedField } from '../../common/decorators/unified-field.decorator.js';
|
|
@@ -1,6 +1,7 @@
|
|
|
1
1
|
import { DynamicModule, Global, MiddlewareConsumer, Module, NestModule, Type } from '@nestjs/common';
|
|
2
|
-
import {
|
|
2
|
+
import { SchemaFactory } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
3
3
|
|
|
4
|
+
import { CorePersistenceModule } from '../../common/persistence/core-persistence.module.js';
|
|
4
5
|
import { API_TOKEN_MODEL_TOKEN } from './core-api-token.constants.js';
|
|
5
6
|
import { CoreApiTokenMiddleware } from './core-api-token.middleware.js';
|
|
6
7
|
import { CoreApiTokenModel } from './core-api-token.model.js';
|
|
@@ -36,7 +37,8 @@ export class CoreApiTokenModule implements NestModule {
|
|
|
36
37
|
return {
|
|
37
38
|
exports: [CoreApiTokenService],
|
|
38
39
|
global: true,
|
|
39
|
-
|
|
40
|
+
// Database-neutral registration: the token model follows `database` like every other model
|
|
41
|
+
imports: [CorePersistenceModule.forFeature([{ name: API_TOKEN_MODEL_TOKEN, schema }])],
|
|
40
42
|
module: CoreApiTokenModule,
|
|
41
43
|
providers: [{ provide: CoreApiTokenService, useClass: options.service || CoreApiTokenService }],
|
|
42
44
|
};
|
|
@@ -11,10 +11,17 @@ import {
|
|
|
11
11
|
Optional,
|
|
12
12
|
UnauthorizedException,
|
|
13
13
|
} from '@nestjs/common';
|
|
14
|
-
import {
|
|
15
|
-
import {
|
|
14
|
+
import { ModuleRef } from '@nestjs/core';
|
|
15
|
+
import { InjectConnection, InjectModel } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
16
|
+
import type { Connection, Model } from 'mongoose';
|
|
17
|
+
import type { Types } from 'mongoose';
|
|
16
18
|
|
|
17
19
|
import { RoleEnum } from '../../common/enums/role.enum.js';
|
|
20
|
+
import type { DataStore } from '../../common/persistence/data-store.interface.js';
|
|
21
|
+
import { isWellFormedId } from '../../common/persistence/id-format.js';
|
|
22
|
+
import { getModelDescriptor } from '../../common/persistence/model-metadata.registry.js';
|
|
23
|
+
import { getStoreForModel } from '../../common/persistence/persistence-runtime.registry.js';
|
|
24
|
+
import { getStoreToken } from '../../common/persistence/persistence.tokens.js';
|
|
18
25
|
import { ConfigService } from '../../common/services/config.service.js';
|
|
19
26
|
import { CoreRedisService } from '../../common/services/core-redis.service.js';
|
|
20
27
|
import { InMemoryRateLimitStore, RateLimitStore, RedisRateLimitStore } from '../../common/services/rate-limit-store.js';
|
|
@@ -44,6 +51,7 @@ import {
|
|
|
44
51
|
} from './core-api-token.helpers.js';
|
|
45
52
|
import { CoreApiTokenModel } from './core-api-token.model.js';
|
|
46
53
|
import { ApiTokenOwnerIdentity, setApiTokenRevoker } from './core-api-token.registry.js';
|
|
54
|
+
import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
47
55
|
|
|
48
56
|
/** Fields a caller can never set through a create/update input. */
|
|
49
57
|
const PROTECTED_FIELDS = new Set([
|
|
@@ -65,6 +73,24 @@ const PROTECTED_FIELDS = new Set([
|
|
|
65
73
|
]);
|
|
66
74
|
|
|
67
75
|
/** User fields never loaded onto a token-authenticated request user. */
|
|
76
|
+
/** Name of the user model whose store a token owner is loaded from on a SQL database */
|
|
77
|
+
const API_TOKEN_USER_MODEL = 'User';
|
|
78
|
+
|
|
79
|
+
/** A filter built for MongoDB (`_id`) as the neutral filter of a data store (`id`) */
|
|
80
|
+
function toNeutralFilter(filter: Record<string, unknown>): Record<string, unknown> {
|
|
81
|
+
const { _id, ...rest } = filter;
|
|
82
|
+
return _id === undefined ? rest : { ...rest, id: String(_id) };
|
|
83
|
+
}
|
|
84
|
+
|
|
85
|
+
/** A user record without the fields `USER_SECRET_PROJECTION` keeps out of a request user */
|
|
86
|
+
function withoutSecrets(record: Record<string, any>): Record<string, any> {
|
|
87
|
+
const copy = { ...record };
|
|
88
|
+
for (const field of Object.keys(USER_SECRET_PROJECTION)) {
|
|
89
|
+
delete copy[field];
|
|
90
|
+
}
|
|
91
|
+
return copy;
|
|
92
|
+
}
|
|
93
|
+
|
|
68
94
|
const USER_SECRET_PROJECTION = {
|
|
69
95
|
password: 0,
|
|
70
96
|
passwordResetToken: 0,
|
|
@@ -161,8 +187,30 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
161
187
|
@Optional() @InjectConnection() protected readonly connection?: Connection,
|
|
162
188
|
@Optional() protected readonly tenantService?: CoreTenantService,
|
|
163
189
|
@Optional() protected readonly redisService?: CoreRedisService,
|
|
190
|
+
@Optional() protected readonly moduleRef?: ModuleRef,
|
|
164
191
|
) {}
|
|
165
192
|
|
|
193
|
+
/** The token store when the token model is routed to SQL; `undefined` keeps the Mongoose path (MongoDB) */
|
|
194
|
+
protected get tokenStore(): DataStore<any> | undefined {
|
|
195
|
+
const store = getStoreForModel(this.apiTokenModel);
|
|
196
|
+
return store && !store.capabilities.mongoosePopulate ? store : undefined;
|
|
197
|
+
}
|
|
198
|
+
|
|
199
|
+
/**
|
|
200
|
+
* The users' store when the user model (`User`) is routed to SQL: a token's owner is loaded from where the users
|
|
201
|
+
* live. `undefined` keeps the `users` collection, the document Better-Auth and the legacy strategy resolve on MongoDB.
|
|
202
|
+
* `protected` so a project whose user model has another name can return its store.
|
|
203
|
+
*/
|
|
204
|
+
protected userStore(): DataStore<any> | undefined {
|
|
205
|
+
let store: DataStore<any> | undefined;
|
|
206
|
+
try {
|
|
207
|
+
store = this.moduleRef?.get(getStoreToken(API_TOKEN_USER_MODEL), { strict: false });
|
|
208
|
+
} catch {
|
|
209
|
+
return undefined;
|
|
210
|
+
}
|
|
211
|
+
return store && !store.capabilities.mongoosePopulate ? store : undefined;
|
|
212
|
+
}
|
|
213
|
+
|
|
166
214
|
onModuleInit(): void {
|
|
167
215
|
assertApiTokenConfigIsUsable();
|
|
168
216
|
// Let the password-reset paths (Better-Auth hook, legacy resetPassword) revoke user tokens
|
|
@@ -262,10 +310,13 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
262
310
|
this.lastUsedWrites.clear();
|
|
263
311
|
}
|
|
264
312
|
this.lastUsedWrites.set(tokenId, now);
|
|
265
|
-
this.
|
|
266
|
-
|
|
267
|
-
.
|
|
268
|
-
|
|
313
|
+
const tokens = this.tokenStore;
|
|
314
|
+
const write = tokens
|
|
315
|
+
? tokens.updateById(tokenId, { $set: { lastUsedAt: new Date(now) } }, { timestamps: false })
|
|
316
|
+
: this.apiTokenModel
|
|
317
|
+
.updateOne({ _id: tokenId }, { $set: { lastUsedAt: new Date(now) } }, { timestamps: false })
|
|
318
|
+
.exec();
|
|
319
|
+
write.catch((error: Error) => this.logger.debug(`lastUsedAt update failed: ${error.message}`));
|
|
269
320
|
}
|
|
270
321
|
|
|
271
322
|
/** A token that may authenticate right now: known, not revoked, not expired, kind enabled. */
|
|
@@ -273,11 +324,14 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
273
324
|
publicId: string,
|
|
274
325
|
config: IResolvedApiTokenConfig,
|
|
275
326
|
): Promise<CoreApiTokenModel | null> {
|
|
276
|
-
const
|
|
277
|
-
|
|
278
|
-
|
|
279
|
-
|
|
280
|
-
|
|
327
|
+
const tokens = this.tokenStore;
|
|
328
|
+
const token = (
|
|
329
|
+
tokens
|
|
330
|
+
? await tokens
|
|
331
|
+
.findOne({ publicId }, { select: Object.keys(getModelDescriptor(tokens.modelName)?.fields ?? {}) })
|
|
332
|
+
.then((record) => record && { ...record, _id: record.id })
|
|
333
|
+
: await this.apiTokenModel.findOne({ publicId }).select('+secretHash +signingKeyEncrypted').lean().exec()
|
|
334
|
+
) as (CoreApiTokenModel & { _id: Types.ObjectId | string }) | null;
|
|
281
335
|
if (!token || token.revokedAt || (token.expiresAt && new Date(token.expiresAt).getTime() <= Date.now())) {
|
|
282
336
|
return null;
|
|
283
337
|
}
|
|
@@ -323,12 +377,15 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
323
377
|
* `protected` so a project with a different user store can override it.
|
|
324
378
|
*/
|
|
325
379
|
protected async loadTokenUser(userId: string): Promise<null | Record<string, any>> {
|
|
326
|
-
|
|
380
|
+
const users = this.userStore();
|
|
381
|
+
if ((!users && !this.connection) || !userId || !isWellFormedId(userId)) {
|
|
327
382
|
return null;
|
|
328
383
|
}
|
|
329
|
-
const doc =
|
|
330
|
-
.
|
|
331
|
-
|
|
384
|
+
const doc = users
|
|
385
|
+
? await users.findById(userId).then((record) => record && withoutSecrets({ ...record, _id: record.id }))
|
|
386
|
+
: await this.connection
|
|
387
|
+
.collection('users')
|
|
388
|
+
.findOne({ _id: newObjectId(userId) }, { projection: USER_SECRET_PROJECTION });
|
|
332
389
|
if (!doc) {
|
|
333
390
|
return null;
|
|
334
391
|
}
|
|
@@ -425,12 +482,11 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
425
482
|
* or when the user is blocked. Returns the number of tokens revoked.
|
|
426
483
|
*/
|
|
427
484
|
async revokeAllForUser(userId: string): Promise<number> {
|
|
428
|
-
const
|
|
429
|
-
|
|
430
|
-
|
|
431
|
-
|
|
432
|
-
|
|
433
|
-
.exec();
|
|
485
|
+
const active = { kind: ApiTokenKind.USER, revokedAt: null, user: String(userId) };
|
|
486
|
+
if (this.tokenStore) {
|
|
487
|
+
return this.tokenStore.updateMany(active, { $set: { revokedAt: new Date() } });
|
|
488
|
+
}
|
|
489
|
+
const result = await this.apiTokenModel.updateMany(active, { $set: { revokedAt: new Date() } }).exec();
|
|
434
490
|
return result.modifiedCount ?? 0;
|
|
435
491
|
}
|
|
436
492
|
|
|
@@ -441,19 +497,25 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
441
497
|
*/
|
|
442
498
|
async revokeAllForOwner(identity: ApiTokenOwnerIdentity): Promise<number> {
|
|
443
499
|
let userId = identity?.userId;
|
|
444
|
-
|
|
500
|
+
const users = this.userStore();
|
|
501
|
+
if (!userId && (users || this.connection) && (identity?.email || identity?.iamId)) {
|
|
445
502
|
const or: Record<string, string>[] = [];
|
|
446
503
|
if (identity.email) or.push({ email: identity.email });
|
|
447
504
|
if (identity.iamId) or.push({ iamId: identity.iamId });
|
|
448
|
-
|
|
449
|
-
|
|
505
|
+
userId = users
|
|
506
|
+
? (await users.findOne({ $or: or }, { select: ['id'] }))?.id
|
|
507
|
+
: (await this.connection.collection('users').findOne({ $or: or }, { projection: { _id: 1 } }))?._id?.toString();
|
|
450
508
|
}
|
|
451
509
|
return userId ? this.revokeAllForUser(userId) : 0;
|
|
452
510
|
}
|
|
453
511
|
|
|
454
512
|
/** Delete every token of a user (system operation, no rights check) — call it when deleting the user. */
|
|
455
513
|
async deleteAllForUser(userId: string): Promise<number> {
|
|
456
|
-
const
|
|
514
|
+
const owned = { kind: ApiTokenKind.USER, user: String(userId) };
|
|
515
|
+
if (this.tokenStore) {
|
|
516
|
+
return this.tokenStore.deleteMany(owned);
|
|
517
|
+
}
|
|
518
|
+
const result = await this.apiTokenModel.deleteMany(owned).exec();
|
|
457
519
|
return result.deletedCount ?? 0;
|
|
458
520
|
}
|
|
459
521
|
|
|
@@ -536,6 +598,9 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
536
598
|
if (!tenantId?.trim()) {
|
|
537
599
|
throw new BadRequestException('tenantId must not be empty');
|
|
538
600
|
}
|
|
601
|
+
if (this.tokenStore) {
|
|
602
|
+
return this.tokenStore.deleteMany({ tenant: tenantId });
|
|
603
|
+
}
|
|
539
604
|
const result = await this.apiTokenModel.deleteMany({ tenant: tenantId }).exec();
|
|
540
605
|
return result.deletedCount ?? 0;
|
|
541
606
|
}
|
|
@@ -632,7 +697,7 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
632
697
|
const config = getApiTokenConfig();
|
|
633
698
|
const { publicId, secret, token } = generateApiToken(config.prefix);
|
|
634
699
|
const signingKey = generateApiTokenSigningKey();
|
|
635
|
-
const
|
|
700
|
+
const record = {
|
|
636
701
|
...document,
|
|
637
702
|
createdBy: String(currentUser.id),
|
|
638
703
|
publicId,
|
|
@@ -640,12 +705,18 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
640
705
|
secretHash: hashApiTokenSecret(secret),
|
|
641
706
|
signingKeyEncrypted: this.encryptSigningKey(signingKey),
|
|
642
707
|
updatedBy: String(currentUser.id),
|
|
643
|
-
}
|
|
708
|
+
};
|
|
709
|
+
if (this.tokenStore) {
|
|
710
|
+
return { apiToken: this.toInfo(await this.tokenStore.insert(record)), signingKey, token };
|
|
711
|
+
}
|
|
712
|
+
const created = await this.apiTokenModel.create(record);
|
|
644
713
|
return { apiToken: this.toInfo(created.toObject()), signingKey, token };
|
|
645
714
|
}
|
|
646
715
|
|
|
647
716
|
protected async list(filter: Record<string, unknown>): Promise<ApiTokenInfo[]> {
|
|
648
|
-
const tokens =
|
|
717
|
+
const tokens = this.tokenStore
|
|
718
|
+
? await this.tokenStore.find(toNeutralFilter(filter), { sort: { createdAt: -1 } })
|
|
719
|
+
: await this.apiTokenModel.find(filter).sort({ createdAt: -1 }).lean().exec();
|
|
649
720
|
return tokens.map((token) => this.toInfo(token));
|
|
650
721
|
}
|
|
651
722
|
|
|
@@ -654,10 +725,10 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
654
725
|
$set: Record<string, unknown>,
|
|
655
726
|
currentUser: any,
|
|
656
727
|
): Promise<ApiTokenInfo> {
|
|
657
|
-
const
|
|
658
|
-
|
|
659
|
-
.
|
|
660
|
-
.exec();
|
|
728
|
+
const update = { $set: { ...$set, updatedBy: String(currentUser.id) } };
|
|
729
|
+
const updated = this.tokenStore
|
|
730
|
+
? await this.tokenStore.updateOne(toNeutralFilter(filter), update)
|
|
731
|
+
: await this.apiTokenModel.findOneAndUpdate(filter, update, { returnDocument: 'after' }).lean().exec();
|
|
661
732
|
if (!updated) {
|
|
662
733
|
throw new NotFoundException('API token not found');
|
|
663
734
|
}
|
|
@@ -665,19 +736,21 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
665
736
|
}
|
|
666
737
|
|
|
667
738
|
protected async applyRevoke(filter: Record<string, unknown>, currentUser: any): Promise<ApiTokenInfo> {
|
|
668
|
-
const
|
|
669
|
-
|
|
670
|
-
|
|
671
|
-
|
|
672
|
-
|
|
673
|
-
|
|
674
|
-
|
|
675
|
-
|
|
739
|
+
const revocation = { $set: { revokedAt: new Date(), updatedBy: String(currentUser.id) } };
|
|
740
|
+
const tokens = this.tokenStore;
|
|
741
|
+
const revoked = tokens
|
|
742
|
+
? await tokens.updateOne(toNeutralFilter({ ...filter, revokedAt: null }), revocation)
|
|
743
|
+
: await this.apiTokenModel
|
|
744
|
+
.findOneAndUpdate({ ...filter, revokedAt: null }, revocation, { returnDocument: 'after' })
|
|
745
|
+
.lean()
|
|
746
|
+
.exec();
|
|
676
747
|
if (revoked) {
|
|
677
748
|
return this.toInfo(revoked);
|
|
678
749
|
}
|
|
679
750
|
// Already revoked: answer with the current state rather than an error.
|
|
680
|
-
const existing =
|
|
751
|
+
const existing = tokens
|
|
752
|
+
? await tokens.findOne(toNeutralFilter(filter))
|
|
753
|
+
: await this.apiTokenModel.findOne(filter).lean().exec();
|
|
681
754
|
if (!existing) {
|
|
682
755
|
throw new NotFoundException('API token not found');
|
|
683
756
|
}
|
|
@@ -685,7 +758,9 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
685
758
|
}
|
|
686
759
|
|
|
687
760
|
protected async applyDelete(filter: Record<string, unknown>): Promise<ApiTokenInfo> {
|
|
688
|
-
const deleted =
|
|
761
|
+
const deleted = this.tokenStore
|
|
762
|
+
? await this.tokenStore.deleteOne(toNeutralFilter(filter))
|
|
763
|
+
: await this.apiTokenModel.findOneAndDelete(filter).lean().exec();
|
|
689
764
|
if (!deleted) {
|
|
690
765
|
throw new NotFoundException('API token not found');
|
|
691
766
|
}
|
|
@@ -705,7 +780,7 @@ export class CoreApiTokenService implements OnModuleDestroy, OnModuleInit {
|
|
|
705
780
|
if (typeof tokenId !== 'string' || !/^[0-9a-f]{24}$/i.test(tokenId)) {
|
|
706
781
|
throw new NotFoundException('API token not found');
|
|
707
782
|
}
|
|
708
|
-
return
|
|
783
|
+
return newObjectId(tokenId);
|
|
709
784
|
}
|
|
710
785
|
|
|
711
786
|
protected commonUpdate(input: IUpdateApiTokenInput, config: IResolvedApiTokenConfig): Record<string, unknown> {
|
|
@@ -9,6 +9,7 @@ import { CoreRedisService } from '../../common/services/core-redis.service.js';
|
|
|
9
9
|
import { AuthGuardStrategy } from './auth-guard-strategy.enum.js';
|
|
10
10
|
import { LegacyAuthRateLimitGuard } from './guards/legacy-auth-rate-limit.guard.js';
|
|
11
11
|
import { RolesGuardRegistry } from './guards/roles-guard-registry.js';
|
|
12
|
+
import { ROLE_GUARD } from './guards/role-guard.token.js';
|
|
12
13
|
import { RolesGuard } from './guards/roles.guard.js';
|
|
13
14
|
import { CoreAuthUserService } from './services/core-auth-user.service.js';
|
|
14
15
|
import { CoreAuthService } from './services/core-auth.service.js';
|
|
@@ -59,6 +60,7 @@ export class CoreAuthModule {
|
|
|
59
60
|
return [
|
|
60
61
|
RolesGuard, // Register as regular provider first
|
|
61
62
|
{ provide: APP_GUARD, useExisting: RolesGuard }, // Reference the registered provider
|
|
63
|
+
{ provide: ROLE_GUARD, useExisting: RolesGuard }, // How CoreTenantGuard reaches it
|
|
62
64
|
];
|
|
63
65
|
})();
|
|
64
66
|
|
|
@@ -76,9 +76,10 @@ export class LegacyAuthRateLimitGuard implements CanActivate {
|
|
|
76
76
|
const request = context.switchToHttp().getRequest();
|
|
77
77
|
const ip = this.getClientIp(request);
|
|
78
78
|
|
|
79
|
-
//
|
|
80
|
-
|
|
81
|
-
|
|
79
|
+
// The handler, never the URL: the URL carries the query string and the client's spelling of the path
|
|
80
|
+
// (Express routes case-insensitively and ignores a trailing slash), so every variant was a fresh bucket and
|
|
81
|
+
// `/auth/signin?n=1`, `?n=2`, … guessed passwords without ever reaching the limit.
|
|
82
|
+
const endpoint = context.getHandler()?.name || 'unknown';
|
|
82
83
|
|
|
83
84
|
return { endpoint, ip };
|
|
84
85
|
}
|
|
@@ -0,0 +1,7 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* DI token under which the module that registers the global role guard (`RolesGuard` in `CoreAuthModule`,
|
|
3
|
+
* `BetterAuthRolesGuard` in `CoreBetterAuthModule`) also provides it — so `CoreTenantGuard` reaches the role guard of
|
|
4
|
+
* its own application without importing it. Import-free leaf (see `.claude/rules/architecture.md` → "DI Token
|
|
5
|
+
* Placement (SWC-Safe)").
|
|
6
|
+
*/
|
|
7
|
+
export const ROLE_GUARD = 'LtRoleGuard';
|
|
@@ -130,16 +130,30 @@ export class CoreAuthService {
|
|
|
130
130
|
throw new UnauthorizedException(ErrorCode.INVALID_TOKEN);
|
|
131
131
|
}
|
|
132
132
|
|
|
133
|
+
// A device is ended by writing `null` for it, not by deleting its key: update() MERGES the input into the stored
|
|
134
|
+
// record, so a key that is merely missing from the input survives — and with it the refresh token this logout
|
|
135
|
+
// must end. `validateUser()` reads a `null` device as "not signed in".
|
|
136
|
+
const ended = (deviceIds: string[]) => Object.fromEntries(deviceIds.map((id) => [id, null]));
|
|
137
|
+
|
|
133
138
|
// Logout from all devices
|
|
134
139
|
if (serviceOptions.allDevices) {
|
|
140
|
+
const deviceIds = Object.keys(user.refreshTokens);
|
|
135
141
|
user.refreshTokens = {};
|
|
136
|
-
await this.userService.update(
|
|
142
|
+
await this.userService.update(
|
|
143
|
+
user.id,
|
|
144
|
+
{ refreshTokens: ended(deviceIds), tempTokens: ended(Object.keys(user.tempTokens ?? {})) },
|
|
145
|
+
serviceOptions,
|
|
146
|
+
);
|
|
137
147
|
return true;
|
|
138
148
|
}
|
|
139
149
|
|
|
140
150
|
// Logout from specific devices
|
|
141
151
|
delete user.refreshTokens[deviceId];
|
|
142
|
-
await this.userService.update(
|
|
152
|
+
await this.userService.update(
|
|
153
|
+
user.id,
|
|
154
|
+
{ refreshTokens: ended([deviceId]), tempTokens: ended([deviceId]) },
|
|
155
|
+
serviceOptions,
|
|
156
|
+
);
|
|
143
157
|
return true;
|
|
144
158
|
}
|
|
145
159
|
|
|
@@ -673,7 +673,7 @@ In JWT mode (`cookies: false`), the server stores WebAuthn challenges in the dat
|
|
|
673
673
|
|
|
674
674
|
| Mode | Challenge Storage | Client Approach |
|
|
675
675
|
| ----------------------------------- | -------------------------------------------------- | ----------------------- |
|
|
676
|
-
| Cookie (`cookies: true` or not set) | Cookie (`
|
|
676
|
+
| Cookie (`cookies: true` or not set) | Cookie (`iam.better-auth-passkey`) | Either approach works |
|
|
677
677
|
| JWT (`cookies: false`) | Database with `challengeId` mapping (auto-enabled) | **Must use composable** |
|
|
678
678
|
|
|
679
679
|
**Note:** Database challenge storage is automatically enabled when `options.cookies: false` is set. No additional configuration is required.
|
|
@@ -1083,6 +1083,15 @@ social sign-in after the upgrade — see
|
|
|
1083
1083
|
> `providerId` alone on purpose, so they keep working on rows the backfill has not reached yet —
|
|
1084
1084
|
> which matters most when the backfill has failed.
|
|
1085
1085
|
|
|
1086
|
+
### Storage on a SQL source
|
|
1087
|
+
|
|
1088
|
+
When the user model (table `users`) is routed to a SQL source through `database`, Better-Auth follows it: it runs its
|
|
1089
|
+
built-in Kysely adapter on that source's application pool and shares ONE `users` row per user with the user model.
|
|
1090
|
+
Its tables are snake_case (`session`, `account`, `verification`, `jwks`, `two_factor`, `passkey`), ids keep the
|
|
1091
|
+
ObjectId format, and its migrations run at boot as the owner (`database.ownerUrl`) — without an owner connection the
|
|
1092
|
+
boot stops while any are pending. The two MongoDB steps above are skipped there. Nothing is copied from MongoDB.
|
|
1093
|
+
Details: `.claude/rules/better-auth.md` §11.
|
|
1094
|
+
|
|
1086
1095
|
---
|
|
1087
1096
|
|
|
1088
1097
|
## Module Setup
|
|
@@ -1757,7 +1766,7 @@ const legacyToken = await authService.signIn({ email, password });
|
|
|
1757
1766
|
|
|
1758
1767
|
### Key Points
|
|
1759
1768
|
|
|
1760
|
-
1. **Shared Users Collection**: Both systems use the same `users` MongoDB
|
|
1769
|
+
1. **Shared Users Collection**: Both systems use the same `users` collection — on MongoDB, or one `users` table when the user model is routed to a SQL source (see [Storage on a SQL source](#storage-on-a-sql-source))
|
|
1761
1770
|
2. **bcrypt Compatibility**: Both systems use bcrypt - passwords work with either system
|
|
1762
1771
|
3. **User Linking**: When a user logs in via Better-Auth, `iamId` is set to link them
|
|
1763
1772
|
4. **Role Preservation**: User roles work with both systems
|