@sync-in/server 1.7.0 → 1.8.1

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 (275) hide show
  1. package/CHANGELOG.md +173 -58
  2. package/environment/environment.dist.yaml +6 -3
  3. package/migrations/0003_giant_luckman.sql +6 -0
  4. package/migrations/meta/0003_snapshot.json +2463 -0
  5. package/migrations/meta/_journal.json +7 -0
  6. package/package.json +19 -17
  7. package/server/app.bootstrap.js +5 -2
  8. package/server/app.bootstrap.js.map +1 -1
  9. package/server/app.constants.js +0 -4
  10. package/server/app.constants.js.map +1 -1
  11. package/server/app.service.js +7 -6
  12. package/server/app.service.js.map +1 -1
  13. package/server/applications/files/constants/only-office.js +12 -0
  14. package/server/applications/files/constants/only-office.js.map +1 -1
  15. package/server/applications/files/files.config.js +5 -0
  16. package/server/applications/files/files.config.js.map +1 -1
  17. package/server/applications/files/files.controller.js +12 -4
  18. package/server/applications/files/files.controller.js.map +1 -1
  19. package/server/applications/files/files.controller.spec.js +18 -4
  20. package/server/applications/files/files.controller.spec.js.map +1 -1
  21. package/server/applications/files/services/files-content-manager.service.js +6 -6
  22. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  23. package/server/applications/files/services/files-manager.service.js +4 -4
  24. package/server/applications/files/services/files-manager.service.js.map +1 -1
  25. package/server/applications/files/services/files-methods.service.js +4 -7
  26. package/server/applications/files/services/files-methods.service.js.map +1 -1
  27. package/server/applications/files/services/files-only-office-manager.service.js +2 -2
  28. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  29. package/server/applications/files/services/files-parser.service.js +6 -3
  30. package/server/applications/files/services/files-parser.service.js.map +1 -1
  31. package/server/applications/files/services/files-scheduler.service.js +51 -3
  32. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  33. package/server/applications/files/services/files-search-manager.service.js +4 -0
  34. package/server/applications/files/services/files-search-manager.service.js.map +1 -1
  35. package/server/applications/files/utils/doc-textify/adapters/pdf.js +6 -8
  36. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  37. package/server/applications/notifications/i18n/de.js +56 -0
  38. package/server/applications/notifications/i18n/de.js.map +1 -0
  39. package/server/applications/notifications/i18n/es.js +52 -0
  40. package/server/applications/notifications/i18n/es.js.map +1 -0
  41. package/server/applications/notifications/i18n/hi.js +52 -0
  42. package/server/applications/notifications/i18n/hi.js.map +1 -0
  43. package/server/applications/notifications/i18n/index.js +73 -8
  44. package/server/applications/notifications/i18n/index.js.map +1 -1
  45. package/server/applications/notifications/i18n/it.js +52 -0
  46. package/server/applications/notifications/i18n/it.js.map +1 -0
  47. package/server/applications/notifications/i18n/ja.js +52 -0
  48. package/server/applications/notifications/i18n/ja.js.map +1 -0
  49. package/server/applications/notifications/i18n/ko.js +52 -0
  50. package/server/applications/notifications/i18n/ko.js.map +1 -0
  51. package/server/applications/notifications/i18n/pl.js +52 -0
  52. package/server/applications/notifications/i18n/pl.js.map +1 -0
  53. package/server/applications/notifications/i18n/pt.js +52 -0
  54. package/server/applications/notifications/i18n/pt.js.map +1 -0
  55. package/server/applications/notifications/i18n/pt_br.js +52 -0
  56. package/server/applications/notifications/i18n/pt_br.js.map +1 -0
  57. package/server/applications/notifications/i18n/ru.js +52 -0
  58. package/server/applications/notifications/i18n/ru.js.map +1 -0
  59. package/server/applications/notifications/i18n/tr.js +52 -0
  60. package/server/applications/notifications/i18n/tr.js.map +1 -0
  61. package/server/applications/notifications/i18n/zh.js +52 -0
  62. package/server/applications/notifications/i18n/zh.js.map +1 -0
  63. package/server/applications/notifications/mails/models.js +6 -7
  64. package/server/applications/notifications/mails/models.js.map +1 -1
  65. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  66. package/server/applications/shares/dto/create-or-update-share.dto.js +11 -0
  67. package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
  68. package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
  69. package/server/applications/shares/schemas/share.interface.js.map +1 -1
  70. package/server/applications/shares/schemas/shares.schema.js +9 -0
  71. package/server/applications/shares/schemas/shares.schema.js.map +1 -1
  72. package/server/applications/shares/services/shares-manager.service.js +46 -17
  73. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  74. package/server/applications/shares/services/shares-queries.service.js +24 -5
  75. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  76. package/server/applications/spaces/constants/cache.js +4 -0
  77. package/server/applications/spaces/constants/cache.js.map +1 -1
  78. package/server/applications/spaces/dto/create-or-update-space.dto.js +5 -0
  79. package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
  80. package/server/applications/spaces/guards/space.guard.js +3 -3
  81. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  82. package/server/applications/spaces/models/space-props.model.js.map +1 -1
  83. package/server/applications/spaces/models/space.model.js.map +1 -1
  84. package/server/applications/spaces/schemas/space.interface.js.map +1 -1
  85. package/server/applications/spaces/schemas/spaces.schema.js +1 -0
  86. package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
  87. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  88. package/server/applications/spaces/services/spaces-manager.service.js +34 -31
  89. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  90. package/server/applications/spaces/services/spaces-queries.service.js +23 -7
  91. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  92. package/server/applications/spaces/services/spaces-scheduler.service.js +21 -20
  93. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  94. package/server/applications/spaces/spaces.controller.js +4 -2
  95. package/server/applications/spaces/spaces.controller.js.map +1 -1
  96. package/server/applications/spaces/utils/paths.js +14 -16
  97. package/server/applications/spaces/utils/paths.js.map +1 -1
  98. package/server/applications/sync/services/sync-manager.service.js +4 -3
  99. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  100. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  101. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  102. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  103. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  104. package/server/applications/sync/sync.controller.js +2 -1
  105. package/server/applications/sync/sync.controller.js.map +1 -1
  106. package/server/applications/users/constants/routes.js +5 -0
  107. package/server/applications/users/constants/routes.js.map +1 -1
  108. package/server/applications/users/constants/user.js +0 -16
  109. package/server/applications/users/constants/user.js.map +1 -1
  110. package/server/applications/users/dto/user-properties.dto.js +10 -0
  111. package/server/applications/users/dto/user-properties.dto.js.map +1 -1
  112. package/server/applications/users/models/user.model.js.map +1 -1
  113. package/server/applications/users/schemas/user.interface.js.map +1 -1
  114. package/server/applications/users/schemas/users.schema.js +3 -2
  115. package/server/applications/users/schemas/users.schema.js.map +1 -1
  116. package/server/applications/users/services/admin-users-manager.service.js +1 -0
  117. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  118. package/server/applications/users/services/admin-users-manager.service.spec.js +2 -1
  119. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  120. package/server/applications/users/services/users-manager.service.js +7 -2
  121. package/server/applications/users/services/users-manager.service.js.map +1 -1
  122. package/server/applications/users/services/users-manager.service.spec.js +1 -0
  123. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  124. package/server/applications/users/services/users-queries.service.js +18 -4
  125. package/server/applications/users/services/users-queries.service.js.map +1 -1
  126. package/server/applications/users/users.controller.js +15 -0
  127. package/server/applications/users/users.controller.js.map +1 -1
  128. package/server/applications/users/users.gateway.js +6 -0
  129. package/server/applications/users/users.gateway.js.map +1 -1
  130. package/server/applications/users/utils/test.js +2 -2
  131. package/server/applications/users/utils/test.js.map +1 -1
  132. package/server/applications/webdav/constants/routes.js +2 -2
  133. package/server/applications/webdav/constants/routes.js.map +1 -1
  134. package/server/applications/webdav/constants/webdav.js +2 -2
  135. package/server/applications/webdav/constants/webdav.js.map +1 -1
  136. package/server/applications/webdav/filters/webdav.filter.js +2 -2
  137. package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
  138. package/server/applications/webdav/filters/webdav.filter.spec.js +2 -2
  139. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
  140. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  141. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  142. package/server/applications/webdav/utils/webdav.js +1 -2
  143. package/server/applications/webdav/utils/webdav.js.map +1 -1
  144. package/server/authentication/auth.config.js +2 -2
  145. package/server/authentication/auth.config.js.map +1 -1
  146. package/server/authentication/guards/auth-basic.strategy.js +2 -2
  147. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  148. package/server/common/i18n.js +52 -0
  149. package/server/common/i18n.js.map +1 -0
  150. package/server/common/image.js +63 -43
  151. package/server/common/image.js.map +1 -1
  152. package/server/common/interfaces.js.map +1 -1
  153. package/server/common/shared.js +5 -2
  154. package/server/common/shared.js.map +1 -1
  155. package/server/configuration/config.validation.js +3 -3
  156. package/server/configuration/config.validation.js.map +1 -1
  157. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +8 -6
  158. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  159. package/server/infrastructure/cache/adapters/redis-cache.adapter.js +22 -17
  160. package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
  161. package/server/infrastructure/cache/cache.e2e-spec.js +1 -0
  162. package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
  163. package/server/infrastructure/cache/cache.module.js +1 -14
  164. package/server/infrastructure/cache/cache.module.js.map +1 -1
  165. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  166. package/server/infrastructure/database/database.module.js +20 -1
  167. package/server/infrastructure/database/database.module.js.map +1 -1
  168. package/server/infrastructure/database/utils.js +48 -0
  169. package/server/infrastructure/database/utils.js.map +1 -1
  170. package/server/infrastructure/scheduler/scheduler.module.js +1 -1
  171. package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
  172. package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -3
  173. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  174. package/static/3rdpartylicenses.txt +137 -163
  175. package/static/chunk-2KLC4T2Z.js +1 -0
  176. package/static/chunk-2VMSXRCB.js +12 -0
  177. package/static/chunk-3GMLWAFZ.js +1 -0
  178. package/static/chunk-3OHSRRKH.js +4 -0
  179. package/static/chunk-3R4WKOHQ.js +1 -0
  180. package/static/{chunk-7ITZXYYJ.js → chunk-3R74L4UU.js} +1 -1
  181. package/static/chunk-3XVM35O2.js +1 -0
  182. package/static/chunk-3YVRP3VM.js +2 -0
  183. package/static/chunk-5NMSIIQB.js +1 -0
  184. package/static/chunk-5UKZLU5H.js +1 -0
  185. package/static/chunk-AF24EYXU.js +1 -0
  186. package/static/chunk-AKQVEHO6.js +2 -0
  187. package/static/chunk-BCVX464U.js +2 -0
  188. package/static/chunk-BQV4FRM6.js +1 -0
  189. package/static/{chunk-EVIE5F2U.js → chunk-CETH7UYS.js} +1 -1
  190. package/static/chunk-CHJ64RJM.js +1 -0
  191. package/static/chunk-DIT6W7VM.js +562 -0
  192. package/static/chunk-DKSEQTMX.js +1 -0
  193. package/static/chunk-DM4NXKEP.js +1 -0
  194. package/static/chunk-DPUVSXRB.js +1 -0
  195. package/static/chunk-DSWEWLXJ.js +1 -0
  196. package/static/chunk-FJE6BOFL.js +1 -0
  197. package/static/chunk-FZ3JPGYZ.js +1 -0
  198. package/static/chunk-IQSKQXC3.js +1 -0
  199. package/static/chunk-ITUFI2BJ.js +1 -0
  200. package/static/chunk-JPT5WEAT.js +1 -0
  201. package/static/chunk-LCTZJ537.js +1 -0
  202. package/static/chunk-LK2UCQJ6.js +1 -0
  203. package/static/chunk-LNTUR3GU.js +1 -0
  204. package/static/chunk-LP5TBXEN.js +7 -0
  205. package/static/{chunk-IPAC4VAF.js → chunk-LVSNIS5P.js} +1 -1
  206. package/static/{chunk-SIPE37PA.js → chunk-MTVSJTIW.js} +1 -1
  207. package/static/chunk-N3U6637P.js +1 -0
  208. package/static/chunk-NNV4OXSB.js +1 -0
  209. package/static/chunk-O6FYXVHI.js +1 -0
  210. package/static/chunk-OOGP4WSH.js +2 -0
  211. package/static/chunk-PB4AIT7O.js +1 -0
  212. package/static/chunk-PCWDQPOM.js +2 -0
  213. package/static/chunk-PNR6M34W.js +1 -0
  214. package/static/chunk-PVDHBQRM.js +1 -0
  215. package/static/chunk-Q5KM7LTX.js +1 -0
  216. package/static/chunk-QHC6ZPQ4.js +1 -0
  217. package/static/chunk-QMRBZHE4.js +1 -0
  218. package/static/chunk-QO6BTONN.js +1 -0
  219. package/static/chunk-QSJRY3TF.js +1 -0
  220. package/static/chunk-QUUIRSYT.js +1 -0
  221. package/static/chunk-RFH46UW3.js +1 -0
  222. package/static/{chunk-PTGDOWV3.js → chunk-RSXHRKM5.js} +1 -1
  223. package/static/chunk-RV3VZJPZ.js +1 -0
  224. package/static/{chunk-QNJFQVYI.js → chunk-S7HNXVRB.js} +1 -1
  225. package/static/chunk-SBZ572Q4.js +2 -0
  226. package/static/chunk-SJR5R3Y4.js +1 -0
  227. package/static/chunk-SLHTEGRU.js +1 -0
  228. package/static/{chunk-SH5EVL4E.js → chunk-SSFF27P2.js} +1 -1
  229. package/static/chunk-UNCPXHHT.js +1 -0
  230. package/static/chunk-URHTCJ7G.js +1 -0
  231. package/static/chunk-V3LHHZYN.js +1 -0
  232. package/static/{chunk-DJYJ66UF.js → chunk-VJTXJ43D.js} +1 -1
  233. package/static/chunk-VQQKMY2C.js +1 -0
  234. package/static/{chunk-IQOALFYU.js → chunk-WSSU2HXE.js} +1 -1
  235. package/static/chunk-XDZGW64M.js +3 -0
  236. package/static/chunk-XTRDKGKG.js +1 -0
  237. package/static/chunk-YLWTEC3X.js +1 -0
  238. package/static/chunk-Z5J5F5SX.js +1 -0
  239. package/static/chunk-ZIJQRARU.js +1 -0
  240. package/static/index.html +2 -2
  241. package/static/main-4H5BJY3J.js +9 -0
  242. package/static/scripts-WRDOQIU5.js +24 -0
  243. package/static/{styles-A5VYX3CE.css → styles-2C2UNCNB.css} +1 -1
  244. package/server/applications/spaces/interfaces/space-quota.interface.js +0 -10
  245. package/server/applications/spaces/interfaces/space-quota.interface.js.map +0 -1
  246. package/static/chunk-22EANI6R.js +0 -1
  247. package/static/chunk-3GFGJYMK.js +0 -1
  248. package/static/chunk-4YGJGZZZ.js +0 -1
  249. package/static/chunk-5K7HEX3C.js +0 -27
  250. package/static/chunk-5KLMS6A4.js +0 -1
  251. package/static/chunk-ATP3BFHV.js +0 -562
  252. package/static/chunk-BB4G55KE.js +0 -1
  253. package/static/chunk-EWKSX76T.js +0 -1
  254. package/static/chunk-FHLACA7V.js +0 -1
  255. package/static/chunk-GCATNU55.js +0 -1
  256. package/static/chunk-GYODPCIE.js +0 -1
  257. package/static/chunk-HZTFYLM5.js +0 -1
  258. package/static/chunk-JSUKJT6Z.js +0 -1
  259. package/static/chunk-JXZCNFW7.js +0 -1
  260. package/static/chunk-LTGFCQR7.js +0 -1
  261. package/static/chunk-LV3PYKWO.js +0 -1
  262. package/static/chunk-N2WFNW6M.js +0 -7
  263. package/static/chunk-ORMRCEGT.js +0 -1
  264. package/static/chunk-OUTBJSMW.js +0 -1
  265. package/static/chunk-RS2PX32L.js +0 -1
  266. package/static/chunk-RSSWH3S2.js +0 -1
  267. package/static/chunk-RTRJ3KFH.js +0 -1
  268. package/static/chunk-TKTCBDOG.js +0 -1
  269. package/static/chunk-V6K2N46L.js +0 -1
  270. package/static/chunk-XLCCZSQL.js +0 -4
  271. package/static/chunk-YPEH66GG.js +0 -1
  272. package/static/chunk-YPOIUQ57.js +0 -1
  273. package/static/chunk-ZKCFO2OA.js +0 -4
  274. package/static/main-MZ7HWZXO.js +0 -9
  275. package/static/scripts-VZVAP2P4.js +0 -30
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, isNotNull, isNull, max, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { ACTION } from '../../../common/constants'\nimport { popFromObject } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n convertToWhere,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { FileDBProps } from '../../files/interfaces/file-db-props.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { links } from '../../links/schemas/links.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { GROUP_TYPE } from '../../users/constants/group'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { Member } from '../../users/interfaces/member.interface'\nimport { groups } from '../../users/schemas/groups.schema'\nimport { usersGroups } from '../../users/schemas/users-groups.schema'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { SPACE_ROLE } from '../constants/spaces'\nimport { SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceMembers } from '../schemas/space-members.interface'\nimport { SpaceRoot } from '../schemas/space-root.interface'\nimport { Space } from '../schemas/space.interface'\nimport { spacesMembers } from '../schemas/spaces-members.schema'\nimport { spacesRoots } from '../schemas/spaces-roots.schema'\nimport { spaceGroupConcatPermissions, spaces } from '../schemas/spaces.schema'\n\n@Injectable()\nexport class SpacesQueries {\n private readonly logger = new Logger(SpacesQueries.name)\n private spacePermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceAndRootPermissionsQuery: MySql2PreparedQuery<any> = null\n private spacesWithDetailsQuery: MySql2PreparedQuery<any> = null\n private spacesQuery: MySql2PreparedQuery<any> = null\n private spaceIdsQuery: MySql2PreparedQuery<any> = null\n private spaceQuery: MySql2PreparedQuery<any> = null\n private spacesWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceFromIdWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceRootFilesQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache,\n private readonly filesQueries: FilesQueries,\n private readonly sharesQueries: SharesQueries\n ) {}\n\n spaceExistsForAlias(alias: string): any | undefined {\n return this.db.query.spaces.findFirst({ columns: { id: true }, where: eq(spaces.alias, alias) })\n }\n\n spaceRootExistsForAlias(spaceId: number, rootAlias: string): any | undefined {\n return this.db.query.spacesRoots.findFirst({\n columns: { id: true },\n where: and(eq(spacesRoots.spaceId, spaceId), eq(spacesRoots.alias, rootAlias))\n })\n }\n\n selectSpaces(fields: Partial<keyof Space>[] = ['id', 'alias', 'name'], where: SQL[]): Promise<Partial<Space>[]> {\n const select: Record<keyof Space, any> = convertToSelect(spaces, fields)\n return this.db\n .select(select)\n .from(spaces)\n .where(and(...where))\n }\n\n async userIsSpaceManager(userId: number, spaceId: number, shareId?: number): Promise<boolean> {\n /* Check if user is a space manager */\n const q = this.db\n .select({\n userId: spacesMembers.userId,\n spaceId: spacesMembers.spaceId,\n ...(shareId && { shareId: shares.id })\n })\n .from(spacesMembers)\n if (shareId) {\n q.innerJoin(shares, and(eq(shares.id, shareId), eq(shares.spaceId, spaceId)))\n }\n const [r] = await q\n .where(and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, userId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .limit(1)\n return r && r.userId === userId && r.spaceId === spaceId && (shareId ? r.shareId === shareId : true)\n }\n\n async getSpaceAsManager(userId: number, spaceId: number): Promise<SpaceProps> {\n /* User must be the manager of the space */\n // todo: make a condition if current user is an admin\n if (!this.spaceQuery) {\n const otherMembers: any = alias(spacesMembers, 'otherMembers')\n const rootOwner: any = alias(users, 'rootOwner')\n // fileOwner: avoid providing file path information for roots not owned by the current user\n const fileOwner: any = alias(files, 'fileOwner')\n const linkUsers: any = alias(users, 'linkUsers')\n this.spaceQuery = this.db\n .select({\n id: spaces.id,\n name: spaces.name,\n alias: spaces.alias,\n description: spaces.description,\n enabled: spaces.enabled,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt,\n roots: concatDistinctObjectsInArray(spacesRoots.id, {\n id: spacesRoots.id,\n name: spacesRoots.name,\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n createdAt: dateTimeUTC(spacesRoots.createdAt),\n owner: { id: rootOwner.id, login: rootOwner.login, fullName: userFullNameSQL(rootOwner), email: rootOwner.email },\n // fileOwner: (hide if not owner), files: allow fields\n file: { id: fileOwner.id, path: filePathSQL(fileOwner), mime: files.mime }\n }),\n users: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n type: sql`IF (${users.role} = ${USER_ROLE.GUEST}, ${MEMBER_TYPE.GUEST}, ${MEMBER_TYPE.USER})`,\n spaceRole: otherMembers.role,\n description: users.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n groups: concatDistinctObjectsInArray(groups.id, {\n id: groups.id,\n name: groups.name,\n type: sql`IF (${groups.type} = ${GROUP_TYPE.PERSONAL}, ${MEMBER_TYPE.PGROUP}, ${MEMBER_TYPE.GROUP})`,\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: groups.description,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n links: concatDistinctObjectsInArray(linkUsers.id, {\n id: linkUsers.id,\n linkId: links.id,\n name: links.name,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: links.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n })\n })\n .from(spacesMembers)\n .innerJoin(\n spaces,\n and(\n eq(spaces.id, spacesMembers.spaceId),\n eq(spacesMembers.spaceId, sql.placeholder('spaceId')),\n eq(spacesMembers.userId, sql.placeholder('userId')),\n eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)\n )\n )\n .innerJoin(otherMembers, eq(otherMembers.spaceId, spaces.id))\n .leftJoin(users, and(isNull(otherMembers.linkId), eq(otherMembers.userId, users.id)))\n .leftJoin(linkUsers, and(isNotNull(otherMembers.linkId), eq(linkUsers.id, otherMembers.userId)))\n .leftJoin(links, and(eq(links.userId, linkUsers.id), eq(links.id, otherMembers.linkId)))\n .leftJoin(groups, eq(otherMembers.groupId, groups.id))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(spacesRoots.fileId, files.id))\n .leftJoin(rootOwner, eq(rootOwner.id, files.ownerId))\n .leftJoin(fileOwner, and(eq(fileOwner.id, files.id), eq(fileOwner.ownerId, sql.placeholder('userId'))))\n .groupBy(spaces.id)\n .limit(1)\n .prepare()\n }\n const [space] = await this.spaceQuery.execute({ userId, spaceId })\n if (!space) {\n return null\n }\n // merge members\n space.members = [...popFromObject('users', space), ...popFromObject('groups', space), ...popFromObject('links', space)]\n return new SpaceProps(space, userId)\n }\n\n async createSpace(space: SpaceProps): Promise<number> {\n return dbGetInsertedId(await this.db.insert(spaces).values(space))\n }\n\n async deleteSpace(spaceId: number, deleteNow = false): Promise<boolean> {\n let r: MySqlQueryResult\n if (deleteNow) {\n r = await this.db.delete(spaces).where(eq(spaces.id, spaceId))\n } else {\n r = await this.db\n .update(spaces)\n .set({ enabled: false, disabledAt: new Date() } as Space)\n .where(eq(spaces.id, spaceId))\n }\n return dbCheckAffectedRows(r, 1)\n }\n\n async updateSpace(id: number, set: Partial<Record<keyof Space, any>>): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.update(spaces).set(set).where(eq(spaces.id, id)), 1)\n this.logger.debug(`${this.updateSpace.name} - space (${id}) was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateSpace.name} - space (${id}) was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async spaceRootFiles(\n userId: number,\n spaceId: number,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n }\n ): Promise<FileProps[]> {\n if (!this.spaceRootFilesQuery) {\n const select: FileProps | SelectedFields<any, any> = {\n id: files.id,\n path: filePathSQL(files),\n isDir: files.isDir,\n inTrash: files.inTrash,\n size: files.size,\n ctime: files.ctime,\n mtime: files.mtime,\n mime: files.mime,\n root: {\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n owner: { login: users.login, email: users.email, fullName: userFullNameSQL(users) }\n },\n shares: sql`IF (${sql.placeholder('withShares')}, ${concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })}, '[]')`.mapWith(JSON.parse),\n syncs: sql`IF (${sql.placeholder('withSyncs')}, ${concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })}, '[]')`.mapWith(JSON.parse),\n hasComments: sql<boolean>`IF (${sql.placeholder('withHasComments')}, ${fileHasCommentsSubquerySQL(files.id)}, 0)`.mapWith(Boolean)\n }\n this.spaceRootFilesQuery = this.db\n .select(select)\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .leftJoin(\n shares,\n and(\n eq(sql.placeholder('withShares'), sql.raw('1')),\n eq(shares.ownerId, sql.placeholder('userId')),\n isNull(shares.fileId),\n isNull(shares.parentId),\n eq(shares.spaceRootId, spacesRoots.id)\n )\n )\n .leftJoin(syncClients, and(eq(sql.placeholder('withSyncs'), sql.raw('1')), eq(syncClients.ownerId, sql.placeholder('userId'))))\n .leftJoin(\n syncPaths,\n and(\n eq(sql.placeholder('withSyncs'), sql.raw('1')),\n eq(syncPaths.clientId, syncClients.id),\n eq(syncPaths.spaceId, sql.placeholder('spaceId')),\n eq(syncPaths.spaceRootId, spacesRoots.id),\n isNull(syncPaths.fileId)\n )\n )\n .where(eq(spacesRoots.spaceId, sql.placeholder('spaceId')))\n .groupBy(files.id, spacesRoots.id)\n .prepare()\n }\n return this.spaceRootFilesQuery.execute({\n userId,\n spaceId,\n withHasComments: +!!options.withHasComments,\n withShares: +!!options.withShares,\n withSyncs: +!!options.withSyncs\n })\n }\n\n async getSpaceRoots(spaceId: number, userId?: number): Promise<SpaceRootProps[]> {\n const where: SQL<any>[] = [eq(spacesRoots.spaceId, spaceId)]\n if (userId) {\n where.push(eq(files.ownerId, userId))\n }\n return (await this.db\n .select({\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n permissions: spacesRoots.permissions,\n createdAt: spacesRoots.createdAt,\n ...(!userId && { owner: { id: files.ownerId } }),\n file: {\n id: files.id,\n path: filePathSQL(files),\n mime: files.mime\n }\n })\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .where(and(...where))) as SpaceRootProps[]\n }\n\n async getSpaceMemberIds(spaceId: number): Promise<{ groupIds: number[]; userIds: number[] }> {\n const members = { userIds: [], groupIds: [] }\n for (const m of await this.db\n .select({\n userId: spacesMembers.userId,\n groupId: spacesMembers.groupId\n })\n .from(spacesMembers)\n .where(eq(spacesMembers.spaceId, spaceId))) {\n if (m.userId) {\n members.userIds.push(m.userId)\n } else {\n members.groupIds.push(m.groupId)\n }\n }\n return members\n }\n\n async updateMembers(\n spaceId: number,\n add: SpaceMemberDto[],\n update: Record<string | 'object', Partial<SpaceMembers> | SpaceMemberDto>[],\n remove: SpaceMemberDto[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }>> {\n // store status\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }> = {\n [ACTION.ADD]: { userIds: [], groupIds: [] },\n [ACTION.UPDATE]: { userIds: [], groupIds: [] },\n [ACTION.DELETE]: { userIds: [], groupIds: [] }\n }\n // add\n for (const m of add) {\n try {\n dbCheckAffectedRows(\n await this.db.insert(spacesMembers).values({\n spaceId: spaceId,\n ...(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? { userId: m.id } : { groupId: m.id }),\n role: m.spaceRole,\n permissions: m.permissions\n } as SpaceMembers),\n 1\n )\n status[ACTION.ADD][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) added to the space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not added to the space ${spaceId} -> : ${e}`)\n }\n }\n // update\n for (const props of update) {\n const m: SpaceMemberDto = popFromObject('object', props)\n const spaceRole = popFromObject('spaceRole', props)\n if (Number.isInteger(spaceRole)) {\n props.role = spaceRole\n }\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesMembers)\n .set(props)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n )\n .limit(1),\n 1\n )\n status[ACTION.UPDATE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) was updated on space (${spaceId}) : ${JSON.stringify(props)}`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not updated on space (${spaceId}) : ${JSON.stringify(props)} : ${e}`)\n }\n }\n // remove\n for (const m of remove) {\n try {\n dbCheckAffectedRows(\n await this.db\n .delete(spacesMembers)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n ),\n 1\n )\n status[ACTION.DELETE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) removed from space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not removed from space (${spaceId}) : ${e}`)\n }\n }\n return status\n }\n\n async updateSpaceRoots(\n userId: number,\n spaceId: number,\n add: SpaceRootProps[],\n update: Record<string | 'object', Partial<SpaceRootProps> | SpaceRootProps>[],\n remove: SpaceRootProps[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>> {\n // store status\n const status = {} as Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>\n // add\n for (const r of add) {\n if (await this.addRoot(userId, spaceId, r)) {\n ;(status[ACTION.ADD] ||= []).push(r)\n }\n }\n // update\n for (const props of update) {\n const r: SpaceRootProps = popFromObject('object', props)\n if (await this.updateRoot(props, { id: r.id })) {\n ;(status[ACTION.UPDATE] ||= []).push(r)\n }\n }\n // delete\n for (const r of remove) {\n if (await this.removeRoot(r.id)) {\n ;(status[ACTION.DELETE] ||= []).push(r)\n }\n }\n return status\n }\n\n @CacheDecorator()\n async spaceIds(userId: number): Promise<number[]> {\n if (!this.spaceIdsQuery) {\n const unionAlias = this.fromUserAndGroups({ id: spaces.id })\n this.spaceIdsQuery = this.db.select({ id: unionAlias.id }).from(unionAlias).groupBy(unionAlias.id).prepare()\n }\n return (await this.spaceIdsQuery.execute({ userId })).map((r: { id: number }) => r.id)\n }\n\n @CacheDecorator()\n async spaces(userId: number, withPermissions = false, fromId?: number): Promise<SpaceProps[]> {\n let pQuery: MySql2PreparedQuery<any>\n if (fromId) {\n pQuery = this.spaceFromIdWithPermissionsQuery\n } else if (withPermissions) {\n pQuery = this.spacesWithPermissionsQuery\n } else {\n pQuery = this.spacesQuery\n }\n if (!pQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n ...(withPermissions && { permissions: spacesMembers.permissions, role: spacesMembers.role })\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n createdAt: unionAlias.createdAt,\n modifiedAt: unionAlias.modifiedAt,\n ...(withPermissions && {\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n })\n }\n if (fromId) {\n pQuery = this.db.select(select).from(unionAlias).where(eq(unionAlias.id, fromId)).limit(1).prepare()\n this.spaceFromIdWithPermissionsQuery = pQuery\n } else {\n pQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).prepare()\n if (withPermissions) {\n this.spacesWithPermissionsQuery = pQuery\n } else {\n this.spacesQuery = pQuery\n }\n }\n }\n // SpaceProps instance is required, if the user is a space manager, he must have all permissions\n return (await pQuery.execute({ userId })).map((s: Partial<SpaceProps>) => new SpaceProps(s))\n }\n\n async spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n if (!this.spacesWithDetailsQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const managers: any = alias(users, 'managers')\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role),\n modifiedAt: unionAlias.modifiedAt,\n createdAt: unionAlias.createdAt,\n disabledAt: unionAlias.disabledAt,\n members: concatDistinctObjectsInArray(managers.id, {\n id: managers.id,\n login: managers.login,\n name: userFullNameSQL(managers),\n description: managers.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: spacesMembers.role,\n permissions: sql<string>`''`,\n createdAt: dateTimeUTC(spacesMembers.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'permissions' | 'spaceRole' | 'createdAt'>, any>),\n counts: {\n users: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.userId} IS NOT NULL AND ${spacesMembers.linkId} IS NULL THEN ${spacesMembers.userId} END))`,\n groups: countDistinct(spacesMembers.groupId),\n links: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.linkId} IS NOT NULL THEN ${spacesMembers.linkId} END))`,\n roots: countDistinct(files.id),\n shares: sql`COUNT(DISTINCT(CASE WHEN ${shares.id} IS NOT NULL THEN ${shares.id} END))`\n }\n }\n this.spacesWithDetailsQuery = this.db\n .select(select)\n .from(unionAlias)\n .leftJoin(spacesMembers, eq(spacesMembers.spaceId, unionAlias.id))\n .leftJoin(users, eq(users.id, spacesMembers.userId))\n .leftJoin(groups, eq(groups.id, spacesMembers.groupId))\n .leftJoin(managers, and(eq(spacesMembers.userId, managers.id), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, unionAlias.id))\n .leftJoin(files, and(eq(files.id, spacesRoots.fileId), eq(files.ownerId, sql.placeholder('userId'))))\n .leftJoin(shares, and(eq(unionAlias.role, 1), eq(shares.spaceId, unionAlias.id), isNotNull(shares.spaceId)))\n .groupBy(unionAlias.id)\n .prepare()\n }\n const r: MySqlQueryResult = await this.spacesWithDetailsQuery.execute({ userId })\n return r.length ? r.map((s: Partial<SpaceProps>) => new SpaceProps(s)) : []\n }\n\n @CacheDecorator()\n async permissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (rootAlias) {\n return await this.spaceAndRootPermissions(userId, spaceAlias, rootAlias)\n }\n return await this.spacePermissions(userId, spaceAlias)\n }\n\n async addRoot(userId: number, spaceId: number, root: SpaceRootProps): Promise<boolean> {\n const r: Partial<SpaceRoot> = { name: root.name, alias: root.alias, permissions: root.permissions, spaceId: spaceId }\n if (root.externalPath) {\n r.externalPath = root.externalPath\n } else {\n r.fileId = await this.getOrCreateUserFile(userId, root.file)\n }\n try {\n dbCheckAffectedRows(await this.db.insert(spacesRoots).values(r as SpaceRoot), 1)\n this.logger.debug(`${this.addRoot.name} - *${root.alias}* (${root.id}) added`)\n return true\n } catch (e) {\n this.logger.error(`${this.addRoot.name} - *${root.alias}* (${root.id}) was not added : ${JSON.stringify(root)} : ${e}`)\n return false\n }\n }\n\n async updateRoot(set: Partial<Record<keyof SpaceRoot, any>>, filters: Partial<Record<keyof SpaceRoot, any>>): Promise<boolean> {\n const where: SQL[] = convertToWhere(spacesRoots, filters)\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesRoots)\n .set(set)\n .where(and(...where))\n .limit(1),\n 1\n )\n this.logger.debug(`${this.updateRoot.name} - ${JSON.stringify(filters)} was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateRoot.name} - ${JSON.stringify(filters)} was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n return this.filesQueries.getOrCreateUserFile(userId, file)\n }\n\n async getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile)\n }\n\n async clearCachePermissions(spaceAlias: string, rootAliases?: string[], userIds?: number[]) {\n const uIds = userIds ?? ['*']\n for (const uid of uIds) {\n const basePattern = [this.constructor.name, this.permissions.name, uid, spaceAlias]\n const patterns: string[] = []\n if (rootAliases?.length) {\n // clear cache on space root\n rootAliases.forEach((rAlias: string) => patterns.push(this.cache.genSlugKey(...basePattern, rAlias)))\n } else {\n // clear cache on spaces list\n patterns.push(this.cache.genSlugKey(...[this.constructor.name, this.spaces.name, uid, '*']))\n // clear cache on spaces and roots\n patterns.push(this.cache.genSlugKey(...basePattern), this.cache.genSlugKey(...basePattern, '*'))\n }\n for (const p of patterns) {\n const keys = await this.cache.keys(p)\n if (keys.length) {\n this.logger.verbose(`${this.clearCachePermissions.name} - ${JSON.stringify(keys)}`)\n this.cache.mdel(keys).catch((e: Error) => this.logger.error(`${this.clearCachePermissions.name} - ${e}`))\n }\n }\n }\n }\n\n private async removeRoot(id: number): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.delete(spacesRoots).where(eq(spacesRoots.id, id)), 1)\n this.logger.debug(`${this.removeRoot.name} - root (${id}) removed`)\n return true\n } catch (e) {\n this.logger.error(`${this.removeRoot.name} - root (${id}) was not deleted : ${e}`)\n return false\n }\n }\n\n private async spacePermissions(userId: number, spaceAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spacePermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const unionAlias = this.fromUserAndGroups(selectUnion, filters)\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n }\n this.spacePermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n const r: MySqlQueryResult = await this.spacePermissionsQuery.execute({ userId, spaceAlias })\n return r.length ? r.at(0) : null\n }\n\n private async spaceAndRootPermissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spaceAndRootPermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n rootId: sql`${spacesRoots.id}`.as('rootId'),\n rootAlias: sql`${spacesRoots.alias}`.as('rootAlias'),\n rootName: sql`${spacesRoots.name}`.as('rootName'),\n rootPermissions: sql`${spacesRoots.permissions}`.as('rootPermissions'),\n rootOwnerId: files.ownerId,\n rootOwnerLogin: users.login,\n rootFileId: sql`${files.id}`.as('rootFileId'),\n rootFilePath: filePathSQL(files).as('rootFilePath'),\n rootFileInTrash: files.inTrash,\n rootExternalPath: spacesRoots.externalPath\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const fromUser = this.fromUserQuery(selectUnion, filters).$dynamic()\n const fromGroups = this.fromGroupsQuery(selectUnion, filters).$dynamic()\n for (const q of [fromUser, fromGroups]) {\n q.leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spacesMembers.spaceId), eq(spacesRoots.alias, sql.placeholder('rootAlias'))))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n }\n const unionAlias = union(fromUser, fromGroups).as('union_alias')\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: sql<SPACE_ROLE>`MAX(${unionAlias.role})`,\n root: {\n id: unionAlias.rootId,\n alias: unionAlias.rootAlias,\n name: unionAlias.rootName,\n permissions: unionAlias.rootPermissions,\n owner: { id: unionAlias.rootOwnerId, login: unionAlias.rootOwnerLogin },\n file: { id: unionAlias.rootFileId, path: unionAlias.rootFilePath, inTrash: unionAlias.rootFileInTrash },\n externalPath: unionAlias.rootExternalPath\n }\n }\n this.spaceAndRootPermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n const r: MySqlQueryResult = await this.spaceAndRootPermissionsQuery.execute({ userId, spaceAlias, rootAlias })\n return r.length ? r.at(0) : null\n }\n\n private fromUserAndGroups(select: SelectedFields<any, any>, filters: SQL[] = []) {\n return union(this.fromUserQuery(select, filters), this.fromGroupsQuery(select, filters)).as('union_alias')\n }\n\n private fromUserQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.userId, sql.placeholder('userId')), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n\n private fromGroupsQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.groupId, usersGroups.groupId), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(usersGroups, eq(usersGroups.userId, sql.placeholder('userId')))\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n}\n"],"names":["SpacesQueries","spaceExistsForAlias","alias","db","query","spaces","findFirst","columns","id","where","eq","spaceRootExistsForAlias","spaceId","rootAlias","spacesRoots","and","selectSpaces","fields","select","convertToSelect","from","userIsSpaceManager","userId","shareId","q","spacesMembers","shares","innerJoin","r","role","SPACE_ROLE","IS_MANAGER","limit","getSpaceAsManager","spaceQuery","otherMembers","rootOwner","users","fileOwner","files","linkUsers","name","description","enabled","storageUsage","storageQuota","createdAt","modifiedAt","disabledAt","roots","concatDistinctObjectsInArray","externalPath","permissions","dateTimeUTC","owner","login","fullName","userFullNameSQL","email","file","path","filePathSQL","mime","type","sql","USER_ROLE","GUEST","MEMBER_TYPE","USER","spaceRole","groups","GROUP_TYPE","PERSONAL","PGROUP","GROUP","IS_MEMBER","links","linkId","raw","placeholder","leftJoin","isNull","isNotNull","groupId","fileId","ownerId","groupBy","prepare","space","execute","members","popFromObject","SpaceProps","createSpace","dbGetInsertedId","insert","values","deleteSpace","deleteNow","delete","update","set","Date","dbCheckAffectedRows","updateSpace","logger","debug","JSON","stringify","e","error","spaceRootFiles","options","spaceRootFilesQuery","isDir","inTrash","size","ctime","mtime","root","mapWith","parse","syncs","syncPaths","clientId","syncClients","clientName","info","hasComments","fileHasCommentsSubquerySQL","Boolean","parentId","spaceRootId","withHasComments","withShares","withSyncs","getSpaceRoots","push","getSpaceMemberIds","userIds","groupIds","m","updateMembers","add","remove","status","ACTION","ADD","UPDATE","DELETE","props","Number","isInteger","updateSpaceRoots","addRoot","updateRoot","removeRoot","spaceIds","spaceIdsQuery","unionAlias","fromUserAndGroups","map","withPermissions","fromId","pQuery","spaceFromIdWithPermissionsQuery","spacesWithPermissionsQuery","spacesQuery","selectUnion","spaceGroupConcatPermissions","max","s","spacesWithDetails","spacesWithDetailsQuery","managers","counts","countDistinct","length","spaceAlias","spaceAndRootPermissions","spacePermissions","getOrCreateUserFile","filters","convertToWhere","filesQueries","getOrCreateSpaceFile","dbFile","clearCachePermissions","rootAliases","uIds","uid","basePattern","patterns","forEach","rAlias","cache","genSlugKey","p","keys","verbose","mdel","catch","spacePermissionsQuery","at","spaceAndRootPermissionsQuery","rootId","as","rootName","rootPermissions","rootOwnerId","rootOwnerLogin","rootFileId","rootFilePath","rootFileInTrash","rootExternalPath","fromUser","fromUserQuery","$dynamic","fromGroups","fromGroupsQuery","union","usersGroups","sharesQueries","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, countDistinct, eq, isNotNull, isNull, max, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { MySql2PreparedQuery, MySqlQueryResult } from 'drizzle-orm/mysql2'\nimport { ACTION } from '../../../common/constants'\nimport { popFromObject } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport {\n concatDistinctObjectsInArray,\n convertToSelect,\n convertToWhere,\n dateTimeUTC,\n dbCheckAffectedRows,\n dbGetInsertedId\n} from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { FileDBProps } from '../../files/interfaces/file-db-props.interface'\nimport { FileProps } from '../../files/interfaces/file-props.interface'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { links } from '../../links/schemas/links.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { GROUP_TYPE } from '../../users/constants/group'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { Member } from '../../users/interfaces/member.interface'\nimport { groups } from '../../users/schemas/groups.schema'\nimport { usersGroups } from '../../users/schemas/users-groups.schema'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { SPACE_ROLE } from '../constants/spaces'\nimport { SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceMembers } from '../schemas/space-members.interface'\nimport { SpaceRoot } from '../schemas/space-root.interface'\nimport { Space } from '../schemas/space.interface'\nimport { spacesMembers } from '../schemas/spaces-members.schema'\nimport { spacesRoots } from '../schemas/spaces-roots.schema'\nimport { spaceGroupConcatPermissions, spaces } from '../schemas/spaces.schema'\n\n@Injectable()\nexport class SpacesQueries {\n private readonly logger = new Logger(SpacesQueries.name)\n private spacePermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceAndRootPermissionsQuery: MySql2PreparedQuery<any> = null\n private spacesWithDetailsQuery: MySql2PreparedQuery<any> = null\n private spacesQuery: MySql2PreparedQuery<any> = null\n private spaceIdsQuery: MySql2PreparedQuery<any> = null\n private spaceQuery: MySql2PreparedQuery<any> = null\n private spacesWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceFromIdWithPermissionsQuery: MySql2PreparedQuery<any> = null\n private spaceRootFilesQuery: MySql2PreparedQuery<any> = null\n\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n public readonly cache: Cache,\n private readonly filesQueries: FilesQueries\n ) {}\n\n spaceExistsForAlias(alias: string): any | undefined {\n return this.db.query.spaces.findFirst({ columns: { id: true }, where: eq(spaces.alias, alias) })\n }\n\n spaceRootExistsForAlias(spaceId: number, rootAlias: string): any | undefined {\n return this.db.query.spacesRoots.findFirst({\n columns: { id: true },\n where: and(eq(spacesRoots.spaceId, spaceId), eq(spacesRoots.alias, rootAlias))\n })\n }\n\n selectSpaces(fields: Partial<keyof Space>[] = ['id', 'alias', 'name'], where: SQL[]): Promise<Partial<Space>[]> {\n const select: Record<keyof Space, any> = convertToSelect(spaces, fields)\n return this.db\n .select(select)\n .from(spaces)\n .where(and(...where))\n }\n\n spacesQuotaPaths(spaceId?: number): Promise<(Partial<Space> & { externalPaths: string[] })[]> {\n return this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n externalPaths: sql<string[]>`JSON_ARRAYAGG(${spacesRoots.externalPath})`.mapWith(JSON.parse).as('externalPaths')\n })\n .from(spaces)\n .leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spaces.id), isNotNull(spacesRoots.externalPath)))\n .where(and(...[...(spaceId ? [eq(spaces.id, spaceId)] : [])]))\n .groupBy(spaces.id)\n }\n\n async userIsSpaceManager(userId: number, spaceId: number, shareId?: number): Promise<boolean> {\n /* Check if user is a space manager */\n const q = this.db\n .select({\n userId: spacesMembers.userId,\n spaceId: spacesMembers.spaceId,\n ...(shareId && { shareId: shares.id })\n })\n .from(spacesMembers)\n if (shareId) {\n q.innerJoin(shares, and(eq(shares.id, shareId), eq(shares.spaceId, spaceId)))\n }\n const [r] = await q\n .where(and(eq(spacesMembers.spaceId, spaceId), eq(spacesMembers.userId, userId), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .limit(1)\n return r && r.userId === userId && r.spaceId === spaceId && (shareId ? r.shareId === shareId : true)\n }\n\n async getSpaceAsManager(userId: number, spaceId: number): Promise<SpaceProps> {\n /* User must be the manager of the space */\n // todo: make a condition if current user is an admin\n if (!this.spaceQuery) {\n const otherMembers: any = alias(spacesMembers, 'otherMembers')\n const rootOwner: any = alias(users, 'rootOwner')\n // fileOwner: avoid providing file path information for roots not owned by the current user\n const fileOwner: any = alias(files, 'fileOwner')\n const linkUsers: any = alias(users, 'linkUsers')\n this.spaceQuery = this.db\n .select({\n id: spaces.id,\n name: spaces.name,\n alias: spaces.alias,\n description: spaces.description,\n enabled: spaces.enabled,\n storageUsage: spaces.storageUsage,\n storageQuota: spaces.storageQuota,\n storageIndexing: spaces.storageIndexing,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt,\n roots: concatDistinctObjectsInArray(spacesRoots.id, {\n id: spacesRoots.id,\n name: spacesRoots.name,\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n createdAt: dateTimeUTC(spacesRoots.createdAt),\n owner: { id: rootOwner.id, login: rootOwner.login, fullName: userFullNameSQL(rootOwner), email: rootOwner.email },\n // fileOwner: (hide if not owner), files: allow fields\n file: { id: fileOwner.id, path: filePathSQL(fileOwner), mime: files.mime }\n }),\n users: concatDistinctObjectsInArray(users.id, {\n id: users.id,\n login: users.login,\n name: userFullNameSQL(users),\n type: sql`IF (${users.role} = ${USER_ROLE.GUEST}, ${MEMBER_TYPE.GUEST}, ${MEMBER_TYPE.USER})`,\n spaceRole: otherMembers.role,\n description: users.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n groups: concatDistinctObjectsInArray(groups.id, {\n id: groups.id,\n name: groups.name,\n type: sql`IF (${groups.type} = ${GROUP_TYPE.PERSONAL}, ${MEMBER_TYPE.PGROUP}, ${MEMBER_TYPE.GROUP})`,\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: groups.description,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n }),\n links: concatDistinctObjectsInArray(linkUsers.id, {\n id: linkUsers.id,\n linkId: links.id,\n name: links.name,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: sql`${SPACE_ROLE.IS_MEMBER}`,\n description: links.email,\n permissions: otherMembers.permissions,\n createdAt: dateTimeUTC(otherMembers.createdAt)\n })\n } satisfies SpaceProps | SelectedFields<any, any>)\n .from(spacesMembers)\n .innerJoin(\n spaces,\n and(\n eq(spaces.id, spacesMembers.spaceId),\n eq(spacesMembers.spaceId, sql.placeholder('spaceId')),\n eq(spacesMembers.userId, sql.placeholder('userId')),\n eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)\n )\n )\n .innerJoin(otherMembers, eq(otherMembers.spaceId, spaces.id))\n .leftJoin(users, and(isNull(otherMembers.linkId), eq(otherMembers.userId, users.id)))\n .leftJoin(linkUsers, and(isNotNull(otherMembers.linkId), eq(linkUsers.id, otherMembers.userId)))\n .leftJoin(links, and(eq(links.userId, linkUsers.id), eq(links.id, otherMembers.linkId)))\n .leftJoin(groups, eq(otherMembers.groupId, groups.id))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(spacesRoots.fileId, files.id))\n .leftJoin(rootOwner, eq(rootOwner.id, files.ownerId))\n .leftJoin(fileOwner, and(eq(fileOwner.id, files.id), eq(fileOwner.ownerId, sql.placeholder('userId'))))\n .groupBy(spaces.id)\n .limit(1)\n .prepare()\n }\n const [space] = await this.spaceQuery.execute({ userId, spaceId })\n if (!space) {\n return null\n }\n // merge members\n space.members = [...popFromObject('users', space), ...popFromObject('groups', space), ...popFromObject('links', space)]\n return new SpaceProps(space, userId)\n }\n\n async createSpace(space: SpaceProps): Promise<number> {\n return dbGetInsertedId(await this.db.insert(spaces).values(space))\n }\n\n async deleteSpace(spaceId: number, deleteNow = false): Promise<boolean> {\n let r: MySqlQueryResult\n if (deleteNow) {\n r = await this.db.delete(spaces).where(eq(spaces.id, spaceId))\n } else {\n r = await this.db\n .update(spaces)\n .set({ enabled: false, disabledAt: new Date() } as Space)\n .where(eq(spaces.id, spaceId))\n }\n return dbCheckAffectedRows(r, 1)\n }\n\n async updateSpace(id: number, set: Partial<Record<keyof Space, any>>): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.update(spaces).set(set).where(eq(spaces.id, id)), 1)\n this.logger.debug(`${this.updateSpace.name} - space (${id}) was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateSpace.name} - space (${id}) was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async spaceRootFiles(\n userId: number,\n spaceId: number,\n options: {\n withShares?: boolean\n withHasComments?: boolean\n withSyncs?: boolean\n }\n ): Promise<FileProps[]> {\n if (!this.spaceRootFilesQuery) {\n const select: FileProps | SelectedFields<any, any> = {\n id: files.id,\n path: filePathSQL(files),\n isDir: files.isDir,\n inTrash: files.inTrash,\n size: files.size,\n ctime: files.ctime,\n mtime: files.mtime,\n mime: files.mime,\n root: {\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n externalPath: spacesRoots.externalPath,\n permissions: spacesRoots.permissions,\n owner: { login: users.login, email: users.email, fullName: userFullNameSQL(users) }\n },\n shares: sql`IF (${sql.placeholder('withShares')}, ${concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })}, '[]')`.mapWith(JSON.parse),\n syncs: sql`IF (${sql.placeholder('withSyncs')}, ${concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })}, '[]')`.mapWith(JSON.parse),\n hasComments: sql<boolean>`IF (${sql.placeholder('withHasComments')}, ${fileHasCommentsSubquerySQL(files.id)}, 0)`.mapWith(Boolean)\n }\n this.spaceRootFilesQuery = this.db\n .select(select)\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .leftJoin(\n shares,\n and(\n eq(sql.placeholder('withShares'), sql.raw('1')),\n eq(shares.ownerId, sql.placeholder('userId')),\n isNull(shares.fileId),\n isNull(shares.parentId),\n eq(shares.spaceRootId, spacesRoots.id)\n )\n )\n .leftJoin(syncClients, and(eq(sql.placeholder('withSyncs'), sql.raw('1')), eq(syncClients.ownerId, sql.placeholder('userId'))))\n .leftJoin(\n syncPaths,\n and(\n eq(sql.placeholder('withSyncs'), sql.raw('1')),\n eq(syncPaths.clientId, syncClients.id),\n eq(syncPaths.spaceId, sql.placeholder('spaceId')),\n eq(syncPaths.spaceRootId, spacesRoots.id),\n isNull(syncPaths.fileId)\n )\n )\n .where(eq(spacesRoots.spaceId, sql.placeholder('spaceId')))\n .groupBy(files.id, spacesRoots.id)\n .prepare()\n }\n return this.spaceRootFilesQuery.execute({\n userId,\n spaceId,\n withHasComments: +!!options.withHasComments,\n withShares: +!!options.withShares,\n withSyncs: +!!options.withSyncs\n })\n }\n\n async getSpaceRoots(spaceId: number, userId?: number): Promise<SpaceRootProps[]> {\n const where: SQL<any>[] = [eq(spacesRoots.spaceId, spaceId)]\n if (userId) {\n where.push(eq(files.ownerId, userId))\n }\n return (await this.db\n .select({\n id: spacesRoots.id,\n alias: spacesRoots.alias,\n name: spacesRoots.name,\n permissions: spacesRoots.permissions,\n createdAt: spacesRoots.createdAt,\n ...(!userId && { owner: { id: files.ownerId } }),\n file: {\n id: files.id,\n path: filePathSQL(files),\n mime: files.mime\n }\n })\n .from(spacesRoots)\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .where(and(...where))) as SpaceRootProps[]\n }\n\n async getSpaceMemberIds(spaceId: number): Promise<{ groupIds: number[]; userIds: number[] }> {\n const members = { userIds: [], groupIds: [] }\n for (const m of await this.db\n .select({\n userId: spacesMembers.userId,\n groupId: spacesMembers.groupId\n })\n .from(spacesMembers)\n .where(eq(spacesMembers.spaceId, spaceId))) {\n if (m.userId) {\n members.userIds.push(m.userId)\n } else {\n members.groupIds.push(m.groupId)\n }\n }\n return members\n }\n\n async updateMembers(\n spaceId: number,\n add: SpaceMemberDto[],\n update: Record<string | 'object', Partial<SpaceMembers> | SpaceMemberDto>[],\n remove: SpaceMemberDto[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }>> {\n // store status\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, { userIds: number[]; groupIds: number[] }> = {\n [ACTION.ADD]: { userIds: [], groupIds: [] },\n [ACTION.UPDATE]: { userIds: [], groupIds: [] },\n [ACTION.DELETE]: { userIds: [], groupIds: [] }\n }\n // add\n for (const m of add) {\n try {\n dbCheckAffectedRows(\n await this.db.insert(spacesMembers).values({\n spaceId: spaceId,\n ...(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? { userId: m.id } : { groupId: m.id }),\n role: m.spaceRole,\n permissions: m.permissions\n } as SpaceMembers),\n 1\n )\n status[ACTION.ADD][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) added to the space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not added to the space ${spaceId} -> : ${e}`)\n }\n }\n // update\n for (const props of update) {\n const m: SpaceMemberDto = popFromObject('object', props)\n const spaceRole = popFromObject('spaceRole', props)\n if (Number.isInteger(spaceRole)) {\n props.role = spaceRole\n }\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesMembers)\n .set(props)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n )\n .limit(1),\n 1\n )\n status[ACTION.UPDATE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) was updated on space (${spaceId}) : ${JSON.stringify(props)}`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not updated on space (${spaceId}) : ${JSON.stringify(props)} : ${e}`)\n }\n }\n // remove\n for (const m of remove) {\n try {\n dbCheckAffectedRows(\n await this.db\n .delete(spacesMembers)\n .where(\n and(\n eq(spacesMembers.spaceId, spaceId),\n eq(m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? spacesMembers.userId : spacesMembers.groupId, m.id)\n )\n ),\n 1\n )\n status[ACTION.DELETE][`${m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST ? 'userIds' : 'groupIds'}`].push(m.id)\n this.logger.debug(`${this.updateMembers.name} - ${m.type} (${m.id}) removed from space (${spaceId})`)\n } catch (e) {\n this.logger.error(`${this.updateMembers.name} - ${m.type} (${m.id}) was not removed from space (${spaceId}) : ${e}`)\n }\n }\n return status\n }\n\n async updateSpaceRoots(\n userId: number,\n spaceId: number,\n add: SpaceRootProps[],\n update: Record<string | 'object', Partial<SpaceRootProps> | SpaceRootProps>[],\n remove: SpaceRootProps[]\n ): Promise<Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>> {\n // store status\n const status = {} as Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]>\n // add\n for (const r of add) {\n if (await this.addRoot(userId, spaceId, r)) {\n ;(status[ACTION.ADD] ||= []).push(r)\n }\n }\n // update\n for (const props of update) {\n const r: SpaceRootProps = popFromObject('object', props)\n if (await this.updateRoot(props, { id: r.id })) {\n ;(status[ACTION.UPDATE] ||= []).push(r)\n }\n }\n // delete\n for (const r of remove) {\n if (await this.removeRoot(r.id)) {\n ;(status[ACTION.DELETE] ||= []).push(r)\n }\n }\n return status\n }\n\n @CacheDecorator()\n async spaceIds(userId: number): Promise<number[]> {\n if (!this.spaceIdsQuery) {\n const unionAlias = this.fromUserAndGroups({ id: spaces.id })\n this.spaceIdsQuery = this.db.select({ id: unionAlias.id }).from(unionAlias).groupBy(unionAlias.id).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n return (await this.spaceIdsQuery.execute({ userId })).map((r: { id: number }) => r.id)\n }\n\n @CacheDecorator()\n async spaces(userId: number, withPermissions = false, fromId?: number): Promise<SpaceProps[]> {\n let pQuery: MySql2PreparedQuery<any>\n if (fromId) {\n pQuery = this.spaceFromIdWithPermissionsQuery\n } else if (withPermissions) {\n pQuery = this.spacesWithPermissionsQuery\n } else {\n pQuery = this.spacesQuery\n }\n if (!pQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n ...(withPermissions && { permissions: spacesMembers.permissions, role: spacesMembers.role })\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n createdAt: unionAlias.createdAt,\n modifiedAt: unionAlias.modifiedAt,\n ...(withPermissions && {\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n })\n }\n if (fromId) {\n pQuery = this.db\n .select(select)\n .from(unionAlias)\n .where(eq(unionAlias.id, sql.placeholder('fromId')))\n .limit(1)\n .prepare()\n this.spaceFromIdWithPermissionsQuery = pQuery\n } else {\n pQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).prepare()\n if (withPermissions) {\n this.spacesWithPermissionsQuery = pQuery\n } else {\n this.spacesQuery = pQuery\n }\n }\n }\n // SpaceProps instance is required, if the user is a space manager, he must have all permissions\n // `userId` is used in `fromUserAndGroups` function\n return (await pQuery.execute({ userId, fromId })).map((s: Partial<SpaceProps>) => new SpaceProps(s))\n }\n\n async spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n if (!this.spacesWithDetailsQuery) {\n const selectUnion: Space | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n description: spaces.description,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n createdAt: spaces.createdAt,\n modifiedAt: spaces.modifiedAt,\n disabledAt: spaces.disabledAt\n }\n const unionAlias = this.fromUserAndGroups(selectUnion)\n const managers: any = alias(users, 'managers')\n const select: Space | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n description: unionAlias.description,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role),\n modifiedAt: unionAlias.modifiedAt,\n createdAt: unionAlias.createdAt,\n disabledAt: unionAlias.disabledAt,\n members: concatDistinctObjectsInArray(managers.id, {\n id: managers.id,\n login: managers.login,\n name: userFullNameSQL(managers),\n description: managers.email,\n type: sql.raw(`'${MEMBER_TYPE.USER}'`),\n spaceRole: spacesMembers.role,\n permissions: sql<string>`''`,\n createdAt: dateTimeUTC(spacesMembers.createdAt)\n } satisfies Record<keyof Pick<Member, 'id' | 'name' | 'login' | 'description' | 'type' | 'permissions' | 'spaceRole' | 'createdAt'>, any>),\n counts: {\n users: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.userId} IS NOT NULL AND ${spacesMembers.linkId} IS NULL THEN ${spacesMembers.userId} END))`,\n groups: countDistinct(spacesMembers.groupId),\n links: sql`COUNT(DISTINCT(CASE WHEN ${spacesMembers.linkId} IS NOT NULL THEN ${spacesMembers.linkId} END))`,\n roots: countDistinct(files.id),\n shares: sql`COUNT(DISTINCT(CASE WHEN ${shares.id} IS NOT NULL THEN ${shares.id} END))`\n }\n }\n this.spacesWithDetailsQuery = this.db\n .select(select)\n .from(unionAlias)\n .leftJoin(spacesMembers, eq(spacesMembers.spaceId, unionAlias.id))\n .leftJoin(users, eq(users.id, spacesMembers.userId))\n .leftJoin(groups, eq(groups.id, spacesMembers.groupId))\n .leftJoin(managers, and(eq(spacesMembers.userId, managers.id), eq(spacesMembers.role, SPACE_ROLE.IS_MANAGER)))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, unionAlias.id))\n .leftJoin(files, and(eq(files.id, spacesRoots.fileId), eq(files.ownerId, sql.placeholder('userId'))))\n .leftJoin(shares, and(eq(unionAlias.role, 1), eq(shares.spaceId, unionAlias.id), isNotNull(shares.spaceId)))\n .groupBy(unionAlias.id)\n .prepare()\n }\n const r: MySqlQueryResult = await this.spacesWithDetailsQuery.execute({ userId })\n return r.length ? r.map((s: Partial<SpaceProps>) => new SpaceProps(s)) : []\n }\n\n @CacheDecorator()\n async permissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (rootAlias) {\n return await this.spaceAndRootPermissions(userId, spaceAlias, rootAlias)\n }\n return await this.spacePermissions(userId, spaceAlias)\n }\n\n async addRoot(userId: number, spaceId: number, root: SpaceRootProps): Promise<boolean> {\n const r: Partial<SpaceRoot> = { name: root.name, alias: root.alias, permissions: root.permissions, spaceId: spaceId }\n if (root.externalPath) {\n r.externalPath = root.externalPath\n } else {\n r.fileId = await this.getOrCreateUserFile(userId, root.file)\n }\n try {\n dbCheckAffectedRows(await this.db.insert(spacesRoots).values(r as SpaceRoot), 1)\n this.logger.debug(`${this.addRoot.name} - *${root.alias}* (${root.id}) added`)\n return true\n } catch (e) {\n this.logger.error(`${this.addRoot.name} - *${root.alias}* (${root.id}) was not added : ${JSON.stringify(root)} : ${e}`)\n return false\n }\n }\n\n async updateRoot(set: Partial<Record<keyof SpaceRoot, any>>, filters: Partial<Record<keyof SpaceRoot, any>>): Promise<boolean> {\n const where: SQL[] = convertToWhere(spacesRoots, filters)\n try {\n dbCheckAffectedRows(\n await this.db\n .update(spacesRoots)\n .set(set)\n .where(and(...where))\n .limit(1),\n 1\n )\n this.logger.debug(`${this.updateRoot.name} - ${JSON.stringify(filters)} was updated : ${JSON.stringify(set)}`)\n return true\n } catch (e) {\n this.logger.error(`${this.updateRoot.name} - ${JSON.stringify(filters)} was not updated : ${JSON.stringify(set)} : ${e}`)\n return false\n }\n }\n\n async getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n return this.filesQueries.getOrCreateUserFile(userId, file)\n }\n\n async getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile)\n }\n\n async clearCachePermissions(spaceAlias: string, rootAliases?: string[], userIds?: number[]) {\n const uIds = userIds ?? ['*']\n for (const uid of uIds) {\n const basePattern = [this.constructor.name, this.permissions.name, uid, spaceAlias]\n const patterns: string[] = []\n if (rootAliases?.length) {\n // clear cache on space root\n rootAliases.forEach((rAlias: string) => patterns.push(this.cache.genSlugKey(...basePattern, rAlias)))\n } else {\n // clear cache on spaces list\n patterns.push(this.cache.genSlugKey(...[this.constructor.name, this.spaces.name, uid, '*']))\n // clear cache on spaces and roots\n patterns.push(this.cache.genSlugKey(...basePattern), this.cache.genSlugKey(...basePattern, '*'))\n }\n for (const p of patterns) {\n const keys = await this.cache.keys(p)\n if (keys.length) {\n this.logger.verbose(`${this.clearCachePermissions.name} - ${JSON.stringify(keys)}`)\n this.cache.mdel(keys).catch((e: Error) => this.logger.error(`${this.clearCachePermissions.name} - ${e}`))\n }\n }\n }\n }\n\n private async removeRoot(id: number): Promise<boolean> {\n try {\n dbCheckAffectedRows(await this.db.delete(spacesRoots).where(eq(spacesRoots.id, id)), 1)\n this.logger.debug(`${this.removeRoot.name} - root (${id}) removed`)\n return true\n } catch (e) {\n this.logger.error(`${this.removeRoot.name} - root (${id}) was not deleted : ${e}`)\n return false\n }\n }\n\n private async spacePermissions(userId: number, spaceAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spacePermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const unionAlias = this.fromUserAndGroups(selectUnion, filters)\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: max(unionAlias.role)\n }\n this.spacePermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserAndGroups` function\n const r: MySqlQueryResult = await this.spacePermissionsQuery.execute({ userId, spaceAlias })\n return r.length ? r.at(0) : null\n }\n\n private async spaceAndRootPermissions(userId: number, spaceAlias: string, rootAlias: string): Promise<Partial<SpaceEnv>> {\n if (!this.spaceAndRootPermissionsQuery) {\n const selectUnion: SpaceEnv | SelectedFields<any, any> = {\n id: spaces.id,\n alias: spaces.alias,\n name: spaces.name,\n enabled: spaces.enabled,\n permissions: spacesMembers.permissions,\n role: spacesMembers.role,\n rootId: sql`${spacesRoots.id}`.as('rootId'),\n rootAlias: sql`${spacesRoots.alias}`.as('rootAlias'),\n rootName: sql`${spacesRoots.name}`.as('rootName'),\n rootPermissions: sql`${spacesRoots.permissions}`.as('rootPermissions'),\n rootOwnerId: files.ownerId,\n rootOwnerLogin: users.login,\n rootFileId: sql`${files.id}`.as('rootFileId'),\n rootFilePath: filePathSQL(files).as('rootFilePath'),\n rootFileInTrash: files.inTrash,\n rootExternalPath: spacesRoots.externalPath\n }\n const filters: SQL[] = [eq(spaces.alias, sql.placeholder('spaceAlias'))]\n const fromUser = this.fromUserQuery(selectUnion, filters).$dynamic()\n const fromGroups = this.fromGroupsQuery(selectUnion, filters).$dynamic()\n for (const q of [fromUser, fromGroups]) {\n q.leftJoin(spacesRoots, and(eq(spacesRoots.spaceId, spacesMembers.spaceId), eq(spacesRoots.alias, sql.placeholder('rootAlias'))))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n }\n const unionAlias = union(fromUser, fromGroups).as('union_alias')\n const select: SpaceEnv | SelectedFields<any, any> = {\n id: unionAlias.id,\n alias: unionAlias.alias,\n name: unionAlias.name,\n enabled: unionAlias.enabled,\n permissions: spaceGroupConcatPermissions(unionAlias.permissions),\n role: sql<SPACE_ROLE>`MAX(${unionAlias.role})`,\n root: {\n id: unionAlias.rootId,\n alias: unionAlias.rootAlias,\n name: unionAlias.rootName,\n permissions: unionAlias.rootPermissions,\n owner: { id: unionAlias.rootOwnerId, login: unionAlias.rootOwnerLogin },\n file: { id: unionAlias.rootFileId, path: unionAlias.rootFilePath, inTrash: unionAlias.rootFileInTrash },\n externalPath: unionAlias.rootExternalPath\n }\n }\n this.spaceAndRootPermissionsQuery = this.db.select(select).from(unionAlias).groupBy(unionAlias.id).limit(1).prepare()\n }\n // `userId` is used in `fromUserQuery` and `fromGroupsQuery` function\n const r: MySqlQueryResult = await this.spaceAndRootPermissionsQuery.execute({ userId, spaceAlias, rootAlias })\n return r.length ? r.at(0) : null\n }\n\n private fromUserAndGroups(select: SelectedFields<any, any>, filters: SQL[] = []) {\n return union(this.fromUserQuery(select, filters), this.fromGroupsQuery(select, filters)).as('union_alias')\n }\n\n private fromUserQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.userId, sql.placeholder('userId')), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n\n private fromGroupsQuery(select: SelectedFields<any, any>, filters: SQL[] = []) {\n const where = [eq(spacesMembers.groupId, usersGroups.groupId), ...filters]\n return this.db\n .select(select)\n .from(spacesMembers)\n .innerJoin(usersGroups, eq(usersGroups.userId, sql.placeholder('userId')))\n .innerJoin(spaces, eq(spacesMembers.spaceId, spaces.id))\n .where(and(...where))\n }\n}\n"],"names":["SpacesQueries","spaceExistsForAlias","alias","db","query","spaces","findFirst","columns","id","where","eq","spaceRootExistsForAlias","spaceId","rootAlias","spacesRoots","and","selectSpaces","fields","select","convertToSelect","from","spacesQuotaPaths","storageUsage","storageQuota","externalPaths","sql","externalPath","mapWith","JSON","parse","as","leftJoin","isNotNull","groupBy","userIsSpaceManager","userId","shareId","q","spacesMembers","shares","innerJoin","r","role","SPACE_ROLE","IS_MANAGER","limit","getSpaceAsManager","spaceQuery","otherMembers","rootOwner","users","fileOwner","files","linkUsers","name","description","enabled","storageIndexing","createdAt","modifiedAt","disabledAt","roots","concatDistinctObjectsInArray","permissions","dateTimeUTC","owner","login","fullName","userFullNameSQL","email","file","path","filePathSQL","mime","type","USER_ROLE","GUEST","MEMBER_TYPE","USER","spaceRole","groups","GROUP_TYPE","PERSONAL","PGROUP","GROUP","IS_MEMBER","links","linkId","raw","placeholder","isNull","groupId","fileId","ownerId","prepare","space","execute","members","popFromObject","SpaceProps","createSpace","dbGetInsertedId","insert","values","deleteSpace","deleteNow","delete","update","set","Date","dbCheckAffectedRows","updateSpace","logger","debug","stringify","e","error","spaceRootFiles","options","spaceRootFilesQuery","isDir","inTrash","size","ctime","mtime","root","syncs","syncPaths","clientId","syncClients","clientName","info","hasComments","fileHasCommentsSubquerySQL","Boolean","parentId","spaceRootId","withHasComments","withShares","withSyncs","getSpaceRoots","push","getSpaceMemberIds","userIds","groupIds","m","updateMembers","add","remove","status","ACTION","ADD","UPDATE","DELETE","props","Number","isInteger","updateSpaceRoots","addRoot","updateRoot","removeRoot","spaceIds","spaceIdsQuery","unionAlias","fromUserAndGroups","map","withPermissions","fromId","pQuery","spaceFromIdWithPermissionsQuery","spacesWithPermissionsQuery","spacesQuery","selectUnion","spaceGroupConcatPermissions","max","s","spacesWithDetails","spacesWithDetailsQuery","managers","counts","countDistinct","length","spaceAlias","spaceAndRootPermissions","spacePermissions","getOrCreateUserFile","filters","convertToWhere","filesQueries","getOrCreateSpaceFile","dbFile","clearCachePermissions","rootAliases","uIds","uid","basePattern","patterns","forEach","rAlias","cache","genSlugKey","p","keys","verbose","mdel","catch","spacePermissionsQuery","at","spaceAndRootPermissionsQuery","rootId","rootName","rootPermissions","rootOwnerId","rootOwnerLogin","rootFileId","rootFilePath","rootFileInTrash","rootExternalPath","fromUser","fromUserQuery","$dynamic","fromGroups","fromGroupsQuery","union","usersGroups","Logger"],"mappings":"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"}
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "SpacesScheduler", {
14
14
  });
15
15
  const _common = require("@nestjs/common");
16
16
  const _schedule = require("@nestjs/schedule");
17
+ const _sharesmanagerservice = require("../../shares/services/shares-manager.service");
17
18
  const _spacesmanagerservice = require("./spaces-manager.service");
18
19
  function _ts_decorate(decorators, target, key, desc) {
19
20
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
@@ -25,23 +26,28 @@ function _ts_metadata(k, v) {
25
26
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
26
27
  }
27
28
  let SpacesScheduler = class SpacesScheduler {
28
- async updatePersonalSpacesQuota() {
29
- this.logger.log(`${this.updatePersonalSpacesQuota.name} - START`);
29
+ async updateQuotas() {
30
+ this.logger.log('Update Personal Quotas - START');
30
31
  try {
31
32
  await this.spacesManager.updatePersonalSpacesQuota();
32
33
  } catch (e) {
33
- this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`);
34
+ this.logger.error(`Update Personal Quotas} - ${e}`);
34
35
  }
35
- this.logger.log(`${this.updatePersonalSpacesQuota.name} - END`);
36
- }
37
- async updateSpacesQuota() {
38
- this.logger.log(`${this.updateSpacesQuota.name} - START`);
36
+ this.logger.log('Update Personal Quotas - END');
37
+ this.logger.log('Update Space Quotas - START');
39
38
  try {
40
39
  await this.spacesManager.updateSpacesQuota();
41
40
  } catch (e) {
42
- this.logger.error(`${this.updateSpacesQuota.name} - ${e}`);
41
+ this.logger.error(`Update Space Quotas - ${e}`);
43
42
  }
44
- this.logger.log(`${this.updateSpacesQuota.name} - END`);
43
+ this.logger.log('Update Space Quotas - END');
44
+ this.logger.log('Update Share External Path Quotas - START');
45
+ try {
46
+ await this.sharesManager.updateSharesExternalPathQuota();
47
+ } catch (e) {
48
+ this.logger.error(`Update Share External Path Quotas - ${e}`);
49
+ }
50
+ this.logger.log('Update Share External Path Quotas - END');
45
51
  }
46
52
  async deleteExpiredSpaces() {
47
53
  /* Removes spaces that have been disabled for more than 30 days */ this.logger.log(`${this.deleteExpiredSpaces.name} - START`);
@@ -52,8 +58,9 @@ let SpacesScheduler = class SpacesScheduler {
52
58
  }
53
59
  this.logger.log(`${this.deleteExpiredSpaces.name} - DONE`);
54
60
  }
55
- constructor(spacesManager){
61
+ constructor(spacesManager, sharesManager){
56
62
  this.spacesManager = spacesManager;
63
+ this.sharesManager = sharesManager;
57
64
  this.logger = new _common.Logger(SpacesScheduler.name);
58
65
  }
59
66
  };
@@ -63,16 +70,9 @@ _ts_decorate([
63
70
  _ts_metadata("design:type", Function),
64
71
  _ts_metadata("design:paramtypes", []),
65
72
  _ts_metadata("design:returntype", Promise)
66
- ], SpacesScheduler.prototype, "updatePersonalSpacesQuota", null);
67
- _ts_decorate([
68
- (0, _schedule.Timeout)(60000),
69
- (0, _schedule.Cron)(_schedule.CronExpression.EVERY_HOUR),
70
- _ts_metadata("design:type", Function),
71
- _ts_metadata("design:paramtypes", []),
72
- _ts_metadata("design:returntype", Promise)
73
- ], SpacesScheduler.prototype, "updateSpacesQuota", null);
73
+ ], SpacesScheduler.prototype, "updateQuotas", null);
74
74
  _ts_decorate([
75
- (0, _schedule.Cron)(_schedule.CronExpression.EVERY_DAY_AT_4AM),
75
+ (0, _schedule.Cron)(_schedule.CronExpression.EVERY_DAY_AT_2AM),
76
76
  _ts_metadata("design:type", Function),
77
77
  _ts_metadata("design:paramtypes", []),
78
78
  _ts_metadata("design:returntype", Promise)
@@ -81,7 +81,8 @@ SpacesScheduler = _ts_decorate([
81
81
  (0, _common.Injectable)(),
82
82
  _ts_metadata("design:type", Function),
83
83
  _ts_metadata("design:paramtypes", [
84
- typeof _spacesmanagerservice.SpacesManager === "undefined" ? Object : _spacesmanagerservice.SpacesManager
84
+ typeof _spacesmanagerservice.SpacesManager === "undefined" ? Object : _spacesmanagerservice.SpacesManager,
85
+ typeof _sharesmanagerservice.SharesManager === "undefined" ? Object : _sharesmanagerservice.SharesManager
85
86
  ])
86
87
  ], SpacesScheduler);
87
88
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-scheduler.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Injectable, Logger } from '@nestjs/common'\nimport { Cron, CronExpression, Timeout } from '@nestjs/schedule'\nimport { SpacesManager } from './spaces-manager.service'\n\n@Injectable()\nexport class SpacesScheduler {\n private readonly logger = new Logger(SpacesScheduler.name)\n\n constructor(private readonly spacesManager: SpacesManager) {}\n\n @Timeout(60000)\n @Cron(CronExpression.EVERY_HOUR)\n async updatePersonalSpacesQuota() {\n this.logger.log(`${this.updatePersonalSpacesQuota.name} - START`)\n try {\n await this.spacesManager.updatePersonalSpacesQuota()\n } catch (e) {\n this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`)\n }\n this.logger.log(`${this.updatePersonalSpacesQuota.name} - END`)\n }\n\n @Timeout(60000)\n @Cron(CronExpression.EVERY_HOUR)\n async updateSpacesQuota() {\n this.logger.log(`${this.updateSpacesQuota.name} - START`)\n try {\n await this.spacesManager.updateSpacesQuota()\n } catch (e) {\n this.logger.error(`${this.updateSpacesQuota.name} - ${e}`)\n }\n this.logger.log(`${this.updateSpacesQuota.name} - END`)\n }\n\n @Cron(CronExpression.EVERY_DAY_AT_4AM)\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n this.logger.log(`${this.deleteExpiredSpaces.name} - START`)\n try {\n await this.spacesManager.deleteExpiredSpaces()\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - ${e}`)\n }\n this.logger.log(`${this.deleteExpiredSpaces.name} - DONE`)\n }\n}\n"],"names":["SpacesScheduler","updatePersonalSpacesQuota","logger","log","name","spacesManager","e","error","updateSpacesQuota","deleteExpiredSpaces","Logger","EVERY_HOUR","EVERY_DAY_AT_4AM"],"mappings":"AAAA;;;;CAIC;;;;+BAOYA;;;eAAAA;;;wBALsB;0BACW;sCAChB;;;;;;;;;;AAGvB,IAAA,AAAMA,kBAAN,MAAMA;IAKX,MAEMC,4BAA4B;QAChC,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACF,yBAAyB,CAACG,IAAI,CAAC,QAAQ,CAAC;QAChE,IAAI;YACF,MAAM,IAAI,CAACC,aAAa,CAACJ,yBAAyB;QACpD,EAAE,OAAOK,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,GAAG,IAAI,CAACN,yBAAyB,CAACG,IAAI,CAAC,GAAG,EAAEE,GAAG;QACnE;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACF,yBAAyB,CAACG,IAAI,CAAC,MAAM,CAAC;IAChE;IAEA,MAEMI,oBAAoB;QACxB,IAAI,CAACN,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACK,iBAAiB,CAACJ,IAAI,CAAC,QAAQ,CAAC;QACxD,IAAI;YACF,MAAM,IAAI,CAACC,aAAa,CAACG,iBAAiB;QAC5C,EAAE,OAAOF,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,GAAG,IAAI,CAACC,iBAAiB,CAACJ,IAAI,CAAC,GAAG,EAAEE,GAAG;QAC3D;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACK,iBAAiB,CAACJ,IAAI,CAAC,MAAM,CAAC;IACxD;IAEA,MACMK,sBAAsB;QAC1B,gEAAgE,GAChE,IAAI,CAACP,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACM,mBAAmB,CAACL,IAAI,CAAC,QAAQ,CAAC;QAC1D,IAAI;YACF,MAAM,IAAI,CAACC,aAAa,CAACI,mBAAmB;QAC9C,EAAE,OAAOH,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,GAAG,IAAI,CAACE,mBAAmB,CAACL,IAAI,CAAC,GAAG,EAAEE,GAAG;QAC7D;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACM,mBAAmB,CAACL,IAAI,CAAC,OAAO,CAAC;IAC3D;IApCA,YAAY,AAAiBC,aAA4B,CAAE;aAA9BA,gBAAAA;aAFZH,SAAS,IAAIQ,cAAM,CAACV,gBAAgBI,IAAI;IAEG;AAqC9D;;;iDAlCuBO;;;;;;;iDAYAA;;;;;;iDAWAC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-scheduler.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Injectable, Logger } from '@nestjs/common'\nimport { Cron, CronExpression, Timeout } from '@nestjs/schedule'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { SpacesManager } from './spaces-manager.service'\n\n@Injectable()\nexport class SpacesScheduler {\n private readonly logger = new Logger(SpacesScheduler.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly sharesManager: SharesManager\n ) {}\n\n @Timeout(60000)\n @Cron(CronExpression.EVERY_HOUR)\n async updateQuotas() {\n this.logger.log('Update Personal Quotas - START')\n try {\n await this.spacesManager.updatePersonalSpacesQuota()\n } catch (e) {\n this.logger.error(`Update Personal Quotas} - ${e}`)\n }\n this.logger.log('Update Personal Quotas - END')\n this.logger.log('Update Space Quotas - START')\n try {\n await this.spacesManager.updateSpacesQuota()\n } catch (e) {\n this.logger.error(`Update Space Quotas - ${e}`)\n }\n this.logger.log('Update Space Quotas - END')\n this.logger.log('Update Share External Path Quotas - START')\n try {\n await this.sharesManager.updateSharesExternalPathQuota()\n } catch (e) {\n this.logger.error(`Update Share External Path Quotas - ${e}`)\n }\n this.logger.log('Update Share External Path Quotas - END')\n }\n\n @Cron(CronExpression.EVERY_DAY_AT_2AM)\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n this.logger.log(`${this.deleteExpiredSpaces.name} - START`)\n try {\n await this.spacesManager.deleteExpiredSpaces()\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - ${e}`)\n }\n this.logger.log(`${this.deleteExpiredSpaces.name} - DONE`)\n }\n}\n"],"names":["SpacesScheduler","updateQuotas","logger","log","spacesManager","updatePersonalSpacesQuota","e","error","updateSpacesQuota","sharesManager","updateSharesExternalPathQuota","deleteExpiredSpaces","name","Logger","EVERY_HOUR","EVERY_DAY_AT_2AM"],"mappings":"AAAA;;;;CAIC;;;;+BAQYA;;;eAAAA;;;wBANsB;0BACW;sCAChB;sCACA;;;;;;;;;;AAGvB,IAAA,AAAMA,kBAAN,MAAMA;IAQX,MAEMC,eAAe;QACnB,IAAI,CAACC,MAAM,CAACC,GAAG,CAAC;QAChB,IAAI;YACF,MAAM,IAAI,CAACC,aAAa,CAACC,yBAAyB;QACpD,EAAE,OAAOC,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,CAAC,0BAA0B,EAAED,GAAG;QACpD;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC;QAChB,IAAI,CAACD,MAAM,CAACC,GAAG,CAAC;QAChB,IAAI;YACF,MAAM,IAAI,CAACC,aAAa,CAACI,iBAAiB;QAC5C,EAAE,OAAOF,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,CAAC,sBAAsB,EAAED,GAAG;QAChD;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC;QAChB,IAAI,CAACD,MAAM,CAACC,GAAG,CAAC;QAChB,IAAI;YACF,MAAM,IAAI,CAACM,aAAa,CAACC,6BAA6B;QACxD,EAAE,OAAOJ,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,CAAC,oCAAoC,EAAED,GAAG;QAC9D;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC;IAClB;IAEA,MACMQ,sBAAsB;QAC1B,gEAAgE,GAChE,IAAI,CAACT,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACQ,mBAAmB,CAACC,IAAI,CAAC,QAAQ,CAAC;QAC1D,IAAI;YACF,MAAM,IAAI,CAACR,aAAa,CAACO,mBAAmB;QAC9C,EAAE,OAAOL,GAAG;YACV,IAAI,CAACJ,MAAM,CAACK,KAAK,CAAC,GAAG,IAAI,CAACI,mBAAmB,CAACC,IAAI,CAAC,GAAG,EAAEN,GAAG;QAC7D;QACA,IAAI,CAACJ,MAAM,CAACC,GAAG,CAAC,GAAG,IAAI,CAACQ,mBAAmB,CAACC,IAAI,CAAC,OAAO,CAAC;IAC3D;IAzCA,YACE,AAAiBR,aAA4B,EAC7C,AAAiBK,aAA4B,CAC7C;aAFiBL,gBAAAA;aACAK,gBAAAA;aAJFP,SAAS,IAAIW,cAAM,CAACb,gBAAgBY,IAAI;IAKtD;AAuCL;;;iDApCuBE;;;;;;iDAyBAC"}
@@ -269,7 +269,8 @@ _ts_decorate([
269
269
  _ts_param(0, (0, _userdecorator.GetUser)()),
270
270
  _ts_param(1, (0, _common.Param)('id', _common.ParseIntPipe)),
271
271
  _ts_param(2, (0, _common.Body)(new _common.ParseArrayPipe({
272
- items: _spacerootsdto.SpaceRootDto
272
+ items: _spacerootsdto.SpaceRootDto,
273
+ whitelist: true
273
274
  }))),
274
275
  _ts_metadata("design:type", Function),
275
276
  _ts_metadata("design:paramtypes", [
@@ -284,7 +285,8 @@ _ts_decorate([
284
285
  _ts_param(0, (0, _userdecorator.GetUser)()),
285
286
  _ts_param(1, (0, _common.Param)('id', _common.ParseIntPipe)),
286
287
  _ts_param(2, (0, _common.Body)(new _common.ParseArrayPipe({
287
- items: _spacerootsdto.SpaceRootDto
288
+ items: _spacerootsdto.SpaceRootDto,
289
+ whitelist: true
288
290
  }))),
289
291
  _ts_metadata("design:type", Function),
290
292
  _ts_metadata("design:paramtypes", [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/spaces/spaces.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport {\n Body,\n Controller,\n DefaultValuePipe,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Param,\n ParseArrayPipe,\n ParseBoolPipe,\n ParseIntPipe,\n Post,\n Put,\n Query,\n Search,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { FileTree } from '../files/interfaces/file-tree.interface'\nimport { FileError } from '../files/models/file-error'\nimport { checkExternalPath } from '../files/utils/files'\nimport { convertToFilesTree, convertToSpacesTree } from '../files/utils/files-tree'\nimport { CreateOrUpdateShareDto } from '../shares/dto/create-or-update-share.dto'\nimport { ShareLink } from '../shares/interfaces/share-link.interface'\nimport { ShareProps } from '../shares/interfaces/share-props.interface'\nimport { ShareChild } from '../shares/models/share-child.model'\nimport { USER_PERMISSION, USER_ROLE } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { UserHaveRole } from '../users/decorators/roles.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserRolesGuard } from '../users/guards/roles.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { SPACES_BASE_ROUTE, SPACES_ROUTE } from './constants/routes'\nimport { GetSpace } from './decorators/space.decorator'\nimport { CreateOrUpdateSpaceDto } from './dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from './dto/delete-space.dto'\nimport { SearchSpaceDto } from './dto/search-space.dto'\nimport { CheckRootExternalPathDto, SpaceRootDto } from './dto/space-roots.dto'\nimport { SpaceGuard } from './guards/space.guard'\nimport { SpaceFiles } from './interfaces/space-files.interface'\nimport { SpaceTrash } from './interfaces/space-trash.interface'\nimport { SpaceEnv } from './models/space-env.model'\nimport { SpaceProps } from './models/space-props.model'\nimport { SpacesBrowser } from './services/spaces-browser.service'\nimport { SpacesManager } from './services/spaces-manager.service'\n\n@Controller(SPACES_ROUTE.BASE)\n@UserHaveRole(USER_ROLE.USER)\n@UserHavePermission(USER_PERMISSION.SPACES)\n@UseGuards(UserRolesGuard, UserPermissionsGuard)\n@UseInterceptors(ContextInterceptor)\nexport class SpacesController {\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly spacesBrowser: SpacesBrowser\n ) {}\n\n @Get(`${SPACES_ROUTE.BROWSE}/*`)\n @UserHaveRole() // override: all roles\n @UserHavePermission() // override: checked in space guard\n @UseGuards(SpaceGuard)\n async browseSpace(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<SpaceFiles> {\n return this.spacesBrowser.browse(user, space, { withLocks: true, withSpacesAndShares: true, withSyncs: true, withHasComments: true })\n }\n\n @Get(`${SPACES_ROUTE.TREE}/${SPACES_BASE_ROUTE}`)\n @UserHaveRole() // override: all roles\n async treeSpaces(@GetUser() user: UserModel): Promise<FileTree[]> {\n const spaces = await this.spacesManager.listSpacesWithPermissions(user)\n return convertToSpacesTree(spaces)\n }\n\n @Get(`${SPACES_ROUTE.TREE}/*`)\n @UserHaveRole() // override: all roles\n @UserHavePermission() // override: checked in space guard\n @UseGuards(SpaceGuard)\n async treeFiles(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('showFiles', new DefaultValuePipe(false), ParseBoolPipe) showFiles?: boolean\n ): Promise<FileTree[]> {\n const spaceFiles = await this.spacesBrowser.browse(user, space)\n return convertToFilesTree(space, spaceFiles.files, !showFiles)\n }\n\n @Get(SPACES_ROUTE.LIST)\n @UserHaveRole() // override: all roles\n listSpaces(@GetUser() user: UserModel): Promise<SpaceProps[]> {\n return this.spacesManager.spacesWithDetails(user.id)\n }\n\n @UserHavePermission([USER_PERMISSION.PERSONAL_SPACE, USER_PERMISSION.SPACES])\n @Get(`${SPACES_ROUTE.TRASH}/${SPACES_ROUTE.LIST}`)\n listTrashes(@GetUser() user: UserModel): Promise<SpaceTrash[]> {\n return this.spacesManager.listTrashes(user)\n }\n\n /* MANAGE SPACES */\n\n @Search()\n searchSpaces(@GetUser() user: UserModel, @Body() searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n return this.spacesManager.searchSpaces(user.id, searchSpaceDto)\n }\n\n @Get(':id')\n getSpace(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<SpaceProps> {\n return this.spacesManager.getSpace(user, spaceId)\n }\n\n @Post()\n @UserHavePermission(USER_PERMISSION.SPACES_ADMIN)\n createSpace(@GetUser() user: UserModel, @Body() createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n return this.spacesManager.createSpace(user, createOrUpdateSpaceDto)\n }\n\n @Put(':id')\n // can be used by space managers\n updateSpace(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body() createOrUpdateSpaceDto: CreateOrUpdateSpaceDto\n ): Promise<SpaceProps> {\n return this.spacesManager.updateSpace(user, spaceId, createOrUpdateSpaceDto)\n }\n\n @Delete(':id')\n // can be used by space managers\n deleteSpace(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number, @Body() deleteSpaceDto?: DeleteSpaceDto) {\n return this.spacesManager.deleteSpace(user, spaceId, deleteSpaceDto)\n }\n\n /* MANAGE SPACE ROOTS */\n\n @Get(`:id/${SPACES_ROUTE.ROOTS}`)\n getUserRoots(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<SpaceRootDto[]> {\n return this.spacesManager.getUserRoots(user, spaceId)\n }\n\n @Post(`:id/${SPACES_ROUTE.ROOTS}`)\n createUserRoots(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body(new ParseArrayPipe({ items: SpaceRootDto })) roots: SpaceRootDto[]\n ): Promise<SpaceRootDto[]> {\n return this.spacesManager.updateUserRoots(user, spaceId, roots, true)\n }\n\n @Put(`:id/${SPACES_ROUTE.ROOTS}`)\n updateUserRoots(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body(new ParseArrayPipe({ items: SpaceRootDto })) roots: SpaceRootDto[]\n ): Promise<SpaceRootDto[]> {\n return this.spacesManager.updateUserRoots(user, spaceId, roots)\n }\n\n // Check admin root external path\n @Post(SPACES_ROUTE.ROOT_CHECK)\n @UserHavePermission(USER_PERMISSION.SPACES_ADMIN)\n @UserHaveRole(USER_ROLE.ADMINISTRATOR)\n async checkRootExternalPath(@Body() checkRootExternalPathDto: CheckRootExternalPathDto) {\n /* reserved to admins */\n try {\n await checkExternalPath(checkRootExternalPathDto.path)\n } catch (e: any) {\n if (e instanceof FileError) {\n throw new HttpException(e.message, e.httpCode)\n } else {\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n }\n\n /* MANAGE SPACE SHARES */\n\n @Get(`:id/${SPACES_ROUTE.SHARES}`)\n listSpaceShares(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<ShareChild[]> {\n return this.spacesManager.listSpaceShares(user, spaceId)\n }\n\n @Get(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n getSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<ShareProps> {\n return this.spacesManager.getSpaceShare(user, spaceId, shareId)\n }\n\n @Put(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n updateSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number,\n @Body() createOrUpdateShareDto: CreateOrUpdateShareDto\n ): Promise<ShareProps> {\n return this.spacesManager.updateSpaceShare(user, spaceId, shareId, createOrUpdateShareDto)\n }\n\n @Delete(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n deleteSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<void> {\n return this.spacesManager.deleteSpaceShare(user, spaceId, shareId)\n }\n\n @Get(`:id/${SPACES_ROUTE.LINKS}/:sid`)\n getSpaceShareLink(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<ShareLink> {\n return this.spacesManager.getSpaceShareLink(user, spaceId, shareId)\n }\n}\n"],"names":["SpacesController","browseSpace","user","space","spacesBrowser","browse","withLocks","withSpacesAndShares","withSyncs","withHasComments","treeSpaces","spaces","spacesManager","listSpacesWithPermissions","convertToSpacesTree","treeFiles","showFiles","spaceFiles","convertToFilesTree","files","listSpaces","spacesWithDetails","id","listTrashes","searchSpaces","searchSpaceDto","getSpace","spaceId","createSpace","createOrUpdateSpaceDto","updateSpace","deleteSpace","deleteSpaceDto","getUserRoots","createUserRoots","roots","updateUserRoots","checkRootExternalPath","checkRootExternalPathDto","checkExternalPath","path","e","FileError","HttpException","message","httpCode","HttpStatus","INTERNAL_SERVER_ERROR","listSpaceShares","getSpaceShare","shareId","updateSpaceShare","createOrUpdateShareDto","deleteSpaceShare","getSpaceShareLink","SPACES_ROUTE","BROWSE","TREE","SPACES_BASE_ROUTE","DefaultValuePipe","LIST","USER_PERMISSION","PERSONAL_SPACE","SPACES","TRASH","SPACES_ADMIN","ROOTS","ParseArrayPipe","items","SpaceRootDto","ROOT_CHECK","ADMINISTRATOR","SHARES","LINKS","BASE","USER"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/spaces/spaces.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport {\n Body,\n Controller,\n DefaultValuePipe,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Param,\n ParseArrayPipe,\n ParseBoolPipe,\n ParseIntPipe,\n Post,\n Put,\n Query,\n Search,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { FileTree } from '../files/interfaces/file-tree.interface'\nimport { FileError } from '../files/models/file-error'\nimport { checkExternalPath } from '../files/utils/files'\nimport { convertToFilesTree, convertToSpacesTree } from '../files/utils/files-tree'\nimport { CreateOrUpdateShareDto } from '../shares/dto/create-or-update-share.dto'\nimport { ShareLink } from '../shares/interfaces/share-link.interface'\nimport { ShareProps } from '../shares/interfaces/share-props.interface'\nimport { ShareChild } from '../shares/models/share-child.model'\nimport { USER_PERMISSION, USER_ROLE } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { UserHaveRole } from '../users/decorators/roles.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserRolesGuard } from '../users/guards/roles.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { SPACES_BASE_ROUTE, SPACES_ROUTE } from './constants/routes'\nimport { GetSpace } from './decorators/space.decorator'\nimport { CreateOrUpdateSpaceDto } from './dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from './dto/delete-space.dto'\nimport { SearchSpaceDto } from './dto/search-space.dto'\nimport { CheckRootExternalPathDto, SpaceRootDto } from './dto/space-roots.dto'\nimport { SpaceGuard } from './guards/space.guard'\nimport { SpaceFiles } from './interfaces/space-files.interface'\nimport { SpaceTrash } from './interfaces/space-trash.interface'\nimport { SpaceEnv } from './models/space-env.model'\nimport { SpaceProps } from './models/space-props.model'\nimport { SpacesBrowser } from './services/spaces-browser.service'\nimport { SpacesManager } from './services/spaces-manager.service'\n\n@Controller(SPACES_ROUTE.BASE)\n@UserHaveRole(USER_ROLE.USER)\n@UserHavePermission(USER_PERMISSION.SPACES)\n@UseGuards(UserRolesGuard, UserPermissionsGuard)\n@UseInterceptors(ContextInterceptor)\nexport class SpacesController {\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly spacesBrowser: SpacesBrowser\n ) {}\n\n @Get(`${SPACES_ROUTE.BROWSE}/*`)\n @UserHaveRole() // override: all roles\n @UserHavePermission() // override: checked in space guard\n @UseGuards(SpaceGuard)\n async browseSpace(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<SpaceFiles> {\n return this.spacesBrowser.browse(user, space, { withLocks: true, withSpacesAndShares: true, withSyncs: true, withHasComments: true })\n }\n\n @Get(`${SPACES_ROUTE.TREE}/${SPACES_BASE_ROUTE}`)\n @UserHaveRole() // override: all roles\n async treeSpaces(@GetUser() user: UserModel): Promise<FileTree[]> {\n const spaces = await this.spacesManager.listSpacesWithPermissions(user)\n return convertToSpacesTree(spaces)\n }\n\n @Get(`${SPACES_ROUTE.TREE}/*`)\n @UserHaveRole() // override: all roles\n @UserHavePermission() // override: checked in space guard\n @UseGuards(SpaceGuard)\n async treeFiles(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('showFiles', new DefaultValuePipe(false), ParseBoolPipe) showFiles?: boolean\n ): Promise<FileTree[]> {\n const spaceFiles = await this.spacesBrowser.browse(user, space)\n return convertToFilesTree(space, spaceFiles.files, !showFiles)\n }\n\n @Get(SPACES_ROUTE.LIST)\n @UserHaveRole() // override: all roles\n listSpaces(@GetUser() user: UserModel): Promise<SpaceProps[]> {\n return this.spacesManager.spacesWithDetails(user.id)\n }\n\n @UserHavePermission([USER_PERMISSION.PERSONAL_SPACE, USER_PERMISSION.SPACES])\n @Get(`${SPACES_ROUTE.TRASH}/${SPACES_ROUTE.LIST}`)\n listTrashes(@GetUser() user: UserModel): Promise<SpaceTrash[]> {\n return this.spacesManager.listTrashes(user)\n }\n\n /* MANAGE SPACES */\n\n @Search()\n searchSpaces(@GetUser() user: UserModel, @Body() searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n return this.spacesManager.searchSpaces(user.id, searchSpaceDto)\n }\n\n @Get(':id')\n getSpace(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<SpaceProps> {\n return this.spacesManager.getSpace(user, spaceId)\n }\n\n @Post()\n @UserHavePermission(USER_PERMISSION.SPACES_ADMIN)\n createSpace(@GetUser() user: UserModel, @Body() createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n return this.spacesManager.createSpace(user, createOrUpdateSpaceDto)\n }\n\n @Put(':id')\n // can be used by space managers\n updateSpace(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body() createOrUpdateSpaceDto: CreateOrUpdateSpaceDto\n ): Promise<SpaceProps> {\n return this.spacesManager.updateSpace(user, spaceId, createOrUpdateSpaceDto)\n }\n\n @Delete(':id')\n // can be used by space managers\n deleteSpace(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number, @Body() deleteSpaceDto?: DeleteSpaceDto) {\n return this.spacesManager.deleteSpace(user, spaceId, deleteSpaceDto)\n }\n\n /* MANAGE SPACE ROOTS */\n\n @Get(`:id/${SPACES_ROUTE.ROOTS}`)\n getUserRoots(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<SpaceRootDto[]> {\n return this.spacesManager.getUserRoots(user, spaceId)\n }\n\n @Post(`:id/${SPACES_ROUTE.ROOTS}`)\n createUserRoots(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body(new ParseArrayPipe({ items: SpaceRootDto, whitelist: true })) roots: SpaceRootDto[]\n ): Promise<SpaceRootDto[]> {\n return this.spacesManager.updateUserRoots(user, spaceId, roots, true)\n }\n\n @Put(`:id/${SPACES_ROUTE.ROOTS}`)\n updateUserRoots(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Body(new ParseArrayPipe({ items: SpaceRootDto, whitelist: true })) roots: SpaceRootDto[]\n ): Promise<SpaceRootDto[]> {\n return this.spacesManager.updateUserRoots(user, spaceId, roots)\n }\n\n // Check admin root external path\n @Post(SPACES_ROUTE.ROOT_CHECK)\n @UserHavePermission(USER_PERMISSION.SPACES_ADMIN)\n @UserHaveRole(USER_ROLE.ADMINISTRATOR)\n async checkRootExternalPath(@Body() checkRootExternalPathDto: CheckRootExternalPathDto) {\n /* reserved to admins */\n try {\n await checkExternalPath(checkRootExternalPathDto.path)\n } catch (e: any) {\n if (e instanceof FileError) {\n throw new HttpException(e.message, e.httpCode)\n } else {\n throw new HttpException(e.message, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n }\n\n /* MANAGE SPACE SHARES */\n\n @Get(`:id/${SPACES_ROUTE.SHARES}`)\n listSpaceShares(@GetUser() user: UserModel, @Param('id', ParseIntPipe) spaceId: number): Promise<ShareChild[]> {\n return this.spacesManager.listSpaceShares(user, spaceId)\n }\n\n @Get(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n getSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<ShareProps> {\n return this.spacesManager.getSpaceShare(user, spaceId, shareId)\n }\n\n @Put(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n updateSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number,\n @Body() createOrUpdateShareDto: CreateOrUpdateShareDto\n ): Promise<ShareProps> {\n return this.spacesManager.updateSpaceShare(user, spaceId, shareId, createOrUpdateShareDto)\n }\n\n @Delete(`:id/${SPACES_ROUTE.SHARES}/:sid`)\n deleteSpaceShare(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<void> {\n return this.spacesManager.deleteSpaceShare(user, spaceId, shareId)\n }\n\n @Get(`:id/${SPACES_ROUTE.LINKS}/:sid`)\n getSpaceShareLink(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) spaceId: number,\n @Param('sid', ParseIntPipe) shareId: number\n ): Promise<ShareLink> {\n return this.spacesManager.getSpaceShareLink(user, spaceId, shareId)\n }\n}\n"],"names":["SpacesController","browseSpace","user","space","spacesBrowser","browse","withLocks","withSpacesAndShares","withSyncs","withHasComments","treeSpaces","spaces","spacesManager","listSpacesWithPermissions","convertToSpacesTree","treeFiles","showFiles","spaceFiles","convertToFilesTree","files","listSpaces","spacesWithDetails","id","listTrashes","searchSpaces","searchSpaceDto","getSpace","spaceId","createSpace","createOrUpdateSpaceDto","updateSpace","deleteSpace","deleteSpaceDto","getUserRoots","createUserRoots","roots","updateUserRoots","checkRootExternalPath","checkRootExternalPathDto","checkExternalPath","path","e","FileError","HttpException","message","httpCode","HttpStatus","INTERNAL_SERVER_ERROR","listSpaceShares","getSpaceShare","shareId","updateSpaceShare","createOrUpdateShareDto","deleteSpaceShare","getSpaceShareLink","SPACES_ROUTE","BROWSE","TREE","SPACES_BASE_ROUTE","DefaultValuePipe","LIST","USER_PERMISSION","PERSONAL_SPACE","SPACES","TRASH","SPACES_ADMIN","ROOTS","ParseArrayPipe","items","SpaceRootDto","whitelist","ROOT_CHECK","ADMINISTRATOR","SHARES","LINKS","BASE","USER"],"mappings":"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"}
@@ -120,13 +120,14 @@ function realTrashPathFromSpace(user, space) {
120
120
  return _usermodel.UserModel.getTrashPath(user.login);
121
121
  } else if (space.root?.externalPath) {
122
122
  // external path from space or share
123
+ // space case: use the space trash
123
124
  if (space.root.file?.space?.alias) {
124
- // space case
125
125
  return _spacemodel.SpaceModel.getTrashPath(space.root.file.space.alias);
126
+ } else if (space.inFilesRepository && !space.inSharesRepository) {
127
+ return _spacemodel.SpaceModel.getTrashPath(space.alias);
126
128
  }
127
- // share case
128
- // todo: store the deleted files in the same path with .trash ?
129
- return null;
129
+ // share case: use the user's trash because this type of share has no owner
130
+ return _usermodel.UserModel.getTrashPath(user.login);
130
131
  } else if (space.root?.file?.path && space.root.owner?.login) {
131
132
  // space root is linked to a file in a personal space
132
133
  return _usermodel.UserModel.getTrashPath(space.root.owner.login);
@@ -136,9 +137,8 @@ function realTrashPathFromSpace(user, space) {
136
137
  } else if (space.alias) {
137
138
  // space files (no root)
138
139
  return _spacemodel.SpaceModel.getTrashPath(space.alias);
139
- } else {
140
- return null;
141
140
  }
141
+ return null;
142
142
  }
143
143
  function realPathFromRootFile(f) {
144
144
  // get realpath
@@ -216,21 +216,19 @@ function dbFileFromSpace(userId, space) {
216
216
  }
217
217
  function quotaKeyFromSpace(userId, space) {
218
218
  if (space.inPersonalSpace) {
219
- // personal user space
219
+ // Personal user space
220
220
  return `${_cache.CACHE_QUOTA_USER_PREFIX}-${userId}`;
221
221
  } else if (space.root?.externalPath) {
222
- // external paths are managed by admin, set a quota on a root is not intended
223
- return null;
222
+ // External paths used as shares or as space roots share the same quota as their origin
223
+ if (space.inSharesRepository) {
224
+ return `${_cache.CACHE_QUOTA_SHARE_PREFIX}-${space.root?.externalParentShareId || space.id}`;
225
+ }
226
+ return `${_cache.CACHE_QUOTA_SPACE_PREFIX}-${space.id}`;
224
227
  } else if (space.root.file?.path && space.root.owner?.login) {
225
- // space root is linked on a user file
228
+ // Space root is linked on a user file
226
229
  return `${_cache.CACHE_QUOTA_USER_PREFIX}-${space.root.owner.id}`;
227
230
  } else if (space.root.file?.space?.id) {
228
- if (space.root.file.root?.id) {
229
- // share linked to a root space with an external path, set a quota on a root is not intended
230
- return null;
231
- } else {
232
- return `${_cache.CACHE_QUOTA_SPACE_PREFIX}-${space.root.file.space.id}`;
233
- }
231
+ return `${_cache.CACHE_QUOTA_SPACE_PREFIX}-${space.root.file.space.id}`;
234
232
  } else if (space.id) {
235
233
  return `${_cache.CACHE_QUOTA_SPACE_PREFIX}-${space.id}`;
236
234
  } else {