@evara-group/guard 1.0.30 → 2.0.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/README.md +346 -28
- package/dist/common.d.ts +2 -0
- package/dist/common.js +6 -0
- package/dist/common.js.map +1 -0
- package/dist/core/database/switch.schema.d.ts +6 -0
- package/dist/core/database/switch.schema.js +39 -0
- package/dist/core/database/switch.schema.js.map +1 -0
- package/dist/core/enums/user-permission.d.ts +32 -0
- package/dist/core/enums/user-permission.js +37 -0
- package/dist/core/enums/user-permission.js.map +1 -0
- package/dist/core/utils/base.entity.d.ts +1 -0
- package/dist/core/utils/base.entity.js +4 -3
- package/dist/core/utils/base.entity.js.map +1 -1
- package/dist/core/utils/base.migration.d.ts +2 -0
- package/dist/core/utils/base.migration.js +44 -0
- package/dist/core/utils/base.migration.js.map +1 -0
- package/dist/core/utils/guard-base.entity.d.ts +10 -0
- package/dist/core/utils/guard-base.entity.js +46 -0
- package/dist/core/utils/guard-base.entity.js.map +1 -0
- package/dist/core/utils/lower-case.transformer.d.ts +3 -0
- package/dist/core/utils/lower-case.transformer.js +6 -0
- package/dist/core/utils/lower-case.transformer.js.map +1 -0
- package/dist/core/utils/pagination.entity.js.map +1 -1
- package/dist/core/utils/remove-spaces.transformer.d.ts +3 -0
- package/dist/core/utils/remove-spaces.transformer.js +6 -0
- package/dist/core/utils/remove-spaces.transformer.js.map +1 -0
- package/dist/core/utils/request.d.ts +1 -1
- package/dist/database/config/typeorm.config.d.ts +5 -0
- package/dist/database/config/typeorm.config.js +38 -0
- package/dist/database/config/typeorm.config.js.map +1 -0
- package/dist/database/migrations/1765027603465-CreateUserTable.d.ts +6 -0
- package/dist/database/migrations/1765027603465-CreateUserTable.js +63 -0
- package/dist/database/migrations/1765027603465-CreateUserTable.js.map +1 -0
- package/dist/database/migrations/1765042818137-CreateModuleTable.d.ts +6 -0
- package/dist/database/migrations/1765042818137-CreateModuleTable.js +53 -0
- package/dist/database/migrations/1765042818137-CreateModuleTable.js.map +1 -0
- package/dist/database/migrations/1765042839363-CreatepermissionTable.d.ts +6 -0
- package/dist/database/migrations/1765042839363-CreatepermissionTable.js +74 -0
- package/dist/database/migrations/1765042839363-CreatepermissionTable.js.map +1 -0
- package/dist/database/migrations/1765042865354-CreateRoleTable.d.ts +6 -0
- package/dist/database/migrations/1765042865354-CreateRoleTable.js +60 -0
- package/dist/database/migrations/1765042865354-CreateRoleTable.js.map +1 -0
- package/dist/database/migrations/1765042888581-CreateUserTable.d.ts +6 -0
- package/dist/database/migrations/1765042888581-CreateUserTable.js +58 -0
- package/dist/database/migrations/1765042888581-CreateUserTable.js.map +1 -0
- package/dist/database/migrations/1765042926793-CreateUserRoleTable.d.ts +6 -0
- package/dist/database/migrations/1765042926793-CreateUserRoleTable.js +54 -0
- package/dist/database/migrations/1765042926793-CreateUserRoleTable.js.map +1 -0
- package/dist/database/migrations/1765042959694-CreateRolePermissionTable.d.ts +6 -0
- package/dist/database/migrations/1765042959694-CreateRolePermissionTable.js +45 -0
- package/dist/database/migrations/1765042959694-CreateRolePermissionTable.js.map +1 -0
- package/dist/database/migrations/1765042980940-CreateUserPermissionTable.d.ts +6 -0
- package/dist/database/migrations/1765042980940-CreateUserPermissionTable.js +50 -0
- package/dist/database/migrations/1765042980940-CreateUserPermissionTable.js.map +1 -0
- package/dist/database/seeders/auth.seeder.d.ts +12 -0
- package/dist/database/seeders/auth.seeder.js +338 -0
- package/dist/database/seeders/auth.seeder.js.map +1 -0
- package/dist/database/seeders/modules.seeder.d.ts +6 -0
- package/dist/database/seeders/modules.seeder.js +39 -0
- package/dist/database/seeders/modules.seeder.js.map +1 -0
- package/dist/database/seeders/orchestrator.seeder.d.ts +6 -0
- package/dist/database/seeders/orchestrator.seeder.js +32 -0
- package/dist/database/seeders/orchestrator.seeder.js.map +1 -0
- package/dist/database/seeders/permissions.seeder.d.ts +6 -0
- package/dist/database/seeders/permissions.seeder.js +96 -0
- package/dist/database/seeders/permissions.seeder.js.map +1 -0
- package/dist/database/seeders/role-permissions.seeder.d.ts +6 -0
- package/dist/database/seeders/role-permissions.seeder.js +35 -0
- package/dist/database/seeders/role-permissions.seeder.js.map +1 -0
- package/dist/database/seeders/roles.seeder.d.ts +6 -0
- package/dist/database/seeders/roles.seeder.js +33 -0
- package/dist/database/seeders/roles.seeder.js.map +1 -0
- package/dist/database/seeders/run.seeder.d.ts +1 -0
- package/dist/database/seeders/run.seeder.js +82 -0
- package/dist/database/seeders/run.seeder.js.map +1 -0
- package/dist/database/seeders/user-roles.seeder.d.ts +6 -0
- package/dist/database/seeders/user-roles.seeder.js +41 -0
- package/dist/database/seeders/user-roles.seeder.js.map +1 -0
- package/dist/database/seeders/users.seeder.d.ts +6 -0
- package/dist/database/seeders/users.seeder.js +72 -0
- package/dist/database/seeders/users.seeder.js.map +1 -0
- package/dist/index.d.ts +72 -5
- package/dist/index.js +76 -5
- package/dist/index.js.map +1 -1
- package/dist/modules/app.module.d.ts +16 -0
- package/dist/modules/app.module.js +86 -0
- package/dist/modules/app.module.js.map +1 -0
- package/dist/modules/auth/auth.controller.d.ts +10 -0
- package/dist/modules/auth/auth.controller.js +47 -0
- package/dist/modules/auth/auth.controller.js.map +1 -0
- package/dist/modules/auth/auth.module-definition.d.ts +2 -0
- package/dist/modules/auth/auth.module-definition.js +11 -0
- package/dist/modules/auth/auth.module-definition.js.map +1 -0
- package/dist/modules/auth/auth.module.d.ts +2 -0
- package/dist/modules/auth/auth.module.js +48 -0
- package/dist/modules/auth/auth.module.js.map +1 -0
- package/dist/modules/auth/auth.options.d.ts +13 -0
- package/dist/modules/auth/auth.options.js +3 -0
- package/dist/modules/auth/auth.options.js.map +1 -0
- package/dist/modules/auth/auth.service.d.ts +15 -0
- package/dist/modules/auth/auth.service.js +133 -0
- package/dist/modules/auth/auth.service.js.map +1 -0
- package/dist/modules/auth/dto/auth-login.dto.d.ts +5 -0
- package/dist/modules/auth/dto/auth-login.dto.js +32 -0
- package/dist/modules/auth/dto/auth-login.dto.js.map +1 -0
- package/dist/modules/auth/dto/register.dto.d.ts +7 -0
- package/dist/modules/auth/dto/register.dto.js +46 -0
- package/dist/modules/auth/dto/register.dto.js.map +1 -0
- package/dist/modules/module/dtos/create-module.dto.d.ts +5 -0
- package/dist/modules/module/dtos/create-module.dto.js +14 -0
- package/dist/modules/module/dtos/create-module.dto.js.map +1 -0
- package/dist/modules/module/dtos/module-query.dto.d.ts +3 -0
- package/dist/modules/module/dtos/module-query.dto.js +8 -0
- package/dist/modules/module/dtos/module-query.dto.js.map +1 -0
- package/dist/modules/module/dtos/module.dto.d.ts +10 -0
- package/dist/modules/module/dtos/module.dto.js +84 -0
- package/dist/modules/module/dtos/module.dto.js.map +1 -0
- package/dist/modules/module/dtos/update-module.dto.d.ts +5 -0
- package/dist/modules/module/dtos/update-module.dto.js +14 -0
- package/dist/modules/module/dtos/update-module.dto.js.map +1 -0
- package/dist/modules/module/module.controller.d.ts +12 -0
- package/dist/modules/module/module.controller.js +111 -0
- package/dist/modules/module/module.controller.js.map +1 -0
- package/dist/modules/module/module.entity.d.ts +10 -0
- package/dist/modules/module/module.entity.js +46 -0
- package/dist/modules/module/module.entity.js.map +1 -0
- package/dist/modules/module/module.mapper.d.ts +5 -0
- package/dist/modules/module/module.mapper.js +35 -0
- package/dist/modules/module/module.mapper.js.map +1 -0
- package/dist/modules/module/module.module.d.ts +2 -0
- package/dist/modules/module/module.module.js +27 -0
- package/dist/modules/module/module.module.js.map +1 -0
- package/dist/modules/module/module.service.d.ts +13 -0
- package/dist/modules/module/module.service.js +63 -0
- package/dist/modules/module/module.service.js.map +1 -0
- package/dist/modules/permission/dtos/create-permission.dto.d.ts +5 -0
- package/dist/modules/permission/dtos/create-permission.dto.js +14 -0
- package/dist/modules/permission/dtos/create-permission.dto.js.map +1 -0
- package/dist/modules/permission/dtos/permission-query.dto.d.ts +3 -0
- package/dist/modules/permission/dtos/permission-query.dto.js +8 -0
- package/dist/modules/permission/dtos/permission-query.dto.js.map +1 -0
- package/dist/modules/permission/dtos/permission.dto.d.ts +9 -0
- package/dist/modules/permission/dtos/permission.dto.js +72 -0
- package/dist/modules/permission/dtos/permission.dto.js.map +1 -0
- package/dist/modules/permission/dtos/update-permission.dto.d.ts +5 -0
- package/dist/modules/permission/dtos/update-permission.dto.js +9 -0
- package/dist/modules/permission/dtos/update-permission.dto.js.map +1 -0
- package/dist/modules/permission/permission.controller.d.ts +11 -0
- package/dist/modules/permission/permission.controller.js +109 -0
- package/dist/modules/permission/permission.controller.js.map +1 -0
- package/dist/modules/permission/permission.entity.d.ts +11 -0
- package/dist/modules/permission/permission.entity.js +57 -0
- package/dist/modules/permission/permission.entity.js.map +1 -0
- package/dist/modules/permission/permission.mapper.d.ts +5 -0
- package/dist/modules/permission/permission.mapper.js +32 -0
- package/dist/modules/permission/permission.mapper.js.map +1 -0
- package/dist/modules/permission/permission.module.d.ts +2 -0
- package/dist/modules/permission/permission.module.js +27 -0
- package/dist/modules/permission/permission.module.js.map +1 -0
- package/dist/modules/permission/permission.service.d.ts +13 -0
- package/dist/modules/permission/permission.service.js +60 -0
- package/dist/modules/permission/permission.service.js.map +1 -0
- package/dist/modules/role/dtos/create-role.dto.d.ts +6 -0
- package/dist/modules/role/dtos/create-role.dto.js +15 -0
- package/dist/modules/role/dtos/create-role.dto.js.map +1 -0
- package/dist/modules/role/dtos/role-query.dto.d.ts +3 -0
- package/dist/modules/role/dtos/role-query.dto.js +8 -0
- package/dist/modules/role/dtos/role-query.dto.js.map +1 -0
- package/dist/modules/role/dtos/role.dto.d.ts +11 -0
- package/dist/modules/role/dtos/role.dto.js +82 -0
- package/dist/modules/role/dtos/role.dto.js.map +1 -0
- package/dist/modules/role/dtos/update-role.dto.d.ts +5 -0
- package/dist/modules/role/dtos/update-role.dto.js +9 -0
- package/dist/modules/role/dtos/update-role.dto.js.map +1 -0
- package/dist/modules/role/role.controller.d.ts +16 -0
- package/dist/modules/role/role.controller.js +174 -0
- package/dist/modules/role/role.controller.js.map +1 -0
- package/dist/modules/role/role.entity.d.ts +11 -0
- package/dist/modules/role/role.entity.js +61 -0
- package/dist/modules/role/role.entity.js.map +1 -0
- package/dist/modules/role/role.mapper.d.ts +9 -0
- package/dist/modules/role/role.mapper.js +74 -0
- package/dist/modules/role/role.mapper.js.map +1 -0
- package/dist/modules/role/role.module.d.ts +2 -0
- package/dist/modules/role/role.module.js +27 -0
- package/dist/modules/role/role.module.js.map +1 -0
- package/dist/modules/role/role.service.d.ts +13 -0
- package/dist/modules/role/role.service.js +63 -0
- package/dist/modules/role/role.service.js.map +1 -0
- package/dist/modules/role-permission/dtos/create-role-permission.dto.d.ts +5 -0
- package/dist/modules/role-permission/dtos/create-role-permission.dto.js +14 -0
- package/dist/modules/role-permission/dtos/create-role-permission.dto.js.map +1 -0
- package/dist/modules/role-permission/dtos/role-permission-query.dto.d.ts +3 -0
- package/dist/modules/role-permission/dtos/role-permission-query.dto.js +8 -0
- package/dist/modules/role-permission/dtos/role-permission-query.dto.js.map +1 -0
- package/dist/modules/role-permission/dtos/role-permission.dto.d.ts +7 -0
- package/dist/modules/role-permission/dtos/role-permission.dto.js +28 -0
- package/dist/modules/role-permission/dtos/role-permission.dto.js.map +1 -0
- package/dist/modules/role-permission/dtos/update-role-permission.dto.d.ts +5 -0
- package/dist/modules/role-permission/dtos/update-role-permission.dto.js +9 -0
- package/dist/modules/role-permission/dtos/update-role-permission.dto.js.map +1 -0
- package/dist/modules/role-permission/role-permission.controller.d.ts +2 -0
- package/dist/modules/role-permission/role-permission.controller.js +17 -0
- package/dist/modules/role-permission/role-permission.controller.js.map +1 -0
- package/dist/modules/role-permission/role-permission.entity.d.ts +7 -0
- package/dist/modules/role-permission/role-permission.entity.js +33 -0
- package/dist/modules/role-permission/role-permission.entity.js.map +1 -0
- package/dist/modules/role-permission/role-permission.mapper.d.ts +10 -0
- package/dist/modules/role-permission/role-permission.mapper.js +47 -0
- package/dist/modules/role-permission/role-permission.mapper.js.map +1 -0
- package/dist/modules/role-permission/role-permission.module.d.ts +2 -0
- package/dist/modules/role-permission/role-permission.module.js +29 -0
- package/dist/modules/role-permission/role-permission.module.js.map +1 -0
- package/dist/modules/role-permission/role-permission.service.d.ts +13 -0
- package/dist/modules/role-permission/role-permission.service.js +60 -0
- package/dist/modules/role-permission/role-permission.service.js.map +1 -0
- package/dist/modules/user/dtos/create-user.dto.d.ts +6 -0
- package/dist/modules/user/dtos/create-user.dto.js +15 -0
- package/dist/modules/user/dtos/create-user.dto.js.map +1 -0
- package/dist/modules/user/dtos/update-user.dto.js.map +1 -0
- package/dist/modules/user/dtos/user-query.dto.d.ts +3 -0
- package/dist/{user → modules/user}/dtos/user-query.dto.js +1 -1
- package/dist/modules/user/dtos/user-query.dto.js.map +1 -0
- package/dist/modules/user/dtos/user.dto.d.ts +13 -0
- package/dist/{user → modules/user}/dtos/user.dto.js +1 -12
- package/dist/modules/user/dtos/user.dto.js.map +1 -0
- package/dist/modules/user/user.controller.d.ts +18 -0
- package/dist/{user → modules/user}/user.controller.js +62 -29
- package/dist/modules/user/user.controller.js.map +1 -0
- package/dist/{user → modules/user}/user.entity.d.ts +4 -3
- package/dist/{user → modules/user}/user.entity.js +17 -6
- package/dist/modules/user/user.entity.js.map +1 -0
- package/dist/{user → modules/user}/user.mapper.d.ts +6 -2
- package/dist/modules/user/user.mapper.js +126 -0
- package/dist/modules/user/user.mapper.js.map +1 -0
- package/dist/modules/user/user.module-definition.d.ts +5 -0
- package/dist/modules/user/user.module-definition.js +9 -0
- package/dist/modules/user/user.module-definition.js.map +1 -0
- package/dist/modules/user/user.module.d.ts +2 -0
- package/dist/{user → modules/user}/user.module.js +10 -14
- package/dist/modules/user/user.module.js.map +1 -0
- package/dist/{user → modules/user}/user.service.d.ts +4 -4
- package/dist/{user → modules/user}/user.service.js +8 -8
- package/dist/modules/user/user.service.js.map +1 -0
- package/dist/modules/user-permission/dtos/create-user-permission.dto.d.ts +5 -0
- package/dist/modules/user-permission/dtos/create-user-permission.dto.js +14 -0
- package/dist/modules/user-permission/dtos/create-user-permission.dto.js.map +1 -0
- package/dist/modules/user-permission/dtos/update-user-permission.dto.d.ts +5 -0
- package/dist/modules/user-permission/dtos/update-user-permission.dto.js +9 -0
- package/dist/modules/user-permission/dtos/update-user-permission.dto.js.map +1 -0
- package/dist/modules/user-permission/dtos/user-permission-query.dto.d.ts +3 -0
- package/dist/modules/user-permission/dtos/user-permission-query.dto.js +8 -0
- package/dist/modules/user-permission/dtos/user-permission-query.dto.js.map +1 -0
- package/dist/modules/user-permission/dtos/user-permission.dto.d.ts +8 -0
- package/dist/modules/user-permission/dtos/user-permission.dto.js +36 -0
- package/dist/modules/user-permission/dtos/user-permission.dto.js.map +1 -0
- package/dist/modules/user-permission/user-permission.controller.d.ts +2 -0
- package/dist/modules/user-permission/user-permission.controller.js +17 -0
- package/dist/modules/user-permission/user-permission.controller.js.map +1 -0
- package/dist/modules/user-permission/user-permission.entity.d.ts +8 -0
- package/dist/modules/user-permission/user-permission.entity.js +41 -0
- package/dist/modules/user-permission/user-permission.entity.js.map +1 -0
- package/dist/modules/user-permission/user-permission.mapper.d.ts +10 -0
- package/dist/modules/user-permission/user-permission.mapper.js +51 -0
- package/dist/modules/user-permission/user-permission.mapper.js.map +1 -0
- package/dist/modules/user-permission/user-permission.module.d.ts +2 -0
- package/dist/modules/user-permission/user-permission.module.js +29 -0
- package/dist/modules/user-permission/user-permission.module.js.map +1 -0
- package/dist/modules/user-permission/user-permission.service.d.ts +13 -0
- package/dist/modules/user-permission/user-permission.service.js +60 -0
- package/dist/modules/user-permission/user-permission.service.js.map +1 -0
- package/dist/modules/user-role/dtos/create-user-role.dto.d.ts +5 -0
- package/dist/modules/user-role/dtos/create-user-role.dto.js +14 -0
- package/dist/modules/user-role/dtos/create-user-role.dto.js.map +1 -0
- package/dist/modules/user-role/dtos/update-user-role.dto.d.ts +5 -0
- package/dist/modules/user-role/dtos/update-user-role.dto.js +9 -0
- package/dist/modules/user-role/dtos/update-user-role.dto.js.map +1 -0
- package/dist/modules/user-role/dtos/user-role-query.dto.d.ts +3 -0
- package/dist/modules/user-role/dtos/user-role-query.dto.js +8 -0
- package/dist/modules/user-role/dtos/user-role-query.dto.js.map +1 -0
- package/dist/modules/user-role/dtos/user-role.dto.d.ts +7 -0
- package/dist/{security/security.service.js → modules/user-role/dtos/user-role.dto.js} +17 -20
- package/dist/modules/user-role/dtos/user-role.dto.js.map +1 -0
- package/dist/modules/user-role/user-role.controller.d.ts +0 -0
- package/dist/modules/user-role/user-role.controller.js +2 -0
- package/dist/modules/user-role/user-role.controller.js.map +1 -0
- package/dist/modules/user-role/user-role.entity.d.ts +0 -0
- package/dist/modules/user-role/user-role.entity.js +2 -0
- package/dist/modules/user-role/user-role.entity.js.map +1 -0
- package/dist/modules/user-role/user-role.mapper.d.ts +0 -0
- package/dist/modules/user-role/user-role.mapper.js +2 -0
- package/dist/modules/user-role/user-role.mapper.js.map +1 -0
- package/dist/modules/user-role/user-role.module.d.ts +0 -0
- package/dist/modules/user-role/user-role.module.js +2 -0
- package/dist/modules/user-role/user-role.module.js.map +1 -0
- package/dist/modules/user-role/user-role.service.d.ts +0 -0
- package/dist/modules/user-role/user-role.service.js +2 -0
- package/dist/modules/user-role/user-role.service.js.map +1 -0
- package/dist/scripts/run-migrations.d.ts +1 -0
- package/dist/scripts/run-migrations.js +60 -0
- package/dist/scripts/run-migrations.js.map +1 -0
- package/dist/security/decorators/auth-user.decorator.d.ts +1 -1
- package/dist/security/decorators/auth-user.decorator.js +3 -3
- package/dist/security/decorators/auth-user.decorator.js.map +1 -1
- package/dist/security/decorators/permissions.decorator.d.ts +2 -0
- package/dist/security/decorators/permissions.decorator.js +7 -0
- package/dist/security/decorators/permissions.decorator.js.map +1 -0
- package/dist/security/decorators/roles.decorator.d.ts +2 -1
- package/dist/security/decorators/roles.decorator.js +1 -1
- package/dist/security/decorators/roles.decorator.js.map +1 -1
- package/dist/security/guards/jwt-auth.guard.d.ts +5 -2
- package/dist/security/guards/jwt-auth.guard.js +12 -5
- package/dist/security/guards/jwt-auth.guard.js.map +1 -1
- package/dist/security/guards/roles.guard.d.ts +7 -5
- package/dist/security/guards/roles.guard.js +33 -9
- package/dist/security/guards/roles.guard.js.map +1 -1
- package/dist/security/interfaces/jwt-payload.interface.d.ts +14 -0
- package/dist/security/interfaces/jwt-payload.interface.js +3 -0
- package/dist/security/interfaces/jwt-payload.interface.js.map +1 -0
- package/dist/security/interfaces/token.interface.d.ts +3 -0
- package/dist/security/interfaces/token.interface.js +3 -0
- package/dist/security/interfaces/token.interface.js.map +1 -0
- package/dist/security/password-util.d.ts +3 -0
- package/dist/security/password-util.js +44 -0
- package/dist/security/password-util.js.map +1 -0
- package/dist/security/strategies/jwt.strategy.d.ts +14 -3
- package/dist/security/strategies/jwt.strategy.js +28 -13
- package/dist/security/strategies/jwt.strategy.js.map +1 -1
- package/dist/seeders/auth.seeder.d.ts +12 -0
- package/dist/seeders/auth.seeder.js +404 -0
- package/dist/seeders/auth.seeder.js.map +1 -0
- package/dist/seeders/modules.seeder.d.ts +6 -0
- package/dist/seeders/modules.seeder.js +53 -0
- package/dist/seeders/modules.seeder.js.map +1 -0
- package/dist/seeders/orchestrator.seeder.d.ts +6 -0
- package/dist/seeders/orchestrator.seeder.js +32 -0
- package/dist/seeders/orchestrator.seeder.js.map +1 -0
- package/dist/seeders/permissions.seeder.d.ts +6 -0
- package/dist/seeders/permissions.seeder.js +51 -0
- package/dist/seeders/permissions.seeder.js.map +1 -0
- package/dist/seeders/role-permissions.seeder.d.ts +6 -0
- package/dist/seeders/role-permissions.seeder.js +65 -0
- package/dist/seeders/role-permissions.seeder.js.map +1 -0
- package/dist/seeders/roles.seeder.d.ts +6 -0
- package/dist/seeders/roles.seeder.js +57 -0
- package/dist/seeders/roles.seeder.js.map +1 -0
- package/dist/seeders/run.seeder.d.ts +1 -0
- package/dist/seeders/run.seeder.js +82 -0
- package/dist/seeders/run.seeder.js.map +1 -0
- package/dist/seeders/user/data.d.ts +2 -0
- package/dist/seeders/user/data.js +16 -0
- package/dist/seeders/user/data.js.map +1 -0
- package/dist/seeders/user/user-seeder.module.d.ts +2 -0
- package/dist/seeders/user/user-seeder.module.js +24 -0
- package/dist/seeders/user/user-seeder.module.js.map +1 -0
- package/dist/seeders/user/user-seeder.service.d.ts +7 -0
- package/dist/seeders/user/user-seeder.service.js +51 -0
- package/dist/seeders/user/user-seeder.service.js.map +1 -0
- package/dist/seeders/user-roles.seeder.d.ts +6 -0
- package/dist/seeders/user-roles.seeder.js +44 -0
- package/dist/seeders/user-roles.seeder.js.map +1 -0
- package/dist/seeders/users.seeder.d.ts +6 -0
- package/dist/seeders/users.seeder.js +93 -0
- package/dist/seeders/users.seeder.js.map +1 -0
- package/dist/tenant-db/config/tenant-db.config.d.ts +4 -0
- package/dist/tenant-db/config/tenant-db.config.js +18 -0
- package/dist/tenant-db/config/tenant-db.config.js.map +1 -0
- package/dist/tenant-db/context/tenant-db.context.d.ts +11 -0
- package/dist/tenant-db/context/tenant-db.context.js +46 -0
- package/dist/tenant-db/context/tenant-db.context.js.map +1 -0
- package/dist/tenant-db/helpers/tenant-db.helpers.d.ts +13 -0
- package/dist/tenant-db/helpers/tenant-db.helpers.js +42 -0
- package/dist/tenant-db/helpers/tenant-db.helpers.js.map +1 -0
- package/dist/tenant-db/manager/tenant-db.manager.d.ts +20 -0
- package/dist/tenant-db/manager/tenant-db.manager.js +135 -0
- package/dist/tenant-db/manager/tenant-db.manager.js.map +1 -0
- package/dist/tenant-db/middleware/tenant-db.middleware.d.ts +13 -0
- package/dist/tenant-db/middleware/tenant-db.middleware.js +46 -0
- package/dist/tenant-db/middleware/tenant-db.middleware.js.map +1 -0
- package/dist/tenant-db/module/tenant=db-module.d.ts +10 -0
- package/dist/tenant-db/module/tenant=db-module.js +53 -0
- package/dist/tenant-db/module/tenant=db-module.js.map +1 -0
- package/dist/tenant-db/resolvers/tenant.resolver.d.ts +9 -0
- package/dist/tenant-db/resolvers/tenant.resolver.js +42 -0
- package/dist/tenant-db/resolvers/tenant.resolver.js.map +1 -0
- package/dist/tenant-db/service/tenant-db.service.d.ts +14 -0
- package/dist/tenant-db/service/tenant-db.service.js +62 -0
- package/dist/tenant-db/service/tenant-db.service.js.map +1 -0
- package/dist/tenant-db/tenant-cache.d.ts +10 -0
- package/dist/tenant-db/tenant-cache.js +17 -0
- package/dist/tenant-db/tenant-cache.js.map +1 -0
- package/dist/tenant-db/types/tenant-db.types.d.ts +29 -0
- package/dist/tenant-db/types/tenant-db.types.js +3 -0
- package/dist/tenant-db/types/tenant-db.types.js.map +1 -0
- package/dist/tsconfig.tsbuildinfo +1 -1
- package/package.json +18 -10
- package/dist/security/security.module.d.ts +0 -7
- package/dist/security/security.module.js +0 -43
- package/dist/security/security.module.js.map +0 -1
- package/dist/security/security.service.d.ts +0 -7
- package/dist/security/security.service.js.map +0 -1
- package/dist/user/dtos/create-user.dto.d.ts +0 -5
- package/dist/user/dtos/create-user.dto.js +0 -7
- package/dist/user/dtos/create-user.dto.js.map +0 -1
- package/dist/user/dtos/update-user.dto.js.map +0 -1
- package/dist/user/dtos/user-query.dto.d.ts +0 -3
- package/dist/user/dtos/user-query.dto.js.map +0 -1
- package/dist/user/dtos/user.dto.d.ts +0 -11
- package/dist/user/dtos/user.dto.js.map +0 -1
- package/dist/user/user.controller.d.ts +0 -16
- package/dist/user/user.controller.js.map +0 -1
- package/dist/user/user.entity.js.map +0 -1
- package/dist/user/user.mapper.js +0 -32
- package/dist/user/user.mapper.js.map +0 -1
- package/dist/user/user.module.d.ts +0 -4
- package/dist/user/user.module.js.map +0 -1
- package/dist/user/user.service.js.map +0 -1
- /package/dist/{user → modules/user}/dtos/update-user.dto.d.ts +0 -0
- /package/dist/{user → modules/user}/dtos/update-user.dto.js +0 -0
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var TenantDatabaseContext_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TenantDatabaseContext = void 0;
|
|
11
|
+
const async_hooks_1 = require("async_hooks");
|
|
12
|
+
const common_1 = require("@nestjs/common");
|
|
13
|
+
let TenantDatabaseContext = TenantDatabaseContext_1 = class TenantDatabaseContext {
|
|
14
|
+
run(store, callback) {
|
|
15
|
+
return TenantDatabaseContext_1.storage.run(store, callback);
|
|
16
|
+
}
|
|
17
|
+
static getStore() {
|
|
18
|
+
return TenantDatabaseContext_1.storage.getStore();
|
|
19
|
+
}
|
|
20
|
+
static getDataSource() {
|
|
21
|
+
return this.getStore()?.dataSource;
|
|
22
|
+
}
|
|
23
|
+
static getTenantId() {
|
|
24
|
+
return this.getStore()?.tenantId;
|
|
25
|
+
}
|
|
26
|
+
static setDataSource(dataSource) {
|
|
27
|
+
const store = this.getStore();
|
|
28
|
+
if (!store) {
|
|
29
|
+
throw new Error("No active async context. Ensure middleware is configured.");
|
|
30
|
+
}
|
|
31
|
+
store.dataSource = dataSource;
|
|
32
|
+
}
|
|
33
|
+
static setTenantId(tenantId) {
|
|
34
|
+
const store = this.getStore();
|
|
35
|
+
if (!store) {
|
|
36
|
+
throw new Error("No active async context. Ensure middleware is configured.");
|
|
37
|
+
}
|
|
38
|
+
store.tenantId = tenantId;
|
|
39
|
+
}
|
|
40
|
+
};
|
|
41
|
+
exports.TenantDatabaseContext = TenantDatabaseContext;
|
|
42
|
+
TenantDatabaseContext.storage = new async_hooks_1.AsyncLocalStorage();
|
|
43
|
+
exports.TenantDatabaseContext = TenantDatabaseContext = TenantDatabaseContext_1 = __decorate([
|
|
44
|
+
(0, common_1.Injectable)()
|
|
45
|
+
], TenantDatabaseContext);
|
|
46
|
+
//# sourceMappingURL=tenant-db.context.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.context.js","sourceRoot":"","sources":["../../../src/tenant-db/context/tenant-db.context.ts"],"names":[],"mappings":";;;;;;;;;;AAKA,6CAAgD;AAChD,2CAA4C;AAKrC,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAGhC,GAAG,CAAI,KAAkB,EAAE,QAAiB;QAC1C,OAAO,uBAAqB,CAAC,OAAO,CAAC,GAAG,CAAC,KAAK,EAAE,QAAQ,CAAC,CAAC;IAC5D,CAAC;IAED,MAAM,CAAC,QAAQ;QACb,OAAO,uBAAqB,CAAC,OAAO,CAAC,QAAQ,EAAE,CAAC;IAClD,CAAC;IAED,MAAM,CAAC,aAAa;QAClB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,UAAU,CAAC;IACrC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,OAAO,IAAI,CAAC,QAAQ,EAAE,EAAE,QAAQ,CAAC;IACnC,CAAC;IAED,MAAM,CAAC,aAAa,CAAC,UAAsB;QACzC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,UAAU,GAAG,UAAU,CAAC;IAChC,CAAC;IAED,MAAM,CAAC,WAAW,CAAC,QAAgB;QACjC,MAAM,KAAK,GAAG,IAAI,CAAC,QAAQ,EAAE,CAAC;QAC9B,IAAI,CAAC,KAAK,EAAE,CAAC;YACX,MAAM,IAAI,KAAK,CACb,2DAA2D,CAC5D,CAAC;QACJ,CAAC;QACD,KAAK,CAAC,QAAQ,GAAG,QAAQ,CAAC;IAC5B,CAAC;;AArCU,sDAAqB;AACR,6BAAO,GAAG,IAAI,+BAAiB,EAAe,AAAvC,CAAwC;gCAD5D,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAsCjC"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { DataSource, EntityTarget, Repository, EntityManager, ObjectLiteral } from "typeorm";
|
|
2
|
+
export declare class TenantDatabaseHelpers {
|
|
3
|
+
static getDataSource(): DataSource;
|
|
4
|
+
static getRepository<Entity extends ObjectLiteral>(entity: EntityTarget<Entity>): Repository<Entity>;
|
|
5
|
+
static getManager(): EntityManager;
|
|
6
|
+
static getTenantId(): string;
|
|
7
|
+
static transaction<T>(work: (manager: EntityManager) => Promise<T>): Promise<T>;
|
|
8
|
+
}
|
|
9
|
+
export declare const getTenantDataSource: () => DataSource;
|
|
10
|
+
export declare const getTenantRepository: <Entity extends ObjectLiteral>(entity: EntityTarget<Entity>) => Repository<Entity>;
|
|
11
|
+
export declare const getTenantManager: () => EntityManager;
|
|
12
|
+
export declare const getTenantId: () => string;
|
|
13
|
+
export declare const runTenantTransaction: <T>(work: (manager: EntityManager) => Promise<T>) => Promise<T>;
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.runTenantTransaction = exports.getTenantId = exports.getTenantManager = exports.getTenantRepository = exports.getTenantDataSource = exports.TenantDatabaseHelpers = void 0;
|
|
4
|
+
const tenant_db_context_1 = require("../context/tenant-db.context");
|
|
5
|
+
class TenantDatabaseHelpers {
|
|
6
|
+
static getDataSource() {
|
|
7
|
+
const dataSource = tenant_db_context_1.TenantDatabaseContext.getDataSource();
|
|
8
|
+
if (!dataSource) {
|
|
9
|
+
throw new Error("No tenant datasource in context. Ensure TenantDatabaseMiddleware is applied.");
|
|
10
|
+
}
|
|
11
|
+
return dataSource;
|
|
12
|
+
}
|
|
13
|
+
static getRepository(entity) {
|
|
14
|
+
return this.getDataSource().getRepository(entity);
|
|
15
|
+
}
|
|
16
|
+
static getManager() {
|
|
17
|
+
return this.getDataSource().manager;
|
|
18
|
+
}
|
|
19
|
+
static getTenantId() {
|
|
20
|
+
const tenantId = tenant_db_context_1.TenantDatabaseContext.getTenantId();
|
|
21
|
+
if (!tenantId) {
|
|
22
|
+
throw new Error("No tenant ID in context");
|
|
23
|
+
}
|
|
24
|
+
return tenantId;
|
|
25
|
+
}
|
|
26
|
+
static async transaction(work) {
|
|
27
|
+
const dataSource = this.getDataSource();
|
|
28
|
+
return dataSource.transaction(work);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
exports.TenantDatabaseHelpers = TenantDatabaseHelpers;
|
|
32
|
+
const getTenantDataSource = () => TenantDatabaseHelpers.getDataSource();
|
|
33
|
+
exports.getTenantDataSource = getTenantDataSource;
|
|
34
|
+
const getTenantRepository = (entity) => TenantDatabaseHelpers.getRepository(entity);
|
|
35
|
+
exports.getTenantRepository = getTenantRepository;
|
|
36
|
+
const getTenantManager = () => TenantDatabaseHelpers.getManager();
|
|
37
|
+
exports.getTenantManager = getTenantManager;
|
|
38
|
+
const getTenantId = () => TenantDatabaseHelpers.getTenantId();
|
|
39
|
+
exports.getTenantId = getTenantId;
|
|
40
|
+
const runTenantTransaction = (work) => TenantDatabaseHelpers.transaction(work);
|
|
41
|
+
exports.runTenantTransaction = runTenantTransaction;
|
|
42
|
+
//# sourceMappingURL=tenant-db.helpers.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.helpers.js","sourceRoot":"","sources":["../../../src/tenant-db/helpers/tenant-db.helpers.ts"],"names":[],"mappings":";;;AAOA,oEAAqE;AAErE,MAAa,qBAAqB;IAChC,MAAM,CAAC,aAAa;QAClB,MAAM,UAAU,GAAG,yCAAqB,CAAC,aAAa,EAAE,CAAC;QAEzD,IAAI,CAAC,UAAU,EAAE,CAAC;YAChB,MAAM,IAAI,KAAK,CACb,8EAA8E,CAC/E,CAAC;QACJ,CAAC;QAED,OAAO,UAAU,CAAC;IACpB,CAAC;IAED,MAAM,CAAC,aAAa,CAClB,MAA4B;QAE5B,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;IACpD,CAAC;IAED,MAAM,CAAC,UAAU;QACf,OAAO,IAAI,CAAC,aAAa,EAAE,CAAC,OAAO,CAAC;IACtC,CAAC;IAED,MAAM,CAAC,WAAW;QAChB,MAAM,QAAQ,GAAG,yCAAqB,CAAC,WAAW,EAAE,CAAC;QAErD,IAAI,CAAC,QAAQ,EAAE,CAAC;YACd,MAAM,IAAI,KAAK,CAAC,yBAAyB,CAAC,CAAC;QAC7C,CAAC;QAED,OAAO,QAAQ,CAAC;IAClB,CAAC;IAED,MAAM,CAAC,KAAK,CAAC,WAAW,CACtB,IAA4C;QAE5C,MAAM,UAAU,GAAG,IAAI,CAAC,aAAa,EAAE,CAAC;QACxC,OAAO,UAAU,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;IACtC,CAAC;CACF;AAvCD,sDAuCC;AAGM,MAAM,mBAAmB,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,aAAa,EAAE,CAAC;AAAlE,QAAA,mBAAmB,uBAA+C;AACxE,MAAM,mBAAmB,GAAG,CACjC,MAA4B,EAC5B,EAAE,CAAC,qBAAqB,CAAC,aAAa,CAAC,MAAM,CAAC,CAAC;AAFpC,QAAA,mBAAmB,uBAEiB;AAC1C,MAAM,gBAAgB,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,UAAU,EAAE,CAAC;AAA5D,QAAA,gBAAgB,oBAA4C;AAClE,MAAM,WAAW,GAAG,GAAG,EAAE,CAAC,qBAAqB,CAAC,WAAW,EAAE,CAAC;AAAxD,QAAA,WAAW,eAA6C;AAC9D,MAAM,oBAAoB,GAAG,CAClC,IAA4C,EAC5C,EAAE,CAAC,qBAAqB,CAAC,WAAW,CAAC,IAAI,CAAC,CAAC;AAFhC,QAAA,oBAAoB,wBAEY"}
|
|
@@ -0,0 +1,20 @@
|
|
|
1
|
+
import { OnModuleDestroy } from "@nestjs/common";
|
|
2
|
+
import { TenantDataSourceOptions } from "../types/tenant-db.types";
|
|
3
|
+
import { DataSource } from "typeorm";
|
|
4
|
+
export declare class TenantDatabaseManager implements OnModuleDestroy {
|
|
5
|
+
private readonly logger;
|
|
6
|
+
private readonly cache;
|
|
7
|
+
private readonly config;
|
|
8
|
+
private cleanupInterval?;
|
|
9
|
+
constructor();
|
|
10
|
+
getDataSource(databaseName: string, options?: TenantDataSourceOptions): Promise<DataSource>;
|
|
11
|
+
private createDataSource;
|
|
12
|
+
private evictLRU;
|
|
13
|
+
private destroyDataSource;
|
|
14
|
+
private startCleanupScheduler;
|
|
15
|
+
private cleanupIdleConnections;
|
|
16
|
+
onModuleDestroy(): Promise<void>;
|
|
17
|
+
getCacheSize(): number;
|
|
18
|
+
getCachedTenants(): string[];
|
|
19
|
+
clearCache(): Promise<void>;
|
|
20
|
+
}
|
|
@@ -0,0 +1,135 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var TenantDatabaseManager_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.TenantDatabaseManager = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const typeorm_1 = require("typeorm");
|
|
16
|
+
const tenant_db_config_1 = require("../config/tenant-db.config");
|
|
17
|
+
let TenantDatabaseManager = TenantDatabaseManager_1 = class TenantDatabaseManager {
|
|
18
|
+
constructor() {
|
|
19
|
+
this.logger = new common_1.Logger(TenantDatabaseManager_1.name);
|
|
20
|
+
this.cache = new Map();
|
|
21
|
+
this.config = tenant_db_config_1.TenantDatabaseConfig.load();
|
|
22
|
+
this.startCleanupScheduler();
|
|
23
|
+
}
|
|
24
|
+
async getDataSource(databaseName, options) {
|
|
25
|
+
const cached = this.cache.get(databaseName);
|
|
26
|
+
if (cached?.dataSource.isInitialized) {
|
|
27
|
+
cached.lastUsed = Date.now();
|
|
28
|
+
return cached.dataSource;
|
|
29
|
+
}
|
|
30
|
+
if (this.cache.size >= this.config.maxCachedTenants) {
|
|
31
|
+
await this.evictLRU();
|
|
32
|
+
}
|
|
33
|
+
const dataSource = await this.createDataSource(databaseName, options);
|
|
34
|
+
this.cache.set(databaseName, {
|
|
35
|
+
dataSource,
|
|
36
|
+
lastUsed: Date.now(),
|
|
37
|
+
});
|
|
38
|
+
this.logger.log(`Initialized datasource for tenant database: ${databaseName}`);
|
|
39
|
+
return dataSource;
|
|
40
|
+
}
|
|
41
|
+
async createDataSource(databaseName, options) {
|
|
42
|
+
const dataSourceOptions = {
|
|
43
|
+
type: "postgres",
|
|
44
|
+
host: options?.host || this.config.defaultHost,
|
|
45
|
+
port: options?.port || this.config.defaultPort,
|
|
46
|
+
username: options?.username || this.config.defaultUsername,
|
|
47
|
+
password: options?.password || this.config.defaultPassword,
|
|
48
|
+
database: databaseName,
|
|
49
|
+
entities: options?.entities || [__dirname + "/../../**/*.entity.{ts,js}"],
|
|
50
|
+
migrations: options?.migrations || [
|
|
51
|
+
__dirname + "/../../database/migrations/*{.ts,.js}",
|
|
52
|
+
],
|
|
53
|
+
synchronize: options?.synchronize ?? false,
|
|
54
|
+
extra: options?.extra || { max: this.config.poolMax },
|
|
55
|
+
logging: process.env.NODE_ENV === "development" ? ["error", "warn"] : false,
|
|
56
|
+
};
|
|
57
|
+
const dataSource = new typeorm_1.DataSource(dataSourceOptions);
|
|
58
|
+
await dataSource.initialize();
|
|
59
|
+
return dataSource;
|
|
60
|
+
}
|
|
61
|
+
async evictLRU() {
|
|
62
|
+
let oldestKey = null;
|
|
63
|
+
let oldestTime = Infinity;
|
|
64
|
+
for (const [key, cached] of this.cache.entries()) {
|
|
65
|
+
if (cached.lastUsed < oldestTime) {
|
|
66
|
+
oldestTime = cached.lastUsed;
|
|
67
|
+
oldestKey = key;
|
|
68
|
+
}
|
|
69
|
+
}
|
|
70
|
+
if (oldestKey) {
|
|
71
|
+
await this.destroyDataSource(oldestKey);
|
|
72
|
+
this.logger.log(`Evicted LRU tenant datasource: ${oldestKey}`);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
async destroyDataSource(key) {
|
|
76
|
+
const cached = this.cache.get(key);
|
|
77
|
+
if (!cached)
|
|
78
|
+
return;
|
|
79
|
+
try {
|
|
80
|
+
if (cached.dataSource.isInitialized) {
|
|
81
|
+
await cached.dataSource.destroy();
|
|
82
|
+
}
|
|
83
|
+
this.cache.delete(key);
|
|
84
|
+
}
|
|
85
|
+
catch (error) {
|
|
86
|
+
this.logger.error(`Failed to destroy datasource for ${key}:`, error);
|
|
87
|
+
}
|
|
88
|
+
}
|
|
89
|
+
startCleanupScheduler() {
|
|
90
|
+
const interval = Math.max(60000, Math.floor(this.config.idleTimeoutMs / 2));
|
|
91
|
+
this.cleanupInterval = setInterval(() => {
|
|
92
|
+
this.cleanupIdleConnections();
|
|
93
|
+
}, interval);
|
|
94
|
+
this.cleanupInterval.unref();
|
|
95
|
+
}
|
|
96
|
+
async cleanupIdleConnections() {
|
|
97
|
+
const now = Date.now();
|
|
98
|
+
const toRemove = [];
|
|
99
|
+
for (const [key, cached] of this.cache.entries()) {
|
|
100
|
+
if (now - cached.lastUsed > this.config.idleTimeoutMs) {
|
|
101
|
+
toRemove.push(key);
|
|
102
|
+
}
|
|
103
|
+
}
|
|
104
|
+
for (const key of toRemove) {
|
|
105
|
+
this.logger.log(`Closing idle datasource: ${key}`);
|
|
106
|
+
await this.destroyDataSource(key);
|
|
107
|
+
}
|
|
108
|
+
}
|
|
109
|
+
async onModuleDestroy() {
|
|
110
|
+
if (this.cleanupInterval) {
|
|
111
|
+
clearInterval(this.cleanupInterval);
|
|
112
|
+
}
|
|
113
|
+
const destroyPromises = Array.from(this.cache.keys()).map((key) => this.destroyDataSource(key));
|
|
114
|
+
await Promise.allSettled(destroyPromises);
|
|
115
|
+
this.logger.log("All tenant datasources destroyed");
|
|
116
|
+
}
|
|
117
|
+
getCacheSize() {
|
|
118
|
+
return this.cache.size;
|
|
119
|
+
}
|
|
120
|
+
getCachedTenants() {
|
|
121
|
+
return Array.from(this.cache.keys());
|
|
122
|
+
}
|
|
123
|
+
async clearCache() {
|
|
124
|
+
const keys = Array.from(this.cache.keys());
|
|
125
|
+
for (const key of keys) {
|
|
126
|
+
await this.destroyDataSource(key);
|
|
127
|
+
}
|
|
128
|
+
}
|
|
129
|
+
};
|
|
130
|
+
exports.TenantDatabaseManager = TenantDatabaseManager;
|
|
131
|
+
exports.TenantDatabaseManager = TenantDatabaseManager = TenantDatabaseManager_1 = __decorate([
|
|
132
|
+
(0, common_1.Injectable)(),
|
|
133
|
+
__metadata("design:paramtypes", [])
|
|
134
|
+
], TenantDatabaseManager);
|
|
135
|
+
//# sourceMappingURL=tenant-db.manager.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.manager.js","sourceRoot":"","sources":["../../../src/tenant-db/manager/tenant-db.manager.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,13 @@
|
|
|
1
|
+
import { NestMiddleware } from "@nestjs/common";
|
|
2
|
+
import { Request, Response, NextFunction } from "express";
|
|
3
|
+
import { TenantDatabaseContext } from "../context/tenant-db.context";
|
|
4
|
+
import { ITenantResolver } from "../resolvers/tenant.resolver";
|
|
5
|
+
import { TenantDatabaseManager } from "../manager/tenant-db.manager";
|
|
6
|
+
export declare class TenantDatabaseMiddleware implements NestMiddleware {
|
|
7
|
+
private readonly manager;
|
|
8
|
+
private readonly context;
|
|
9
|
+
private readonly resolver;
|
|
10
|
+
private readonly logger;
|
|
11
|
+
constructor(manager: TenantDatabaseManager, context: TenantDatabaseContext, resolver: ITenantResolver);
|
|
12
|
+
use(req: Request, res: Response, next: NextFunction): Promise<void>;
|
|
13
|
+
}
|
|
@@ -0,0 +1,46 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var TenantDatabaseMiddleware_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.TenantDatabaseMiddleware = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const tenant_db_context_1 = require("../context/tenant-db.context");
|
|
16
|
+
const tenant_db_manager_1 = require("../manager/tenant-db.manager");
|
|
17
|
+
let TenantDatabaseMiddleware = TenantDatabaseMiddleware_1 = class TenantDatabaseMiddleware {
|
|
18
|
+
constructor(manager, context, resolver) {
|
|
19
|
+
this.manager = manager;
|
|
20
|
+
this.context = context;
|
|
21
|
+
this.resolver = resolver;
|
|
22
|
+
this.logger = new common_1.Logger(TenantDatabaseMiddleware_1.name);
|
|
23
|
+
}
|
|
24
|
+
async use(req, res, next) {
|
|
25
|
+
try {
|
|
26
|
+
const tenantId = this.resolver.extractTenantId(req);
|
|
27
|
+
if (!tenantId) {
|
|
28
|
+
throw new common_1.BadRequestException("Tenant identifier is required");
|
|
29
|
+
}
|
|
30
|
+
const databaseName = await this.resolver.resolveDatabaseName(tenantId);
|
|
31
|
+
const dataSource = await this.manager.getDataSource(databaseName);
|
|
32
|
+
this.context.run({ dataSource, tenantId }, () => next());
|
|
33
|
+
}
|
|
34
|
+
catch (error) {
|
|
35
|
+
this.logger.error("Tenant resolution failed:", error);
|
|
36
|
+
next(error);
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
};
|
|
40
|
+
exports.TenantDatabaseMiddleware = TenantDatabaseMiddleware;
|
|
41
|
+
exports.TenantDatabaseMiddleware = TenantDatabaseMiddleware = TenantDatabaseMiddleware_1 = __decorate([
|
|
42
|
+
(0, common_1.Injectable)(),
|
|
43
|
+
__metadata("design:paramtypes", [tenant_db_manager_1.TenantDatabaseManager,
|
|
44
|
+
tenant_db_context_1.TenantDatabaseContext, Object])
|
|
45
|
+
], TenantDatabaseMiddleware);
|
|
46
|
+
//# sourceMappingURL=tenant-db.middleware.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.middleware.js","sourceRoot":"","sources":["../../../src/tenant-db/middleware/tenant-db.middleware.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAKwB;AAExB,oEAAqE;AAErE,oEAAqE;AAG9D,IAAM,wBAAwB,gCAA9B,MAAM,wBAAwB;IAGnC,YACmB,OAA8B,EAC9B,OAA8B,EAC9B,QAAyB;QAFzB,YAAO,GAAP,OAAO,CAAuB;QAC9B,YAAO,GAAP,OAAO,CAAuB;QAC9B,aAAQ,GAAR,QAAQ,CAAiB;QAL3B,WAAM,GAAG,IAAI,eAAM,CAAC,0BAAwB,CAAC,IAAI,CAAC,CAAC;IAMjE,CAAC;IAEJ,KAAK,CAAC,GAAG,CAAC,GAAY,EAAE,GAAa,EAAE,IAAkB;QACvD,IAAI,CAAC;YACH,MAAM,QAAQ,GAAG,IAAI,CAAC,QAAQ,CAAC,eAAe,CAAC,GAAG,CAAC,CAAC;YAEpD,IAAI,CAAC,QAAQ,EAAE,CAAC;gBACd,MAAM,IAAI,4BAAmB,CAAC,+BAA+B,CAAC,CAAC;YACjE,CAAC;YAED,MAAM,YAAY,GAAG,MAAM,IAAI,CAAC,QAAQ,CAAC,mBAAmB,CAAC,QAAQ,CAAC,CAAC;YACvE,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAElE,IAAI,CAAC,OAAO,CAAC,GAAG,CAAC,EAAE,UAAU,EAAE,QAAQ,EAAE,EAAE,GAAG,EAAE,CAAC,IAAI,EAAE,CAAC,CAAC;QAC3D,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,2BAA2B,EAAE,KAAK,CAAC,CAAC;YACtD,IAAI,CAAC,KAAK,CAAC,CAAC;QACd,CAAC;IACH,CAAC;CACF,CAAA;AA1BY,4DAAwB;mCAAxB,wBAAwB;IADpC,IAAA,mBAAU,GAAE;qCAKiB,yCAAqB;QACrB,yCAAqB;GALtC,wBAAwB,CA0BpC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { MiddlewareConsumer, NestModule, DynamicModule } from "@nestjs/common";
|
|
2
|
+
import { ITenantResolver } from "../resolvers/tenant.resolver";
|
|
3
|
+
export interface TenantDatabaseModuleOptions {
|
|
4
|
+
resolver?: ITenantResolver;
|
|
5
|
+
excludeRoutes?: string[];
|
|
6
|
+
}
|
|
7
|
+
export declare class TenantDatabaseModule implements NestModule {
|
|
8
|
+
static forRoot(options?: TenantDatabaseModuleOptions): DynamicModule;
|
|
9
|
+
configure(consumer: MiddlewareConsumer): void;
|
|
10
|
+
}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var TenantDatabaseModule_1;
|
|
9
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
10
|
+
exports.TenantDatabaseModule = void 0;
|
|
11
|
+
const common_1 = require("@nestjs/common");
|
|
12
|
+
const tenant_resolver_1 = require("../resolvers/tenant.resolver");
|
|
13
|
+
const tenant_db_manager_1 = require("../manager/tenant-db.manager");
|
|
14
|
+
const tenant_db_context_1 = require("../context/tenant-db.context");
|
|
15
|
+
const tenant_db_service_1 = require("../service/tenant-db.service");
|
|
16
|
+
const tenant_db_middleware_1 = require("../middleware/tenant-db.middleware");
|
|
17
|
+
let TenantDatabaseModule = TenantDatabaseModule_1 = class TenantDatabaseModule {
|
|
18
|
+
static forRoot(options) {
|
|
19
|
+
const resolver = options?.resolver || new tenant_resolver_1.DefaultTenantResolver();
|
|
20
|
+
return {
|
|
21
|
+
module: TenantDatabaseModule_1,
|
|
22
|
+
providers: [
|
|
23
|
+
tenant_db_manager_1.TenantDatabaseManager,
|
|
24
|
+
tenant_db_context_1.TenantDatabaseContext,
|
|
25
|
+
tenant_db_service_1.TenantDatabaseService,
|
|
26
|
+
{
|
|
27
|
+
provide: "TENANT_RESOLVER",
|
|
28
|
+
useValue: resolver,
|
|
29
|
+
},
|
|
30
|
+
{
|
|
31
|
+
provide: tenant_db_middleware_1.TenantDatabaseMiddleware,
|
|
32
|
+
useFactory: (manager, context) => {
|
|
33
|
+
return new tenant_db_middleware_1.TenantDatabaseMiddleware(manager, context, resolver);
|
|
34
|
+
},
|
|
35
|
+
inject: [tenant_db_manager_1.TenantDatabaseManager, tenant_db_context_1.TenantDatabaseContext],
|
|
36
|
+
},
|
|
37
|
+
],
|
|
38
|
+
exports: [
|
|
39
|
+
tenant_db_manager_1.TenantDatabaseManager,
|
|
40
|
+
tenant_db_context_1.TenantDatabaseContext,
|
|
41
|
+
tenant_db_service_1.TenantDatabaseService,
|
|
42
|
+
],
|
|
43
|
+
};
|
|
44
|
+
}
|
|
45
|
+
configure(consumer) {
|
|
46
|
+
consumer.apply(tenant_db_middleware_1.TenantDatabaseMiddleware).forRoutes("*");
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
exports.TenantDatabaseModule = TenantDatabaseModule;
|
|
50
|
+
exports.TenantDatabaseModule = TenantDatabaseModule = TenantDatabaseModule_1 = __decorate([
|
|
51
|
+
(0, common_1.Module)({})
|
|
52
|
+
], TenantDatabaseModule);
|
|
53
|
+
//# sourceMappingURL=tenant=db-module.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant=db-module.js","sourceRoot":"","sources":["../../../src/tenant-db/module/tenant=db-module.ts"],"names":[],"mappings":";;;;;;;;;;AAAA,2CAKwB;AACxB,kEAGsC;AACtC,oEAAqE;AACrE,oEAAqE;AACrE,oEAAqE;AACrE,6EAA8E;AAQvE,IAAM,oBAAoB,4BAA1B,MAAM,oBAAoB;IAC/B,MAAM,CAAC,OAAO,CAAC,OAAqC;QAClD,MAAM,QAAQ,GAAG,OAAO,EAAE,QAAQ,IAAI,IAAI,uCAAqB,EAAE,CAAC;QAElE,OAAO;YACL,MAAM,EAAE,sBAAoB;YAC5B,SAAS,EAAE;gBACT,yCAAqB;gBACrB,yCAAqB;gBACrB,yCAAqB;gBACrB;oBACE,OAAO,EAAE,iBAAiB;oBAC1B,QAAQ,EAAE,QAAQ;iBACnB;gBACD;oBACE,OAAO,EAAE,+CAAwB;oBACjC,UAAU,EAAE,CACV,OAA8B,EAC9B,OAA8B,EAC9B,EAAE;wBACF,OAAO,IAAI,+CAAwB,CAAC,OAAO,EAAE,OAAO,EAAE,QAAQ,CAAC,CAAC;oBAClE,CAAC;oBACD,MAAM,EAAE,CAAC,yCAAqB,EAAE,yCAAqB,CAAC;iBACvD;aACF;YACD,OAAO,EAAE;gBACP,yCAAqB;gBACrB,yCAAqB;gBACrB,yCAAqB;aACtB;SACF,CAAC;IACJ,CAAC;IAED,SAAS,CAAC,QAA4B;QACpC,QAAQ,CAAC,KAAK,CAAC,+CAAwB,CAAC,CAAC,SAAS,CAAC,GAAG,CAAC,CAAC;IAC1D,CAAC;CACF,CAAA;AApCY,oDAAoB;+BAApB,oBAAoB;IADhC,IAAA,eAAM,EAAC,EAAE,CAAC;GACE,oBAAoB,CAoChC"}
|
|
@@ -0,0 +1,9 @@
|
|
|
1
|
+
export interface ITenantResolver {
|
|
2
|
+
extractTenantId(request: any): string | undefined;
|
|
3
|
+
resolveDatabaseName(tenantId: string): Promise<string>;
|
|
4
|
+
}
|
|
5
|
+
export declare class DefaultTenantResolver implements ITenantResolver {
|
|
6
|
+
extractTenantId(request: any): string | undefined;
|
|
7
|
+
resolveDatabaseName(tenantId: string): Promise<string>;
|
|
8
|
+
private validateDatabaseName;
|
|
9
|
+
}
|
|
@@ -0,0 +1,42 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
9
|
+
exports.DefaultTenantResolver = void 0;
|
|
10
|
+
const common_1 = require("@nestjs/common");
|
|
11
|
+
let DefaultTenantResolver = class DefaultTenantResolver {
|
|
12
|
+
extractTenantId(request) {
|
|
13
|
+
if (request.headers?.["x-tenant-id"]) {
|
|
14
|
+
return request.headers["x-tenant-id"];
|
|
15
|
+
}
|
|
16
|
+
if (request.headers?.["x-tenant"]) {
|
|
17
|
+
return request.headers["x-tenant"];
|
|
18
|
+
}
|
|
19
|
+
const hostname = request.hostname || request.headers?.host;
|
|
20
|
+
if (hostname) {
|
|
21
|
+
const parts = hostname.split(".");
|
|
22
|
+
if (parts.length > 2) {
|
|
23
|
+
return parts[0];
|
|
24
|
+
}
|
|
25
|
+
}
|
|
26
|
+
return request.query?.tenantId;
|
|
27
|
+
}
|
|
28
|
+
async resolveDatabaseName(tenantId) {
|
|
29
|
+
this.validateDatabaseName(tenantId);
|
|
30
|
+
return `tenant_${tenantId}`;
|
|
31
|
+
}
|
|
32
|
+
validateDatabaseName(name) {
|
|
33
|
+
if (!/^[a-zA-Z0-9_-]+$/.test(name)) {
|
|
34
|
+
throw new Error("Invalid tenant identifier format");
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
exports.DefaultTenantResolver = DefaultTenantResolver;
|
|
39
|
+
exports.DefaultTenantResolver = DefaultTenantResolver = __decorate([
|
|
40
|
+
(0, common_1.Injectable)()
|
|
41
|
+
], DefaultTenantResolver);
|
|
42
|
+
//# sourceMappingURL=tenant.resolver.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant.resolver.js","sourceRoot":"","sources":["../../../src/tenant-db/resolvers/tenant.resolver.ts"],"names":[],"mappings":";;;;;;;;;AAKA,2CAA4C;AAQrC,IAAM,qBAAqB,GAA3B,MAAM,qBAAqB;IAChC,eAAe,CAAC,OAAY;QAE1B,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,aAAa,CAAC,EAAE,CAAC;YACrC,OAAO,OAAO,CAAC,OAAO,CAAC,aAAa,CAAC,CAAC;QACxC,CAAC;QAED,IAAI,OAAO,CAAC,OAAO,EAAE,CAAC,UAAU,CAAC,EAAE,CAAC;YAClC,OAAO,OAAO,CAAC,OAAO,CAAC,UAAU,CAAC,CAAC;QACrC,CAAC;QAGD,MAAM,QAAQ,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,OAAO,EAAE,IAAI,CAAC;QAC3D,IAAI,QAAQ,EAAE,CAAC;YACb,MAAM,KAAK,GAAG,QAAQ,CAAC,KAAK,CAAC,GAAG,CAAC,CAAC;YAClC,IAAI,KAAK,CAAC,MAAM,GAAG,CAAC,EAAE,CAAC;gBACrB,OAAO,KAAK,CAAC,CAAC,CAAC,CAAC;YAClB,CAAC;QACH,CAAC;QAGD,OAAO,OAAO,CAAC,KAAK,EAAE,QAAQ,CAAC;IACjC,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,QAAgB;QAGxC,IAAI,CAAC,oBAAoB,CAAC,QAAQ,CAAC,CAAC;QACpC,OAAO,UAAU,QAAQ,EAAE,CAAC;IAC9B,CAAC;IAEO,oBAAoB,CAAC,IAAY;QAEvC,IAAI,CAAC,kBAAkB,CAAC,IAAI,CAAC,IAAI,CAAC,EAAE,CAAC;YACnC,MAAM,IAAI,KAAK,CAAC,kCAAkC,CAAC,CAAC;QACtD,CAAC;IACH,CAAC;CACF,CAAA;AArCY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;GACA,qBAAqB,CAqCjC"}
|
|
@@ -0,0 +1,14 @@
|
|
|
1
|
+
import { TenantDatabaseManager } from "../manager/tenant-db.manager";
|
|
2
|
+
export declare class TenantDatabaseService {
|
|
3
|
+
private readonly manager;
|
|
4
|
+
private readonly logger;
|
|
5
|
+
constructor(manager: TenantDatabaseManager);
|
|
6
|
+
runMigrations(databaseName: string): Promise<void>;
|
|
7
|
+
showMigrations(databaseName: string): Promise<void>;
|
|
8
|
+
getConnectionStatus(databaseName: string): Promise<boolean>;
|
|
9
|
+
getCacheMetrics(): {
|
|
10
|
+
size: number;
|
|
11
|
+
tenants: string[];
|
|
12
|
+
};
|
|
13
|
+
clearCache(): Promise<void>;
|
|
14
|
+
}
|
|
@@ -0,0 +1,62 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
+
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
+
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
+
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
+
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
+
};
|
|
8
|
+
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
+
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
+
};
|
|
11
|
+
var TenantDatabaseService_1;
|
|
12
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
13
|
+
exports.TenantDatabaseService = void 0;
|
|
14
|
+
const common_1 = require("@nestjs/common");
|
|
15
|
+
const tenant_db_manager_1 = require("../manager/tenant-db.manager");
|
|
16
|
+
let TenantDatabaseService = TenantDatabaseService_1 = class TenantDatabaseService {
|
|
17
|
+
constructor(manager) {
|
|
18
|
+
this.manager = manager;
|
|
19
|
+
this.logger = new common_1.Logger(TenantDatabaseService_1.name);
|
|
20
|
+
}
|
|
21
|
+
async runMigrations(databaseName) {
|
|
22
|
+
const dataSource = await this.manager.getDataSource(databaseName);
|
|
23
|
+
try {
|
|
24
|
+
const migrations = await dataSource.runMigrations();
|
|
25
|
+
this.logger.log(`Executed ${migrations.length} migration(s) for ${databaseName}`);
|
|
26
|
+
}
|
|
27
|
+
catch (error) {
|
|
28
|
+
this.logger.error(`Migration failed for ${databaseName}:`, error);
|
|
29
|
+
throw error;
|
|
30
|
+
}
|
|
31
|
+
}
|
|
32
|
+
async showMigrations(databaseName) {
|
|
33
|
+
const dataSource = await this.manager.getDataSource(databaseName);
|
|
34
|
+
const migrations = await dataSource.showMigrations();
|
|
35
|
+
this.logger.log(`${databaseName} has ${migrations ? "pending" : "no"} migrations`);
|
|
36
|
+
}
|
|
37
|
+
async getConnectionStatus(databaseName) {
|
|
38
|
+
try {
|
|
39
|
+
const dataSource = await this.manager.getDataSource(databaseName);
|
|
40
|
+
return dataSource.isInitialized;
|
|
41
|
+
}
|
|
42
|
+
catch {
|
|
43
|
+
return false;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
getCacheMetrics() {
|
|
47
|
+
return {
|
|
48
|
+
size: this.manager.getCacheSize(),
|
|
49
|
+
tenants: this.manager.getCachedTenants(),
|
|
50
|
+
};
|
|
51
|
+
}
|
|
52
|
+
async clearCache() {
|
|
53
|
+
await this.manager.clearCache();
|
|
54
|
+
this.logger.log("Tenant datasource cache cleared");
|
|
55
|
+
}
|
|
56
|
+
};
|
|
57
|
+
exports.TenantDatabaseService = TenantDatabaseService;
|
|
58
|
+
exports.TenantDatabaseService = TenantDatabaseService = TenantDatabaseService_1 = __decorate([
|
|
59
|
+
(0, common_1.Injectable)(),
|
|
60
|
+
__metadata("design:paramtypes", [tenant_db_manager_1.TenantDatabaseManager])
|
|
61
|
+
], TenantDatabaseService);
|
|
62
|
+
//# sourceMappingURL=tenant-db.service.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.service.js","sourceRoot":"","sources":["../../../src/tenant-db/service/tenant-db.service.ts"],"names":[],"mappings":";;;;;;;;;;;;;AAAA,2CAAoD;AACpD,oEAAqE;AAG9D,IAAM,qBAAqB,6BAA3B,MAAM,qBAAqB;IAGhC,YAA6B,OAA8B;QAA9B,YAAO,GAAP,OAAO,CAAuB;QAF1C,WAAM,GAAG,IAAI,eAAM,CAAC,uBAAqB,CAAC,IAAI,CAAC,CAAC;IAEH,CAAC;IAE/D,KAAK,CAAC,aAAa,CAAC,YAAoB;QACtC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAElE,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,aAAa,EAAE,CAAC;YACpD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,YAAY,UAAU,CAAC,MAAM,qBAAqB,YAAY,EAAE,CACjE,CAAC;QACJ,CAAC;QAAC,OAAO,KAAK,EAAE,CAAC;YACf,IAAI,CAAC,MAAM,CAAC,KAAK,CAAC,wBAAwB,YAAY,GAAG,EAAE,KAAK,CAAC,CAAC;YAClE,MAAM,KAAK,CAAC;QACd,CAAC;IACH,CAAC;IAED,KAAK,CAAC,cAAc,CAAC,YAAoB;QACvC,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;QAClE,MAAM,UAAU,GAAG,MAAM,UAAU,CAAC,cAAc,EAAE,CAAC;QAErD,IAAI,CAAC,MAAM,CAAC,GAAG,CACb,GAAG,YAAY,QAAQ,UAAU,CAAC,CAAC,CAAC,SAAS,CAAC,CAAC,CAAC,IAAI,aAAa,CAClE,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,mBAAmB,CAAC,YAAoB;QAC5C,IAAI,CAAC;YACH,MAAM,UAAU,GAAG,MAAM,IAAI,CAAC,OAAO,CAAC,aAAa,CAAC,YAAY,CAAC,CAAC;YAClE,OAAO,UAAU,CAAC,aAAa,CAAC;QAClC,CAAC;QAAC,MAAM,CAAC;YACP,OAAO,KAAK,CAAC;QACf,CAAC;IACH,CAAC;IAED,eAAe;QACb,OAAO;YACL,IAAI,EAAE,IAAI,CAAC,OAAO,CAAC,YAAY,EAAE;YACjC,OAAO,EAAE,IAAI,CAAC,OAAO,CAAC,gBAAgB,EAAE;SACzC,CAAC;IACJ,CAAC;IAED,KAAK,CAAC,UAAU;QACd,MAAM,IAAI,CAAC,OAAO,CAAC,UAAU,EAAE,CAAC;QAChC,IAAI,CAAC,MAAM,CAAC,GAAG,CAAC,iCAAiC,CAAC,CAAC;IACrD,CAAC;CACF,CAAA;AAhDY,sDAAqB;gCAArB,qBAAqB;IADjC,IAAA,mBAAU,GAAE;qCAI2B,yCAAqB;GAHhD,qBAAqB,CAgDjC"}
|
|
@@ -0,0 +1,10 @@
|
|
|
1
|
+
import { DataSource } from "typeorm";
|
|
2
|
+
export declare function getCachedConnection(key: string): DataSource | undefined;
|
|
3
|
+
export declare function setCachedConnection(key: string, dataSource: DataSource): void;
|
|
4
|
+
export declare function generateConnectionKey(options: {
|
|
5
|
+
name?: string;
|
|
6
|
+
database?: string;
|
|
7
|
+
host: string;
|
|
8
|
+
port: number;
|
|
9
|
+
user: string;
|
|
10
|
+
}): string;
|
|
@@ -0,0 +1,17 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.getCachedConnection = getCachedConnection;
|
|
4
|
+
exports.setCachedConnection = setCachedConnection;
|
|
5
|
+
exports.generateConnectionKey = generateConnectionKey;
|
|
6
|
+
const connectionCache = [];
|
|
7
|
+
function getCachedConnection(key) {
|
|
8
|
+
return connectionCache.find((c) => c.key === key)?.dataSource;
|
|
9
|
+
}
|
|
10
|
+
function setCachedConnection(key, dataSource) {
|
|
11
|
+
connectionCache.push({ key, dataSource });
|
|
12
|
+
}
|
|
13
|
+
function generateConnectionKey(options) {
|
|
14
|
+
const dbName = options.database ?? options.name ?? "default";
|
|
15
|
+
return `${options.host}_${options.port}_${dbName}_${options.user}`;
|
|
16
|
+
}
|
|
17
|
+
//# sourceMappingURL=tenant-cache.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-cache.js","sourceRoot":"","sources":["../../src/tenant-db/tenant-cache.ts"],"names":[],"mappings":";;AAUA,kDAEC;AAED,kDAEC;AAED,sDASC;AAnBD,MAAM,eAAe,GAAuB,EAAE,CAAC;AAE/C,SAAgB,mBAAmB,CAAC,GAAW;IAC7C,OAAO,eAAe,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,GAAG,KAAK,GAAG,CAAC,EAAE,UAAU,CAAC;AAChE,CAAC;AAED,SAAgB,mBAAmB,CAAC,GAAW,EAAE,UAAsB;IACrE,eAAe,CAAC,IAAI,CAAC,EAAE,GAAG,EAAE,UAAU,EAAE,CAAC,CAAC;AAC5C,CAAC;AAED,SAAgB,qBAAqB,CAAC,OAMrC;IACC,MAAM,MAAM,GAAG,OAAO,CAAC,QAAQ,IAAI,OAAO,CAAC,IAAI,IAAI,SAAS,CAAC;IAC7D,OAAO,GAAG,OAAO,CAAC,IAAI,IAAI,OAAO,CAAC,IAAI,IAAI,MAAM,IAAI,OAAO,CAAC,IAAI,EAAE,CAAC;AACrE,CAAC"}
|
|
@@ -0,0 +1,29 @@
|
|
|
1
|
+
import { DataSource } from "typeorm";
|
|
2
|
+
export interface TenantDataSourceOptions {
|
|
3
|
+
host?: string;
|
|
4
|
+
port?: number;
|
|
5
|
+
username?: string;
|
|
6
|
+
password?: string;
|
|
7
|
+
database?: string;
|
|
8
|
+
entities?: string[] | any[];
|
|
9
|
+
migrations?: string[] | any[];
|
|
10
|
+
synchronize?: boolean;
|
|
11
|
+
extra?: any;
|
|
12
|
+
}
|
|
13
|
+
export interface TenantStore {
|
|
14
|
+
dataSource?: DataSource;
|
|
15
|
+
tenantId?: string;
|
|
16
|
+
}
|
|
17
|
+
export interface CachedDataSource {
|
|
18
|
+
dataSource: DataSource;
|
|
19
|
+
lastUsed: number;
|
|
20
|
+
}
|
|
21
|
+
export interface TenantConfig {
|
|
22
|
+
idleTimeoutMs: number;
|
|
23
|
+
maxCachedTenants: number;
|
|
24
|
+
poolMax: number;
|
|
25
|
+
defaultHost: string;
|
|
26
|
+
defaultPort: number;
|
|
27
|
+
defaultUsername: string;
|
|
28
|
+
defaultPassword: string;
|
|
29
|
+
}
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"tenant-db.types.js","sourceRoot":"","sources":["../../../src/tenant-db/types/tenant-db.types.ts"],"names":[],"mappings":""}
|