@sync-in/server 1.8.1 → 1.9.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 (605) hide show
  1. package/CHANGELOG.md +57 -11
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +15 -15
  4. package/server/app.constants.js +9 -0
  5. package/server/app.constants.js.map +1 -1
  6. package/server/app.functions.js +42 -0
  7. package/server/app.functions.js.map +1 -0
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +88 -8
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +11 -4
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +38 -8
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/files.js +1 -1
  65. package/server/applications/files/utils/files.js.map +1 -1
  66. package/server/applications/files/utils/send-file.js +3 -2
  67. package/server/applications/files/utils/send-file.js.map +1 -1
  68. package/server/applications/links/services/links-queries.service.js +1 -1
  69. package/server/applications/links/services/links-queries.service.js.map +1 -1
  70. package/server/applications/notifications/constants/notifications.js +5 -1
  71. package/server/applications/notifications/constants/notifications.js.map +1 -1
  72. package/server/applications/notifications/i18n/de.js +8 -2
  73. package/server/applications/notifications/i18n/de.js.map +1 -1
  74. package/server/applications/notifications/i18n/es.js +8 -2
  75. package/server/applications/notifications/i18n/es.js.map +1 -1
  76. package/server/applications/notifications/i18n/fr.js +8 -2
  77. package/server/applications/notifications/i18n/fr.js.map +1 -1
  78. package/server/applications/notifications/i18n/hi.js +8 -2
  79. package/server/applications/notifications/i18n/hi.js.map +1 -1
  80. package/server/applications/notifications/i18n/it.js +8 -2
  81. package/server/applications/notifications/i18n/it.js.map +1 -1
  82. package/server/applications/notifications/i18n/ja.js +8 -2
  83. package/server/applications/notifications/i18n/ja.js.map +1 -1
  84. package/server/applications/notifications/i18n/ko.js +8 -2
  85. package/server/applications/notifications/i18n/ko.js.map +1 -1
  86. package/server/applications/notifications/i18n/pl.js +8 -2
  87. package/server/applications/notifications/i18n/pl.js.map +1 -1
  88. package/server/applications/notifications/i18n/pt.js +8 -2
  89. package/server/applications/notifications/i18n/pt.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt_br.js +8 -2
  91. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  92. package/server/applications/notifications/i18n/ru.js +8 -2
  93. package/server/applications/notifications/i18n/ru.js.map +1 -1
  94. package/server/applications/notifications/i18n/tr.js +8 -2
  95. package/server/applications/notifications/i18n/tr.js.map +1 -1
  96. package/server/applications/notifications/i18n/zh.js +8 -2
  97. package/server/applications/notifications/i18n/zh.js.map +1 -1
  98. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  99. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  100. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  101. package/server/applications/notifications/mails/models.js +38 -3
  102. package/server/applications/notifications/mails/models.js.map +1 -1
  103. package/server/applications/notifications/mails/templates.js +1 -1
  104. package/server/applications/notifications/mails/templates.js.map +1 -1
  105. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  106. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  108. package/server/applications/shares/services/shares-manager.service.js +17 -10
  109. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  111. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  112. package/server/applications/shares/services/shares-queries.service.js +11 -1
  113. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  114. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  115. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  116. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  117. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  119. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  121. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  122. package/server/applications/spaces/utils/permissions.js +2 -2
  123. package/server/applications/spaces/utils/permissions.js.map +1 -1
  124. package/server/applications/sync/services/sync-manager.service.js +1 -0
  125. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  126. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  127. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  130. package/server/applications/users/constants/user.js +1 -1
  131. package/server/applications/users/constants/user.js.map +1 -1
  132. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  133. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  134. package/server/applications/users/services/users-queries.service.js +67 -68
  135. package/server/applications/users/services/users-queries.service.js.map +1 -1
  136. package/server/applications/users/users.module.js +2 -1
  137. package/server/applications/users/users.module.js.map +1 -1
  138. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  139. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  140. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  141. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  142. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  143. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  144. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  145. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  146. package/server/authentication/constants/auth-ldap.js +2 -0
  147. package/server/authentication/constants/auth-ldap.js.map +1 -1
  148. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  149. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  150. package/server/common/functions.js +0 -8
  151. package/server/common/functions.js.map +1 -1
  152. package/server/common/image.js +1 -0
  153. package/server/common/image.js.map +1 -1
  154. package/server/common/shared.js +18 -1
  155. package/server/common/shared.js.map +1 -1
  156. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  157. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  158. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  159. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  160. package/static/3rdpartylicenses.txt +1393 -44
  161. package/static/assets/favicon.svg +2 -25
  162. package/static/assets/logo-dark.svg +2 -32
  163. package/static/assets/logo.svg +2 -32
  164. package/static/assets/mimes/application-sql.svg +29 -1
  165. package/static/assets/mimes/application-x-sql.svg +29 -0
  166. package/static/assets/mimes/image-bmp.svg +12 -0
  167. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  168. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  169. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  170. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  171. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  172. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  173. package/static/assets/pdfjs/version +1 -1
  174. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  175. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  176. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  177. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  178. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  179. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  180. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  181. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  182. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  183. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  184. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  185. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  186. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  187. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  189. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  190. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  191. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  192. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  194. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  195. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  196. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  198. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  200. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  202. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  203. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  204. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  205. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  206. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  207. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  208. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  209. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  210. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  211. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  212. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  213. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  214. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  216. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  217. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  218. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  219. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  220. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  222. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  223. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  224. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  225. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  226. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  227. package/static/assets/pdfjs/web/viewer.css +141 -110
  228. package/static/assets/pdfjs/web/viewer.html +7 -7
  229. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  230. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  231. package/static/chunk-22DWHRCL.js +1 -0
  232. package/static/chunk-23UUFZSR.js +1 -0
  233. package/static/chunk-25QTY2GI.js +1 -0
  234. package/static/chunk-2E7IJZLL.js +1 -0
  235. package/static/chunk-2FC5EKS5.js +1 -0
  236. package/static/chunk-2TB2INBF.js +1 -0
  237. package/static/chunk-32L7RG2G.js +1 -0
  238. package/static/chunk-3OHSTP3R.js +1 -0
  239. package/static/chunk-3WLBVJ2S.js +1 -0
  240. package/static/{chunk-MTVSJTIW.js → chunk-3YDYZLF7.js} +1 -1
  241. package/static/chunk-42L6C5MT.js +1 -0
  242. package/static/chunk-4AGQL5GV.js +1 -0
  243. package/static/chunk-4BPSQMI2.js +1 -0
  244. package/static/chunk-4FDRWZWT.js +1 -0
  245. package/static/chunk-4GCCF6PF.js +1 -0
  246. package/static/chunk-4ORP3SBY.js +1 -0
  247. package/static/chunk-4PZPHJ7L.js +1 -0
  248. package/static/chunk-4QBOHIC3.js +1 -0
  249. package/static/chunk-4YT6K5KY.js +1 -0
  250. package/static/chunk-556I6YIW.js +1 -0
  251. package/static/chunk-5DPIGJU4.js +1 -0
  252. package/static/chunk-5E3TYOL3.js +1 -0
  253. package/static/chunk-5IL7C45D.js +1 -0
  254. package/static/chunk-5KJXGMKR.js +1 -0
  255. package/static/chunk-5S6KPQRA.js +1 -0
  256. package/static/chunk-5SPGSHKL.js +1 -0
  257. package/static/chunk-5WCQBTXW.js +1 -0
  258. package/static/chunk-5XUIPWOH.js +1 -0
  259. package/static/chunk-62WT7PI3.js +1 -0
  260. package/static/chunk-6B3GGAV3.js +4 -0
  261. package/static/chunk-6F6OMQ5H.js +1 -0
  262. package/static/chunk-6I5BGQHT.js +1 -0
  263. package/static/chunk-6NEBGCAZ.js +1 -0
  264. package/static/chunk-6NOS45DG.js +1 -0
  265. package/static/chunk-6OKLPRCD.js +1 -0
  266. package/static/chunk-6VEJCG43.js +1 -0
  267. package/static/chunk-77SS36Z2.js +1 -0
  268. package/static/chunk-7AXEPO3G.js +1 -0
  269. package/static/chunk-7CKHC72R.js +1 -0
  270. package/static/chunk-7DUTYOJG.js +1 -0
  271. package/static/chunk-7HKFYRPF.js +1 -0
  272. package/static/chunk-7NZJZATZ.js +1 -0
  273. package/static/chunk-AADK5D2H.js +1 -0
  274. package/static/chunk-ACUF7IKP.js +1 -0
  275. package/static/chunk-AGREZPV4.js +1 -0
  276. package/static/chunk-ATBJWFA3.js +1 -0
  277. package/static/chunk-ATXLZN2B.js +1 -0
  278. package/static/chunk-AZ5TF5Y3.js +1 -0
  279. package/static/chunk-BBHYIURC.js +1 -0
  280. package/static/chunk-BHZEPHRI.js +13 -0
  281. package/static/chunk-BODMMLVB.js +7 -0
  282. package/static/chunk-BSB4VROD.js +2 -0
  283. package/static/chunk-BU4ZICZR.js +1 -0
  284. package/static/chunk-C3AAEQKW.js +1 -0
  285. package/static/chunk-CFTKW432.js +1 -0
  286. package/static/chunk-CNOVT6KU.js +1 -0
  287. package/static/chunk-D56H3XE2.js +1 -0
  288. package/static/chunk-DFOOSIIA.js +1 -0
  289. package/static/chunk-DHFQIFOF.js +1 -0
  290. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  291. package/static/chunk-DJDRX53V.js +2 -0
  292. package/static/chunk-DKGXUMLT.js +1 -0
  293. package/static/chunk-DQ3GEMPM.js +1 -0
  294. package/static/chunk-DRHPEERW.js +2 -0
  295. package/static/chunk-DWYP6ZGG.js +1 -0
  296. package/static/chunk-EDJAISWO.js +13 -0
  297. package/static/chunk-EIYRBM4J.js +1 -0
  298. package/static/chunk-EL6QL4TP.js +1 -0
  299. package/static/chunk-ERDZ7IVF.js +1 -0
  300. package/static/chunk-EVQKKVUZ.js +1 -0
  301. package/static/chunk-F2XG7EWI.js +1 -0
  302. package/static/chunk-F672FY5I.js +1 -0
  303. package/static/chunk-F6V37MKG.js +1 -0
  304. package/static/chunk-FCGTI42I.js +1 -0
  305. package/static/chunk-FNOTGWRW.js +1 -0
  306. package/static/chunk-FQHOSSCO.js +1 -0
  307. package/static/chunk-GAGHHYLF.js +1 -0
  308. package/static/chunk-GNZPP2VO.js +1 -0
  309. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  310. package/static/chunk-GRLHFXGB.js +1 -0
  311. package/static/chunk-H6WOTGQ5.js +1 -0
  312. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  313. package/static/chunk-HC7F57NA.js +1 -0
  314. package/static/chunk-HCSWO7BO.js +7 -0
  315. package/static/chunk-HHWXIK2M.js +7 -0
  316. package/static/chunk-HKRGIRKB.js +3 -0
  317. package/static/chunk-HMOB6XC5.js +1 -0
  318. package/static/chunk-HNMGPG72.js +1 -0
  319. package/static/chunk-HS4S6BV3.js +1 -0
  320. package/static/chunk-I2S3XPC5.js +3 -0
  321. package/static/chunk-IJ7K7ATQ.js +1 -0
  322. package/static/chunk-IOIBQGHN.js +562 -0
  323. package/static/chunk-ITVA26X2.js +2 -0
  324. package/static/chunk-J6YSFHLZ.js +1 -0
  325. package/static/chunk-JAEJ6IMV.js +1 -0
  326. package/static/chunk-JB5R6V33.js +1 -0
  327. package/static/chunk-JF6WIV6M.js +1 -0
  328. package/static/chunk-JGB4LLUT.js +1 -0
  329. package/static/chunk-JGXVTKLG.js +1 -0
  330. package/static/chunk-JMYAD7E2.js +1 -0
  331. package/static/chunk-JSE63Q5X.js +1 -0
  332. package/static/chunk-JVV3ZL6L.js +1 -0
  333. package/static/chunk-JWPXQOS3.js +5 -0
  334. package/static/chunk-JXZCNFW7.js +1 -0
  335. package/static/chunk-JY2I3HGL.js +1 -0
  336. package/static/chunk-K657XPXA.js +1 -0
  337. package/static/chunk-KAVP6UXH.js +1 -0
  338. package/static/{chunk-3R74L4UU.js → chunk-KDEEERWZ.js} +1 -1
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KT3TWCST.js +1 -0
  342. package/static/chunk-L6SYG23T.js +1 -0
  343. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  344. package/static/chunk-LRQSPCYZ.js +1 -0
  345. package/static/chunk-LUSVISM6.js +1 -0
  346. package/static/{chunk-LVSNIS5P.js → chunk-LYZGJZNP.js} +1 -1
  347. package/static/chunk-LZKI5P5T.js +1 -0
  348. package/static/chunk-M4XL3JN5.js +6 -0
  349. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  350. package/static/chunk-MIA5YBOI.js +1 -0
  351. package/static/chunk-MKUUWY6Y.js +1 -0
  352. package/static/chunk-MR3U7TKQ.js +1 -0
  353. package/static/chunk-MYM43ENO.js +1 -0
  354. package/static/chunk-NAH4V2R6.js +2 -0
  355. package/static/chunk-NBBDVVUF.js +1 -0
  356. package/static/chunk-NKGKBQBX.js +1 -0
  357. package/static/chunk-NMF2ZFBE.js +1 -0
  358. package/static/chunk-NN4ONTOT.js +1 -0
  359. package/static/chunk-NOPACN4F.js +1 -0
  360. package/static/chunk-NYJPOP4L.js +1 -0
  361. package/static/chunk-OQRWXCLY.js +1 -0
  362. package/static/chunk-PCFH5HCI.js +2 -0
  363. package/static/chunk-PJF5XUTO.js +1 -0
  364. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  365. package/static/chunk-PTLYIUFW.js +1 -0
  366. package/static/chunk-PXRT4L57.js +1 -0
  367. package/static/chunk-PZGLDZZM.js +1 -0
  368. package/static/chunk-Q4VNZGFI.js +1 -0
  369. package/static/chunk-Q556XB3S.js +1 -0
  370. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  371. package/static/chunk-Q7U2VPIS.js +1 -0
  372. package/static/chunk-QM6CQMEX.js +1 -0
  373. package/static/chunk-QMHUIHSR.js +1 -0
  374. package/static/chunk-QVFPHTOH.js +1 -0
  375. package/static/chunk-R4MI25E2.js +1 -0
  376. package/static/chunk-R7JRAR3P.js +1 -0
  377. package/static/chunk-R7PNKQU2.js +1 -0
  378. package/static/chunk-RCAORRB7.js +1 -0
  379. package/static/chunk-RDNTK4YH.js +1 -0
  380. package/static/{chunk-VJTXJ43D.js → chunk-RK2ONYTL.js} +1 -1
  381. package/static/chunk-RK7XRDNB.js +1 -0
  382. package/static/chunk-RO7SAOLK.js +1 -0
  383. package/static/chunk-RQUUINHV.js +1 -0
  384. package/static/chunk-RUN556VW.js +1 -0
  385. package/static/chunk-S2VBGI6Q.js +1 -0
  386. package/static/chunk-S7S5M3AZ.js +1 -0
  387. package/static/chunk-SBLNYV74.js +1 -0
  388. package/static/chunk-SIZCHHUA.js +1 -0
  389. package/static/chunk-SRBOO7AO.js +1 -0
  390. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  391. package/static/chunk-T3YI3BSS.js +1 -0
  392. package/static/chunk-TAL3RTTQ.js +1 -0
  393. package/static/chunk-TGLJFALR.js +1 -0
  394. package/static/chunk-TJZKTNNS.js +1 -0
  395. package/static/chunk-U4RW6XG5.js +1 -0
  396. package/static/chunk-UJTFWZEC.js +1 -0
  397. package/static/chunk-UPGVU5LG.js +1 -0
  398. package/static/chunk-UQ6O3I6W.js +1 -0
  399. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  400. package/static/chunk-V6FA5QY4.js +1 -0
  401. package/static/chunk-VK7XMFVE.js +1 -0
  402. package/static/chunk-VQJYCYWI.js +1 -0
  403. package/static/chunk-VWIRXLNE.js +1 -0
  404. package/static/chunk-VZMVGIVW.js +1 -0
  405. package/static/chunk-VZPCXSRG.js +2 -0
  406. package/static/chunk-WR3MA3L3.js +1 -0
  407. package/static/chunk-XCLK7NJL.js +1 -0
  408. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  409. package/static/chunk-XEGHEUP5.js +1 -0
  410. package/static/chunk-XKEBQNQJ.js +1 -0
  411. package/static/chunk-XOF4UW3S.js +1 -0
  412. package/static/chunk-XQGPSNQB.js +1 -0
  413. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  414. package/static/chunk-Y5RLD72B.js +1 -0
  415. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  416. package/static/chunk-Y63UUJGJ.js +1 -0
  417. package/static/chunk-YBNAC7QM.js +1 -0
  418. package/static/chunk-YCTCESL4.js +1 -0
  419. package/static/chunk-YMAN4LIU.js +1 -0
  420. package/static/chunk-YTDE6SXT.js +1 -0
  421. package/static/chunk-YZPIUJB3.js +1 -0
  422. package/static/chunk-ZCOWBVOT.js +1 -0
  423. package/static/chunk-ZHRYYMYE.js +1 -0
  424. package/static/chunk-ZNXTOQFG.js +1 -0
  425. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  426. package/static/chunk-ZXXHFBGL.js +1 -0
  427. package/static/favicon.ico +0 -0
  428. package/static/index.html +2 -2
  429. package/static/main-56PZQ6TJ.js +11 -0
  430. package/static/styles-Q4OZOSSK.css +1 -0
  431. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  432. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  433. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  434. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  435. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  436. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  437. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  438. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  439. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  440. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  441. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  442. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  443. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  444. package/static/assets/codemirror/mode/css/css.js +0 -862
  445. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  446. package/static/assets/codemirror/mode/d/d.js +0 -223
  447. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  448. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  449. package/static/assets/codemirror/mode/django/django.js +0 -356
  450. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  451. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  452. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  453. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  454. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  455. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  456. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  457. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  458. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  459. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  460. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  461. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  462. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  463. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  464. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  465. package/static/assets/codemirror/mode/go/go.js +0 -187
  466. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  467. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  468. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  469. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  470. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  471. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  472. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  473. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  474. package/static/assets/codemirror/mode/http/http.js +0 -113
  475. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  476. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  477. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  478. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  479. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  480. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  481. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  482. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  483. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  484. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  485. package/static/assets/codemirror/mode/meta.js +0 -221
  486. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  487. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  488. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  489. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  490. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  491. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  492. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  493. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  494. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  495. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  496. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  497. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  498. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  499. package/static/assets/codemirror/mode/php/php.js +0 -234
  500. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  501. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  502. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  503. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  504. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  505. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  506. package/static/assets/codemirror/mode/python/python.js +0 -402
  507. package/static/assets/codemirror/mode/q/q.js +0 -139
  508. package/static/assets/codemirror/mode/r/r.js +0 -190
  509. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  510. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  511. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  512. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  513. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  514. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  515. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  516. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  517. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  518. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  519. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  520. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  521. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  522. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  523. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  524. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  525. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  526. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  527. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  528. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  529. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  530. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  531. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  532. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  533. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  534. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  535. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  536. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  537. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  538. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  539. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  540. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  541. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  542. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  543. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  544. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  545. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  546. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  547. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  548. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  549. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  550. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  551. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  552. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  553. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  554. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  555. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  556. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  557. package/static/chunk-2KLC4T2Z.js +0 -1
  558. package/static/chunk-2VMSXRCB.js +0 -12
  559. package/static/chunk-3OHSRRKH.js +0 -4
  560. package/static/chunk-3R4WKOHQ.js +0 -1
  561. package/static/chunk-3XVM35O2.js +0 -1
  562. package/static/chunk-3YVRP3VM.js +0 -2
  563. package/static/chunk-5UKZLU5H.js +0 -1
  564. package/static/chunk-AF24EYXU.js +0 -1
  565. package/static/chunk-AKQVEHO6.js +0 -2
  566. package/static/chunk-BCVX464U.js +0 -2
  567. package/static/chunk-BQV4FRM6.js +0 -1
  568. package/static/chunk-CETH7UYS.js +0 -1
  569. package/static/chunk-DIT6W7VM.js +0 -562
  570. package/static/chunk-DKSEQTMX.js +0 -1
  571. package/static/chunk-FZ3JPGYZ.js +0 -1
  572. package/static/chunk-IQSKQXC3.js +0 -1
  573. package/static/chunk-ITUFI2BJ.js +0 -1
  574. package/static/chunk-LCTZJ537.js +0 -1
  575. package/static/chunk-LK2UCQJ6.js +0 -1
  576. package/static/chunk-LP5TBXEN.js +0 -7
  577. package/static/chunk-N3U6637P.js +0 -1
  578. package/static/chunk-NNV4OXSB.js +0 -1
  579. package/static/chunk-O6FYXVHI.js +0 -1
  580. package/static/chunk-OOGP4WSH.js +0 -2
  581. package/static/chunk-PCWDQPOM.js +0 -2
  582. package/static/chunk-PNR6M34W.js +0 -1
  583. package/static/chunk-Q5KM7LTX.js +0 -1
  584. package/static/chunk-QHC6ZPQ4.js +0 -1
  585. package/static/chunk-QMRBZHE4.js +0 -1
  586. package/static/chunk-QSJRY3TF.js +0 -1
  587. package/static/chunk-QUUIRSYT.js +0 -1
  588. package/static/chunk-RFH46UW3.js +0 -1
  589. package/static/chunk-RSXHRKM5.js +0 -1
  590. package/static/chunk-RV3VZJPZ.js +0 -1
  591. package/static/chunk-S7HNXVRB.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SJR5R3Y4.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-V3LHHZYN.js +0 -1
  597. package/static/chunk-VQQKMY2C.js +0 -1
  598. package/static/chunk-WSSU2HXE.js +0 -1
  599. package/static/chunk-XDZGW64M.js +0 -3
  600. package/static/chunk-XTRDKGKG.js +0 -1
  601. package/static/chunk-YLWTEC3X.js +0 -1
  602. package/static/chunk-Z5J5F5SX.js +0 -1
  603. package/static/main-4H5BJY3J.js +0 -9
  604. package/static/scripts-WRDOQIU5.js +0 -24
  605. package/static/styles-2C2UNCNB.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-manager.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 { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { eq, isNotNull, lte } from 'drizzle-orm'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { ACTION } from '../../../common/constants'\nimport { convertDiffUpdate, diffCollection, differencePermissions } from '../../../common/functions'\nimport type { Entries, StorageQuota } from '../../../common/interfaces'\nimport { createSlug, regExpNumberSuffix } from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FileError } from '../../files/models/file-error'\nimport { dirListFileNames, dirSize, getProps, isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { CreateOrUpdateShareDto } from '../../shares/dto/create-or-update-share.dto'\nimport type { ShareLink } from '../../shares/interfaces/share-link.interface'\nimport type { ShareProps } from '../../shares/interfaces/share-props.interface'\nimport type { ShareChild } from '../../shares/models/share-child.model'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport type { User } from '../../users/schemas/user.interface'\nimport { users } from '../../users/schemas/users.schema'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { CACHE_QUOTA_SPACE_PREFIX, CACHE_QUOTA_TTL, CACHE_QUOTA_USER_PREFIX } from '../constants/cache'\nimport {\n SPACE_ALIAS,\n SPACE_ALL_OPERATIONS,\n SPACE_MAX_DISABLED_DAYS,\n SPACE_OPERATION,\n SPACE_PERSONAL,\n SPACE_REPOSITORY,\n SPACE_ROLE,\n SPACE_SHARES\n} from '../constants/spaces'\nimport { CreateOrUpdateSpaceDto, SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from '../dto/delete-space.dto'\nimport { SearchSpaceDto } from '../dto/search-space.dto'\nimport { SpaceTrash } from '../interfaces/space-trash.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport type { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceModel } from '../models/space.model'\nimport type { SpaceRoot } from '../schemas/space-root.interface'\nimport type { Space } from '../schemas/space.interface'\nimport { spaces } from '../schemas/spaces.schema'\nimport { quotaKeyFromSpace } from '../utils/paths'\nimport { haveSpacePermission } from '../utils/permissions'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesManager {\n private readonly logger = new Logger(SpacesManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly usersQueries: UsersQueries,\n private readonly sharesManager: SharesManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n listSpaces(userId: number): Promise<Partial<SpaceProps>[]> {\n return this.spacesQueries.spaces(userId)\n }\n\n spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n return this.spacesQueries.spacesWithDetails(userId)\n }\n\n uniqueRootName(name: string, names: string[]) {\n if (names.find((fName: string) => name.toLowerCase() === fName.toLowerCase())) {\n const nameExtension = path.extname(name)\n const nameWithoutExtension = path.basename(name, nameExtension)\n const originalName = nameWithoutExtension.replace(regExpNumberSuffix, '')\n let count = 1\n let newName = `${originalName}-${count}${nameExtension}`\n while (names.find((fName: string) => newName.toLowerCase() === fName.toLowerCase())) {\n count += 1\n newName = `${originalName}-${count}${nameExtension}`\n }\n return newName\n }\n return null\n }\n\n async spaceEnv(user: UserModel, urlSegments: string[], skipEndpointProtection = false): Promise<SpaceEnv> {\n /* SpaceEnv builder */\n let [repository, spaceAlias, rootAlias, ...paths] = urlSegments\n\n if (\n !repository ||\n (!spaceAlias && repository !== SPACE_REPOSITORY.SHARES) ||\n Object.values(SPACE_REPOSITORY).indexOf(repository as SPACE_REPOSITORY) === -1\n ) {\n throw new Error(`Space path is not valid : ${urlSegments}`)\n }\n\n let space: SpaceEnv\n if (spaceAlias === SPACE_ALIAS.PERSONAL) {\n /* Personal Space (static) */\n if (rootAlias) {\n // there is no root in a personal space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n space = new SpaceEnv(SPACE_PERSONAL, rootAlias, false)\n } else if (repository === SPACE_REPOSITORY.SHARES) {\n if (spaceAlias) {\n /* Share */\n const spacePermissions: Partial<SpaceEnv> = await this.sharesManager.permissions(user, spaceAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, null, false)\n }\n } else {\n /* Shares List (static) */\n space = new SpaceEnv(SPACE_SHARES, null, false)\n }\n } else {\n /* Space */\n if (repository === SPACE_REPOSITORY.TRASH && rootAlias) {\n // there is no root in a trash space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n const spacePermissions: Partial<SpaceEnv> = await this.spacesQueries.permissions(user.id, spaceAlias, rootAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, rootAlias || '')\n }\n }\n if (!space) return null\n try {\n space.setup(user, repository as SPACE_REPOSITORY, rootAlias, paths, urlSegments, skipEndpointProtection)\n await this.setQuotaExceeded(user, space)\n return space\n } catch (e) {\n this.logger.warn(`${this.spaceEnv.name} - *${space.alias}* : ${e}`)\n throw new HttpException(e.message, e instanceof FileError ? e.httpCode : HttpStatus.BAD_REQUEST)\n }\n }\n\n async searchSpaces(userId: number, searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n const sps: SpaceProps[] = []\n for (const s of await this.spacesQueries.spaces(userId, true)) {\n if (searchSpaceDto.shareInsidePermission && !haveSpacePermission(s, SPACE_OPERATION.SHARE_INSIDE)) {\n continue\n }\n if (!searchSpaceDto.search || `${s.name} ${s.alias} ${s.description || ''}`.toLowerCase().indexOf(searchSpaceDto.search) > -1) {\n sps.push(s)\n }\n if (sps.length >= searchSpaceDto.limit) {\n break\n }\n }\n return sps\n }\n\n async listSpacesWithPermissions(user: UserModel): Promise<SpaceEnv[]> {\n return Promise.all(\n (await this.spacesQueries.spaces(user.id, true)).map(async (s) => {\n const space = new SpaceEnv(s)\n await this.setQuotaExceeded(user, space)\n return space\n })\n )\n }\n\n async listTrashes(user: UserModel): Promise<SpaceTrash[]> {\n const trashes: SpaceTrash[] = []\n // todo: store 'Personal files' as const somewhere (used in frontend too)\n const personalTrash: SpaceTrash = { id: 0, name: 'Personal files', alias: SPACE_ALIAS.PERSONAL, nb: 0, mtime: 0, ctime: 0 }\n for (const space of [...(await this.listSpaces(user.id)), personalTrash] as SpaceTrash[]) {\n const rPath = space.alias === SPACE_ALIAS.PERSONAL ? user.trashPath : SpaceModel.getTrashPath(space.alias)\n try {\n space.nb = (await fs.readdir(rPath)).filter((f) => configuration.applications.files.showHiddenFiles || f[0] !== '.').length\n if (space.nb) {\n const stats = await fs.stat(rPath)\n space.mtime = stats.mtime.getTime()\n space.ctime = stats.birthtime.getTime()\n trashes.push(space)\n }\n } catch (e) {\n this.logger.error(`${this.listTrashes.name} - ${e}`)\n }\n }\n return trashes\n }\n\n async getSpace(user: UserModel, spaceId: number): Promise<SpaceProps> {\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n if (space.roots?.length && !user.isAdmin) {\n // remove external path if the current user is not an administrator\n for (const root of space.roots) {\n root.externalPath = null\n }\n }\n return space\n }\n\n async createSpace(user: UserModel, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only users with admin space role can create a space */\n // create space\n const space: SpaceProps = new SpaceProps({\n name: createOrUpdateSpaceDto.name,\n alias: await this.uniqueSpaceAlias(createOrUpdateSpaceDto.name, true),\n description: createOrUpdateSpaceDto.description,\n enabled: createOrUpdateSpaceDto.enabled,\n storageQuota: createOrUpdateSpaceDto.storageQuota,\n storageIndexing: createOrUpdateSpaceDto.storageIndexing,\n disabledAt: createOrUpdateSpaceDto.enabled ? null : new Date()\n })\n try {\n space.id = await this.spacesQueries.createSpace(space)\n } catch (e) {\n this.logger.error(`${this.createSpace.name} - unable to create space *${space.alias}* : ${e}`)\n throw new HttpException('Unable to create space', e)\n }\n // create space paths\n await SpaceModel.makePaths(space.alias)\n // add roots\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, [], [])\n // add members\n await this.updateMembers(user, space, createOrUpdateSpaceDto.members.concat(createOrUpdateSpaceDto.managers))\n // create links after members, user must be a space manager to create links\n await this.sharesManager.createOrUpdateLinksAsMembers(user, space, LINK_TYPE.SPACE, createOrUpdateSpaceDto.links)\n return this.spacesQueries.getSpaceAsManager(user.id, space.id)\n }\n\n async updateSpace(user: UserModel, spaceId: number, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only managers of the space can update it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // check and update space info\n const spaceDiffProps: Partial<SpaceProps> = { modifiedAt: new Date() }\n const props: (keyof CreateOrUpdateSpaceDto)[] = ['name', 'description', 'enabled', 'storageQuota', 'storageIndexing']\n for (const prop of props) {\n if (createOrUpdateSpaceDto[prop] !== space[prop]) {\n spaceDiffProps[prop] = createOrUpdateSpaceDto[prop]\n if (prop === 'name') {\n spaceDiffProps.alias = await this.uniqueSpaceAlias(spaceDiffProps.name, true)\n if (space.alias !== spaceDiffProps.alias) {\n // must move the space to match the new alias\n const spaceLocationWasRenamed: boolean = await this.renameSpaceLocation(space.alias, spaceDiffProps.alias)\n if (!spaceLocationWasRenamed) {\n throw new HttpException('Unable to rename space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n space.alias = spaceDiffProps.alias\n }\n } else if (prop === 'enabled') {\n spaceDiffProps.disabledAt = spaceDiffProps[prop] ? null : new Date()\n }\n }\n }\n // updates in db\n this.spacesQueries.updateSpace(spaceId, spaceDiffProps).catch((e: Error) => this.logger.error(`${this.updateSpace.name} - ${e}`))\n // checks & updates members\n const linkMembers: SpaceMemberDto[] = await this.sharesManager.createOrUpdateLinksAsMembers(\n user,\n space,\n LINK_TYPE.SPACE,\n createOrUpdateSpaceDto.links\n )\n const rootOwnerIds: number[] = await this.updateMembers(user, space, [\n ...createOrUpdateSpaceDto.members,\n ...createOrUpdateSpaceDto.managers,\n ...linkMembers\n ])\n if (rootOwnerIds.length) {\n // removes the roots of removed members or those no longer having the `share inside` permission\n createOrUpdateSpaceDto.roots = createOrUpdateSpaceDto.roots.filter((r) => rootOwnerIds.indexOf(r.owner.id) === -1)\n }\n // checks & updates roots\n const aliases: string[] = space.roots.map((r) => r.alias)\n const names: string[] = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...space.roots.map((r) => r.name)]\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, aliases, names)\n if (rootOwnerIds.indexOf(user.id) > -1) {\n // current manager was removed\n return null\n } else {\n return this.spacesQueries.getSpaceAsManager(user.id, spaceId)\n }\n }\n\n async deleteSpace(user: UserModel, spaceId: number, deleteSpaceDto?: DeleteSpaceDto) {\n /* only managers of the space can disable it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // only admin can delete the space data, managers can only disable the space for 30 days\n const deleteNow: boolean = user.isAdmin && !!deleteSpaceDto?.deleteNow\n try {\n if (deleteNow) {\n await this.sharesManager.deleteAllLinkMembers(spaceId, LINK_TYPE.SPACE)\n }\n await this.deleteOrDisableSpace(space, deleteNow)\n this.logger.log(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was ${deleteNow ? 'deleted' : 'disabled'}`)\n } catch (e) {\n this.logger.error(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was not ${deleteNow ? 'deleted' : 'disabled'} : ${e}`)\n throw new HttpException('Unable to delete space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async getUserRoots(user: UserModel, spaceId: number): Promise<SpaceRootProps[]> {\n /* if user has no permissions on the space an empty array will be returned */\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n\n async updateUserRoots(user: UserModel, spaceId: number, userRoots: SpaceRootProps[], addOnly: boolean = false): Promise<SpaceRootProps[]> {\n const space: Partial<SpaceProps> = await this.userCanAccessSpace(user.id, spaceId)\n if (space.role !== SPACE_ROLE.IS_MANAGER && !haveSpacePermission(space, SPACE_OPERATION.SHARE_INSIDE)) {\n this.logger.warn(`is not allowed to share inside on this space : *${space.alias}* (${space.id})`)\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // current states\n const spaceRoots: SpaceRootProps[] = await this.spacesQueries.getSpaceRoots(spaceId)\n const aliases = spaceRoots.map((r) => r.alias)\n const names = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...spaceRoots.map((r) => r.name)]\n // force owner.id on new user roots (owner is optional and required for the next steps)\n userRoots.forEach((r: SpaceRootProps) => (r.owner = { id: user.id }))\n if (addOnly) {\n // short circuit the `updateRoots` function\n // we need to provide all space roots to avoid collisions on aliases and names for new user roots\n const toAdd: SpaceRootProps[] = await this.validateNewRoots(user, space, spaceRoots, userRoots, aliases, names)\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n [],\n []\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateUserRoots.name} - ${e}`)\n )\n )\n return this.getUserRoots(user, spaceId)\n } else {\n const currentUserRoots: SpaceRootProps[] = spaceRoots.filter((r) => r.owner?.id === user.id)\n await this.updateRoots(user, space, currentUserRoots, userRoots, aliases, names)\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n }\n\n async uniqueRootAlias(spaceId: number, alias: string, aliasesAndNames: string[], replaceCount = false): Promise<string> {\n /* for some webdav clients the root alias is displayed instead of the file name.\n * This is why a root alias must be unique for files too */\n if (aliasesAndNames.find((fName: string) => alias.toLowerCase() === fName.toLowerCase())) {\n const aliasExtension = path.extname(alias)\n const aliasWithoutExtension = path.basename(alias, aliasExtension)\n const originalAlias = createSlug(aliasWithoutExtension, replaceCount)\n let count = 1\n let newAlias = `${originalAlias}-${count}${aliasExtension}`\n while (await this.spacesQueries.spaceRootExistsForAlias(spaceId, newAlias)) {\n count += 1\n newAlias = `${originalAlias}-${count}${aliasExtension}`\n }\n return newAlias\n }\n return null\n }\n\n async updatePersonalSpacesQuota(forUser?: UserModel) {\n const props: (keyof User)[] = ['id', 'login', 'storageUsage', 'storageQuota']\n for (const user of await this.usersQueries.selectUsers(props, [\n lte(users.role, USER_ROLE.USER),\n ...(forUser ? [eq(users.id, forUser.id)] : [])\n ])) {\n const userPath = UserModel.getHomePath(user.login)\n if (!(await isPathExists(userPath))) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - *${user.login}* home path does not exist`)\n continue\n }\n const [size, errors] = await dirSize(userPath)\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - unable to get size for *${user.login}* on ${path} : ${error}`)\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: user.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_USER_PREFIX}-${user.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`))\n if (user.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(\n `${this.updatePersonalSpacesQuota.name} - user *${user.login}* (${user.id}) : storage usage updated : ${spaceQuota.storageUsage}`\n )\n await this.usersQueries.updateUserOrGuest(user.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async updateSpacesQuota(spaceId?: number) {\n for (const space of await this.spacesQueries.spacesQuotaPaths(spaceId)) {\n const spacePath = SpaceModel.getHomePath(space.alias)\n if (!(await isPathExists(spacePath))) {\n this.logger.warn(`${this.updateSpacesQuota.name} - *${space.alias}* home path does not exist`)\n continue\n }\n let size = 0\n for (const rPath of [spacePath, ...space.externalPaths.filter(Boolean)]) {\n const [rPathSize, errors] = await dirSize(rPath)\n size += rPathSize\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updateSpacesQuota.name} - unable to get size for *${space.alias}* on ${path} : ${error}`)\n }\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: space.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updateSpacesQuota.name} - ${e}`))\n if (space.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(`${this.updateSpacesQuota.name} - space *${space.alias}* (${space.id}) : storage usage updated : ${spaceQuota.storageUsage}`)\n await this.spacesQueries.updateSpace(space.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n const props: (keyof Space)[] = ['id', 'name', 'alias', 'disabledAt']\n for (const space of await this.spacesQueries.selectSpaces(props, [eq(spaces.enabled, false), isNotNull(spaces.disabledAt)])) {\n const disabled = new Date(space.disabledAt)\n disabled.setDate(disabled.getDate() + SPACE_MAX_DISABLED_DAYS)\n if (new Date() > disabled) {\n try {\n await this.sharesManager.deleteAllLinkMembers(space.id, LINK_TYPE.SPACE)\n await this.deleteOrDisableSpace(space, true)\n this.logger.log(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was deleted`)\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was not deleted : ${e}`)\n }\n }\n }\n }\n\n async listSpaceShares(user: UserModel, spaceId: number): Promise<ShareChild[]> {\n if (await this.userIsSpaceManager(user, spaceId)) {\n return this.sharesManager.listSpaceShares(spaceId)\n }\n }\n\n async getSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareWithMembers(user, shareId, true)\n }\n }\n\n async updateSpaceShare(user: UserModel, spaceId: number, shareId: number, createOrUpdateShareDto: CreateOrUpdateShareDto): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.updateShare(user, shareId, createOrUpdateShareDto, true)\n }\n }\n\n async deleteSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<void> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.deleteShare(user, shareId, true)\n }\n }\n\n async getSpaceShareLink(user: UserModel, spaceId: number, shareId: number): Promise<ShareLink> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareLink(user, shareId, true)\n }\n }\n\n private async updateMembers(user: UserModel, space: SpaceProps, currentMembers: SpaceMemberDto[]): Promise<number[]> {\n if (space.members.length === 0 && currentMembers.length === 0) {\n return\n }\n // diff\n const [add, update, remove]: [SpaceMemberDto[], Record<string | 'object', { old: any; new: any } | SpaceMemberDto>[], SpaceMemberDto[]] =\n diffCollection(space.members, currentMembers, ['permissions', 'spaceRole'], ['id', 'type'])\n\n // check members whitelists\n let toAdd: SpaceMemberDto[] = []\n if (add.length) {\n const [userIdsWhitelist, groupIdsWhitelist] = await Promise.all([\n this.usersQueries.usersWhitelist(user.id),\n this.usersQueries.groupsWhitelist(user.id)\n ])\n toAdd = add.filter((m) => {\n if (\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && !m.linkId && userIdsWhitelist.indexOf(m.id) === -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && groupIdsWhitelist.indexOf(m.id) === -1)\n ) {\n this.logger.warn(\n `${this.updateMembers.name} - cannot add ${m.type} (${m.id}) to space *${space.alias}* (${space.id}) : not in the members whitelist`\n )\n return false\n }\n return true\n })\n }\n\n // filter links\n const toRemove: SpaceMemberDto[] = remove.filter((m) => !m.linkId)\n // do remove links\n this.sharesManager.deleteLinkMembers(remove.filter((m) => !!m.linkId)).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // do update members\n const status: Record<\n Exclude<ACTION, ACTION.DELETE_PERMANENTLY>,\n {\n groupIds: number[]\n userIds: number[]\n }\n > = await this.spacesQueries.updateMembers(space.id, toAdd, convertDiffUpdate(update), toRemove)\n\n // lists deleted and updated members as potential share or space roots owners\n const [rmShareOwners, upShareOwners, rmRootOwners]: [\n SpaceMemberDto[],\n {\n object: SpaceMemberDto\n rmPermissions: SPACE_OPERATION[]\n }[],\n number[]\n ] = [[], [], []]\n\n for (const [action, members] of Object.entries(status) as Entries<typeof status>) {\n if (!members.userIds.length && !members.groupIds.length) continue\n if (action === ACTION.DELETE) {\n // stores the removed members who might own shares created from the current space\n rmShareOwners.push(\n ...toRemove.filter(\n (m) =>\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && members.userIds.indexOf(m.id) > -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.id) > -1)\n )\n )\n // stores ids of removed members that might have space roots\n rmRootOwners.push(...members.userIds)\n } else if (action === ACTION.UPDATE) {\n // stores permissions updates and members who might own shares created from the current space\n // ignore space managers (they have all permissions)\n for (const m of update as {\n object: SpaceMemberDto\n permissions?: { old: string; new: string }\n spaceRole?: { old: number; new: number }\n }[]) {\n if (\n ((m.object.type === MEMBER_TYPE.USER || m.object.type === MEMBER_TYPE.GUEST) &&\n m.object.spaceRole !== SPACE_ROLE.IS_MANAGER &&\n members.userIds.indexOf(m.object.id) > -1) ||\n ((m.object.type === MEMBER_TYPE.GROUP || m.object.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.object.id) > -1)\n ) {\n // special case, the manager was moved to members without permissions change\n if (!m.permissions && m.spaceRole.new === SPACE_ROLE.IS_MEMBER) {\n m.permissions = { old: SPACE_ALL_OPERATIONS, new: m.object.permissions }\n }\n // `share inside` permission is only used for spaces\n const diffPermissions = differencePermissions(m.permissions.old, m.permissions.new).filter((p) => p !== SPACE_OPERATION.SHARE_INSIDE)\n if (diffPermissions.length) {\n upShareOwners.push({ object: m.object, rmPermissions: diffPermissions as SPACE_OPERATION[] })\n }\n }\n }\n }\n // clear cache &|| notify\n this.onSpaceActionForMembers(space, action, members, user).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n }\n // do updates\n // remove or update potential shares\n this.sharesManager\n .updateSharesFromSpace(space.id, currentMembers, rmShareOwners, upShareOwners)\n .catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // return potential root owner ids\n return rmRootOwners\n }\n\n private async updateRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ) {\n // diff\n const [add, toUpdate, toRemove]: [\n SpaceRootProps[],\n Record<\n string | 'object',\n | {\n old: any\n new: any\n }\n | SpaceRootProps\n | any\n >[],\n SpaceRootProps[]\n ] = diffCollection(curRoots, newRoots, ['name', 'alias', 'permissions'])\n\n // update\n for (const props of toUpdate) {\n if ('alias' in props) {\n props.alias.new = (await this.uniqueRootAlias(space.id, props.alias.new, aliases.concat(names), true)) || props.alias.new\n // remove from space cache permissions\n this.spacesQueries\n .clearCachePermissions(space.alias, [props.alias.old, props.alias.new])\n .catch((e: Error) => this.logger.error(`${this.updateRoots.name} - ${e}`))\n // update aliases list for next roots\n aliases.push(props.alias.new)\n }\n if ('name' in props) {\n props.name.new = this.uniqueRootName(props.name.new, names) || props.name.new\n // update names list for next roots\n names.push(props.name.new)\n }\n }\n\n // format actions\n const toAdd = await this.validateNewRoots(user, space, curRoots, add, aliases, names)\n\n // remove a root implies that all shares with a reference to root.id will be deleted in cascade\n // however, it is \"cleaner\" to warn users about the deletion of these shares and to clear the permission caches before the cascade deletion\n // it must be assumed that the deletion and modifications of space roots will be successful\n const [rmRoots, rmRootPermissions]: [\n SpaceRoot['id'][],\n {\n id: SpaceRoot['id']\n rmPermissions: SPACE_OPERATION[]\n }[]\n ] = [\n toRemove.map((r) => r.id),\n (toUpdate as any).reduce((acc: typeof rmRootPermissions, r: any): typeof rmRootPermissions => {\n if (r.permissions !== undefined) {\n const diffPermissions = differencePermissions(r.permissions.old, r.permissions.new) as SPACE_OPERATION[]\n if (diffPermissions.length) {\n acc.push({ id: r.object.id, rmPermissions: diffPermissions })\n }\n }\n return acc\n }, [])\n ]\n // do share updates\n await this.sharesManager.updateSharesFromSpaceRoots(space.id, rmRoots, rmRootPermissions)\n\n // do root updates\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n convertDiffUpdate(toUpdate),\n toRemove\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateRoots.name} - ${e}`)\n )\n )\n }\n\n private async validateNewRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ): Promise<SpaceRootProps[]> {\n const toAdd: SpaceRootProps[] = []\n for (const r of newRoots) {\n if (r.externalPath && !user.isAdmin) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath}) : adding an external path requires the admin role`)\n continue\n }\n const rPath = r.externalPath || path.join(user.filesPath, r.file.path)\n if (!(await isPathExists(rPath))) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.file.path}) : *${rPath}* does not exist`)\n continue\n }\n // check if a parent exists for an externalPath or if the file (or parent) is already anchored\n let rExists: SpaceRootProps\n if (r.externalPath) {\n rExists = curRoots.find((cr) => cr.externalPath && r.externalPath.startsWith(cr.externalPath))\n } else {\n rExists = curRoots.find(\n (cr) => cr.file?.id === r.file.id || (cr.owner?.id === r.owner.id && cr.file?.path && r.file.path.startsWith(cr.file.path))\n )\n }\n if (rExists) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath || r.file.path}) (${r.file?.id}) : parent or file already exists in roots`)\n continue\n }\n // keep the file id (maybe already in db)\n if (!r.externalPath) {\n r.file = { ...(await getProps(rPath, r.file.path)), id: r.file.id }\n }\n r.alias = (await this.uniqueRootAlias(space.id, r.alias, aliases.concat(names), true)) || r.alias\n // update aliases list for next roots\n aliases.push(r.alias)\n r.name = this.uniqueRootName(r.name, names) || r.name\n // update names list for next roots\n names.push(r.name)\n // reset id\n r.id = 0\n toAdd.push(r)\n }\n return toAdd\n }\n\n private async deleteOrDisableSpace(space: Partial<SpaceProps>, deleteNow: boolean = false) {\n if (deleteNow) {\n // clear cache &|| notify\n const memberIds: { groupIds: number[]; userIds: number[] } = await this.spacesQueries.getSpaceMemberIds(space.id)\n this.onSpaceActionForMembers(space, ACTION.DELETE_PERMANENTLY, memberIds).catch((e: Error) =>\n this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`)\n )\n // remove all shares related to the space\n await this.sharesManager.removeSharesFromSpace(space.id)\n }\n await this.spacesQueries.deleteSpace(space.id, deleteNow)\n if (deleteNow) {\n this.spacesQueries.cache\n .del(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`)\n .catch((e: Error) => this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`))\n await this.deleteSpaceLocation(space.alias)\n }\n }\n\n private async deleteSpaceLocation(spaceAlias: string) {\n const spaceLocation = SpaceModel.getHomePath(spaceAlias)\n if (await isPathExists(spaceLocation)) {\n await removeFiles(spaceLocation)\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location was deleted`)\n } else {\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location does not exist : ${spaceLocation}`)\n }\n }\n\n private async renameSpaceLocation(oldSpaceAlias: string, newSpaceAlias: string): Promise<boolean> {\n const currentSpaceLocation: string = SpaceModel.getHomePath(oldSpaceAlias)\n if (await isPathExists(currentSpaceLocation)) {\n const newSpaceLocation: string = SpaceModel.getHomePath(newSpaceAlias)\n if (await isPathExists(newSpaceLocation)) {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${newSpaceAlias}* home path already exists : ${newSpaceLocation}`)\n return false\n } else {\n try {\n await moveFiles(currentSpaceLocation, newSpaceLocation)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newSpaceLocation, currentSpaceLocation, true)\n this.logger.error(\n `${this.renameSpaceLocation.name} - unable to rename space location from *${currentSpaceLocation}* to *${newSpaceLocation}* : ${e}`\n )\n return false\n }\n }\n } else {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${oldSpaceAlias}* space location does not exist : ${currentSpaceLocation}`)\n return false\n }\n }\n\n private async uniqueSpaceAlias(name: string, replaceCount = false): Promise<string> {\n let alias = createSlug(name, replaceCount)\n let count = 0\n // Personal space name is reserved\n if (alias === SPACE_ALIAS.PERSONAL) {\n count += 1\n alias = `${name}-${count}`\n }\n while (await this.spacesQueries.spaceExistsForAlias(alias)) {\n count += 1\n alias = `${name}-${count}`\n }\n return alias\n }\n\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: true): Promise<SpaceProps>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager?: false): Promise<Partial<SpaceProps>>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: boolean = false): Promise<Partial<SpaceProps>> {\n if (asManager) {\n // Get all space details if user is a manager\n const space: SpaceProps = await this.spacesQueries.getSpaceAsManager(userId, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return space\n } else {\n const [space]: SpaceProps[] = await this.spacesQueries.spaces(userId, true, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n return space\n }\n }\n\n private async userIsSpaceManager(user: UserModel, spaceId: number, shareId?: number): Promise<boolean> {\n if (!(await this.spacesQueries.userIsSpaceManager(user.id, spaceId, shareId))) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${user.id})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return true\n }\n\n private async setQuotaExceeded(user: UserModel, space: SpaceEnv) {\n /* extract quota from spaces|shares|roots */\n if (space.inSharesList) {\n return\n }\n const cacheQuotaKey = quotaKeyFromSpace(user.id, space)\n if (!cacheQuotaKey) {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota was ignored for space : *${space.alias}* (${space.id})`)\n return\n }\n let quota: StorageQuota = await this.spacesQueries.cache.get(cacheQuotaKey)\n if (!quota) {\n // the quota scheduler has not started yet or the cache has been cleared\n if (space.inPersonalSpace) {\n await this.updatePersonalSpacesQuota(user)\n } else if (space.inSharesRepository) {\n // Shares with external paths\n await this.sharesManager.updateSharesExternalPathQuota(space.id)\n } else {\n await this.updateSpacesQuota(space.id)\n }\n quota = await this.spacesQueries.cache.get(cacheQuotaKey)\n }\n if (quota) {\n space.storageUsage = quota.storageUsage\n space.storageQuota = quota.storageQuota\n space.quotaIsExceeded = quota.storageQuota !== null && quota.storageUsage >= quota.storageQuota\n } else {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota not found for space : *${space.alias}* (${space.id})`)\n }\n }\n\n private async onSpaceActionForMembers(\n space: Partial<SpaceProps>,\n action: ACTION,\n members: {\n groupIds: number[]\n userIds: number[]\n },\n user?: UserModel\n ) {\n this.clearCachePermissionsAndOrNotify(\n space,\n action,\n user,\n Array.from(new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(members.groupIds)), ...members.userIds])).filter(\n (uid) => uid !== user?.id\n )\n ).catch((e: Error) => this.logger.error(`${this.onSpaceActionForMembers.name} - ${e}`))\n }\n\n private async clearCachePermissionsAndOrNotify(\n space: Partial<SpaceProps>,\n action: ACTION,\n user?: UserModel,\n memberIds?: number[],\n roots?: SpaceRootProps[]\n ): Promise<void> {\n if (memberIds?.length) {\n // clear permissions for space members\n if (action === ACTION.DELETE_PERMANENTLY) {\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action}`)\n this.spacesQueries\n .clearCachePermissions(space.alias)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n } else {\n // update space members cache\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} members:${JSON.stringify(memberIds)}`)\n this.spacesQueries\n .clearCachePermissions(space.alias, undefined, memberIds)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the members who have joined or left the space\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACES,\n event: NOTIFICATION_APP_EVENT.SPACES[action],\n element: space.name,\n url: ''\n }\n this.notificationsManager\n .create(memberIds, notification, {\n currentUrl: this.contextManager.get('headerOriginUrl'),\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n } else if (roots?.length) {\n // clear permissions for space roots\n const rootAliases: string[] = roots.map((r) => r.alias)\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} roots:${JSON.stringify(rootAliases)}`)\n if (action !== ACTION.ADD) {\n this.spacesQueries\n .clearCachePermissions(space.alias, rootAliases)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the space members that a new root was anchored / unanchored\n const spaceMembers = await this.spacesQueries.getSpaceMemberIds(space.id)\n const spaceUserIds = Array.from(\n new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(spaceMembers.groupIds)), ...spaceMembers.userIds])\n ).filter((uid) => uid !== user?.id)\n if (!spaceUserIds.length) {\n return\n }\n for (const r of roots) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACE_ROOTS,\n event: NOTIFICATION_APP_EVENT.SPACE_ROOTS[action],\n element: r.name,\n url: `${SPACE_REPOSITORY.FILES}/${space.name}`\n }\n this.notificationsManager\n .create(spaceUserIds, notification, {\n currentUrl: this.contextManager.get('headerOriginUrl'),\n author: user,\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n }\n }\n }\n}\n"],"names":["SpacesManager","listSpaces","userId","spacesQueries","spaces","spacesWithDetails","uniqueRootName","name","names","find","fName","toLowerCase","nameExtension","path","extname","nameWithoutExtension","basename","originalName","replace","regExpNumberSuffix","count","newName","spaceEnv","user","urlSegments","skipEndpointProtection","repository","spaceAlias","rootAlias","paths","SPACE_REPOSITORY","SHARES","Object","values","indexOf","Error","space","SPACE_ALIAS","PERSONAL","unshift","SpaceEnv","SPACE_PERSONAL","spacePermissions","sharesManager","permissions","SPACE_SHARES","TRASH","id","setup","setQuotaExceeded","e","logger","warn","alias","HttpException","message","FileError","httpCode","HttpStatus","BAD_REQUEST","searchSpaces","searchSpaceDto","sps","s","shareInsidePermission","haveSpacePermission","SPACE_OPERATION","SHARE_INSIDE","search","description","push","length","limit","listSpacesWithPermissions","Promise","all","map","listTrashes","trashes","personalTrash","nb","mtime","ctime","rPath","trashPath","SpaceModel","getTrashPath","fs","readdir","filter","f","configuration","applications","files","showHiddenFiles","stats","stat","getTime","birthtime","error","getSpace","spaceId","userCanAccessSpace","roots","isAdmin","root","externalPath","createSpace","createOrUpdateSpaceDto","SpaceProps","uniqueSpaceAlias","enabled","storageQuota","storageIndexing","disabledAt","Date","makePaths","updateRoots","updateMembers","members","concat","managers","createOrUpdateLinksAsMembers","LINK_TYPE","SPACE","links","getSpaceAsManager","updateSpace","spaceDiffProps","modifiedAt","props","prop","spaceLocationWasRenamed","renameSpaceLocation","INTERNAL_SERVER_ERROR","catch","linkMembers","rootOwnerIds","r","owner","aliases","dirListFileNames","getFilesPath","deleteSpace","deleteSpaceDto","deleteNow","deleteAllLinkMembers","deleteOrDisableSpace","log","getUserRoots","getSpaceRoots","updateUserRoots","userRoots","addOnly","role","SPACE_ROLE","IS_MANAGER","FORBIDDEN","spaceRoots","forEach","toAdd","validateNewRoots","status","updateSpaceRoots","entries","action","clearCachePermissionsAndOrNotify","currentUserRoots","uniqueRootAlias","aliasesAndNames","replaceCount","aliasExtension","aliasWithoutExtension","originalAlias","createSlug","newAlias","spaceRootExistsForAlias","updatePersonalSpacesQuota","forUser","usersQueries","selectUsers","lte","users","USER_ROLE","USER","eq","userPath","UserModel","getHomePath","login","isPathExists","size","errors","dirSize","spaceQuota","storageUsage","cache","set","CACHE_QUOTA_USER_PREFIX","CACHE_QUOTA_TTL","updateUserOrGuest","updateSpacesQuota","spacesQuotaPaths","spacePath","externalPaths","Boolean","rPathSize","CACHE_QUOTA_SPACE_PREFIX","deleteExpiredSpaces","selectSpaces","isNotNull","disabled","setDate","getDate","SPACE_MAX_DISABLED_DAYS","listSpaceShares","userIsSpaceManager","getSpaceShare","shareId","getShareWithMembers","updateSpaceShare","createOrUpdateShareDto","updateShare","deleteSpaceShare","deleteShare","getSpaceShareLink","getShareLink","currentMembers","add","update","remove","diffCollection","userIdsWhitelist","groupIdsWhitelist","usersWhitelist","groupsWhitelist","m","type","MEMBER_TYPE","GUEST","linkId","GROUP","PGROUP","toRemove","deleteLinkMembers","convertDiffUpdate","rmShareOwners","upShareOwners","rmRootOwners","userIds","groupIds","ACTION","DELETE","UPDATE","object","spaceRole","new","IS_MEMBER","old","SPACE_ALL_OPERATIONS","diffPermissions","differencePermissions","p","rmPermissions","onSpaceActionForMembers","updateSharesFromSpace","curRoots","newRoots","toUpdate","clearCachePermissions","rmRoots","rmRootPermissions","reduce","acc","undefined","updateSharesFromSpaceRoots","join","filesPath","file","rExists","cr","startsWith","getProps","memberIds","getSpaceMemberIds","DELETE_PERMANENTLY","removeSharesFromSpace","del","deleteSpaceLocation","spaceLocation","removeFiles","oldSpaceAlias","newSpaceAlias","currentSpaceLocation","newSpaceLocation","moveFiles","spaceExistsForAlias","asManager","NOT_FOUND","inSharesList","cacheQuotaKey","quotaKeyFromSpace","verbose","quota","get","inPersonalSpace","inSharesRepository","updateSharesExternalPathQuota","quotaIsExceeded","Array","from","Set","allUserIdsFromGroupsAndSubGroups","uid","JSON","stringify","notification","app","NOTIFICATION_APP","SPACES","event","NOTIFICATION_APP_EVENT","element","url","notificationsManager","create","currentUrl","contextManager","rootAliases","ADD","spaceMembers","spaceUserIds","SPACE_ROOTS","FILES","author","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/spaces/services/spaces-manager.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 { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { eq, isNotNull, lte } from 'drizzle-orm'\nimport fs from 'node:fs/promises'\nimport path from 'node:path'\nimport { ACTION } from '../../../common/constants'\nimport { convertDiffUpdate, diffCollection, differencePermissions } from '../../../common/functions'\nimport type { Entries, StorageQuota } from '../../../common/interfaces'\nimport { createSlug, regExpNumberSuffix } from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FileError } from '../../files/models/file-error'\nimport { dirListFileNames, dirSize, getProps, isPathExists, moveFiles, removeFiles } from '../../files/utils/files'\nimport { LINK_TYPE } from '../../links/constants/links'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { CreateOrUpdateShareDto } from '../../shares/dto/create-or-update-share.dto'\nimport type { ShareLink } from '../../shares/interfaces/share-link.interface'\nimport type { ShareProps } from '../../shares/interfaces/share-props.interface'\nimport type { ShareChild } from '../../shares/models/share-child.model'\nimport { SharesManager } from '../../shares/services/shares-manager.service'\nimport { MEMBER_TYPE } from '../../users/constants/member'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport type { User } from '../../users/schemas/user.interface'\nimport { users } from '../../users/schemas/users.schema'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { CACHE_QUOTA_SPACE_PREFIX, CACHE_QUOTA_TTL, CACHE_QUOTA_USER_PREFIX } from '../constants/cache'\nimport {\n SPACE_ALIAS,\n SPACE_ALL_OPERATIONS,\n SPACE_MAX_DISABLED_DAYS,\n SPACE_OPERATION,\n SPACE_PERSONAL,\n SPACE_REPOSITORY,\n SPACE_ROLE,\n SPACE_SHARES\n} from '../constants/spaces'\nimport { CreateOrUpdateSpaceDto, SpaceMemberDto } from '../dto/create-or-update-space.dto'\nimport { DeleteSpaceDto } from '../dto/delete-space.dto'\nimport { SearchSpaceDto } from '../dto/search-space.dto'\nimport { SpaceTrash } from '../interfaces/space-trash.interface'\nimport { SpaceEnv } from '../models/space-env.model'\nimport { SpaceProps } from '../models/space-props.model'\nimport type { SpaceRootProps } from '../models/space-root-props.model'\nimport { SpaceModel } from '../models/space.model'\nimport type { SpaceRoot } from '../schemas/space-root.interface'\nimport type { Space } from '../schemas/space.interface'\nimport { spaces } from '../schemas/spaces.schema'\nimport { quotaKeyFromSpace } from '../utils/paths'\nimport { haveSpacePermission } from '../utils/permissions'\nimport { SpacesQueries } from './spaces-queries.service'\n\n@Injectable()\nexport class SpacesManager {\n private readonly logger = new Logger(SpacesManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesQueries: SpacesQueries,\n private readonly usersQueries: UsersQueries,\n private readonly sharesManager: SharesManager,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n listSpaces(userId: number): Promise<Partial<SpaceProps>[]> {\n return this.spacesQueries.spaces(userId)\n }\n\n spacesWithDetails(userId: number): Promise<SpaceProps[]> {\n return this.spacesQueries.spacesWithDetails(userId)\n }\n\n uniqueRootName(name: string, names: string[]) {\n if (names.find((fName: string) => name.toLowerCase() === fName.toLowerCase())) {\n const nameExtension = path.extname(name)\n const nameWithoutExtension = path.basename(name, nameExtension)\n const originalName = nameWithoutExtension.replace(regExpNumberSuffix, '')\n let count = 1\n let newName = `${originalName}-${count}${nameExtension}`\n while (names.find((fName: string) => newName.toLowerCase() === fName.toLowerCase())) {\n count += 1\n newName = `${originalName}-${count}${nameExtension}`\n }\n return newName\n }\n return null\n }\n\n async spaceEnv(user: UserModel, urlSegments: string[], skipEndpointProtection = false): Promise<SpaceEnv> {\n /* SpaceEnv builder */\n let [repository, spaceAlias, rootAlias, ...paths] = urlSegments\n\n if (\n !repository ||\n (!spaceAlias && repository !== SPACE_REPOSITORY.SHARES) ||\n Object.values(SPACE_REPOSITORY).indexOf(repository as SPACE_REPOSITORY) === -1\n ) {\n throw new Error(`Space path is not valid : ${urlSegments}`)\n }\n\n let space: SpaceEnv\n if (spaceAlias === SPACE_ALIAS.PERSONAL) {\n /* Personal Space (static) */\n if (rootAlias) {\n // there is no root in a personal space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n space = new SpaceEnv(SPACE_PERSONAL, rootAlias, false)\n } else if (repository === SPACE_REPOSITORY.SHARES) {\n if (spaceAlias) {\n /* Share */\n const spacePermissions: Partial<SpaceEnv> = await this.sharesManager.permissions(user, spaceAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, null, false)\n }\n } else {\n /* Shares List (static) */\n space = new SpaceEnv(SPACE_SHARES, null, false)\n }\n } else {\n /* Space */\n if (repository === SPACE_REPOSITORY.TRASH && rootAlias) {\n // there is no root in a trash space\n paths.unshift(rootAlias)\n rootAlias = null\n }\n const spacePermissions: Partial<SpaceEnv> = await this.spacesQueries.permissions(user.id, spaceAlias, rootAlias)\n if (spacePermissions) {\n space = new SpaceEnv(spacePermissions, rootAlias || '')\n }\n }\n if (!space) return null\n try {\n space.setup(user, repository as SPACE_REPOSITORY, rootAlias, paths, urlSegments, skipEndpointProtection)\n await this.setQuotaExceeded(user, space)\n return space\n } catch (e) {\n this.logger.warn(`${this.spaceEnv.name} - *${space.alias}* : ${e}`)\n throw new HttpException(e.message, e instanceof FileError ? e.httpCode : HttpStatus.BAD_REQUEST)\n }\n }\n\n async searchSpaces(userId: number, searchSpaceDto: SearchSpaceDto): Promise<SpaceProps[]> {\n const sps: SpaceProps[] = []\n for (const s of await this.spacesQueries.spaces(userId, true)) {\n if (searchSpaceDto.shareInsidePermission && !haveSpacePermission(s, SPACE_OPERATION.SHARE_INSIDE)) {\n continue\n }\n if (!searchSpaceDto.search || `${s.name} ${s.alias} ${s.description || ''}`.toLowerCase().indexOf(searchSpaceDto.search) > -1) {\n sps.push(s)\n }\n if (sps.length >= searchSpaceDto.limit) {\n break\n }\n }\n return sps\n }\n\n async listSpacesWithPermissions(user: UserModel): Promise<SpaceEnv[]> {\n return Promise.all(\n (await this.spacesQueries.spaces(user.id, true)).map(async (s) => {\n const space = new SpaceEnv(s)\n await this.setQuotaExceeded(user, space)\n return space\n })\n )\n }\n\n async listTrashes(user: UserModel): Promise<SpaceTrash[]> {\n const trashes: SpaceTrash[] = []\n // todo: store 'Personal files' as const somewhere (used in frontend too)\n const personalTrash: SpaceTrash = { id: 0, name: 'Personal files', alias: SPACE_ALIAS.PERSONAL, nb: 0, mtime: 0, ctime: 0 }\n for (const space of [...(await this.listSpaces(user.id)), personalTrash] as SpaceTrash[]) {\n const rPath = space.alias === SPACE_ALIAS.PERSONAL ? user.trashPath : SpaceModel.getTrashPath(space.alias)\n try {\n space.nb = (await fs.readdir(rPath)).filter((f) => configuration.applications.files.showHiddenFiles || f[0] !== '.').length\n if (space.nb) {\n const stats = await fs.stat(rPath)\n space.mtime = stats.mtime.getTime()\n space.ctime = stats.birthtime.getTime()\n trashes.push(space)\n }\n } catch (e) {\n this.logger.error(`${this.listTrashes.name} - ${e}`)\n }\n }\n return trashes\n }\n\n async getSpace(user: UserModel, spaceId: number): Promise<SpaceProps> {\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n if (space.roots?.length && !user.isAdmin) {\n // remove external path if the current user is not an administrator\n for (const root of space.roots) {\n root.externalPath = null\n }\n }\n return space\n }\n\n async createSpace(user: UserModel, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only users with admin space role can create a space */\n // create space\n const space: SpaceProps = new SpaceProps({\n name: createOrUpdateSpaceDto.name,\n alias: await this.uniqueSpaceAlias(createOrUpdateSpaceDto.name, true),\n description: createOrUpdateSpaceDto.description,\n enabled: createOrUpdateSpaceDto.enabled,\n storageQuota: createOrUpdateSpaceDto.storageQuota,\n storageIndexing: createOrUpdateSpaceDto.storageIndexing,\n disabledAt: createOrUpdateSpaceDto.enabled ? null : new Date()\n })\n try {\n space.id = await this.spacesQueries.createSpace(space)\n } catch (e) {\n this.logger.error(`${this.createSpace.name} - unable to create space *${space.alias}* : ${e}`)\n throw new HttpException('Unable to create space', e)\n }\n // create space paths\n await SpaceModel.makePaths(space.alias)\n // add roots\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, [], [])\n // add members\n await this.updateMembers(user, space, createOrUpdateSpaceDto.members.concat(createOrUpdateSpaceDto.managers))\n // create links after members, user must be a space manager to create links\n await this.sharesManager.createOrUpdateLinksAsMembers(user, space, LINK_TYPE.SPACE, createOrUpdateSpaceDto.links)\n return this.spacesQueries.getSpaceAsManager(user.id, space.id)\n }\n\n async updateSpace(user: UserModel, spaceId: number, createOrUpdateSpaceDto: CreateOrUpdateSpaceDto): Promise<SpaceProps> {\n /* only managers of the space can update it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // check and update space info\n const spaceDiffProps: Partial<SpaceProps> = { modifiedAt: new Date() }\n const props: (keyof CreateOrUpdateSpaceDto)[] = ['name', 'description', 'enabled', 'storageQuota', 'storageIndexing']\n for (const prop of props) {\n if (createOrUpdateSpaceDto[prop] !== space[prop]) {\n spaceDiffProps[prop] = createOrUpdateSpaceDto[prop]\n if (prop === 'name') {\n spaceDiffProps.alias = await this.uniqueSpaceAlias(spaceDiffProps.name, true)\n if (space.alias !== spaceDiffProps.alias) {\n // must move the space to match the new alias\n const spaceLocationWasRenamed: boolean = await this.renameSpaceLocation(space.alias, spaceDiffProps.alias)\n if (!spaceLocationWasRenamed) {\n throw new HttpException('Unable to rename space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n space.alias = spaceDiffProps.alias\n }\n } else if (prop === 'enabled') {\n spaceDiffProps.disabledAt = spaceDiffProps[prop] ? null : new Date()\n }\n }\n }\n // updates in db\n this.spacesQueries.updateSpace(spaceId, spaceDiffProps).catch((e: Error) => this.logger.error(`${this.updateSpace.name} - ${e}`))\n // checks & updates members\n const linkMembers: SpaceMemberDto[] = await this.sharesManager.createOrUpdateLinksAsMembers(\n user,\n space,\n LINK_TYPE.SPACE,\n createOrUpdateSpaceDto.links\n )\n const rootOwnerIds: number[] = await this.updateMembers(user, space, [\n ...createOrUpdateSpaceDto.members,\n ...createOrUpdateSpaceDto.managers,\n ...linkMembers\n ])\n if (rootOwnerIds.length) {\n // removes the roots of removed members or those no longer having the `share inside` permission\n createOrUpdateSpaceDto.roots = createOrUpdateSpaceDto.roots.filter((r) => rootOwnerIds.indexOf(r.owner.id) === -1)\n }\n // checks & updates roots\n const aliases: string[] = space.roots.map((r) => r.alias)\n const names: string[] = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...space.roots.map((r) => r.name)]\n await this.updateRoots(user, space, space.roots, createOrUpdateSpaceDto.roots, aliases, names)\n if (rootOwnerIds.indexOf(user.id) > -1) {\n // current manager was removed\n return null\n } else {\n return this.spacesQueries.getSpaceAsManager(user.id, spaceId)\n }\n }\n\n async deleteSpace(user: UserModel, spaceId: number, deleteSpaceDto?: DeleteSpaceDto) {\n /* only managers of the space can disable it */\n const space: SpaceProps = await this.userCanAccessSpace(user.id, spaceId, true)\n // only admin can delete the space data, managers can only disable the space for 30 days\n const deleteNow: boolean = user.isAdmin && !!deleteSpaceDto?.deleteNow\n try {\n if (deleteNow) {\n await this.sharesManager.deleteAllLinkMembers(spaceId, LINK_TYPE.SPACE)\n }\n await this.deleteOrDisableSpace(space, deleteNow)\n this.logger.log(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was ${deleteNow ? 'deleted' : 'disabled'}`)\n } catch (e) {\n this.logger.error(`${this.deleteSpace.name} - *${space.alias}* (${space.id}) was not ${deleteNow ? 'deleted' : 'disabled'} : ${e}`)\n throw new HttpException('Unable to delete space', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n }\n\n async getUserRoots(user: UserModel, spaceId: number): Promise<SpaceRootProps[]> {\n /* if user has no permissions on the space an empty array will be returned */\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n\n async updateUserRoots(user: UserModel, spaceId: number, userRoots: SpaceRootProps[], addOnly: boolean = false): Promise<SpaceRootProps[]> {\n const space: Partial<SpaceProps> = await this.userCanAccessSpace(user.id, spaceId)\n if (space.role !== SPACE_ROLE.IS_MANAGER && !haveSpacePermission(space, SPACE_OPERATION.SHARE_INSIDE)) {\n this.logger.warn(`is not allowed to share inside on this space : *${space.alias}* (${space.id})`)\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n // current states\n const spaceRoots: SpaceRootProps[] = await this.spacesQueries.getSpaceRoots(spaceId)\n const aliases = spaceRoots.map((r) => r.alias)\n const names = [...(await dirListFileNames(SpaceModel.getFilesPath(space.alias))), ...spaceRoots.map((r) => r.name)]\n // force owner.id on new user roots (owner is optional and required for the next steps)\n userRoots.forEach((r: SpaceRootProps) => (r.owner = { id: user.id }))\n if (addOnly) {\n // short circuit the `updateRoots` function\n // we need to provide all space roots to avoid collisions on aliases and names for new user roots\n const toAdd: SpaceRootProps[] = await this.validateNewRoots(user, space, spaceRoots, userRoots, aliases, names)\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n [],\n []\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateUserRoots.name} - ${e}`)\n )\n )\n return this.getUserRoots(user, spaceId)\n } else {\n const currentUserRoots: SpaceRootProps[] = spaceRoots.filter((r) => r.owner?.id === user.id)\n await this.updateRoots(user, space, currentUserRoots, userRoots, aliases, names)\n return this.spacesQueries.getSpaceRoots(spaceId, user.id)\n }\n }\n\n async uniqueRootAlias(spaceId: number, alias: string, aliasesAndNames: string[], replaceCount = false): Promise<string> {\n /* for some webdav clients the root alias is displayed instead of the file name.\n * This is why a root alias must be unique for files too */\n if (aliasesAndNames.find((fName: string) => alias.toLowerCase() === fName.toLowerCase())) {\n const aliasExtension = path.extname(alias)\n const aliasWithoutExtension = path.basename(alias, aliasExtension)\n const originalAlias = createSlug(aliasWithoutExtension, replaceCount)\n let count = 1\n let newAlias = `${originalAlias}-${count}${aliasExtension}`\n while (await this.spacesQueries.spaceRootExistsForAlias(spaceId, newAlias)) {\n count += 1\n newAlias = `${originalAlias}-${count}${aliasExtension}`\n }\n return newAlias\n }\n return null\n }\n\n async updatePersonalSpacesQuota(forUser?: UserModel) {\n const props: (keyof User)[] = ['id', 'login', 'storageUsage', 'storageQuota']\n for (const user of await this.usersQueries.selectUsers(props, [\n lte(users.role, USER_ROLE.USER),\n ...(forUser ? [eq(users.id, forUser.id)] : [])\n ])) {\n const userPath = UserModel.getHomePath(user.login)\n if (!(await isPathExists(userPath))) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - *${user.login}* home path does not exist`)\n continue\n }\n const [size, errors] = await dirSize(userPath)\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updatePersonalSpacesQuota.name} - unable to get size for *${user.login}* on ${path} : ${error}`)\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: user.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_USER_PREFIX}-${user.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updatePersonalSpacesQuota.name} - ${e}`))\n if (user.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(\n `${this.updatePersonalSpacesQuota.name} - user *${user.login}* (${user.id}) : storage usage updated : ${spaceQuota.storageUsage}`\n )\n await this.usersQueries.updateUserOrGuest(user.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async updateSpacesQuota(spaceId?: number) {\n for (const space of await this.spacesQueries.spacesQuotaPaths(spaceId)) {\n const spacePath = SpaceModel.getHomePath(space.alias)\n if (!(await isPathExists(spacePath))) {\n this.logger.warn(`${this.updateSpacesQuota.name} - *${space.alias}* home path does not exist`)\n continue\n }\n let size = 0\n for (const rPath of [spacePath, ...space.externalPaths.filter(Boolean)]) {\n const [rPathSize, errors] = await dirSize(rPath)\n size += rPathSize\n for (const [path, error] of Object.entries(errors)) {\n this.logger.warn(`${this.updateSpacesQuota.name} - unable to get size for *${space.alias}* on ${path} : ${error}`)\n }\n }\n const spaceQuota: StorageQuota = { storageUsage: size, storageQuota: space.storageQuota }\n this.spacesQueries.cache\n .set(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`, spaceQuota, CACHE_QUOTA_TTL)\n .catch((e: Error) => this.logger.error(`${this.updateSpacesQuota.name} - ${e}`))\n if (space.storageUsage !== spaceQuota.storageUsage) {\n this.logger.log(`${this.updateSpacesQuota.name} - space *${space.alias}* (${space.id}) : storage usage updated : ${spaceQuota.storageUsage}`)\n await this.spacesQueries.updateSpace(space.id, { storageUsage: spaceQuota.storageUsage })\n }\n }\n }\n\n async deleteExpiredSpaces() {\n /* Removes spaces that have been disabled for more than 30 days */\n const props: (keyof Space)[] = ['id', 'name', 'alias', 'disabledAt']\n for (const space of await this.spacesQueries.selectSpaces(props, [eq(spaces.enabled, false), isNotNull(spaces.disabledAt)])) {\n const disabled = new Date(space.disabledAt)\n disabled.setDate(disabled.getDate() + SPACE_MAX_DISABLED_DAYS)\n if (new Date() > disabled) {\n try {\n await this.sharesManager.deleteAllLinkMembers(space.id, LINK_TYPE.SPACE)\n await this.deleteOrDisableSpace(space, true)\n this.logger.log(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was deleted`)\n } catch (e) {\n this.logger.error(`${this.deleteExpiredSpaces.name} - space *${space.alias}* (${space.id}) was not deleted : ${e}`)\n }\n }\n }\n }\n\n async listSpaceShares(user: UserModel, spaceId: number): Promise<ShareChild[]> {\n if (await this.userIsSpaceManager(user, spaceId)) {\n return this.sharesManager.listSpaceShares(spaceId)\n }\n }\n\n async getSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareWithMembers(user, shareId, true)\n }\n }\n\n async updateSpaceShare(user: UserModel, spaceId: number, shareId: number, createOrUpdateShareDto: CreateOrUpdateShareDto): Promise<ShareProps> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.updateShare(user, shareId, createOrUpdateShareDto, true)\n }\n }\n\n async deleteSpaceShare(user: UserModel, spaceId: number, shareId: number): Promise<void> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.deleteShare(user, shareId, true)\n }\n }\n\n async getSpaceShareLink(user: UserModel, spaceId: number, shareId: number): Promise<ShareLink> {\n if (await this.userIsSpaceManager(user, spaceId, shareId)) {\n return this.sharesManager.getShareLink(user, shareId, true)\n }\n }\n\n private async updateMembers(user: UserModel, space: SpaceProps, currentMembers: SpaceMemberDto[]): Promise<number[]> {\n if (space.members.length === 0 && currentMembers.length === 0) {\n return\n }\n // diff\n const [add, update, remove]: [SpaceMemberDto[], Record<string | 'object', { old: any; new: any } | SpaceMemberDto>[], SpaceMemberDto[]] =\n diffCollection(space.members, currentMembers, ['permissions', 'spaceRole'], ['id', 'type'])\n\n // check members whitelists\n let toAdd: SpaceMemberDto[] = []\n if (add.length) {\n const [userIdsWhitelist, groupIdsWhitelist] = await Promise.all([\n this.usersQueries.usersWhitelist(user.id),\n this.usersQueries.groupsWhitelist(user.id)\n ])\n toAdd = add.filter((m) => {\n if (\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && !m.linkId && userIdsWhitelist.indexOf(m.id) === -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && groupIdsWhitelist.indexOf(m.id) === -1)\n ) {\n this.logger.warn(\n `${this.updateMembers.name} - cannot add ${m.type} (${m.id}) to space *${space.alias}* (${space.id}) : not in the members whitelist`\n )\n return false\n }\n return true\n })\n }\n\n // filter links\n const toRemove: SpaceMemberDto[] = remove.filter((m) => !m.linkId)\n // do remove links\n this.sharesManager.deleteLinkMembers(remove.filter((m) => !!m.linkId)).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // do update members\n const status: Record<\n Exclude<ACTION, ACTION.DELETE_PERMANENTLY>,\n {\n groupIds: number[]\n userIds: number[]\n }\n > = await this.spacesQueries.updateMembers(space.id, toAdd, convertDiffUpdate(update), toRemove)\n\n // lists deleted and updated members as potential share or space roots owners\n const [rmShareOwners, upShareOwners, rmRootOwners]: [\n SpaceMemberDto[],\n {\n object: SpaceMemberDto\n rmPermissions: SPACE_OPERATION[]\n }[],\n number[]\n ] = [[], [], []]\n\n for (const [action, members] of Object.entries(status) as Entries<typeof status>) {\n if (!members.userIds.length && !members.groupIds.length) continue\n if (action === ACTION.DELETE) {\n // stores the removed members who might own shares created from the current space\n rmShareOwners.push(\n ...toRemove.filter(\n (m) =>\n ((m.type === MEMBER_TYPE.USER || m.type === MEMBER_TYPE.GUEST) && members.userIds.indexOf(m.id) > -1) ||\n ((m.type === MEMBER_TYPE.GROUP || m.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.id) > -1)\n )\n )\n // stores ids of removed members that might have space roots\n rmRootOwners.push(...members.userIds)\n } else if (action === ACTION.UPDATE) {\n // stores permissions updates and members who might own shares created from the current space\n // ignore space managers (they have all permissions)\n for (const m of update as {\n object: SpaceMemberDto\n permissions?: { old: string; new: string }\n spaceRole?: { old: number; new: number }\n }[]) {\n if (\n ((m.object.type === MEMBER_TYPE.USER || m.object.type === MEMBER_TYPE.GUEST) &&\n m.object.spaceRole !== SPACE_ROLE.IS_MANAGER &&\n members.userIds.indexOf(m.object.id) > -1) ||\n ((m.object.type === MEMBER_TYPE.GROUP || m.object.type === MEMBER_TYPE.PGROUP) && members.groupIds.indexOf(m.object.id) > -1)\n ) {\n // special case, the manager was moved to members without permissions change\n if (!m.permissions && m.spaceRole.new === SPACE_ROLE.IS_MEMBER) {\n m.permissions = { old: SPACE_ALL_OPERATIONS, new: m.object.permissions }\n }\n // `share inside` permission is only used for spaces\n const diffPermissions = differencePermissions(m.permissions.old, m.permissions.new).filter((p) => p !== SPACE_OPERATION.SHARE_INSIDE)\n if (diffPermissions.length) {\n upShareOwners.push({ object: m.object, rmPermissions: diffPermissions as SPACE_OPERATION[] })\n }\n }\n }\n }\n // clear cache &|| notify\n this.onSpaceActionForMembers(space, action, members, user).catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n }\n // do updates\n // remove or update potential shares\n this.sharesManager\n .updateSharesFromSpace(space.id, currentMembers, rmShareOwners, upShareOwners)\n .catch((e: Error) => this.logger.error(`${this.updateMembers.name} - ${e}`))\n // return potential root owner ids\n return rmRootOwners\n }\n\n private async updateRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ) {\n // diff\n const [add, toUpdate, toRemove]: [\n SpaceRootProps[],\n Record<\n string | 'object',\n | {\n old: any\n new: any\n }\n | SpaceRootProps\n | any\n >[],\n SpaceRootProps[]\n ] = diffCollection(curRoots, newRoots, ['name', 'alias', 'permissions'])\n\n // update\n for (const props of toUpdate) {\n if ('alias' in props) {\n props.alias.new = (await this.uniqueRootAlias(space.id, props.alias.new, aliases.concat(names), true)) || props.alias.new\n // remove from space cache permissions\n this.spacesQueries\n .clearCachePermissions(space.alias, [props.alias.old, props.alias.new])\n .catch((e: Error) => this.logger.error(`${this.updateRoots.name} - ${e}`))\n // update aliases list for next roots\n aliases.push(props.alias.new)\n }\n if ('name' in props) {\n props.name.new = this.uniqueRootName(props.name.new, names) || props.name.new\n // update names list for next roots\n names.push(props.name.new)\n }\n }\n\n // format actions\n const toAdd = await this.validateNewRoots(user, space, curRoots, add, aliases, names)\n\n // remove a root implies that all shares with a reference to root.id will be deleted in cascade\n // however, it is \"cleaner\" to warn users about the deletion of these shares and to clear the permission caches before the cascade deletion\n // it must be assumed that the deletion and modifications of space roots will be successful\n const [rmRoots, rmRootPermissions]: [\n SpaceRoot['id'][],\n {\n id: SpaceRoot['id']\n rmPermissions: SPACE_OPERATION[]\n }[]\n ] = [\n toRemove.map((r) => r.id),\n (toUpdate as any).reduce((acc: typeof rmRootPermissions, r: any): typeof rmRootPermissions => {\n if (r.permissions !== undefined) {\n const diffPermissions = differencePermissions(r.permissions.old, r.permissions.new) as SPACE_OPERATION[]\n if (diffPermissions.length) {\n acc.push({ id: r.object.id, rmPermissions: diffPermissions })\n }\n }\n return acc\n }, [])\n ]\n // do share updates\n await this.sharesManager.updateSharesFromSpaceRoots(space.id, rmRoots, rmRootPermissions)\n\n // do root updates\n const status: Record<Exclude<ACTION, ACTION.DELETE_PERMANENTLY>, SpaceRootProps[]> = await this.spacesQueries.updateSpaceRoots(\n user.id,\n space.id,\n toAdd,\n convertDiffUpdate(toUpdate),\n toRemove\n )\n Object.entries(status).forEach(([action, roots]: [ACTION, SpaceRootProps[]]) =>\n this.clearCachePermissionsAndOrNotify(space, action, user, null, roots).catch((e: Error) =>\n this.logger.error(`${this.updateRoots.name} - ${e}`)\n )\n )\n }\n\n private async validateNewRoots(\n user: UserModel,\n space: Partial<SpaceProps>,\n curRoots: SpaceRootProps[],\n newRoots: SpaceRootProps[],\n aliases: string[],\n names: string[]\n ): Promise<SpaceRootProps[]> {\n const toAdd: SpaceRootProps[] = []\n for (const r of newRoots) {\n if (r.externalPath && !user.isAdmin) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath}) : adding an external path requires the admin role`)\n continue\n }\n const rPath = r.externalPath || path.join(user.filesPath, r.file.path)\n if (!(await isPathExists(rPath))) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.file.path}) : *${rPath}* does not exist`)\n continue\n }\n // check if a parent exists for an externalPath or if the file (or parent) is already anchored\n let rExists: SpaceRootProps\n if (r.externalPath) {\n rExists = curRoots.find((cr) => cr.externalPath && r.externalPath.startsWith(cr.externalPath))\n } else {\n rExists = curRoots.find(\n (cr) => cr.file?.id === r.file.id || (cr.owner?.id === r.owner.id && cr.file?.path && r.file.path.startsWith(cr.file.path))\n )\n }\n if (rExists) {\n this.logger.warn(`ignore new root *${r.alias}* (${r.externalPath || r.file.path}) (${r.file?.id}) : parent or file already exists in roots`)\n continue\n }\n // keep the file id (maybe already in db)\n if (!r.externalPath) {\n r.file = { ...(await getProps(rPath, r.file.path)), id: r.file.id }\n }\n r.alias = (await this.uniqueRootAlias(space.id, r.alias, aliases.concat(names), true)) || r.alias\n // update aliases list for next roots\n aliases.push(r.alias)\n r.name = this.uniqueRootName(r.name, names) || r.name\n // update names list for next roots\n names.push(r.name)\n // reset id\n r.id = 0\n toAdd.push(r)\n }\n return toAdd\n }\n\n private async deleteOrDisableSpace(space: Partial<SpaceProps>, deleteNow: boolean = false) {\n if (deleteNow) {\n // clear cache &|| notify\n const memberIds: { groupIds: number[]; userIds: number[] } = await this.spacesQueries.getSpaceMemberIds(space.id)\n this.onSpaceActionForMembers(space, ACTION.DELETE_PERMANENTLY, memberIds).catch((e: Error) =>\n this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`)\n )\n // remove all shares related to the space\n await this.sharesManager.removeSharesFromSpace(space.id)\n }\n await this.spacesQueries.deleteSpace(space.id, deleteNow)\n if (deleteNow) {\n this.spacesQueries.cache\n .del(`${CACHE_QUOTA_SPACE_PREFIX}-${space.id}`)\n .catch((e: Error) => this.logger.error(`${this.deleteOrDisableSpace.name} - ${e}`))\n await this.deleteSpaceLocation(space.alias)\n }\n }\n\n private async deleteSpaceLocation(spaceAlias: string) {\n const spaceLocation = SpaceModel.getHomePath(spaceAlias)\n if (await isPathExists(spaceLocation)) {\n await removeFiles(spaceLocation)\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location was deleted`)\n } else {\n this.logger.warn(`${this.deleteSpaceLocation.name} - space *${spaceAlias}* location does not exist : ${spaceLocation}`)\n }\n }\n\n private async renameSpaceLocation(oldSpaceAlias: string, newSpaceAlias: string): Promise<boolean> {\n const currentSpaceLocation: string = SpaceModel.getHomePath(oldSpaceAlias)\n if (await isPathExists(currentSpaceLocation)) {\n const newSpaceLocation: string = SpaceModel.getHomePath(newSpaceAlias)\n if (await isPathExists(newSpaceLocation)) {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${newSpaceAlias}* home path already exists : ${newSpaceLocation}`)\n return false\n } else {\n try {\n await moveFiles(currentSpaceLocation, newSpaceLocation)\n return true\n } catch (e) {\n // try to restore\n await moveFiles(newSpaceLocation, currentSpaceLocation, true)\n this.logger.error(\n `${this.renameSpaceLocation.name} - unable to rename space location from *${currentSpaceLocation}* to *${newSpaceLocation}* : ${e}`\n )\n return false\n }\n }\n } else {\n this.logger.warn(`${this.renameSpaceLocation.name} - *${oldSpaceAlias}* space location does not exist : ${currentSpaceLocation}`)\n return false\n }\n }\n\n private async uniqueSpaceAlias(name: string, replaceCount = false): Promise<string> {\n let alias = createSlug(name, replaceCount)\n let count = 0\n // Personal space name is reserved\n if (alias === SPACE_ALIAS.PERSONAL) {\n count += 1\n alias = `${name}-${count}`\n }\n while (await this.spacesQueries.spaceExistsForAlias(alias)) {\n count += 1\n alias = `${name}-${count}`\n }\n return alias\n }\n\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: true): Promise<SpaceProps>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager?: false): Promise<Partial<SpaceProps>>\n private async userCanAccessSpace(userId: number, spaceId: number, asManager: boolean = false): Promise<Partial<SpaceProps>> {\n if (asManager) {\n // Get all space details if user is a manager\n const space: SpaceProps = await this.spacesQueries.getSpaceAsManager(userId, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return space\n } else {\n const [space]: SpaceProps[] = await this.spacesQueries.spaces(userId, true, spaceId)\n if (!space) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${userId})`)\n throw new HttpException('Space not found', HttpStatus.NOT_FOUND)\n }\n return space\n }\n }\n\n private async userIsSpaceManager(user: UserModel, spaceId: number, shareId?: number): Promise<boolean> {\n if (!(await this.spacesQueries.userIsSpaceManager(user.id, spaceId, shareId))) {\n this.logger.warn(`space (${spaceId}) not found or not authorized for user (${user.id})`)\n throw new HttpException('Not authorized', HttpStatus.FORBIDDEN)\n }\n return true\n }\n\n private async setQuotaExceeded(user: UserModel, space: SpaceEnv) {\n /* extract quota from spaces|shares|roots */\n if (space.inSharesList) {\n return\n }\n const cacheQuotaKey = quotaKeyFromSpace(user.id, space)\n if (!cacheQuotaKey) {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota was ignored for space : *${space.alias}* (${space.id})`)\n return\n }\n let quota: StorageQuota = await this.spacesQueries.cache.get(cacheQuotaKey)\n if (!quota) {\n // the quota scheduler has not started yet or the cache has been cleared\n if (space.inPersonalSpace) {\n await this.updatePersonalSpacesQuota(user)\n } else if (space.inSharesRepository) {\n // Shares with external paths\n await this.sharesManager.updateSharesExternalPathQuota(space.id)\n } else {\n await this.updateSpacesQuota(space.id)\n }\n quota = await this.spacesQueries.cache.get(cacheQuotaKey)\n }\n if (quota) {\n space.storageUsage = quota.storageUsage\n space.storageQuota = quota.storageQuota\n space.quotaIsExceeded = quota.storageQuota !== null && quota.storageUsage >= quota.storageQuota\n } else {\n this.logger.verbose(`${this.setQuotaExceeded.name} - quota not found for space : *${space.alias}* (${space.id})`)\n }\n }\n\n private async onSpaceActionForMembers(\n space: Partial<SpaceProps>,\n action: ACTION,\n members: {\n groupIds: number[]\n userIds: number[]\n },\n user?: UserModel\n ) {\n this.clearCachePermissionsAndOrNotify(\n space,\n action,\n user,\n Array.from(new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(members.groupIds)), ...members.userIds])).filter(\n (uid) => uid !== user?.id\n )\n ).catch((e: Error) => this.logger.error(`${this.onSpaceActionForMembers.name} - ${e}`))\n }\n\n private async clearCachePermissionsAndOrNotify(\n space: Partial<SpaceProps>,\n action: ACTION,\n user?: UserModel,\n memberIds?: number[],\n roots?: SpaceRootProps[]\n ): Promise<void> {\n if (memberIds?.length) {\n // clear permissions for space members\n if (action === ACTION.DELETE_PERMANENTLY) {\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action}`)\n this.spacesQueries\n .clearCachePermissions(space.alias)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n } else {\n // update space members cache\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} members:${JSON.stringify(memberIds)}`)\n this.spacesQueries\n .clearCachePermissions(space.alias, undefined, memberIds)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the members who have joined or left the space\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACES,\n event: NOTIFICATION_APP_EVENT.SPACES[action],\n element: space.name,\n url: ''\n }\n this.notificationsManager\n .create(memberIds, notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n } else if (roots?.length) {\n // clear permissions for space roots\n const rootAliases: string[] = roots.map((r) => r.alias)\n this.logger.verbose(`${this.clearCachePermissionsAndOrNotify.name} - space:${space.alias} ${action} roots:${JSON.stringify(rootAliases)}`)\n if (action !== ACTION.ADD) {\n this.spacesQueries\n .clearCachePermissions(space.alias, rootAliases)\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n // notify\n if (action !== ACTION.UPDATE) {\n // notify the space members that a new root was anchored / unanchored\n const spaceMembers = await this.spacesQueries.getSpaceMemberIds(space.id)\n const spaceUserIds = Array.from(\n new Set([...(await this.usersQueries.allUserIdsFromGroupsAndSubGroups(spaceMembers.groupIds)), ...spaceMembers.userIds])\n ).filter((uid) => uid !== user?.id)\n if (!spaceUserIds.length) {\n return\n }\n for (const r of roots) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SPACE_ROOTS,\n event: NOTIFICATION_APP_EVENT.SPACE_ROOTS[action],\n element: r.name,\n url: `${SPACE_REPOSITORY.FILES}/${space.name}`\n }\n this.notificationsManager\n .create(spaceUserIds, notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n author: user,\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.clearCachePermissionsAndOrNotify.name} - ${e}`))\n }\n }\n }\n }\n}\n"],"names":["SpacesManager","listSpaces","userId","spacesQueries","spaces","spacesWithDetails","uniqueRootName","name","names","find","fName","toLowerCase","nameExtension","path","extname","nameWithoutExtension","basename","originalName","replace","regExpNumberSuffix","count","newName","spaceEnv","user","urlSegments","skipEndpointProtection","repository","spaceAlias","rootAlias","paths","SPACE_REPOSITORY","SHARES","Object","values","indexOf","Error","space","SPACE_ALIAS","PERSONAL","unshift","SpaceEnv","SPACE_PERSONAL","spacePermissions","sharesManager","permissions","SPACE_SHARES","TRASH","id","setup","setQuotaExceeded","e","logger","warn","alias","HttpException","message","FileError","httpCode","HttpStatus","BAD_REQUEST","searchSpaces","searchSpaceDto","sps","s","shareInsidePermission","haveSpacePermission","SPACE_OPERATION","SHARE_INSIDE","search","description","push","length","limit","listSpacesWithPermissions","Promise","all","map","listTrashes","trashes","personalTrash","nb","mtime","ctime","rPath","trashPath","SpaceModel","getTrashPath","fs","readdir","filter","f","configuration","applications","files","showHiddenFiles","stats","stat","getTime","birthtime","error","getSpace","spaceId","userCanAccessSpace","roots","isAdmin","root","externalPath","createSpace","createOrUpdateSpaceDto","SpaceProps","uniqueSpaceAlias","enabled","storageQuota","storageIndexing","disabledAt","Date","makePaths","updateRoots","updateMembers","members","concat","managers","createOrUpdateLinksAsMembers","LINK_TYPE","SPACE","links","getSpaceAsManager","updateSpace","spaceDiffProps","modifiedAt","props","prop","spaceLocationWasRenamed","renameSpaceLocation","INTERNAL_SERVER_ERROR","catch","linkMembers","rootOwnerIds","r","owner","aliases","dirListFileNames","getFilesPath","deleteSpace","deleteSpaceDto","deleteNow","deleteAllLinkMembers","deleteOrDisableSpace","log","getUserRoots","getSpaceRoots","updateUserRoots","userRoots","addOnly","role","SPACE_ROLE","IS_MANAGER","FORBIDDEN","spaceRoots","forEach","toAdd","validateNewRoots","status","updateSpaceRoots","entries","action","clearCachePermissionsAndOrNotify","currentUserRoots","uniqueRootAlias","aliasesAndNames","replaceCount","aliasExtension","aliasWithoutExtension","originalAlias","createSlug","newAlias","spaceRootExistsForAlias","updatePersonalSpacesQuota","forUser","usersQueries","selectUsers","lte","users","USER_ROLE","USER","eq","userPath","UserModel","getHomePath","login","isPathExists","size","errors","dirSize","spaceQuota","storageUsage","cache","set","CACHE_QUOTA_USER_PREFIX","CACHE_QUOTA_TTL","updateUserOrGuest","updateSpacesQuota","spacesQuotaPaths","spacePath","externalPaths","Boolean","rPathSize","CACHE_QUOTA_SPACE_PREFIX","deleteExpiredSpaces","selectSpaces","isNotNull","disabled","setDate","getDate","SPACE_MAX_DISABLED_DAYS","listSpaceShares","userIsSpaceManager","getSpaceShare","shareId","getShareWithMembers","updateSpaceShare","createOrUpdateShareDto","updateShare","deleteSpaceShare","deleteShare","getSpaceShareLink","getShareLink","currentMembers","add","update","remove","diffCollection","userIdsWhitelist","groupIdsWhitelist","usersWhitelist","groupsWhitelist","m","type","MEMBER_TYPE","GUEST","linkId","GROUP","PGROUP","toRemove","deleteLinkMembers","convertDiffUpdate","rmShareOwners","upShareOwners","rmRootOwners","userIds","groupIds","ACTION","DELETE","UPDATE","object","spaceRole","new","IS_MEMBER","old","SPACE_ALL_OPERATIONS","diffPermissions","differencePermissions","p","rmPermissions","onSpaceActionForMembers","updateSharesFromSpace","curRoots","newRoots","toUpdate","clearCachePermissions","rmRoots","rmRootPermissions","reduce","acc","undefined","updateSharesFromSpaceRoots","join","filesPath","file","rExists","cr","startsWith","getProps","memberIds","getSpaceMemberIds","DELETE_PERMANENTLY","removeSharesFromSpace","del","deleteSpaceLocation","spaceLocation","removeFiles","oldSpaceAlias","newSpaceAlias","currentSpaceLocation","newSpaceLocation","moveFiles","spaceExistsForAlias","asManager","NOT_FOUND","inSharesList","cacheQuotaKey","quotaKeyFromSpace","verbose","quota","get","inPersonalSpace","inSharesRepository","updateSharesExternalPathQuota","quotaIsExceeded","Array","from","Set","allUserIdsFromGroupsAndSubGroups","uid","JSON","stringify","notification","app","NOTIFICATION_APP","SPACES","event","NOTIFICATION_APP_EVENT","element","url","notificationsManager","create","currentUrl","contextManager","headerOriginUrl","rootAliases","ADD","spaceMembers","spaceUserIds","SPACE_ROOTS","FILES","author","Logger"],"mappings":"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"}
@@ -235,6 +235,7 @@ let SpacesQueries = class SpacesQueries {
235
235
  externalPath: _spacesrootsschema.spacesRoots.externalPath,
236
236
  permissions: _spacesrootsschema.spacesRoots.permissions,
237
237
  owner: {
238
+ id: _usersschema.users.id,
238
239
  login: _usersschema.users.login,
239
240
  email: _usersschema.users.email,
240
241
  fullName: (0, _usersschema.userFullNameSQL)(_usersschema.users)
@@ -556,10 +557,13 @@ let SpacesQueries = class SpacesQueries {
556
557
  return false;
557
558
  }
558
559
  }
559
- async getOrCreateUserFile(userId, file) {
560
+ getUserFile(userId, fileId) {
561
+ return this.filesQueries.getUserFile(userId, fileId);
562
+ }
563
+ getOrCreateUserFile(userId, file) {
560
564
  return this.filesQueries.getOrCreateUserFile(userId, file);
561
565
  }
562
- async getOrCreateSpaceFile(fileId, file, dbFile) {
566
+ getOrCreateSpaceFile(fileId, file, dbFile) {
563
567
  return this.filesQueries.getOrCreateSpaceFile(fileId, file, dbFile);
564
568
  }
565
569
  async clearCachePermissions(spaceAlias, rootAliases, userIds) {