@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
|
@@ -10,24 +10,31 @@ import {
|
|
|
10
10
|
Type,
|
|
11
11
|
} from '@nestjs/common';
|
|
12
12
|
import { APP_GUARD } from '@nestjs/core';
|
|
13
|
-
import { getConnectionToken } from '
|
|
14
|
-
import
|
|
13
|
+
import { getConnectionToken } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
14
|
+
import type { Connection } from 'mongoose';
|
|
15
15
|
|
|
16
16
|
import { maskEmail } from '../../common/helpers/logging.helper.js';
|
|
17
|
+
import { getPersistenceRuntime } from '../../common/persistence/persistence-runtime.registry.js';
|
|
17
18
|
import { IBetterAuth, ICorsConfig } from '../../common/interfaces/server-options.interface.js';
|
|
18
19
|
import { BrevoService } from '../../common/services/brevo.service.js';
|
|
19
20
|
import { ConfigService } from '../../common/services/config.service.js';
|
|
20
21
|
import { RolesGuardRegistry } from '../auth/guards/roles-guard-registry.js';
|
|
22
|
+
import { ROLE_GUARD } from '../auth/guards/role-guard.token.js';
|
|
21
23
|
import { isLegacyEndpointEnabled } from '../auth/helpers/legacy-endpoints.helper.js';
|
|
22
24
|
import { BetterAuthRolesGuard } from './better-auth-roles.guard.js';
|
|
23
25
|
import { BetterAuthTokenService } from './better-auth-token.service.js';
|
|
24
26
|
import {
|
|
25
27
|
AuthEmailCallbackOptions,
|
|
26
28
|
BetterAuthInstance,
|
|
29
|
+
buildBetterAuthOptions,
|
|
30
|
+
type CreateBetterAuthOptions,
|
|
27
31
|
CreateBetterAuthResult,
|
|
28
|
-
|
|
32
|
+
instantiateBetterAuth,
|
|
29
33
|
OnPasswordResetCallback,
|
|
30
34
|
} from './better-auth.config.js';
|
|
35
|
+
import { applyBetterAuthSchema } from './better-auth-sql.helper.js';
|
|
36
|
+
import { getBetterAuthSqlStore, setBetterAuthSqlStore } from './core-better-auth-sql.registry.js';
|
|
37
|
+
import { BetterAuthSqlStore, type IamSqlQueryable } from './core-better-auth-sql.store.js';
|
|
31
38
|
import { DefaultBetterAuthResolver } from './better-auth.resolver.js';
|
|
32
39
|
import { CoreBetterAuthApiMiddleware } from './core-better-auth-api.middleware.js';
|
|
33
40
|
import { CoreBetterAuthChallengeService } from './core-better-auth-challenge.service.js';
|
|
@@ -48,6 +55,8 @@ import {
|
|
|
48
55
|
} from './core-better-auth.registry.js';
|
|
49
56
|
import { CoreBetterAuthResolver } from './core-better-auth.resolver.js';
|
|
50
57
|
import { CoreBetterAuthService } from './core-better-auth.service.js';
|
|
58
|
+
import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
59
|
+
import { requireMongoPackages } from '../../common/persistence/mongo/mongo-packages.js';
|
|
51
60
|
|
|
52
61
|
/**
|
|
53
62
|
* @deprecated Import from `./core-better-auth.constants` instead. Re-exported only
|
|
@@ -464,6 +473,38 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
464
473
|
}
|
|
465
474
|
}
|
|
466
475
|
|
|
476
|
+
/**
|
|
477
|
+
* Better-Auth on the database the `users` table lives in (one row per user, shared with the user model): on a SQL
|
|
478
|
+
* source its adapter runs on that source's application pool, and its tables are brought up to date before the
|
|
479
|
+
* instance exists — Better-Auth validates its schema as it starts.
|
|
480
|
+
*/
|
|
481
|
+
private static async createInstance(options: CreateBetterAuthOptions): Promise<CreateBetterAuthResult | null> {
|
|
482
|
+
const storage = await getPersistenceRuntime()?.iamStorage();
|
|
483
|
+
setBetterAuthSqlStore(undefined);
|
|
484
|
+
const built = buildBetterAuthOptions({ ...options, sqlPool: storage?.pool });
|
|
485
|
+
if (!built) {
|
|
486
|
+
return null;
|
|
487
|
+
}
|
|
488
|
+
if (storage) {
|
|
489
|
+
await applyBetterAuthSchema(built.options, storage);
|
|
490
|
+
}
|
|
491
|
+
const result = instantiateBetterAuth(built);
|
|
492
|
+
if (storage) {
|
|
493
|
+
setBetterAuthSqlStore(new BetterAuthSqlStore(storage.users, result.instance, storage.pool as IamSqlQueryable));
|
|
494
|
+
}
|
|
495
|
+
return result;
|
|
496
|
+
}
|
|
497
|
+
|
|
498
|
+
/** The MongoDB database Better-Auth's adapter runs on, once the connection is up */
|
|
499
|
+
private static async mongoDatabase(): Promise<unknown> {
|
|
500
|
+
await this.waitForMongoConnection();
|
|
501
|
+
const db = requireMongoPackages('Better-Auth on MongoDB').mongoose.connection.db;
|
|
502
|
+
if (!db) {
|
|
503
|
+
throw new Error('MongoDB database not available');
|
|
504
|
+
}
|
|
505
|
+
return db;
|
|
506
|
+
}
|
|
507
|
+
|
|
467
508
|
/**
|
|
468
509
|
* Waits for mongoose connection to be ready using polling
|
|
469
510
|
* This is more reliable than event-based waiting in test environments
|
|
@@ -472,6 +513,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
472
513
|
private static async waitForMongoConnection(): Promise<void> {
|
|
473
514
|
const maxAttempts = 60; // 60 attempts * 500ms = 30 seconds max
|
|
474
515
|
const pollInterval = 500;
|
|
516
|
+
const { mongoose } = requireMongoPackages('Better-Auth on MongoDB (the user model is not routed to a SQL source)');
|
|
475
517
|
|
|
476
518
|
for (let attempt = 0; attempt < maxAttempts; attempt++) {
|
|
477
519
|
// Check if already connected
|
|
@@ -687,12 +729,9 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
687
729
|
// Enable middleware registration
|
|
688
730
|
this.betterAuthEnabled = true;
|
|
689
731
|
|
|
690
|
-
|
|
691
|
-
|
|
692
|
-
const db =
|
|
693
|
-
if (!db) {
|
|
694
|
-
throw new Error('MongoDB database not available');
|
|
695
|
-
}
|
|
732
|
+
// On a SQL source Better-Auth runs on that source's pool (createInstance()); MongoDB is neither awaited
|
|
733
|
+
// nor needed then — a project on PostgreSQL alone has none
|
|
734
|
+
const db = (await getPersistenceRuntime()?.iamStorage()) ? undefined : await this.mongoDatabase();
|
|
696
735
|
|
|
697
736
|
this.configServiceInstance = configService;
|
|
698
737
|
|
|
@@ -706,7 +745,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
706
745
|
|
|
707
746
|
// Note: Secret validation is now handled in createBetterAuthInstance
|
|
708
747
|
// with fallback to jwt.secret, jwt.refresh.secret, or auto-generation
|
|
709
|
-
const result =
|
|
748
|
+
const result = await this.createInstance({
|
|
710
749
|
config,
|
|
711
750
|
db,
|
|
712
751
|
fallbackSecrets,
|
|
@@ -802,6 +841,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
802
841
|
*/
|
|
803
842
|
static reset(): void {
|
|
804
843
|
this.authInstance = null;
|
|
844
|
+
setBetterAuthSqlStore(undefined);
|
|
805
845
|
this.initialized = false;
|
|
806
846
|
this.initLogged = false;
|
|
807
847
|
this.betterAuthEnabled = false;
|
|
@@ -894,12 +934,16 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
894
934
|
// This callback is called by Better-Auth when email is verified
|
|
895
935
|
// Sync nest-server's verified/verifiedAt fields with Better-Auth's emailVerified
|
|
896
936
|
try {
|
|
937
|
+
const sql = getBetterAuthSqlStore();
|
|
897
938
|
const db = this.mongoConnection?.db;
|
|
898
|
-
if (
|
|
899
|
-
|
|
939
|
+
if (sql) {
|
|
940
|
+
// One row per user on SQL: Better-Auth's user id is the row's id
|
|
941
|
+
await sql.updateUser({ id: userId }, { verified: true, verifiedAt: new Date() });
|
|
942
|
+
this.logger.debug(`Email verified for user ${userId} - synced verified/verifiedAt`);
|
|
943
|
+
} else if (db) {
|
|
900
944
|
await db
|
|
901
945
|
.collection('users')
|
|
902
|
-
.updateOne({ _id:
|
|
946
|
+
.updateOne({ _id: newObjectId(userId) }, { $set: { verified: true, verifiedAt: new Date() } });
|
|
903
947
|
this.logger.debug(`Email verified for user ${userId} - synced verified/verifiedAt`);
|
|
904
948
|
} else {
|
|
905
949
|
this.logger.warn(`Cannot sync verifiedAt for user ${userId} - no database connection`);
|
|
@@ -1040,7 +1084,7 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
1040
1084
|
inject: [getConnectionToken(), CoreBetterAuthEmailVerificationService, ConfigService],
|
|
1041
1085
|
provide: BETTER_AUTH_INSTANCE,
|
|
1042
1086
|
useFactory: async (
|
|
1043
|
-
connection: Connection,
|
|
1087
|
+
connection: Connection | null,
|
|
1044
1088
|
emailVerificationService: CoreBetterAuthEmailVerificationService,
|
|
1045
1089
|
configService: ConfigService,
|
|
1046
1090
|
) => {
|
|
@@ -1067,26 +1111,13 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
1067
1111
|
serverEnv: options?.serverEnv,
|
|
1068
1112
|
};
|
|
1069
1113
|
|
|
1070
|
-
//
|
|
1071
|
-
|
|
1072
|
-
const
|
|
1073
|
-
|
|
1074
|
-
|
|
1075
|
-
await this.
|
|
1076
|
-
|
|
1077
|
-
if (!globalDb) {
|
|
1078
|
-
throw new Error('MongoDB database not available');
|
|
1079
|
-
}
|
|
1080
|
-
result = createBetterAuthInstance({
|
|
1081
|
-
...sharedInstanceOptions,
|
|
1082
|
-
db: globalDb,
|
|
1083
|
-
});
|
|
1084
|
-
} else {
|
|
1085
|
-
result = createBetterAuthInstance({
|
|
1086
|
-
...sharedInstanceOptions,
|
|
1087
|
-
db,
|
|
1088
|
-
});
|
|
1089
|
-
}
|
|
1114
|
+
// On a SQL source Better-Auth runs on that source's pool; on MongoDB on the injected connection, falling
|
|
1115
|
+
// back to the global mongoose connection while its database is not yet available
|
|
1116
|
+
const sqlStorage = await getPersistenceRuntime()?.iamStorage();
|
|
1117
|
+
const result: CreateBetterAuthResult | null = await this.createInstance({
|
|
1118
|
+
...sharedInstanceOptions,
|
|
1119
|
+
db: sqlStorage ? undefined : (connection?.db ?? (await this.mongoDatabase())),
|
|
1120
|
+
});
|
|
1090
1121
|
this.authInstance = result?.instance ?? null;
|
|
1091
1122
|
this.resolvedCookieDomain = result?.cookieDomain;
|
|
1092
1123
|
|
|
@@ -1163,7 +1194,12 @@ export class CoreBetterAuthModule implements NestModule, OnModuleInit {
|
|
|
1163
1194
|
...(this.shouldRegisterRolesGuardGlobally && !RolesGuardRegistry.isRegistered()
|
|
1164
1195
|
? (() => {
|
|
1165
1196
|
RolesGuardRegistry.markRegistered('CoreBetterAuthModule');
|
|
1166
|
-
return [
|
|
1197
|
+
return [
|
|
1198
|
+
BetterAuthRolesGuard,
|
|
1199
|
+
{ provide: APP_GUARD, useExisting: BetterAuthRolesGuard },
|
|
1200
|
+
// How CoreTenantGuard reaches it
|
|
1201
|
+
{ provide: ROLE_GUARD, useExisting: BetterAuthRolesGuard },
|
|
1202
|
+
];
|
|
1167
1203
|
})()
|
|
1168
1204
|
: []),
|
|
1169
1205
|
],
|
|
@@ -4,10 +4,11 @@ import {
|
|
|
4
4
|
Injectable,
|
|
5
5
|
Logger,
|
|
6
6
|
OnApplicationBootstrap,
|
|
7
|
+
OnModuleDestroy,
|
|
7
8
|
OnModuleInit,
|
|
8
9
|
Optional,
|
|
9
10
|
} from '@nestjs/common';
|
|
10
|
-
import { InjectConnection } from '
|
|
11
|
+
import { InjectConnection } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
11
12
|
import {
|
|
12
13
|
freshSessionMiddleware,
|
|
13
14
|
requestOnlySessionMiddleware,
|
|
@@ -19,6 +20,7 @@ import { importJWK, jwtVerify } from 'jose';
|
|
|
19
20
|
import type { Connection } from 'mongoose';
|
|
20
21
|
|
|
21
22
|
import { shouldConvertSessionTokenToJwt } from '../../common/helpers/cookies.helper.js';
|
|
23
|
+
import { type ExpirySweep, scheduleExpirySweep } from '../../common/persistence/expiry-sweep.js';
|
|
22
24
|
import { maskEmail, maskToken } from '../../common/helpers/logging.helper.js';
|
|
23
25
|
import { type IBetterAuth, ICookiesConfig } from '../../common/interfaces/server-options.interface.js';
|
|
24
26
|
import { ConfigService } from '../../common/services/config.service.js';
|
|
@@ -47,6 +49,7 @@ import {
|
|
|
47
49
|
DEFAULT_ACCOUNT_ISSUER_FIELD,
|
|
48
50
|
DEFAULT_ACCOUNT_MODEL_NAME,
|
|
49
51
|
} from './core-better-auth.constants.js';
|
|
52
|
+
import { getBetterAuthSqlStore } from './core-better-auth-sql.registry.js';
|
|
50
53
|
|
|
51
54
|
/**
|
|
52
55
|
* Result of a session validation
|
|
@@ -103,8 +106,9 @@ export { BETTER_AUTH_CONFIG, BETTER_AUTH_COOKIE_DOMAIN } from './core-better-aut
|
|
|
103
106
|
* ```
|
|
104
107
|
*/
|
|
105
108
|
@Injectable()
|
|
106
|
-
export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleInit {
|
|
109
|
+
export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleDestroy, OnModuleInit {
|
|
107
110
|
private readonly logger = new Logger(CoreBetterAuthService.name);
|
|
111
|
+
protected expirySweep?: ExpirySweep;
|
|
108
112
|
private readonly config: IBetterAuth;
|
|
109
113
|
private openApiSchema: IBetterAuthOpenApiDocument | undefined;
|
|
110
114
|
private unavailableOperations: Set<string> | undefined;
|
|
@@ -145,7 +149,8 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
145
149
|
* better-auth pin yet therefore keeps working exactly as before.
|
|
146
150
|
*/
|
|
147
151
|
async onModuleInit(): Promise<void> {
|
|
148
|
-
|
|
152
|
+
// Both steps concern MongoDB's collections: on a SQL source Better-Auth's migrator created the tables and indices
|
|
153
|
+
if (!this.isEnabled() || !this.connection?.db || getBetterAuthSqlStore()) return;
|
|
149
154
|
|
|
150
155
|
await this.ensureIndices();
|
|
151
156
|
if (usesLegacyAccountIssuer()) {
|
|
@@ -164,6 +169,34 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
164
169
|
*/
|
|
165
170
|
async onApplicationBootstrap(): Promise<void> {
|
|
166
171
|
await this.prepareOpenApiSchema();
|
|
172
|
+
this.startExpirySweep();
|
|
173
|
+
}
|
|
174
|
+
|
|
175
|
+
async onModuleDestroy(): Promise<void> {
|
|
176
|
+
// Before the data sources close their connections (onApplicationShutdown)
|
|
177
|
+
await this.expirySweep?.stop();
|
|
178
|
+
}
|
|
179
|
+
|
|
180
|
+
/**
|
|
181
|
+
* On a SQL source, removes expired sessions and verification values periodically (`scheduleExpirySweep()`): there is
|
|
182
|
+
* no TTL index, and Better-Auth deletes neither an expired session nor, unless one is looked up, an expired
|
|
183
|
+
* verification value. MongoDB keeps its TTL index and gets no sweep.
|
|
184
|
+
*/
|
|
185
|
+
protected startExpirySweep(): void {
|
|
186
|
+
const sql = getBetterAuthSqlStore();
|
|
187
|
+
if (!this.isEnabled() || !sql || this.expirySweep) {
|
|
188
|
+
return;
|
|
189
|
+
}
|
|
190
|
+
this.expirySweep = scheduleExpirySweep(
|
|
191
|
+
'iam',
|
|
192
|
+
async () => {
|
|
193
|
+
const { sessions, verificationValues } = await sql.deleteExpired();
|
|
194
|
+
if (sessions || verificationValues) {
|
|
195
|
+
this.logger.debug(`Removed ${sessions} expired session(s) and ${verificationValues} verification value(s)`);
|
|
196
|
+
}
|
|
197
|
+
},
|
|
198
|
+
{ logger: this.logger },
|
|
199
|
+
);
|
|
167
200
|
}
|
|
168
201
|
|
|
169
202
|
/**
|
|
@@ -1087,7 +1120,14 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
1087
1120
|
* @returns Session and user data, or null if not found/expired
|
|
1088
1121
|
*/
|
|
1089
1122
|
async getSessionByToken(token: string): Promise<SessionResult> {
|
|
1090
|
-
if (!this.isEnabled()
|
|
1123
|
+
if (!this.isEnabled()) {
|
|
1124
|
+
return { session: null, user: null };
|
|
1125
|
+
}
|
|
1126
|
+
const sql = getBetterAuthSqlStore();
|
|
1127
|
+
if (sql) {
|
|
1128
|
+
return this.liveSession(() => sql.findSession(token), 'getSessionByToken');
|
|
1129
|
+
}
|
|
1130
|
+
if (!this.connection?.db) {
|
|
1091
1131
|
return { session: null, user: null };
|
|
1092
1132
|
}
|
|
1093
1133
|
|
|
@@ -1183,7 +1223,14 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
1183
1223
|
* @returns Session result with token, or null if no active session exists
|
|
1184
1224
|
*/
|
|
1185
1225
|
async getActiveSessionForUser(userId: string): Promise<SessionResult> {
|
|
1186
|
-
if (!this.isEnabled()
|
|
1226
|
+
if (!this.isEnabled()) {
|
|
1227
|
+
return { session: null, user: null };
|
|
1228
|
+
}
|
|
1229
|
+
const sql = getBetterAuthSqlStore();
|
|
1230
|
+
if (sql) {
|
|
1231
|
+
return this.liveSession(() => sql.findActiveSession(userId), 'getActiveSessionForUser');
|
|
1232
|
+
}
|
|
1233
|
+
if (!this.connection?.db) {
|
|
1187
1234
|
return { session: null, user: null };
|
|
1188
1235
|
}
|
|
1189
1236
|
|
|
@@ -1259,6 +1306,23 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
1259
1306
|
}
|
|
1260
1307
|
}
|
|
1261
1308
|
|
|
1309
|
+
/**
|
|
1310
|
+
* A session from the SQL store, refused once expired — the check the MongoDB lookups make on the document
|
|
1311
|
+
*/
|
|
1312
|
+
protected async liveSession(lookup: () => Promise<null | SessionResult>, caller: string): Promise<SessionResult> {
|
|
1313
|
+
try {
|
|
1314
|
+
const found = await lookup();
|
|
1315
|
+
if (!found?.session || (found.session.expiresAt && new Date(found.session.expiresAt) < new Date())) {
|
|
1316
|
+
this.logger.debug(`${caller}: no live session`);
|
|
1317
|
+
return { session: null, user: null };
|
|
1318
|
+
}
|
|
1319
|
+
return found;
|
|
1320
|
+
} catch (error) {
|
|
1321
|
+
this.logger.debug(`${caller} error: ${error instanceof Error ? error.message : 'Unknown error'}`);
|
|
1322
|
+
return { session: null, user: null };
|
|
1323
|
+
}
|
|
1324
|
+
}
|
|
1325
|
+
|
|
1262
1326
|
// ===================================================================================================================
|
|
1263
1327
|
// User Lookup Methods
|
|
1264
1328
|
// ===================================================================================================================
|
|
@@ -1353,8 +1417,8 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
1353
1417
|
return this.verifyHs256Token(token);
|
|
1354
1418
|
}
|
|
1355
1419
|
|
|
1356
|
-
// For asymmetric algorithms (EdDSA, RS256, ES256), use JWKS
|
|
1357
|
-
if (kid
|
|
1420
|
+
// For asymmetric algorithms (EdDSA, RS256, ES256), use JWKS — from MongoDB or the SQL source, whichever holds them
|
|
1421
|
+
if (kid) {
|
|
1358
1422
|
return this.verifyJwksToken(token, kid, alg);
|
|
1359
1423
|
}
|
|
1360
1424
|
|
|
@@ -1412,17 +1476,22 @@ export class CoreBetterAuthService implements OnApplicationBootstrap, OnModuleIn
|
|
|
1412
1476
|
email?: string;
|
|
1413
1477
|
sub: string;
|
|
1414
1478
|
}> {
|
|
1415
|
-
|
|
1479
|
+
const sql = getBetterAuthSqlStore();
|
|
1480
|
+
if (!this.connection && !sql) {
|
|
1416
1481
|
this.logger.debug('JWKS verification failed: no database connection');
|
|
1417
1482
|
return null;
|
|
1418
1483
|
}
|
|
1419
1484
|
|
|
1420
1485
|
try {
|
|
1421
|
-
// Fetch the JWKS public key from database
|
|
1422
|
-
const jwksCollection = this.connection
|
|
1423
|
-
let keyRecord = await jwksCollection
|
|
1486
|
+
// Fetch the JWKS public key from database (on SQL through Better-Auth's adapter, by its logical names)
|
|
1487
|
+
const jwksCollection = this.connection?.collection('jwks');
|
|
1488
|
+
let keyRecord = sql ? await sql.findJwk(kid) : await jwksCollection?.findOne({ id: kid });
|
|
1424
1489
|
|
|
1425
|
-
if (!keyRecord) {
|
|
1490
|
+
if (!keyRecord && sql) {
|
|
1491
|
+
this.logger.debug(`No JWKS key found for kid: ${kid}`);
|
|
1492
|
+
return null;
|
|
1493
|
+
}
|
|
1494
|
+
if (!keyRecord && jwksCollection) {
|
|
1426
1495
|
// Try with _id as fallback (MongoDB ObjectId)
|
|
1427
1496
|
const allKeys = await jwksCollection.find({}).toArray();
|
|
1428
1497
|
const matchingKey = allKeys.find((k) => k.id === kid || k._id?.toString() === kid);
|
|
@@ -57,6 +57,16 @@ and pages over them, `checkRights()` reads them per request. A directory listing
|
|
|
57
57
|
that, and sidecar files would reinvent an index the database already is. So `'filesystem'` moves the
|
|
58
58
|
bytes off the database, not the bookkeeping.
|
|
59
59
|
|
|
60
|
+
**Which database holds it follows `database`** (db-agnostic phase 4). The S3 and filesystem metadata
|
|
61
|
+
are two framework models, `CoreS3File` and `CoreFilesystemFile`: on MongoDB the collections `s3-files`
|
|
62
|
+
and `filesystem-files` as before, on a SQL default source (or with `database.models` naming another
|
|
63
|
+
source) the tables `s3_files` and `filesystem_files`. Nothing changes in a project's `FileModule`.
|
|
64
|
+
Code of your own that reads that metadata uses `fileMetadataCollection(connection, 's3' | 'filesystem')`
|
|
65
|
+
— it answers the collection or the table behind the same operations — never `connection.db.collection('s3-files')`,
|
|
66
|
+
which would look at MongoDB while the files are in the table. GridFS keeps bytes and metadata in MongoDB
|
|
67
|
+
(`fs.files`), so without `file.storage` a project whose file metadata is on SQL gets `'filesystem'`
|
|
68
|
+
instead of `'gridfs'`; an explicit `'gridfs'` keeps working while MongoDB is connected.
|
|
69
|
+
|
|
60
70
|
### How an upload reaches S3
|
|
61
71
|
|
|
62
72
|
No upload is read into memory on its way to S3. Which request carries it depends on whether its
|
|
@@ -98,11 +108,14 @@ operator did not believe they were in. Afterwards nobody can tell which file wen
|
|
|
98
108
|
**Leave it unset and it is derived**, most capable first:
|
|
99
109
|
|
|
100
110
|
1. `'s3'` — when `s3.bucket` is configured
|
|
101
|
-
2. `'
|
|
102
|
-
|
|
111
|
+
2. `'filesystem'` — when `database` routes the file metadata to a SQL source (a PostgreSQL default source
|
|
112
|
+
does): GridFS would put bytes and metadata into MongoDB. The directory is pod-local — mount
|
|
113
|
+
`storageDir` as a volume or configure `s3`, or the files are gone after the next restart
|
|
114
|
+
3. `'gridfs'` — when a database is configured
|
|
115
|
+
4. `'filesystem'` — when none is
|
|
103
116
|
|
|
104
117
|
A configured-but-**unreachable** database is an error in its own right (Mongoose fails the boot), never
|
|
105
|
-
a reason to fall through to the disk. Only a database that is not configured **at all** reaches step
|
|
118
|
+
a reason to fall through to the disk. Only a database that is not configured **at all** reaches step 4 —
|
|
106
119
|
which today is theoretical, since `CoreModule` always registers Mongoose.
|
|
107
120
|
|
|
108
121
|
A derived driver is enforced too: `s3.bucket` in the config makes S3 the default, but the bytes still
|
|
@@ -1,10 +1,10 @@
|
|
|
1
1
|
import { ObjectType } from '@nestjs/graphql';
|
|
2
|
-
import { Types } from 'mongoose';
|
|
3
2
|
|
|
4
3
|
import { Restricted } from '../../common/decorators/restricted.decorator.js';
|
|
5
4
|
import { UnifiedField } from '../../common/decorators/unified-field.decorator.js';
|
|
6
5
|
import { RoleEnum } from '../../common/enums/role.enum.js';
|
|
7
6
|
import { CoreModel } from '../../common/models/core-model.model.js';
|
|
7
|
+
import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
8
8
|
|
|
9
9
|
/**
|
|
10
10
|
* File info
|
|
@@ -18,7 +18,7 @@ export class CoreFileInfo extends CoreModel {
|
|
|
18
18
|
|
|
19
19
|
@Restricted(RoleEnum.S_EVERYONE)
|
|
20
20
|
get _id() {
|
|
21
|
-
return
|
|
21
|
+
return newObjectId(this.id);
|
|
22
22
|
}
|
|
23
23
|
|
|
24
24
|
// ===========================================================================
|
|
@@ -1,5 +1,6 @@
|
|
|
1
1
|
import { Logger, NotFoundException } from '@nestjs/common';
|
|
2
|
-
import {
|
|
2
|
+
import type { Connection } from 'mongoose';
|
|
3
|
+
import type { mongo, Types } from 'mongoose';
|
|
3
4
|
import { Readable } from 'stream';
|
|
4
5
|
|
|
5
6
|
import { FilterArgs } from '../../common/args/filter.args.js';
|
|
@@ -9,6 +10,7 @@ import { convertFilterArgsToQuery } from '../../common/helpers/filter.helper.js'
|
|
|
9
10
|
import { GridFSHelper } from '../../common/helpers/gridfs.helper.js';
|
|
10
11
|
import { check } from '../../common/helpers/input.helper.js';
|
|
11
12
|
import { prepareOutput } from '../../common/helpers/service.helper.js';
|
|
13
|
+
import { isWellFormedId } from '../../common/persistence/id-format.js';
|
|
12
14
|
import { ConfigService } from '../../common/services/config.service.js';
|
|
13
15
|
import { RequestContext } from '../../common/services/request-context.service.js';
|
|
14
16
|
import { CoreS3Service } from '../../common/services/core-s3.service.js';
|
|
@@ -25,13 +27,11 @@ import {
|
|
|
25
27
|
logFileStorage,
|
|
26
28
|
resolveFileStorage,
|
|
27
29
|
} from './file-storage.helper.js';
|
|
28
|
-
import {
|
|
29
|
-
|
|
30
|
-
|
|
31
|
-
|
|
32
|
-
|
|
33
|
-
} from './filesystem-file.helper.js';
|
|
34
|
-
import { S3_FILES_COLLECTION, S3FileHelper, S3FileInfo } from './s3-file.helper.js';
|
|
30
|
+
import type { FileCollection } from './file-metadata.helper.js';
|
|
31
|
+
import { fileMetadataCollection } from './file-metadata.store.js';
|
|
32
|
+
import { DEFAULT_FILESYSTEM_DIR, FilesystemFileHelper, FilesystemFileInfo } from './filesystem-file.helper.js';
|
|
33
|
+
import { S3FileHelper, S3FileInfo } from './s3-file.helper.js';
|
|
34
|
+
import { createGridFsBucket } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
35
35
|
|
|
36
36
|
/**
|
|
37
37
|
* Type for checking input
|
|
@@ -56,11 +56,18 @@ export abstract class CoreFileService {
|
|
|
56
56
|
// Use the native MongoDB driver's types (accessed via Mongoose's exports) to avoid BSON version conflicts
|
|
57
57
|
files: mongo.GridFSBucket;
|
|
58
58
|
|
|
59
|
-
/**
|
|
60
|
-
|
|
59
|
+
/**
|
|
60
|
+
* Metadata of the files stored in S3: the `s3-files` collection, or the table of its model when `database` routes it
|
|
61
|
+
* to a SQL source (`fileMetadataCollection()`)
|
|
62
|
+
*/
|
|
63
|
+
protected get s3Files(): FileCollection {
|
|
64
|
+
return fileMetadataCollection(this.connection, 's3');
|
|
65
|
+
}
|
|
61
66
|
|
|
62
|
-
/** Metadata
|
|
63
|
-
protected filesystemFiles:
|
|
67
|
+
/** Metadata of the files stored on the local filesystem: `filesystem-files`, or its table on a SQL source */
|
|
68
|
+
protected get filesystemFiles(): FileCollection {
|
|
69
|
+
return fileMetadataCollection(this.connection, 'filesystem');
|
|
70
|
+
}
|
|
64
71
|
|
|
65
72
|
protected readonly logger = new Logger(CoreFileService.name);
|
|
66
73
|
|
|
@@ -75,10 +82,9 @@ export abstract class CoreFileService {
|
|
|
75
82
|
bucketName = 'fs',
|
|
76
83
|
protected readonly options?: CoreFileServiceOptions,
|
|
77
84
|
) {
|
|
78
|
-
//
|
|
79
|
-
|
|
80
|
-
this.
|
|
81
|
-
this.filesystemFiles = connection.db.collection(FILESYSTEM_FILES_COLLECTION);
|
|
85
|
+
// GridFS needs MongoDB: without a connection (a project on PostgreSQL alone) there is no bucket, the GridFS reads
|
|
86
|
+
// find nothing, and `file.storage: 'gridfs'` fails the boot below as unavailable
|
|
87
|
+
this.files = connection?.db ? createGridFsBucket(connection.db, { bucketName }) : undefined;
|
|
82
88
|
|
|
83
89
|
// Resolve from the global config rather than the optional injected
|
|
84
90
|
// ConfigService: a project on the pre-11.33 constructor (`super(connection)`)
|
|
@@ -123,6 +129,9 @@ export abstract class CoreFileService {
|
|
|
123
129
|
* library and the service wired through `super()`.
|
|
124
130
|
*/
|
|
125
131
|
protected isStorageAvailable(driver: FileStorageDriver): boolean {
|
|
132
|
+
if (driver === 'gridfs') {
|
|
133
|
+
return !!this.files;
|
|
134
|
+
}
|
|
126
135
|
return driver === 's3' ? !!this.options?.s3Service?.enabled : true;
|
|
127
136
|
}
|
|
128
137
|
|
|
@@ -144,14 +153,14 @@ export abstract class CoreFileService {
|
|
|
144
153
|
*
|
|
145
154
|
* Every store keys files by an ObjectId, so a string that is not 24 hex characters — a TUS upload
|
|
146
155
|
* id (which clients took for the file id), a filename, a typo in a URL — names no file. It is
|
|
147
|
-
* answered exactly like an unknown id. Handed to `new ObjectId()` it threw a BSONError instead,
|
|
156
|
+
* answered exactly like an unknown id. Handed to `new Types.ObjectId()` it threw a BSONError instead,
|
|
148
157
|
* and `GET /files/id/<tus-upload-id>` answered 500 where an unknown id gets 404.
|
|
149
158
|
*
|
|
150
159
|
* Only strings are judged: anything else keeps its previous path, so an ObjectId from a second
|
|
151
160
|
* copy of `bson` (where `instanceof` fails) is not suddenly reported as missing.
|
|
152
161
|
*/
|
|
153
162
|
protected isMalformedFileId(id: unknown): boolean {
|
|
154
|
-
return typeof id === 'string' && !(id
|
|
163
|
+
return typeof id === 'string' && !isWellFormedId(id);
|
|
155
164
|
}
|
|
156
165
|
|
|
157
166
|
/**
|
|
@@ -1,4 +1,5 @@
|
|
|
1
|
-
import { mongo, Types } from 'mongoose';
|
|
1
|
+
import type { mongo, Types } from 'mongoose';
|
|
2
|
+
import { newObjectId } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
2
3
|
|
|
3
4
|
/**
|
|
4
5
|
* The metadata shape every non-GridFS storage driver writes, and the queries against it.
|
|
@@ -25,7 +26,10 @@ import { mongo, Types } from 'mongoose';
|
|
|
25
26
|
* `.claude/rules/architecture.md` → "DI Token Placement (SWC-Safe)".
|
|
26
27
|
*/
|
|
27
28
|
|
|
28
|
-
/**
|
|
29
|
+
/**
|
|
30
|
+
* Metadata collection handle — the MongoDB collection, or its table on a SQL source behind the same operations
|
|
31
|
+
* (`fileMetadataCollection()` decides which)
|
|
32
|
+
*/
|
|
29
33
|
export type FileCollection = mongo.Collection<any>;
|
|
30
34
|
|
|
31
35
|
/**
|
|
@@ -70,7 +74,7 @@ export async function findMetadataById(
|
|
|
70
74
|
collection: FileCollection,
|
|
71
75
|
id: string | Types.ObjectId,
|
|
72
76
|
): Promise<FileMetadataInfo | null> {
|
|
73
|
-
return (await collection.findOne({ _id:
|
|
77
|
+
return (await collection.findOne({ _id: newObjectId(id) })) as FileMetadataInfo | null;
|
|
74
78
|
}
|
|
75
79
|
|
|
76
80
|
/**
|
|
@@ -0,0 +1,44 @@
|
|
|
1
|
+
import type { Schema } from 'mongoose';
|
|
2
|
+
|
|
3
|
+
import { createSchema } from '../../common/persistence/mongo/mongoose-compat.js';
|
|
4
|
+
|
|
5
|
+
import { FILESYSTEM_FILES_COLLECTION } from './filesystem-file.helper.js';
|
|
6
|
+
import { S3_FILES_COLLECTION } from './s3-file.helper.js';
|
|
7
|
+
|
|
8
|
+
/**
|
|
9
|
+
* The metadata of files whose bytes live in S3 or on the filesystem, as models — what routes them with `database`
|
|
10
|
+
* like every other model (db-agnostic phase 4). On a SQL default source the rows live in the tables `s3_files` and
|
|
11
|
+
* `filesystem_files`; on MongoDB the file helpers keep reading and writing the collections natively, as before.
|
|
12
|
+
*
|
|
13
|
+
* `autoCreate` and `autoIndex` are off: these schemas only register the models. A deployment that never writes to a
|
|
14
|
+
* store must not grow an empty collection for it (`ensureFilenameIndex()` creates the index on the first write), and
|
|
15
|
+
* nothing may create an index next to the one the helpers ensure. GridFS has no model here: its `fs.files` belongs to
|
|
16
|
+
* the driver and stays on MongoDB.
|
|
17
|
+
*/
|
|
18
|
+
|
|
19
|
+
/** Model of the `s3-files` metadata */
|
|
20
|
+
export const S3_FILE_MODEL = 'CoreS3File';
|
|
21
|
+
|
|
22
|
+
/** Model of the `filesystem-files` metadata */
|
|
23
|
+
export const FILESYSTEM_FILE_MODEL = 'CoreFilesystemFile';
|
|
24
|
+
|
|
25
|
+
/** The shape both stores write — a GridFS `fs.files` document plus the `storage` marker (`FileMetadataInfo`) */
|
|
26
|
+
function fileMetadataSchema(collection: string): Schema {
|
|
27
|
+
return createSchema(
|
|
28
|
+
{
|
|
29
|
+
contentType: { type: String },
|
|
30
|
+
filename: { index: true, type: String },
|
|
31
|
+
length: { type: Number },
|
|
32
|
+
metadata: { type: Object },
|
|
33
|
+
storage: { type: String },
|
|
34
|
+
uploadDate: { type: Date },
|
|
35
|
+
},
|
|
36
|
+
{ autoCreate: false, autoIndex: false, collection, versionKey: false },
|
|
37
|
+
);
|
|
38
|
+
}
|
|
39
|
+
|
|
40
|
+
/** Registered by `CoreModule` through `CorePersistenceModule.forFeature()` */
|
|
41
|
+
export const FILE_METADATA_MODELS = [
|
|
42
|
+
{ name: S3_FILE_MODEL, schema: fileMetadataSchema(S3_FILES_COLLECTION) },
|
|
43
|
+
{ name: FILESYSTEM_FILE_MODEL, schema: fileMetadataSchema(FILESYSTEM_FILES_COLLECTION) },
|
|
44
|
+
];
|