@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.
Files changed (419) hide show
  1. package/README.md +346 -28
  2. package/dist/common.d.ts +2 -0
  3. package/dist/common.js +6 -0
  4. package/dist/common.js.map +1 -0
  5. package/dist/core/database/switch.schema.d.ts +6 -0
  6. package/dist/core/database/switch.schema.js +39 -0
  7. package/dist/core/database/switch.schema.js.map +1 -0
  8. package/dist/core/enums/user-permission.d.ts +32 -0
  9. package/dist/core/enums/user-permission.js +37 -0
  10. package/dist/core/enums/user-permission.js.map +1 -0
  11. package/dist/core/utils/base.entity.d.ts +1 -0
  12. package/dist/core/utils/base.entity.js +4 -3
  13. package/dist/core/utils/base.entity.js.map +1 -1
  14. package/dist/core/utils/base.migration.d.ts +2 -0
  15. package/dist/core/utils/base.migration.js +44 -0
  16. package/dist/core/utils/base.migration.js.map +1 -0
  17. package/dist/core/utils/guard-base.entity.d.ts +10 -0
  18. package/dist/core/utils/guard-base.entity.js +46 -0
  19. package/dist/core/utils/guard-base.entity.js.map +1 -0
  20. package/dist/core/utils/lower-case.transformer.d.ts +3 -0
  21. package/dist/core/utils/lower-case.transformer.js +6 -0
  22. package/dist/core/utils/lower-case.transformer.js.map +1 -0
  23. package/dist/core/utils/pagination.entity.js.map +1 -1
  24. package/dist/core/utils/remove-spaces.transformer.d.ts +3 -0
  25. package/dist/core/utils/remove-spaces.transformer.js +6 -0
  26. package/dist/core/utils/remove-spaces.transformer.js.map +1 -0
  27. package/dist/core/utils/request.d.ts +1 -1
  28. package/dist/database/config/typeorm.config.d.ts +5 -0
  29. package/dist/database/config/typeorm.config.js +38 -0
  30. package/dist/database/config/typeorm.config.js.map +1 -0
  31. package/dist/database/migrations/1765027603465-CreateUserTable.d.ts +6 -0
  32. package/dist/database/migrations/1765027603465-CreateUserTable.js +63 -0
  33. package/dist/database/migrations/1765027603465-CreateUserTable.js.map +1 -0
  34. package/dist/database/migrations/1765042818137-CreateModuleTable.d.ts +6 -0
  35. package/dist/database/migrations/1765042818137-CreateModuleTable.js +53 -0
  36. package/dist/database/migrations/1765042818137-CreateModuleTable.js.map +1 -0
  37. package/dist/database/migrations/1765042839363-CreatepermissionTable.d.ts +6 -0
  38. package/dist/database/migrations/1765042839363-CreatepermissionTable.js +74 -0
  39. package/dist/database/migrations/1765042839363-CreatepermissionTable.js.map +1 -0
  40. package/dist/database/migrations/1765042865354-CreateRoleTable.d.ts +6 -0
  41. package/dist/database/migrations/1765042865354-CreateRoleTable.js +60 -0
  42. package/dist/database/migrations/1765042865354-CreateRoleTable.js.map +1 -0
  43. package/dist/database/migrations/1765042888581-CreateUserTable.d.ts +6 -0
  44. package/dist/database/migrations/1765042888581-CreateUserTable.js +58 -0
  45. package/dist/database/migrations/1765042888581-CreateUserTable.js.map +1 -0
  46. package/dist/database/migrations/1765042926793-CreateUserRoleTable.d.ts +6 -0
  47. package/dist/database/migrations/1765042926793-CreateUserRoleTable.js +54 -0
  48. package/dist/database/migrations/1765042926793-CreateUserRoleTable.js.map +1 -0
  49. package/dist/database/migrations/1765042959694-CreateRolePermissionTable.d.ts +6 -0
  50. package/dist/database/migrations/1765042959694-CreateRolePermissionTable.js +45 -0
  51. package/dist/database/migrations/1765042959694-CreateRolePermissionTable.js.map +1 -0
  52. package/dist/database/migrations/1765042980940-CreateUserPermissionTable.d.ts +6 -0
  53. package/dist/database/migrations/1765042980940-CreateUserPermissionTable.js +50 -0
  54. package/dist/database/migrations/1765042980940-CreateUserPermissionTable.js.map +1 -0
  55. package/dist/database/seeders/auth.seeder.d.ts +12 -0
  56. package/dist/database/seeders/auth.seeder.js +338 -0
  57. package/dist/database/seeders/auth.seeder.js.map +1 -0
  58. package/dist/database/seeders/modules.seeder.d.ts +6 -0
  59. package/dist/database/seeders/modules.seeder.js +39 -0
  60. package/dist/database/seeders/modules.seeder.js.map +1 -0
  61. package/dist/database/seeders/orchestrator.seeder.d.ts +6 -0
  62. package/dist/database/seeders/orchestrator.seeder.js +32 -0
  63. package/dist/database/seeders/orchestrator.seeder.js.map +1 -0
  64. package/dist/database/seeders/permissions.seeder.d.ts +6 -0
  65. package/dist/database/seeders/permissions.seeder.js +96 -0
  66. package/dist/database/seeders/permissions.seeder.js.map +1 -0
  67. package/dist/database/seeders/role-permissions.seeder.d.ts +6 -0
  68. package/dist/database/seeders/role-permissions.seeder.js +35 -0
  69. package/dist/database/seeders/role-permissions.seeder.js.map +1 -0
  70. package/dist/database/seeders/roles.seeder.d.ts +6 -0
  71. package/dist/database/seeders/roles.seeder.js +33 -0
  72. package/dist/database/seeders/roles.seeder.js.map +1 -0
  73. package/dist/database/seeders/run.seeder.d.ts +1 -0
  74. package/dist/database/seeders/run.seeder.js +82 -0
  75. package/dist/database/seeders/run.seeder.js.map +1 -0
  76. package/dist/database/seeders/user-roles.seeder.d.ts +6 -0
  77. package/dist/database/seeders/user-roles.seeder.js +41 -0
  78. package/dist/database/seeders/user-roles.seeder.js.map +1 -0
  79. package/dist/database/seeders/users.seeder.d.ts +6 -0
  80. package/dist/database/seeders/users.seeder.js +72 -0
  81. package/dist/database/seeders/users.seeder.js.map +1 -0
  82. package/dist/index.d.ts +72 -5
  83. package/dist/index.js +76 -5
  84. package/dist/index.js.map +1 -1
  85. package/dist/modules/app.module.d.ts +16 -0
  86. package/dist/modules/app.module.js +86 -0
  87. package/dist/modules/app.module.js.map +1 -0
  88. package/dist/modules/auth/auth.controller.d.ts +10 -0
  89. package/dist/modules/auth/auth.controller.js +47 -0
  90. package/dist/modules/auth/auth.controller.js.map +1 -0
  91. package/dist/modules/auth/auth.module-definition.d.ts +2 -0
  92. package/dist/modules/auth/auth.module-definition.js +11 -0
  93. package/dist/modules/auth/auth.module-definition.js.map +1 -0
  94. package/dist/modules/auth/auth.module.d.ts +2 -0
  95. package/dist/modules/auth/auth.module.js +48 -0
  96. package/dist/modules/auth/auth.module.js.map +1 -0
  97. package/dist/modules/auth/auth.options.d.ts +13 -0
  98. package/dist/modules/auth/auth.options.js +3 -0
  99. package/dist/modules/auth/auth.options.js.map +1 -0
  100. package/dist/modules/auth/auth.service.d.ts +15 -0
  101. package/dist/modules/auth/auth.service.js +133 -0
  102. package/dist/modules/auth/auth.service.js.map +1 -0
  103. package/dist/modules/auth/dto/auth-login.dto.d.ts +5 -0
  104. package/dist/modules/auth/dto/auth-login.dto.js +32 -0
  105. package/dist/modules/auth/dto/auth-login.dto.js.map +1 -0
  106. package/dist/modules/auth/dto/register.dto.d.ts +7 -0
  107. package/dist/modules/auth/dto/register.dto.js +46 -0
  108. package/dist/modules/auth/dto/register.dto.js.map +1 -0
  109. package/dist/modules/module/dtos/create-module.dto.d.ts +5 -0
  110. package/dist/modules/module/dtos/create-module.dto.js +14 -0
  111. package/dist/modules/module/dtos/create-module.dto.js.map +1 -0
  112. package/dist/modules/module/dtos/module-query.dto.d.ts +3 -0
  113. package/dist/modules/module/dtos/module-query.dto.js +8 -0
  114. package/dist/modules/module/dtos/module-query.dto.js.map +1 -0
  115. package/dist/modules/module/dtos/module.dto.d.ts +10 -0
  116. package/dist/modules/module/dtos/module.dto.js +84 -0
  117. package/dist/modules/module/dtos/module.dto.js.map +1 -0
  118. package/dist/modules/module/dtos/update-module.dto.d.ts +5 -0
  119. package/dist/modules/module/dtos/update-module.dto.js +14 -0
  120. package/dist/modules/module/dtos/update-module.dto.js.map +1 -0
  121. package/dist/modules/module/module.controller.d.ts +12 -0
  122. package/dist/modules/module/module.controller.js +111 -0
  123. package/dist/modules/module/module.controller.js.map +1 -0
  124. package/dist/modules/module/module.entity.d.ts +10 -0
  125. package/dist/modules/module/module.entity.js +46 -0
  126. package/dist/modules/module/module.entity.js.map +1 -0
  127. package/dist/modules/module/module.mapper.d.ts +5 -0
  128. package/dist/modules/module/module.mapper.js +35 -0
  129. package/dist/modules/module/module.mapper.js.map +1 -0
  130. package/dist/modules/module/module.module.d.ts +2 -0
  131. package/dist/modules/module/module.module.js +27 -0
  132. package/dist/modules/module/module.module.js.map +1 -0
  133. package/dist/modules/module/module.service.d.ts +13 -0
  134. package/dist/modules/module/module.service.js +63 -0
  135. package/dist/modules/module/module.service.js.map +1 -0
  136. package/dist/modules/permission/dtos/create-permission.dto.d.ts +5 -0
  137. package/dist/modules/permission/dtos/create-permission.dto.js +14 -0
  138. package/dist/modules/permission/dtos/create-permission.dto.js.map +1 -0
  139. package/dist/modules/permission/dtos/permission-query.dto.d.ts +3 -0
  140. package/dist/modules/permission/dtos/permission-query.dto.js +8 -0
  141. package/dist/modules/permission/dtos/permission-query.dto.js.map +1 -0
  142. package/dist/modules/permission/dtos/permission.dto.d.ts +9 -0
  143. package/dist/modules/permission/dtos/permission.dto.js +72 -0
  144. package/dist/modules/permission/dtos/permission.dto.js.map +1 -0
  145. package/dist/modules/permission/dtos/update-permission.dto.d.ts +5 -0
  146. package/dist/modules/permission/dtos/update-permission.dto.js +9 -0
  147. package/dist/modules/permission/dtos/update-permission.dto.js.map +1 -0
  148. package/dist/modules/permission/permission.controller.d.ts +11 -0
  149. package/dist/modules/permission/permission.controller.js +109 -0
  150. package/dist/modules/permission/permission.controller.js.map +1 -0
  151. package/dist/modules/permission/permission.entity.d.ts +11 -0
  152. package/dist/modules/permission/permission.entity.js +57 -0
  153. package/dist/modules/permission/permission.entity.js.map +1 -0
  154. package/dist/modules/permission/permission.mapper.d.ts +5 -0
  155. package/dist/modules/permission/permission.mapper.js +32 -0
  156. package/dist/modules/permission/permission.mapper.js.map +1 -0
  157. package/dist/modules/permission/permission.module.d.ts +2 -0
  158. package/dist/modules/permission/permission.module.js +27 -0
  159. package/dist/modules/permission/permission.module.js.map +1 -0
  160. package/dist/modules/permission/permission.service.d.ts +13 -0
  161. package/dist/modules/permission/permission.service.js +60 -0
  162. package/dist/modules/permission/permission.service.js.map +1 -0
  163. package/dist/modules/role/dtos/create-role.dto.d.ts +6 -0
  164. package/dist/modules/role/dtos/create-role.dto.js +15 -0
  165. package/dist/modules/role/dtos/create-role.dto.js.map +1 -0
  166. package/dist/modules/role/dtos/role-query.dto.d.ts +3 -0
  167. package/dist/modules/role/dtos/role-query.dto.js +8 -0
  168. package/dist/modules/role/dtos/role-query.dto.js.map +1 -0
  169. package/dist/modules/role/dtos/role.dto.d.ts +11 -0
  170. package/dist/modules/role/dtos/role.dto.js +82 -0
  171. package/dist/modules/role/dtos/role.dto.js.map +1 -0
  172. package/dist/modules/role/dtos/update-role.dto.d.ts +5 -0
  173. package/dist/modules/role/dtos/update-role.dto.js +9 -0
  174. package/dist/modules/role/dtos/update-role.dto.js.map +1 -0
  175. package/dist/modules/role/role.controller.d.ts +16 -0
  176. package/dist/modules/role/role.controller.js +174 -0
  177. package/dist/modules/role/role.controller.js.map +1 -0
  178. package/dist/modules/role/role.entity.d.ts +11 -0
  179. package/dist/modules/role/role.entity.js +61 -0
  180. package/dist/modules/role/role.entity.js.map +1 -0
  181. package/dist/modules/role/role.mapper.d.ts +9 -0
  182. package/dist/modules/role/role.mapper.js +74 -0
  183. package/dist/modules/role/role.mapper.js.map +1 -0
  184. package/dist/modules/role/role.module.d.ts +2 -0
  185. package/dist/modules/role/role.module.js +27 -0
  186. package/dist/modules/role/role.module.js.map +1 -0
  187. package/dist/modules/role/role.service.d.ts +13 -0
  188. package/dist/modules/role/role.service.js +63 -0
  189. package/dist/modules/role/role.service.js.map +1 -0
  190. package/dist/modules/role-permission/dtos/create-role-permission.dto.d.ts +5 -0
  191. package/dist/modules/role-permission/dtos/create-role-permission.dto.js +14 -0
  192. package/dist/modules/role-permission/dtos/create-role-permission.dto.js.map +1 -0
  193. package/dist/modules/role-permission/dtos/role-permission-query.dto.d.ts +3 -0
  194. package/dist/modules/role-permission/dtos/role-permission-query.dto.js +8 -0
  195. package/dist/modules/role-permission/dtos/role-permission-query.dto.js.map +1 -0
  196. package/dist/modules/role-permission/dtos/role-permission.dto.d.ts +7 -0
  197. package/dist/modules/role-permission/dtos/role-permission.dto.js +28 -0
  198. package/dist/modules/role-permission/dtos/role-permission.dto.js.map +1 -0
  199. package/dist/modules/role-permission/dtos/update-role-permission.dto.d.ts +5 -0
  200. package/dist/modules/role-permission/dtos/update-role-permission.dto.js +9 -0
  201. package/dist/modules/role-permission/dtos/update-role-permission.dto.js.map +1 -0
  202. package/dist/modules/role-permission/role-permission.controller.d.ts +2 -0
  203. package/dist/modules/role-permission/role-permission.controller.js +17 -0
  204. package/dist/modules/role-permission/role-permission.controller.js.map +1 -0
  205. package/dist/modules/role-permission/role-permission.entity.d.ts +7 -0
  206. package/dist/modules/role-permission/role-permission.entity.js +33 -0
  207. package/dist/modules/role-permission/role-permission.entity.js.map +1 -0
  208. package/dist/modules/role-permission/role-permission.mapper.d.ts +10 -0
  209. package/dist/modules/role-permission/role-permission.mapper.js +47 -0
  210. package/dist/modules/role-permission/role-permission.mapper.js.map +1 -0
  211. package/dist/modules/role-permission/role-permission.module.d.ts +2 -0
  212. package/dist/modules/role-permission/role-permission.module.js +29 -0
  213. package/dist/modules/role-permission/role-permission.module.js.map +1 -0
  214. package/dist/modules/role-permission/role-permission.service.d.ts +13 -0
  215. package/dist/modules/role-permission/role-permission.service.js +60 -0
  216. package/dist/modules/role-permission/role-permission.service.js.map +1 -0
  217. package/dist/modules/user/dtos/create-user.dto.d.ts +6 -0
  218. package/dist/modules/user/dtos/create-user.dto.js +15 -0
  219. package/dist/modules/user/dtos/create-user.dto.js.map +1 -0
  220. package/dist/modules/user/dtos/update-user.dto.js.map +1 -0
  221. package/dist/modules/user/dtos/user-query.dto.d.ts +3 -0
  222. package/dist/{user → modules/user}/dtos/user-query.dto.js +1 -1
  223. package/dist/modules/user/dtos/user-query.dto.js.map +1 -0
  224. package/dist/modules/user/dtos/user.dto.d.ts +13 -0
  225. package/dist/{user → modules/user}/dtos/user.dto.js +1 -12
  226. package/dist/modules/user/dtos/user.dto.js.map +1 -0
  227. package/dist/modules/user/user.controller.d.ts +18 -0
  228. package/dist/{user → modules/user}/user.controller.js +62 -29
  229. package/dist/modules/user/user.controller.js.map +1 -0
  230. package/dist/{user → modules/user}/user.entity.d.ts +4 -3
  231. package/dist/{user → modules/user}/user.entity.js +17 -6
  232. package/dist/modules/user/user.entity.js.map +1 -0
  233. package/dist/{user → modules/user}/user.mapper.d.ts +6 -2
  234. package/dist/modules/user/user.mapper.js +126 -0
  235. package/dist/modules/user/user.mapper.js.map +1 -0
  236. package/dist/modules/user/user.module-definition.d.ts +5 -0
  237. package/dist/modules/user/user.module-definition.js +9 -0
  238. package/dist/modules/user/user.module-definition.js.map +1 -0
  239. package/dist/modules/user/user.module.d.ts +2 -0
  240. package/dist/{user → modules/user}/user.module.js +10 -14
  241. package/dist/modules/user/user.module.js.map +1 -0
  242. package/dist/{user → modules/user}/user.service.d.ts +4 -4
  243. package/dist/{user → modules/user}/user.service.js +8 -8
  244. package/dist/modules/user/user.service.js.map +1 -0
  245. package/dist/modules/user-permission/dtos/create-user-permission.dto.d.ts +5 -0
  246. package/dist/modules/user-permission/dtos/create-user-permission.dto.js +14 -0
  247. package/dist/modules/user-permission/dtos/create-user-permission.dto.js.map +1 -0
  248. package/dist/modules/user-permission/dtos/update-user-permission.dto.d.ts +5 -0
  249. package/dist/modules/user-permission/dtos/update-user-permission.dto.js +9 -0
  250. package/dist/modules/user-permission/dtos/update-user-permission.dto.js.map +1 -0
  251. package/dist/modules/user-permission/dtos/user-permission-query.dto.d.ts +3 -0
  252. package/dist/modules/user-permission/dtos/user-permission-query.dto.js +8 -0
  253. package/dist/modules/user-permission/dtos/user-permission-query.dto.js.map +1 -0
  254. package/dist/modules/user-permission/dtos/user-permission.dto.d.ts +8 -0
  255. package/dist/modules/user-permission/dtos/user-permission.dto.js +36 -0
  256. package/dist/modules/user-permission/dtos/user-permission.dto.js.map +1 -0
  257. package/dist/modules/user-permission/user-permission.controller.d.ts +2 -0
  258. package/dist/modules/user-permission/user-permission.controller.js +17 -0
  259. package/dist/modules/user-permission/user-permission.controller.js.map +1 -0
  260. package/dist/modules/user-permission/user-permission.entity.d.ts +8 -0
  261. package/dist/modules/user-permission/user-permission.entity.js +41 -0
  262. package/dist/modules/user-permission/user-permission.entity.js.map +1 -0
  263. package/dist/modules/user-permission/user-permission.mapper.d.ts +10 -0
  264. package/dist/modules/user-permission/user-permission.mapper.js +51 -0
  265. package/dist/modules/user-permission/user-permission.mapper.js.map +1 -0
  266. package/dist/modules/user-permission/user-permission.module.d.ts +2 -0
  267. package/dist/modules/user-permission/user-permission.module.js +29 -0
  268. package/dist/modules/user-permission/user-permission.module.js.map +1 -0
  269. package/dist/modules/user-permission/user-permission.service.d.ts +13 -0
  270. package/dist/modules/user-permission/user-permission.service.js +60 -0
  271. package/dist/modules/user-permission/user-permission.service.js.map +1 -0
  272. package/dist/modules/user-role/dtos/create-user-role.dto.d.ts +5 -0
  273. package/dist/modules/user-role/dtos/create-user-role.dto.js +14 -0
  274. package/dist/modules/user-role/dtos/create-user-role.dto.js.map +1 -0
  275. package/dist/modules/user-role/dtos/update-user-role.dto.d.ts +5 -0
  276. package/dist/modules/user-role/dtos/update-user-role.dto.js +9 -0
  277. package/dist/modules/user-role/dtos/update-user-role.dto.js.map +1 -0
  278. package/dist/modules/user-role/dtos/user-role-query.dto.d.ts +3 -0
  279. package/dist/modules/user-role/dtos/user-role-query.dto.js +8 -0
  280. package/dist/modules/user-role/dtos/user-role-query.dto.js.map +1 -0
  281. package/dist/modules/user-role/dtos/user-role.dto.d.ts +7 -0
  282. package/dist/{security/security.service.js → modules/user-role/dtos/user-role.dto.js} +17 -20
  283. package/dist/modules/user-role/dtos/user-role.dto.js.map +1 -0
  284. package/dist/modules/user-role/user-role.controller.d.ts +0 -0
  285. package/dist/modules/user-role/user-role.controller.js +2 -0
  286. package/dist/modules/user-role/user-role.controller.js.map +1 -0
  287. package/dist/modules/user-role/user-role.entity.d.ts +0 -0
  288. package/dist/modules/user-role/user-role.entity.js +2 -0
  289. package/dist/modules/user-role/user-role.entity.js.map +1 -0
  290. package/dist/modules/user-role/user-role.mapper.d.ts +0 -0
  291. package/dist/modules/user-role/user-role.mapper.js +2 -0
  292. package/dist/modules/user-role/user-role.mapper.js.map +1 -0
  293. package/dist/modules/user-role/user-role.module.d.ts +0 -0
  294. package/dist/modules/user-role/user-role.module.js +2 -0
  295. package/dist/modules/user-role/user-role.module.js.map +1 -0
  296. package/dist/modules/user-role/user-role.service.d.ts +0 -0
  297. package/dist/modules/user-role/user-role.service.js +2 -0
  298. package/dist/modules/user-role/user-role.service.js.map +1 -0
  299. package/dist/scripts/run-migrations.d.ts +1 -0
  300. package/dist/scripts/run-migrations.js +60 -0
  301. package/dist/scripts/run-migrations.js.map +1 -0
  302. package/dist/security/decorators/auth-user.decorator.d.ts +1 -1
  303. package/dist/security/decorators/auth-user.decorator.js +3 -3
  304. package/dist/security/decorators/auth-user.decorator.js.map +1 -1
  305. package/dist/security/decorators/permissions.decorator.d.ts +2 -0
  306. package/dist/security/decorators/permissions.decorator.js +7 -0
  307. package/dist/security/decorators/permissions.decorator.js.map +1 -0
  308. package/dist/security/decorators/roles.decorator.d.ts +2 -1
  309. package/dist/security/decorators/roles.decorator.js +1 -1
  310. package/dist/security/decorators/roles.decorator.js.map +1 -1
  311. package/dist/security/guards/jwt-auth.guard.d.ts +5 -2
  312. package/dist/security/guards/jwt-auth.guard.js +12 -5
  313. package/dist/security/guards/jwt-auth.guard.js.map +1 -1
  314. package/dist/security/guards/roles.guard.d.ts +7 -5
  315. package/dist/security/guards/roles.guard.js +33 -9
  316. package/dist/security/guards/roles.guard.js.map +1 -1
  317. package/dist/security/interfaces/jwt-payload.interface.d.ts +14 -0
  318. package/dist/security/interfaces/jwt-payload.interface.js +3 -0
  319. package/dist/security/interfaces/jwt-payload.interface.js.map +1 -0
  320. package/dist/security/interfaces/token.interface.d.ts +3 -0
  321. package/dist/security/interfaces/token.interface.js +3 -0
  322. package/dist/security/interfaces/token.interface.js.map +1 -0
  323. package/dist/security/password-util.d.ts +3 -0
  324. package/dist/security/password-util.js +44 -0
  325. package/dist/security/password-util.js.map +1 -0
  326. package/dist/security/strategies/jwt.strategy.d.ts +14 -3
  327. package/dist/security/strategies/jwt.strategy.js +28 -13
  328. package/dist/security/strategies/jwt.strategy.js.map +1 -1
  329. package/dist/seeders/auth.seeder.d.ts +12 -0
  330. package/dist/seeders/auth.seeder.js +404 -0
  331. package/dist/seeders/auth.seeder.js.map +1 -0
  332. package/dist/seeders/modules.seeder.d.ts +6 -0
  333. package/dist/seeders/modules.seeder.js +53 -0
  334. package/dist/seeders/modules.seeder.js.map +1 -0
  335. package/dist/seeders/orchestrator.seeder.d.ts +6 -0
  336. package/dist/seeders/orchestrator.seeder.js +32 -0
  337. package/dist/seeders/orchestrator.seeder.js.map +1 -0
  338. package/dist/seeders/permissions.seeder.d.ts +6 -0
  339. package/dist/seeders/permissions.seeder.js +51 -0
  340. package/dist/seeders/permissions.seeder.js.map +1 -0
  341. package/dist/seeders/role-permissions.seeder.d.ts +6 -0
  342. package/dist/seeders/role-permissions.seeder.js +65 -0
  343. package/dist/seeders/role-permissions.seeder.js.map +1 -0
  344. package/dist/seeders/roles.seeder.d.ts +6 -0
  345. package/dist/seeders/roles.seeder.js +57 -0
  346. package/dist/seeders/roles.seeder.js.map +1 -0
  347. package/dist/seeders/run.seeder.d.ts +1 -0
  348. package/dist/seeders/run.seeder.js +82 -0
  349. package/dist/seeders/run.seeder.js.map +1 -0
  350. package/dist/seeders/user/data.d.ts +2 -0
  351. package/dist/seeders/user/data.js +16 -0
  352. package/dist/seeders/user/data.js.map +1 -0
  353. package/dist/seeders/user/user-seeder.module.d.ts +2 -0
  354. package/dist/seeders/user/user-seeder.module.js +24 -0
  355. package/dist/seeders/user/user-seeder.module.js.map +1 -0
  356. package/dist/seeders/user/user-seeder.service.d.ts +7 -0
  357. package/dist/seeders/user/user-seeder.service.js +51 -0
  358. package/dist/seeders/user/user-seeder.service.js.map +1 -0
  359. package/dist/seeders/user-roles.seeder.d.ts +6 -0
  360. package/dist/seeders/user-roles.seeder.js +44 -0
  361. package/dist/seeders/user-roles.seeder.js.map +1 -0
  362. package/dist/seeders/users.seeder.d.ts +6 -0
  363. package/dist/seeders/users.seeder.js +93 -0
  364. package/dist/seeders/users.seeder.js.map +1 -0
  365. package/dist/tenant-db/config/tenant-db.config.d.ts +4 -0
  366. package/dist/tenant-db/config/tenant-db.config.js +18 -0
  367. package/dist/tenant-db/config/tenant-db.config.js.map +1 -0
  368. package/dist/tenant-db/context/tenant-db.context.d.ts +11 -0
  369. package/dist/tenant-db/context/tenant-db.context.js +46 -0
  370. package/dist/tenant-db/context/tenant-db.context.js.map +1 -0
  371. package/dist/tenant-db/helpers/tenant-db.helpers.d.ts +13 -0
  372. package/dist/tenant-db/helpers/tenant-db.helpers.js +42 -0
  373. package/dist/tenant-db/helpers/tenant-db.helpers.js.map +1 -0
  374. package/dist/tenant-db/manager/tenant-db.manager.d.ts +20 -0
  375. package/dist/tenant-db/manager/tenant-db.manager.js +135 -0
  376. package/dist/tenant-db/manager/tenant-db.manager.js.map +1 -0
  377. package/dist/tenant-db/middleware/tenant-db.middleware.d.ts +13 -0
  378. package/dist/tenant-db/middleware/tenant-db.middleware.js +46 -0
  379. package/dist/tenant-db/middleware/tenant-db.middleware.js.map +1 -0
  380. package/dist/tenant-db/module/tenant=db-module.d.ts +10 -0
  381. package/dist/tenant-db/module/tenant=db-module.js +53 -0
  382. package/dist/tenant-db/module/tenant=db-module.js.map +1 -0
  383. package/dist/tenant-db/resolvers/tenant.resolver.d.ts +9 -0
  384. package/dist/tenant-db/resolvers/tenant.resolver.js +42 -0
  385. package/dist/tenant-db/resolvers/tenant.resolver.js.map +1 -0
  386. package/dist/tenant-db/service/tenant-db.service.d.ts +14 -0
  387. package/dist/tenant-db/service/tenant-db.service.js +62 -0
  388. package/dist/tenant-db/service/tenant-db.service.js.map +1 -0
  389. package/dist/tenant-db/tenant-cache.d.ts +10 -0
  390. package/dist/tenant-db/tenant-cache.js +17 -0
  391. package/dist/tenant-db/tenant-cache.js.map +1 -0
  392. package/dist/tenant-db/types/tenant-db.types.d.ts +29 -0
  393. package/dist/tenant-db/types/tenant-db.types.js +3 -0
  394. package/dist/tenant-db/types/tenant-db.types.js.map +1 -0
  395. package/dist/tsconfig.tsbuildinfo +1 -1
  396. package/package.json +18 -10
  397. package/dist/security/security.module.d.ts +0 -7
  398. package/dist/security/security.module.js +0 -43
  399. package/dist/security/security.module.js.map +0 -1
  400. package/dist/security/security.service.d.ts +0 -7
  401. package/dist/security/security.service.js.map +0 -1
  402. package/dist/user/dtos/create-user.dto.d.ts +0 -5
  403. package/dist/user/dtos/create-user.dto.js +0 -7
  404. package/dist/user/dtos/create-user.dto.js.map +0 -1
  405. package/dist/user/dtos/update-user.dto.js.map +0 -1
  406. package/dist/user/dtos/user-query.dto.d.ts +0 -3
  407. package/dist/user/dtos/user-query.dto.js.map +0 -1
  408. package/dist/user/dtos/user.dto.d.ts +0 -11
  409. package/dist/user/dtos/user.dto.js.map +0 -1
  410. package/dist/user/user.controller.d.ts +0 -16
  411. package/dist/user/user.controller.js.map +0 -1
  412. package/dist/user/user.entity.js.map +0 -1
  413. package/dist/user/user.mapper.js +0 -32
  414. package/dist/user/user.mapper.js.map +0 -1
  415. package/dist/user/user.module.d.ts +0 -4
  416. package/dist/user/user.module.js.map +0 -1
  417. package/dist/user/user.service.js.map +0 -1
  418. /package/dist/{user → modules/user}/dtos/update-user.dto.d.ts +0 -0
  419. /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,3 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ //# sourceMappingURL=tenant-db.types.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"file":"tenant-db.types.js","sourceRoot":"","sources":["../../../src/tenant-db/types/tenant-db.types.ts"],"names":[],"mappings":""}