@sync-in/server 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/CHANGELOG.md +64 -10
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +18 -17
  4. package/server/app.bootstrap.js +4 -2
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +9 -0
  7. package/server/app.constants.js.map +1 -1
  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 +100 -12
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +29 -8
  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 +39 -14
  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/doc-textify/adapters/pdf.js +5 -16
  65. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  66. package/server/applications/files/utils/files.js +1 -1
  67. package/server/applications/files/utils/files.js.map +1 -1
  68. package/server/applications/files/utils/send-file.js +3 -2
  69. package/server/applications/files/utils/send-file.js.map +1 -1
  70. package/server/applications/links/services/links-queries.service.js +1 -1
  71. package/server/applications/links/services/links-queries.service.js.map +1 -1
  72. package/server/applications/notifications/constants/notifications.js +5 -1
  73. package/server/applications/notifications/constants/notifications.js.map +1 -1
  74. package/server/applications/notifications/i18n/de.js +8 -2
  75. package/server/applications/notifications/i18n/de.js.map +1 -1
  76. package/server/applications/notifications/i18n/es.js +8 -2
  77. package/server/applications/notifications/i18n/es.js.map +1 -1
  78. package/server/applications/notifications/i18n/fr.js +8 -2
  79. package/server/applications/notifications/i18n/fr.js.map +1 -1
  80. package/server/applications/notifications/i18n/hi.js +8 -2
  81. package/server/applications/notifications/i18n/hi.js.map +1 -1
  82. package/server/applications/notifications/i18n/it.js +8 -2
  83. package/server/applications/notifications/i18n/it.js.map +1 -1
  84. package/server/applications/notifications/i18n/ja.js +8 -2
  85. package/server/applications/notifications/i18n/ja.js.map +1 -1
  86. package/server/applications/notifications/i18n/ko.js +8 -2
  87. package/server/applications/notifications/i18n/ko.js.map +1 -1
  88. package/server/applications/notifications/i18n/pl.js +8 -2
  89. package/server/applications/notifications/i18n/pl.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt.js +8 -2
  91. package/server/applications/notifications/i18n/pt.js.map +1 -1
  92. package/server/applications/notifications/i18n/pt_br.js +8 -2
  93. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  94. package/server/applications/notifications/i18n/ru.js +8 -2
  95. package/server/applications/notifications/i18n/ru.js.map +1 -1
  96. package/server/applications/notifications/i18n/tr.js +8 -2
  97. package/server/applications/notifications/i18n/tr.js.map +1 -1
  98. package/server/applications/notifications/i18n/zh.js +8 -2
  99. package/server/applications/notifications/i18n/zh.js.map +1 -1
  100. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  101. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  102. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  103. package/server/applications/notifications/mails/models.js +38 -3
  104. package/server/applications/notifications/mails/models.js.map +1 -1
  105. package/server/applications/notifications/mails/templates.js +1 -1
  106. package/server/applications/notifications/mails/templates.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  108. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  109. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.js +17 -10
  111. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  112. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  113. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  114. package/server/applications/shares/services/shares-queries.service.js +11 -1
  115. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  116. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  117. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  119. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  121. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  123. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  124. package/server/applications/spaces/utils/permissions.js +2 -2
  125. package/server/applications/spaces/utils/permissions.js.map +1 -1
  126. package/server/applications/sync/services/sync-manager.service.js +1 -0
  127. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  130. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  131. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  132. package/server/applications/users/constants/user.js +1 -1
  133. package/server/applications/users/constants/user.js.map +1 -1
  134. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  135. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  136. package/server/applications/users/services/users-manager.service.js +1 -2
  137. package/server/applications/users/services/users-manager.service.js.map +1 -1
  138. package/server/applications/users/services/users-queries.service.js +67 -68
  139. package/server/applications/users/services/users-queries.service.js.map +1 -1
  140. package/server/applications/users/users.gateway.js +6 -0
  141. package/server/applications/users/users.gateway.js.map +1 -1
  142. package/server/applications/users/users.module.js +2 -1
  143. package/server/applications/users/users.module.js.map +1 -1
  144. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  145. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  146. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  147. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  148. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  149. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  150. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  151. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  152. package/server/authentication/constants/auth-ldap.js +2 -0
  153. package/server/authentication/constants/auth-ldap.js.map +1 -1
  154. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  155. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  156. package/server/common/functions.js +0 -8
  157. package/server/common/functions.js.map +1 -1
  158. package/server/common/image.js +63 -58
  159. package/server/common/image.js.map +1 -1
  160. package/server/common/shared.js +18 -1
  161. package/server/common/shared.js.map +1 -1
  162. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  163. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  164. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  165. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  166. package/static/3rdpartylicenses.txt +1380 -57
  167. package/static/assets/favicon.svg +2 -25
  168. package/static/assets/logo-dark.svg +2 -32
  169. package/static/assets/logo.svg +2 -32
  170. package/static/assets/mimes/application-sql.svg +29 -1
  171. package/static/assets/mimes/application-x-sql.svg +29 -0
  172. package/static/assets/mimes/image-bmp.svg +12 -0
  173. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  174. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  175. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  176. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  177. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  178. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  179. package/static/assets/pdfjs/version +1 -1
  180. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  181. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  182. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  183. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  184. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  185. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  186. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  187. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  189. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  191. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  192. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  195. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  196. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  198. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  200. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  202. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  203. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  204. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  205. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  206. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  208. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  209. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  210. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  211. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  212. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  213. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  214. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  216. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  217. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  218. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  219. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  220. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  222. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  223. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  224. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  225. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  226. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  227. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  228. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  229. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  230. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  231. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  232. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  233. package/static/assets/pdfjs/web/viewer.css +141 -110
  234. package/static/assets/pdfjs/web/viewer.html +7 -7
  235. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  236. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  237. package/static/chunk-22DWHRCL.js +1 -0
  238. package/static/chunk-23UUFZSR.js +1 -0
  239. package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
  240. package/static/chunk-25QTY2GI.js +1 -0
  241. package/static/chunk-2E7IJZLL.js +1 -0
  242. package/static/chunk-2FC5EKS5.js +1 -0
  243. package/static/chunk-2FOWUJQF.js +1 -0
  244. package/static/chunk-2XPHUNYN.js +1 -0
  245. package/static/chunk-32L7RG2G.js +1 -0
  246. package/static/chunk-3IISSX63.js +1 -0
  247. package/static/chunk-3OHSTP3R.js +1 -0
  248. package/static/chunk-42L6C5MT.js +1 -0
  249. package/static/chunk-4AGQL5GV.js +1 -0
  250. package/static/chunk-4BPSQMI2.js +1 -0
  251. package/static/chunk-4FDRWZWT.js +1 -0
  252. package/static/chunk-4FJUCMEG.js +1 -0
  253. package/static/chunk-4GCCF6PF.js +1 -0
  254. package/static/chunk-4ORP3SBY.js +1 -0
  255. package/static/chunk-4QBOHIC3.js +1 -0
  256. package/static/chunk-4YT6K5KY.js +1 -0
  257. package/static/chunk-556I6YIW.js +1 -0
  258. package/static/chunk-5DPIGJU4.js +1 -0
  259. package/static/chunk-5HNQLBSW.js +3 -0
  260. package/static/chunk-5IL7C45D.js +1 -0
  261. package/static/chunk-5KJXGMKR.js +1 -0
  262. package/static/chunk-5SPGSHKL.js +1 -0
  263. package/static/chunk-5WCQBTXW.js +1 -0
  264. package/static/chunk-5XUIPWOH.js +1 -0
  265. package/static/chunk-62WT7PI3.js +1 -0
  266. package/static/chunk-6F6OMQ5H.js +1 -0
  267. package/static/chunk-6I5BGQHT.js +1 -0
  268. package/static/chunk-6NOS45DG.js +1 -0
  269. package/static/chunk-6OKLPRCD.js +1 -0
  270. package/static/chunk-6VEJCG43.js +1 -0
  271. package/static/chunk-77SS36Z2.js +1 -0
  272. package/static/chunk-7AXEPO3G.js +1 -0
  273. package/static/chunk-7CFSJ4BO.js +1 -0
  274. package/static/chunk-7CKHC72R.js +1 -0
  275. package/static/chunk-7DUTYOJG.js +1 -0
  276. package/static/chunk-7HKFYRPF.js +1 -0
  277. package/static/chunk-7NZJZATZ.js +1 -0
  278. package/static/chunk-AADK5D2H.js +1 -0
  279. package/static/chunk-ACUF7IKP.js +1 -0
  280. package/static/chunk-AGREZPV4.js +1 -0
  281. package/static/chunk-ATBJWFA3.js +1 -0
  282. package/static/chunk-ATXLZN2B.js +1 -0
  283. package/static/chunk-AZ5TF5Y3.js +1 -0
  284. package/static/chunk-BBHYIURC.js +1 -0
  285. package/static/chunk-BHZEPHRI.js +13 -0
  286. package/static/chunk-BQZWSZNN.js +1 -0
  287. package/static/chunk-BSB4VROD.js +2 -0
  288. package/static/chunk-BYWSTP3P.js +1 -0
  289. package/static/chunk-C3AAEQKW.js +1 -0
  290. package/static/chunk-CCGGCHGN.js +1 -0
  291. package/static/chunk-CFTKW432.js +1 -0
  292. package/static/chunk-CNOVT6KU.js +1 -0
  293. package/static/chunk-D56H3XE2.js +1 -0
  294. package/static/chunk-DFOOSIIA.js +1 -0
  295. package/static/chunk-DHFQIFOF.js +1 -0
  296. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  297. package/static/chunk-DJDRX53V.js +2 -0
  298. package/static/chunk-DKGXUMLT.js +1 -0
  299. package/static/chunk-DRHPEERW.js +2 -0
  300. package/static/chunk-DWYP6ZGG.js +1 -0
  301. package/static/chunk-EDJAISWO.js +13 -0
  302. package/static/chunk-EIYRBM4J.js +1 -0
  303. package/static/chunk-EKEGRXCV.js +7 -0
  304. package/static/chunk-EL6QL4TP.js +1 -0
  305. package/static/chunk-ERDZ7IVF.js +1 -0
  306. package/static/chunk-EVQKKVUZ.js +1 -0
  307. package/static/chunk-F2XG7EWI.js +1 -0
  308. package/static/chunk-F672FY5I.js +1 -0
  309. package/static/chunk-F6V37MKG.js +1 -0
  310. package/static/chunk-F7TXTNZC.js +1 -0
  311. package/static/chunk-FCGTI42I.js +1 -0
  312. package/static/chunk-FQHOSSCO.js +1 -0
  313. package/static/chunk-FTSIPHMG.js +1 -0
  314. package/static/chunk-GAGHHYLF.js +1 -0
  315. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  316. package/static/chunk-H6WOTGQ5.js +1 -0
  317. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  318. package/static/chunk-HC7F57NA.js +1 -0
  319. package/static/chunk-HHWXIK2M.js +7 -0
  320. package/static/chunk-HKRGIRKB.js +3 -0
  321. package/static/chunk-HNMGPG72.js +1 -0
  322. package/static/chunk-HS4S6BV3.js +1 -0
  323. package/static/chunk-IJ7K7ATQ.js +1 -0
  324. package/static/chunk-IOIBQGHN.js +562 -0
  325. package/static/chunk-ITVA26X2.js +2 -0
  326. package/static/chunk-J6YSFHLZ.js +1 -0
  327. package/static/chunk-JAEJ6IMV.js +1 -0
  328. package/static/chunk-JB5R6V33.js +1 -0
  329. package/static/chunk-JF6WIV6M.js +1 -0
  330. package/static/chunk-JGB4LLUT.js +1 -0
  331. package/static/chunk-JGXVTKLG.js +1 -0
  332. package/static/chunk-JMYAD7E2.js +1 -0
  333. package/static/chunk-JSE63Q5X.js +1 -0
  334. package/static/chunk-JVV3ZL6L.js +1 -0
  335. package/static/chunk-JXZCNFW7.js +1 -0
  336. package/static/chunk-KAVP6UXH.js +1 -0
  337. package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
  338. package/static/chunk-KHRF67SG.js +1 -0
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KNZ3AQPR.js +1 -0
  342. package/static/chunk-KT3TWCST.js +1 -0
  343. package/static/chunk-L6SYG23T.js +1 -0
  344. package/static/chunk-LJSVNPPQ.js +1 -0
  345. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  346. package/static/chunk-LRQSPCYZ.js +1 -0
  347. package/static/chunk-LUSVISM6.js +1 -0
  348. package/static/chunk-LXQGVNU2.js +1 -0
  349. package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
  350. package/static/chunk-LZKI5P5T.js +1 -0
  351. package/static/chunk-M4XL3JN5.js +6 -0
  352. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  353. package/static/chunk-MKUUWY6Y.js +1 -0
  354. package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
  355. package/static/chunk-MR3U7TKQ.js +1 -0
  356. package/static/chunk-MRF3CNLZ.js +1 -0
  357. package/static/chunk-MRMSMTWD.js +1 -0
  358. package/static/chunk-MVZJSG5R.js +1 -0
  359. package/static/chunk-MYM43ENO.js +1 -0
  360. package/static/chunk-N3P6P6GW.js +7 -0
  361. package/static/chunk-NAH4V2R6.js +2 -0
  362. package/static/chunk-NBBDVVUF.js +1 -0
  363. package/static/chunk-NMF2ZFBE.js +1 -0
  364. package/static/chunk-NN4ONTOT.js +1 -0
  365. package/static/chunk-NOPACN4F.js +1 -0
  366. package/static/chunk-NYJPOP4L.js +1 -0
  367. package/static/chunk-OJCAIKUK.js +1 -0
  368. package/static/chunk-OQRWXCLY.js +1 -0
  369. package/static/chunk-PCFH5HCI.js +2 -0
  370. package/static/chunk-PG54TWBO.js +4 -0
  371. package/static/chunk-PJF5XUTO.js +1 -0
  372. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  373. package/static/chunk-PTLYIUFW.js +1 -0
  374. package/static/chunk-PZGLDZZM.js +1 -0
  375. package/static/chunk-Q4VNZGFI.js +1 -0
  376. package/static/chunk-Q556XB3S.js +1 -0
  377. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  378. package/static/chunk-Q7U2VPIS.js +1 -0
  379. package/static/chunk-QM6CQMEX.js +1 -0
  380. package/static/chunk-QMHUIHSR.js +1 -0
  381. package/static/chunk-QNFNXDSX.js +1 -0
  382. package/static/chunk-QVFPHTOH.js +1 -0
  383. package/static/chunk-R4MI25E2.js +1 -0
  384. package/static/chunk-R7JRAR3P.js +1 -0
  385. package/static/chunk-R7PNKQU2.js +1 -0
  386. package/static/chunk-RCAORRB7.js +1 -0
  387. package/static/chunk-RK7XRDNB.js +1 -0
  388. package/static/chunk-RO7SAOLK.js +1 -0
  389. package/static/chunk-RQUUINHV.js +1 -0
  390. package/static/chunk-RT3K6DZR.js +1 -0
  391. package/static/chunk-RUN556VW.js +1 -0
  392. package/static/chunk-RX3YQ67K.js +1 -0
  393. package/static/chunk-S6EVLDHA.js +5 -0
  394. package/static/chunk-S7S5M3AZ.js +1 -0
  395. package/static/chunk-SBLNYV74.js +1 -0
  396. package/static/chunk-SIZCHHUA.js +1 -0
  397. package/static/chunk-SRBOO7AO.js +1 -0
  398. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  399. package/static/chunk-T3YI3BSS.js +1 -0
  400. package/static/chunk-T74SMT7I.js +1 -0
  401. package/static/chunk-TAL3RTTQ.js +1 -0
  402. package/static/chunk-TJZKTNNS.js +1 -0
  403. package/static/chunk-UJTFWZEC.js +1 -0
  404. package/static/chunk-UPGVU5LG.js +1 -0
  405. package/static/chunk-UQ6O3I6W.js +1 -0
  406. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  407. package/static/chunk-VWIRXLNE.js +1 -0
  408. package/static/chunk-VZMVGIVW.js +1 -0
  409. package/static/chunk-VZPCXSRG.js +2 -0
  410. package/static/chunk-WR3MA3L3.js +1 -0
  411. package/static/chunk-XCLK7NJL.js +1 -0
  412. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  413. package/static/chunk-XEGHEUP5.js +1 -0
  414. package/static/chunk-XKEBQNQJ.js +1 -0
  415. package/static/chunk-XOF4UW3S.js +1 -0
  416. package/static/chunk-XOTKK2NJ.js +1 -0
  417. package/static/chunk-XX7JXKA6.js +1 -0
  418. package/static/chunk-Y2I36A4K.js +1 -0
  419. package/static/chunk-Y44XDRM5.js +1 -0
  420. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  421. package/static/chunk-Y5RLD72B.js +1 -0
  422. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  423. package/static/chunk-Y63UUJGJ.js +1 -0
  424. package/static/chunk-YBNAC7QM.js +1 -0
  425. package/static/chunk-YCTCESL4.js +1 -0
  426. package/static/chunk-YMAN4LIU.js +1 -0
  427. package/static/chunk-YTDE6SXT.js +1 -0
  428. package/static/chunk-YZPIUJB3.js +1 -0
  429. package/static/chunk-ZCOWBVOT.js +1 -0
  430. package/static/chunk-ZHRYYMYE.js +1 -0
  431. package/static/chunk-ZNXTOQFG.js +1 -0
  432. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  433. package/static/favicon.ico +0 -0
  434. package/static/index.html +2 -2
  435. package/static/main-3PLRDZTO.js +11 -0
  436. package/static/styles-Q4OZOSSK.css +1 -0
  437. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  438. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  439. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  440. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  441. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  442. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  443. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  444. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  445. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  446. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  447. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  448. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  449. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  450. package/static/assets/codemirror/mode/css/css.js +0 -862
  451. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  452. package/static/assets/codemirror/mode/d/d.js +0 -223
  453. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  454. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  455. package/static/assets/codemirror/mode/django/django.js +0 -356
  456. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  457. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  458. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  459. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  460. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  461. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  462. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  463. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  464. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  465. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  466. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  467. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  468. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  469. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  470. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  471. package/static/assets/codemirror/mode/go/go.js +0 -187
  472. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  473. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  474. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  475. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  476. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  477. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  478. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  479. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  480. package/static/assets/codemirror/mode/http/http.js +0 -113
  481. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  482. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  483. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  484. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  485. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  486. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  487. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  488. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  489. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  490. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  491. package/static/assets/codemirror/mode/meta.js +0 -221
  492. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  493. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  494. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  495. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  496. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  497. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  498. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  499. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  500. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  501. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  502. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  503. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  504. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  505. package/static/assets/codemirror/mode/php/php.js +0 -234
  506. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  507. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  508. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  509. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  510. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  511. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  512. package/static/assets/codemirror/mode/python/python.js +0 -402
  513. package/static/assets/codemirror/mode/q/q.js +0 -139
  514. package/static/assets/codemirror/mode/r/r.js +0 -190
  515. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  516. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  517. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  518. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  519. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  520. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  521. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  522. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  523. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  524. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  525. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  526. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  527. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  528. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  529. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  530. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  531. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  532. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  533. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  534. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  535. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  536. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  537. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  538. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  539. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  540. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  541. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  542. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  543. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  544. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  545. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  546. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  547. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  548. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  549. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  550. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  551. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  552. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  553. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  554. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  555. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  556. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  557. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  558. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  559. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  560. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  561. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  562. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  563. package/static/chunk-2KLC4T2Z.js +0 -1
  564. package/static/chunk-373XVRXW.js +0 -1
  565. package/static/chunk-3XVM35O2.js +0 -1
  566. package/static/chunk-3YVRP3VM.js +0 -2
  567. package/static/chunk-AF24EYXU.js +0 -1
  568. package/static/chunk-AKQVEHO6.js +0 -2
  569. package/static/chunk-AY2SZ3G6.js +0 -1
  570. package/static/chunk-BCVX464U.js +0 -2
  571. package/static/chunk-C36MW4ME.js +0 -562
  572. package/static/chunk-DKSEQTMX.js +0 -1
  573. package/static/chunk-FZ3JPGYZ.js +0 -1
  574. package/static/chunk-GUGNR5TF.js +0 -3
  575. package/static/chunk-H6NE33VX.js +0 -1
  576. package/static/chunk-HNQRZALS.js +0 -1
  577. package/static/chunk-JSWCNGXJ.js +0 -1
  578. package/static/chunk-KFJIQIGR.js +0 -1
  579. package/static/chunk-LVM4QB22.js +0 -1
  580. package/static/chunk-M3XVNQZQ.js +0 -1
  581. package/static/chunk-MFLIJH6T.js +0 -1
  582. package/static/chunk-MSUHTBB2.js +0 -1
  583. package/static/chunk-N3U6637P.js +0 -1
  584. package/static/chunk-NNV4OXSB.js +0 -1
  585. package/static/chunk-NO2LTNW3.js +0 -1
  586. package/static/chunk-OOGP4WSH.js +0 -2
  587. package/static/chunk-PCWDQPOM.js +0 -2
  588. package/static/chunk-PGZZP5W3.js +0 -1
  589. package/static/chunk-Q5KM7LTX.js +0 -1
  590. package/static/chunk-QHC6ZPQ4.js +0 -1
  591. package/static/chunk-QZU2S5CV.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SHIVUDP3.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-TPYBFZS5.js +0 -1
  597. package/static/chunk-UEQCWMXD.js +0 -1
  598. package/static/chunk-UG5DMXYO.js +0 -1
  599. package/static/chunk-UJPPR4MX.js +0 -1
  600. package/static/chunk-V3AT2BKP.js +0 -1
  601. package/static/chunk-VKK5BSLX.js +0 -1
  602. package/static/chunk-WJW7CT6G.js +0 -27
  603. package/static/chunk-X5XGK6T7.js +0 -4
  604. package/static/chunk-YEKR5OPO.js +0 -1
  605. package/static/chunk-YW57T2PF.js +0 -1
  606. package/static/chunk-Z5J5F5SX.js +0 -1
  607. package/static/chunk-ZPF2DSQV.js +0 -1
  608. package/static/chunk-ZTCRGJ6Y.js +0 -7
  609. package/static/main-VOL6OMJ5.js +0 -9
  610. package/static/scripts-WRDOQIU5.js +0 -24
  611. package/static/styles-2C2UNCNB.css +0 -1
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.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, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { pngMimeType } from '../../../common/image'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto } from '../dto/file-operations.dto'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport { checkFileName, dirName, fileName, isPathExists, sanitizeName } from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { FilesManager } from './files-manager.service'\n\n@Injectable()\nexport class FilesMethods {\n private readonly logger = new Logger(FilesMethods.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager\n ) {}\n\n async headOrGet(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest, res: FastifyReply): Promise<void> {\n try {\n await this.filesManager.saveMultipart(req.user, req.space, req)\n } catch (e) {\n // if error we need to close the stream\n // req.raw.destroy()\n this.logger.error(`${this.upload.name} - unable to ${FILE_OPERATION.UPLOAD} ${req.space.url} : ${e}`)\n return res\n .header('Connection', 'close')\n .status(e.httpCode || 500)\n .send({ message: e.message })\n }\n }\n\n async make(user: UserModel, space: SpaceEnv, makeFileDto: MakeFileDto): Promise<void> {\n try {\n if (makeFileDto.type === 'directory') {\n return await this.filesManager.mkDir(user, space)\n } else {\n return await this.filesManager.mkFile(user, space, false, true, true)\n }\n } catch (e) {\n this.handleError(space, `${FILE_OPERATION.MAKE} ${makeFileDto.type}`, e)\n }\n }\n\n copy(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, false)\n }\n\n move(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, true)\n }\n\n async delete(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.delete(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, downloadDto: DownloadFileDto): Promise<void> {\n checkFileName(space.realPath)\n try {\n return await this.filesManager.downloadFromUrl(user, space, downloadDto.url)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DOWNLOAD, e)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, compressFileDto: CompressFileDto): Promise<void> {\n compressFileDto.name = checkFileName(space.realPath)\n try {\n for (const f of compressFileDto.files) {\n // sanitize file name\n f.name = sanitizeName(f.name)\n // handles the case where the file is an anchored file\n let baseSpace: SpaceEnv\n if (f.path) {\n baseSpace = await this.spacesManager.spaceEnv(user, f.path.split('/'))\n f.path = baseSpace.realPath\n } else {\n if (f.rootAlias) {\n baseSpace = await this.spacesManager.spaceEnv(user, path.join(dirName(space.url), f.rootAlias).split('/'))\n f.path = baseSpace.realPath\n } else {\n baseSpace = space\n f.path = path.resolve(dirName(space.realPath), f.name)\n }\n }\n // prevent path traversal\n if (!f.path.startsWith(baseSpace.realBasePath)) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.FORBIDDEN, `${f.name} not allowed`))\n }\n if (!(await isPathExists(f.path))) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.NOT_FOUND, `${f.name} does not exist`))\n }\n }\n return await this.filesManager.compress(user, space, compressFileDto)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.COMPRESS, e)\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.decompress(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DECOMPRESS, e)\n }\n }\n\n async genThumbnail(space: SpaceEnv, size: number): Promise<StreamableFile> {\n try {\n const pngStream = Readable.from(await this.filesManager.generateThumbnail(space, size))\n return new StreamableFile(pngStream, { type: pngMimeType })\n } catch (e) {\n this.handleError(space, this.genThumbnail.name, e)\n }\n }\n\n private async copyMove(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto,\n isMove: boolean\n ): Promise<{\n path: string\n name: string\n }> {\n const dstUrl = path.join(copyMoveFileDto.dstDirectory, copyMoveFileDto.dstName ? copyMoveFileDto.dstName : fileName(space.realPath))\n let dstSpace: SpaceEnv\n try {\n dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.filesManager.copyMove(user, space, dstSpace, isMove)\n } catch (e) {\n this.handleError(space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n return { path: dirName(dstUrl), name: fileName(dstUrl) }\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`)\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["FilesMethods","headOrGet","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","saveMultipart","user","logger","error","name","FILE_OPERATION","UPLOAD","url","header","status","httpCode","send","message","make","makeFileDto","type","mkDir","mkFile","MAKE","copy","copyMoveFileDto","copyMove","move","delete","DELETE","downloadFromUrl","downloadDto","checkFileName","realPath","DOWNLOAD","compress","compressFileDto","f","files","sanitizeName","baseSpace","path","spacesManager","spaceEnv","split","rootAlias","join","dirName","resolve","startsWith","realBasePath","COMPRESS","FileError","HttpStatus","FORBIDDEN","isPathExists","NOT_FOUND","decompress","DECOMPRESS","genThumbnail","size","pngStream","Readable","from","generateThumbnail","StreamableFile","pngMimeType","isMove","dstUrl","dstDirectory","dstName","fileName","dstSpace","MOVE","COPY","action","errorMsg","LockConflict","HttpException","LOCKED","INTERNAL_SERVER_ERROR","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-methods.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, StreamableFile } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport path from 'node:path'\nimport { Readable } from 'node:stream'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { FILE_OPERATION } from '../constants/operations'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto } from '../dto/file-operations.dto'\nimport { FileLockProps } from '../interfaces/file-props.interface'\nimport { FileError } from '../models/file-error'\nimport { LockConflict } from '../models/file-lock-error'\nimport { checkFileName, dirName, fileName, isPathExists, sanitizeName } from '../utils/files'\nimport { SendFile } from '../utils/send-file'\nimport { FilesManager } from './files-manager.service'\n\n@Injectable()\nexport class FilesMethods {\n private readonly logger = new Logger(FilesMethods.name)\n\n constructor(\n private readonly spacesManager: SpacesManager,\n private readonly filesManager: FilesManager\n ) {}\n\n async headOrGet(req: FastifySpaceRequest, res: FastifyReply): Promise<StreamableFile> {\n const sendFile: SendFile = this.filesManager.sendFileFromSpace(req.space)\n try {\n await sendFile.checks()\n return await sendFile.stream(req, res)\n } catch (e) {\n this.handleError(req.space, req.method, e)\n }\n }\n\n async upload(req: FastifySpaceRequest): Promise<void> {\n try {\n await this.filesManager.saveMultipart(req.user, req.space, req)\n } catch (e) {\n this.handleError(req.space, FILE_OPERATION.UPLOAD, e)\n }\n }\n\n async make(user: UserModel, space: SpaceEnv, makeFileDto: MakeFileDto): Promise<void> {\n try {\n if (makeFileDto.type === 'directory') {\n return await this.filesManager.mkDir(user, space)\n } else {\n return await this.filesManager.mkFile(user, space, false, true, true)\n }\n } catch (e) {\n this.handleError(space, `${FILE_OPERATION.MAKE} ${makeFileDto.type}`, e)\n }\n }\n\n copy(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, false)\n }\n\n move(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.copyMove(user, space, copyMoveFileDto, true)\n }\n\n async delete(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.delete(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DELETE, e)\n }\n }\n\n async downloadFromUrl(user: UserModel, space: SpaceEnv, downloadDto: DownloadFileDto): Promise<void> {\n checkFileName(space.realPath)\n try {\n return await this.filesManager.downloadFromUrl(user, space, downloadDto.url)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DOWNLOAD, e)\n }\n }\n\n async compress(user: UserModel, space: SpaceEnv, compressFileDto: CompressFileDto): Promise<void> {\n compressFileDto.name = checkFileName(space.realPath)\n try {\n for (const f of compressFileDto.files) {\n // sanitize file name\n f.name = sanitizeName(f.name)\n // handles the case where the file is an anchored file\n let baseSpace: SpaceEnv\n if (f.path) {\n baseSpace = await this.spacesManager.spaceEnv(user, f.path.split('/'))\n f.path = baseSpace.realPath\n } else {\n if (f.rootAlias) {\n baseSpace = await this.spacesManager.spaceEnv(user, path.join(dirName(space.url), f.rootAlias).split('/'))\n f.path = baseSpace.realPath\n } else {\n baseSpace = space\n f.path = path.resolve(dirName(space.realPath), f.name)\n }\n }\n // prevent path traversal\n if (!f.path.startsWith(baseSpace.realBasePath)) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.FORBIDDEN, `${f.name} not allowed`))\n }\n if (!(await isPathExists(f.path))) {\n return this.handleError(space, FILE_OPERATION.COMPRESS, new FileError(HttpStatus.NOT_FOUND, `${f.name} does not exist`))\n }\n }\n return await this.filesManager.compress(user, space, compressFileDto)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.COMPRESS, e)\n }\n }\n\n async decompress(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.decompress(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.DECOMPRESS, e)\n }\n }\n\n async genThumbnail(space: SpaceEnv, size: number): Promise<Readable> {\n try {\n return await this.filesManager.generateThumbnail(space, size)\n } catch (e) {\n this.handleError(space, this.genThumbnail.name, e)\n }\n }\n\n async lock(user: UserModel, space: SpaceEnv): Promise<FileLockProps> {\n try {\n return await this.filesManager.lock(user, space)\n } catch (e) {\n if (e instanceof LockConflict) {\n const fileLockProps = this.filesManager.filesLockManager.convertLockToFileLockProps(e.lock)\n throw new HttpException(fileLockProps, HttpStatus.LOCKED)\n }\n this.handleError(space, FILE_OPERATION.LOCK, e)\n }\n }\n\n async unlock(user: UserModel, space: SpaceEnv, forceAsOwner = false): Promise<void> {\n try {\n return await this.filesManager.unlock(user, space, forceAsOwner)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK, e)\n }\n }\n\n async unlockRequest(user: UserModel, space: SpaceEnv): Promise<void> {\n try {\n return await this.filesManager.unlockRequest(user, space)\n } catch (e) {\n this.handleError(space, FILE_OPERATION.UNLOCK_REQUEST, e)\n }\n }\n\n async getSize(space: SpaceEnv): Promise<{ size: number }> {\n try {\n return { size: await this.filesManager.getSize(space) }\n } catch (e) {\n this.handleError(space, FILE_OPERATION.GET_SIZE, e)\n }\n }\n\n private async copyMove(\n user: UserModel,\n space: SpaceEnv,\n copyMoveFileDto: CopyMoveFileDto,\n isMove: boolean\n ): Promise<{\n path: string\n name: string\n }> {\n const dstUrl = path.join(copyMoveFileDto.dstDirectory, copyMoveFileDto.dstName ? copyMoveFileDto.dstName : fileName(space.realPath))\n let dstSpace: SpaceEnv\n try {\n dstSpace = await this.spacesManager.spaceEnv(user, dstUrl.split('/'))\n await this.filesManager.copyMove(user, space, dstSpace, isMove, copyMoveFileDto.overwrite)\n } catch (e) {\n this.handleError(space, isMove ? FILE_OPERATION.MOVE : FILE_OPERATION.COPY, e, dstSpace)\n }\n return { path: dirName(dstUrl), name: fileName(dstUrl) }\n }\n\n private handleError(space: SpaceEnv, action: string, e: any, dstSpace?: SpaceEnv) {\n this.logger.error(`unable to ${action} ${space.url}${dstSpace?.url ? ` -> ${dstSpace.url}` : ''} : ${e}`)\n // Remove the last part to avoid exposing the path\n const errorMsg = e.message.split(',')[0]\n if (e instanceof LockConflict) {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n } else if (e instanceof FileError) {\n throw new HttpException(errorMsg, e.httpCode)\n }\n throw new HttpException(errorMsg, HttpStatus.INTERNAL_SERVER_ERROR)\n }\n}\n"],"names":["FilesMethods","headOrGet","req","res","sendFile","filesManager","sendFileFromSpace","space","checks","stream","e","handleError","method","upload","saveMultipart","user","FILE_OPERATION","UPLOAD","make","makeFileDto","type","mkDir","mkFile","MAKE","copy","copyMoveFileDto","copyMove","move","delete","DELETE","downloadFromUrl","downloadDto","checkFileName","realPath","url","DOWNLOAD","compress","compressFileDto","name","f","files","sanitizeName","baseSpace","path","spacesManager","spaceEnv","split","rootAlias","join","dirName","resolve","startsWith","realBasePath","COMPRESS","FileError","HttpStatus","FORBIDDEN","isPathExists","NOT_FOUND","decompress","DECOMPRESS","genThumbnail","size","generateThumbnail","lock","LockConflict","fileLockProps","filesLockManager","convertLockToFileLockProps","HttpException","LOCKED","LOCK","unlock","forceAsOwner","UNLOCK","unlockRequest","UNLOCK_REQUEST","getSize","GET_SIZE","isMove","dstUrl","dstDirectory","dstName","fileName","dstSpace","overwrite","MOVE","COPY","action","logger","error","errorMsg","message","httpCode","INTERNAL_SERVER_ERROR","Logger"],"mappings":"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"}
@@ -20,7 +20,6 @@ const _nodecrypto = /*#__PURE__*/ _interop_require_default(require("node:crypto"
20
20
  const _nodeos = /*#__PURE__*/ _interop_require_default(require("node:os"));
21
21
  const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
22
22
  const _functions = require("../../../common/functions");
23
- const _shared = require("../../../common/shared");
24
23
  const _configenvironment = require("../../../configuration/config.environment");
25
24
  const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
26
25
  const _contextmanagerservice = require("../../../infrastructure/context/services/context-manager.service");
@@ -31,6 +30,7 @@ const _avatar = require("../../users/utils/avatar");
31
30
  const _webdav = require("../../webdav/constants/webdav");
32
31
  const _cache = require("../constants/cache");
33
32
  const _onlyoffice = require("../constants/only-office");
33
+ const _operations = require("../constants/operations");
34
34
  const _routes = require("../constants/routes");
35
35
  const _files = require("../utils/files");
36
36
  const _fileslockmanagerservice = require("./files-lock-manager.service");
@@ -66,10 +66,10 @@ let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
66
66
  if (!_onlyoffice.ONLY_OFFICE_EXTENSIONS.VIEWABLE.has(fileExtension) && !_onlyoffice.ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension)) {
67
67
  throw new _common.HttpException('Document not supported', _common.HttpStatus.BAD_REQUEST);
68
68
  }
69
- if (mode === 'edit' && (!_onlyoffice.ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension) || !(0, _permissions.haveSpaceEnvPermissions)(space, _spaces.SPACE_OPERATION.MODIFY))) {
70
- mode = 'view';
69
+ if (mode === _operations.FILE_MODE.EDIT && (!_onlyoffice.ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension) || !(0, _permissions.haveSpaceEnvPermissions)(space, _spaces.SPACE_OPERATION.MODIFY))) {
70
+ mode = _operations.FILE_MODE.VIEW;
71
71
  }
72
- if (mode === 'edit') {
72
+ if (mode === _operations.FILE_MODE.EDIT) {
73
73
  // check lock conflicts
74
74
  try {
75
75
  await this.filesLockManager.checkConflicts(space.dbFile, _webdav.DEPTH.RESOURCE, {
@@ -143,7 +143,7 @@ let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
143
143
  async genConfiguration(user, space, mode, fileId, fileUrl, fileExtension, callBackUrl, isMobile) {
144
144
  const documentType = _onlyoffice.ONLY_OFFICE_EXTENSIONS.EDITABLE.get(fileExtension) || _onlyoffice.ONLY_OFFICE_EXTENSIONS.VIEWABLE.get(fileExtension);
145
145
  return {
146
- documentServerUrl: this.externalOnlyOfficeServer || `${this.contextManager.get('headerOriginUrl')}${_onlyoffice.ONLY_OFFICE_INTERNAL_URI}`,
146
+ documentServerUrl: this.externalOnlyOfficeServer || `${this.contextManager.headerOriginUrl()}${_onlyoffice.ONLY_OFFICE_INTERNAL_URI}`,
147
147
  config: {
148
148
  type: isMobile ? 'mobile' : 'desktop',
149
149
  height: '100%',
@@ -155,12 +155,12 @@ let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
155
155
  key: await this.getDocumentKey(fileId),
156
156
  permissions: {
157
157
  download: true,
158
- edit: mode === 'edit',
158
+ edit: mode === _operations.FILE_MODE.EDIT,
159
159
  changeHistory: false,
160
160
  comment: true,
161
161
  fillForms: true,
162
162
  print: true,
163
- review: mode === 'edit'
163
+ review: mode === _operations.FILE_MODE.EDIT
164
164
  },
165
165
  url: fileUrl
166
166
  },
@@ -201,11 +201,11 @@ let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
201
201
  }
202
202
  getDocumentUrl(space, token) {
203
203
  // user refresh token is used here for long session
204
- return `${this.contextManager.get('headerOriginUrl')}${_routes.API_FILES_ONLY_OFFICE_DOCUMENT}/${space.url}?${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`;
204
+ return `${this.contextManager.headerOriginUrl()}${_routes.API_FILES_ONLY_OFFICE_DOCUMENT}/${space.url}?${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`;
205
205
  }
206
206
  getCallBackUrl(space, token, fileId) {
207
207
  // user refresh token is used here for long session
208
- return `${this.contextManager.get('headerOriginUrl')}${_routes.API_FILES_ONLY_OFFICE_CALLBACK}/${space.url}?fid=${fileId}&${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`;
208
+ return `${this.contextManager.headerOriginUrl()}${_routes.API_FILES_ONLY_OFFICE_CALLBACK}/${space.url}?fid=${fileId}&${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`;
209
209
  }
210
210
  genPayloadToken(payload) {
211
211
  return this.jwt.signAsync(payload, {
@@ -242,12 +242,12 @@ let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
242
242
  }
243
243
  }
244
244
  async genFileLock(user, space) {
245
- const [ok, _fileLock] = await this.filesLockManager.create(user, space.dbFile, _webdav.DEPTH.RESOURCE, this.expiration, {
245
+ const [ok, _fileLock] = await this.filesLockManager.create(user, space.dbFile, _webdav.DEPTH.RESOURCE, {
246
246
  lockroot: null,
247
247
  locktoken: null,
248
248
  lockscope: _webdav.LOCK_SCOPE.SHARED,
249
- owner: `${_shared.SERVER_NAME} - ${user.fullName} (${user.email})`
250
- });
249
+ owner: `OnlyOffice - ${user.fullName} (${user.email})`
250
+ }, this.expiration);
251
251
  if (!ok) {
252
252
  throw new Error('document is locked');
253
253
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-only-office-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 { HttpService } from '@nestjs/axios'\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { JwtService } from '@nestjs/jwt'\nimport { AxiosResponse } from 'axios'\nimport https from 'https'\nimport crypto from 'node:crypto'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { JwtIdentityPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { convertHumanTimeToSeconds, generateShortUUID } from '../../../common/functions'\nimport { SERVER_NAME } from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { HTTP_METHOD } from '../../applications.constants'\nimport { SPACE_OPERATION } from '../../spaces/constants/spaces'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport type { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport type { UserModel } from '../../users/models/user.model'\nimport { getAvatarBase64 } from '../../users/utils/avatar'\nimport { DEPTH, LOCK_SCOPE } from '../../webdav/constants/webdav'\nimport { CACHE_ONLY_OFFICE } from '../constants/cache'\nimport {\n ONLY_OFFICE_CONVERT_ERROR,\n ONLY_OFFICE_CONVERT_EXTENSIONS,\n ONLY_OFFICE_EXTENSIONS,\n ONLY_OFFICE_INTERNAL_URI,\n ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME\n} from '../constants/only-office'\nimport { API_FILES_ONLY_OFFICE_CALLBACK, API_FILES_ONLY_OFFICE_DOCUMENT } from '../constants/routes'\nimport type { FileProps } from '../interfaces/file-props.interface'\nimport { OnlyOfficeCallBack, OnlyOfficeConfig, OnlyOfficeConvertForm, OnlyOfficeReqConfig } from '../interfaces/only-office-config.interface'\nimport { copyFileContent, fileSize, getProps, isPathExists, isPathIsDir, removeFiles, uniqueFilePathFromDir, writeFromStream } from '../utils/files'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\n@Injectable()\nexport class FilesOnlyOfficeManager {\n private logger = new Logger(FilesOnlyOfficeManager.name)\n private readonly externalOnlyOfficeServer = configuration.applications.files.onlyoffice.externalServer || null\n private readonly rejectUnauthorized: boolean = !configuration.applications.files.onlyoffice?.verifySSL\n private readonly convertUrl = this.externalOnlyOfficeServer ? `${this.externalOnlyOfficeServer}/ConvertService.ashx` : null\n private readonly expiration = convertHumanTimeToSeconds(configuration.auth.token.refresh.expiration)\n private readonly mobileRegex: RegExp = /android|webos|iphone|ipad|ipod|blackberry|windows phone|opera mini|iemobile|mobile/i\n\n constructor(\n private readonly http: HttpService,\n private readonly contextManager: ContextManager,\n private readonly cache: Cache,\n private readonly jwt: JwtService,\n private readonly filesLockManager: FilesLockManager,\n private readonly filesQueries: FilesQueries\n ) {}\n\n getStatus(): { enabled: boolean } {\n return { enabled: configuration.applications.files.onlyoffice.enabled }\n }\n\n async getSettings(user: UserModel, space: SpaceEnv, mode: 'edit' | 'view', req: FastifySpaceRequest): Promise<OnlyOfficeReqConfig> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Document not found', HttpStatus.NOT_FOUND)\n }\n if (await isPathIsDir(space.realPath)) {\n throw new HttpException('Document must be a file', HttpStatus.BAD_REQUEST)\n }\n const fileExtension = path.extname(space.realPath).slice(1)\n if (!ONLY_OFFICE_EXTENSIONS.VIEWABLE.has(fileExtension) && !ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension)) {\n throw new HttpException('Document not supported', HttpStatus.BAD_REQUEST)\n }\n if (mode === 'edit' && (!ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension) || !haveSpaceEnvPermissions(space, SPACE_OPERATION.MODIFY))) {\n mode = 'view'\n }\n if (mode === 'edit') {\n // check lock conflicts\n try {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id, lockScope: LOCK_SCOPE.SHARED })\n } catch {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n }\n }\n const isMobile: boolean = this.mobileRegex.test(req.headers['user-agent'])\n const fileProps: FileProps = await getProps(space.realPath, space.dbFile.path)\n const fileId: string = ((await this.filesQueries.getSpaceFileId(fileProps, space.dbFile)) || fileProps.id).toString()\n const userToken: string = await this.genUserToken(user)\n const fileUrl = this.getDocumentUrl(space, userToken)\n const callBackUrl = this.getCallBackUrl(space, userToken, fileId)\n const config: OnlyOfficeReqConfig = await this.genConfiguration(user, space, mode, fileId, fileUrl, fileExtension, callBackUrl, isMobile)\n config.config.token = await this.genPayloadToken(config.config)\n return config\n }\n\n async callBack(user: UserModel, space: SpaceEnv, token: string, fileId: string) {\n const callBackData: OnlyOfficeCallBack = await this.jwt.verifyAsync(token, { secret: configuration.applications.files.onlyoffice.secret })\n try {\n switch (callBackData.status) {\n case 1:\n await this.checkFileLock(user, space, callBackData)\n this.logger.debug(`document is being edited : ${space.url}`)\n break\n case 2:\n await this.checkFileLock(user, space, callBackData)\n if (callBackData.notmodified) {\n this.logger.debug(`document was edited but closed with no changes : ${space.url}`)\n } else {\n this.logger.debug(`document was edited but not saved (let's do it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n }\n await this.removeDocumentKey(fileId, space)\n break\n case 3:\n this.logger.error(`document cannot be saved, an error has occurred (try to save it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n case 4:\n await this.removeFileLock(user.id, space)\n await this.removeDocumentKey(fileId, space)\n this.logger.debug(`document was closed with no changes : ${space.url}`)\n break\n case 6:\n this.logger.debug(`document is edited but save was requested : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n case 7:\n this.logger.error(`document cannot be force saved, an error has occurred (try to save it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n default:\n this.logger.error('unhandled case')\n }\n } catch (e) {\n this.logger.error(`${this.callBack.name} - ${e.message} : ${space.url}`)\n return { error: e.message }\n }\n return { error: 0 }\n }\n\n private async genConfiguration(\n user: UserModel,\n space: SpaceEnv,\n mode: 'edit' | 'view',\n fileId: string,\n fileUrl: string,\n fileExtension: string,\n callBackUrl: string,\n isMobile: boolean\n ): Promise<OnlyOfficeReqConfig> {\n const documentType = ONLY_OFFICE_EXTENSIONS.EDITABLE.get(fileExtension) || ONLY_OFFICE_EXTENSIONS.VIEWABLE.get(fileExtension)\n return {\n documentServerUrl: this.externalOnlyOfficeServer || `${this.contextManager.get('headerOriginUrl')}${ONLY_OFFICE_INTERNAL_URI}`,\n config: {\n type: isMobile ? 'mobile' : 'desktop',\n height: '100%',\n width: '100%',\n documentType: documentType,\n document: {\n title: path.basename(space.relativeUrl),\n fileType: fileExtension,\n key: await this.getDocumentKey(fileId),\n permissions: {\n download: true,\n edit: mode === 'edit',\n changeHistory: false,\n comment: true,\n fillForms: true,\n print: true,\n review: mode === 'edit'\n },\n url: fileUrl\n },\n editorConfig: {\n mode: mode,\n lang: 'en',\n region: 'en',\n callbackUrl: callBackUrl,\n user: { id: user.id.toString(), name: `${user.fullName} (${user.email})`, image: await getAvatarBase64(user.login) },\n coEditing: {\n mode: 'fast',\n change: true\n },\n embedded: {\n embedUrl: fileUrl,\n saveUrl: fileUrl,\n shareUrl: fileUrl,\n toolbarDocked: 'top'\n },\n customization: {\n about: false,\n autosave: false,\n forcesave: true,\n zoom: documentType === 'slide' ? 60 : 90,\n help: false,\n features: { featuresTips: false },\n plugins: false\n }\n }\n }\n }\n }\n\n private getDocumentUrl(space: SpaceEnv, token: string): string {\n // user refresh token is used here for long session\n return `${this.contextManager.get('headerOriginUrl')}${API_FILES_ONLY_OFFICE_DOCUMENT}/${space.url}?${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`\n }\n\n private getCallBackUrl(space: SpaceEnv, token: string, fileId: string): string {\n // user refresh token is used here for long session\n return `${this.contextManager.get('headerOriginUrl')}${API_FILES_ONLY_OFFICE_CALLBACK}/${space.url}?fid=${fileId}&${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`\n }\n\n private genPayloadToken(payload: OnlyOfficeConfig | OnlyOfficeConvertForm): Promise<string> {\n return this.jwt.signAsync(payload, { secret: configuration.applications.files.onlyoffice.secret, expiresIn: 60 })\n }\n\n private genUserToken(user: UserModel): Promise<string> {\n // use refresh expiration to allow long session\n return this.jwt.signAsync(\n {\n identity: {\n id: user.id,\n login: user.login,\n email: user.email,\n fullName: user.fullName,\n language: user.language,\n role: user.role,\n applications: user.applications\n } satisfies JwtIdentityPayload\n },\n {\n secret: configuration.auth.token.access.secret,\n expiresIn: this.expiration\n }\n )\n }\n\n private async checkFileLock(user: UserModel, space: SpaceEnv, callBackData: OnlyOfficeCallBack) {\n for (const action of callBackData.actions) {\n if (action.type === 0) {\n // disconnect\n await this.removeFileLock(parseInt(action.userid), space)\n } else if (action.type === 1) {\n // connect\n await this.genFileLock(user, space)\n }\n }\n }\n\n private async genFileLock(user: UserModel, space: SpaceEnv): Promise<void> {\n const [ok, _fileLock] = await this.filesLockManager.create(user, space.dbFile, DEPTH.RESOURCE, this.expiration, {\n lockroot: null,\n locktoken: null,\n lockscope: LOCK_SCOPE.SHARED,\n owner: `${SERVER_NAME} - ${user.fullName} (${user.email})`\n })\n if (!ok) {\n throw new Error('document is locked')\n }\n }\n\n private async removeFileLock(userId: number, space: SpaceEnv): Promise<void> {\n for (const lock of await this.filesLockManager.getLocksByPath(space.dbFile)) {\n if (lock.owner.id === userId) {\n await this.filesLockManager.removeLock(lock.key)\n }\n }\n }\n\n private async removeDocumentKey(fileId: string, space: SpaceEnv): Promise<void> {\n if (!(await this.filesLockManager.isPathLocked(space.dbFile))) {\n const cacheKey = this.getCacheKey(fileId)\n const r = await this.cache.del(cacheKey)\n this.logger.debug(`${this.removeDocumentKey.name} - ${cacheKey} ${r ? '' : 'not'} removed`)\n }\n }\n\n private async getDocumentKey(fileId: string): Promise<string> {\n const cacheKey = this.getCacheKey(fileId)\n const existingDocKey: string = await this.cache.get(cacheKey)\n if (existingDocKey) {\n return existingDocKey\n }\n const docKey = generateShortUUID(64)\n await this.cache.set(cacheKey, docKey, this.expiration)\n this.logger.debug(`${this.getDocumentKey.name} - ${cacheKey} (${docKey}) created`)\n return docKey\n }\n\n private async saveDocument(space: SpaceEnv, url: string): Promise<void> {\n /* url format:\n https://onlyoffice-server.com/cache/files/data/-33120641_7158/output.pptx/output.pptx\n ?md5=duFHKC-5d47s-RRcYn3hAw&expires=1739400549&shardkey=-33120641&filename=output.pptx\n */\n const urlParams = new URLSearchParams(url.split('?').at(-1))\n // it is not the md5 of the file but a md5 generated by the combination of the elements of the url\n const md5: string = urlParams.get('md5')\n const tmpFilePath = await uniqueFilePathFromDir(path.join(os.tmpdir(), `${md5}-${urlParams.get('filename')}`))\n\n // convert remote file to the local file with the current extension if these extensions aren't equal\n const localExtension = path.extname(space.realPath).slice(1)\n const remoteExtension = path.extname(urlParams.get('filename')).slice(1)\n\n let downloadUrl: string\n if (localExtension !== remoteExtension && !ONLY_OFFICE_CONVERT_EXTENSIONS.ALLOW_AUTO.has(localExtension)) {\n if (ONLY_OFFICE_CONVERT_EXTENSIONS.FROM.has(remoteExtension) && ONLY_OFFICE_CONVERT_EXTENSIONS.TO.has(localExtension)) {\n downloadUrl = await this.convertDocument(urlParams.get('shardkey'), url, remoteExtension, localExtension, space.url)\n } else {\n throw new Error(`document cannot be converted from ${remoteExtension} -> ${localExtension} : ${space.url}`)\n }\n } else {\n downloadUrl = url\n }\n\n // download file\n let res: AxiosResponse\n try {\n res = await this.http.axiosRef({\n method: HTTP_METHOD.GET,\n url: downloadUrl,\n responseType: 'stream',\n httpsAgent: new https.Agent({ rejectUnauthorized: this.rejectUnauthorized })\n })\n await writeFromStream(tmpFilePath, res.data)\n } catch (e) {\n throw new Error(`unable to get document : ${e.message}`)\n }\n\n // try to verify the downloaded size\n const contentLength = parseInt(res.headers['content-length'], 10)\n if (!isNaN(contentLength)) {\n if (contentLength === 0) {\n this.logger.debug(`${this.saveDocument.name} - content length is 0 : ${space.url}`)\n return\n }\n const tmpFileSize = await fileSize(tmpFilePath)\n if (tmpFileSize !== contentLength) {\n throw new Error(`document size differs (${tmpFileSize} != ${contentLength})`)\n }\n }\n // copy contents to avoid inode changes (fileId in some cases)\n try {\n await copyFileContent(tmpFilePath, space.realPath)\n await removeFiles(tmpFilePath)\n } catch (e) {\n throw new Error(`unable to save document : ${e.message}`)\n }\n }\n\n private async convertDocument(id: string, url: string, fileType: string, outputType: string, spaceUrl: string): Promise<string> {\n const key: string = `${id}-${crypto.randomBytes(20).toString('hex')}`.slice(0, 20).replace('-', '_')\n const payload: OnlyOfficeConvertForm = {\n key: key,\n url: url,\n filetype: fileType,\n outputtype: outputType,\n async: false\n }\n payload.token = await this.genPayloadToken(payload)\n let result: { fileUrl?: string; fileType?: string; endConvert?: boolean; error?: number }\n try {\n const res: AxiosResponse = await this.http.axiosRef({\n method: HTTP_METHOD.POST,\n url: this.convertUrl,\n data: payload,\n httpsAgent: new https.Agent({ rejectUnauthorized: this.rejectUnauthorized })\n })\n result = res.data\n } catch (e) {\n throw new Error(`convert failed with status : ${e.response.status}`)\n }\n if (result.error) {\n throw new Error(`convert failed with reason : ${ONLY_OFFICE_CONVERT_ERROR.get(result.error)}`)\n }\n if (result.endConvert) {\n this.logger.log(`${this.convertDocument.name} - ${fileType} -> ${outputType} : ${spaceUrl}`)\n return result.fileUrl\n }\n }\n\n private getCacheKey(fileId: string): string {\n return `${CACHE_ONLY_OFFICE}|${fileId}`\n }\n}\n"],"names":["FilesOnlyOfficeManager","getStatus","enabled","configuration","applications","files","onlyoffice","getSettings","user","space","mode","req","isPathExists","realPath","HttpException","HttpStatus","NOT_FOUND","isPathIsDir","BAD_REQUEST","fileExtension","path","extname","slice","ONLY_OFFICE_EXTENSIONS","VIEWABLE","has","EDITABLE","haveSpaceEnvPermissions","SPACE_OPERATION","MODIFY","filesLockManager","checkConflicts","dbFile","DEPTH","RESOURCE","userId","id","lockScope","LOCK_SCOPE","SHARED","LOCKED","isMobile","mobileRegex","test","headers","fileProps","getProps","fileId","filesQueries","getSpaceFileId","toString","userToken","genUserToken","fileUrl","getDocumentUrl","callBackUrl","getCallBackUrl","config","genConfiguration","token","genPayloadToken","callBack","callBackData","jwt","verifyAsync","secret","status","checkFileLock","logger","debug","url","notmodified","saveDocument","removeDocumentKey","error","removeFileLock","e","name","message","documentType","get","documentServerUrl","externalOnlyOfficeServer","contextManager","ONLY_OFFICE_INTERNAL_URI","type","height","width","document","title","basename","relativeUrl","fileType","key","getDocumentKey","permissions","download","edit","changeHistory","comment","fillForms","print","review","editorConfig","lang","region","callbackUrl","fullName","email","image","getAvatarBase64","login","coEditing","change","embedded","embedUrl","saveUrl","shareUrl","toolbarDocked","customization","about","autosave","forcesave","zoom","help","features","featuresTips","plugins","API_FILES_ONLY_OFFICE_DOCUMENT","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","API_FILES_ONLY_OFFICE_CALLBACK","payload","signAsync","expiresIn","identity","language","role","auth","access","expiration","action","actions","parseInt","userid","genFileLock","ok","_fileLock","create","lockroot","locktoken","lockscope","owner","SERVER_NAME","Error","lock","getLocksByPath","removeLock","isPathLocked","cacheKey","getCacheKey","r","cache","del","existingDocKey","docKey","generateShortUUID","set","urlParams","URLSearchParams","split","at","md5","tmpFilePath","uniqueFilePathFromDir","join","os","tmpdir","localExtension","remoteExtension","downloadUrl","ONLY_OFFICE_CONVERT_EXTENSIONS","ALLOW_AUTO","FROM","TO","convertDocument","res","http","axiosRef","method","HTTP_METHOD","GET","responseType","httpsAgent","https","Agent","rejectUnauthorized","writeFromStream","data","contentLength","isNaN","tmpFileSize","fileSize","copyFileContent","removeFiles","outputType","spaceUrl","crypto","randomBytes","replace","filetype","outputtype","async","result","POST","convertUrl","response","ONLY_OFFICE_CONVERT_ERROR","endConvert","log","CACHE_ONLY_OFFICE","Logger","externalServer","verifySSL","convertHumanTimeToSeconds","refresh"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-only-office-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 { HttpService } from '@nestjs/axios'\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { JwtService } from '@nestjs/jwt'\nimport { AxiosResponse } from 'axios'\nimport https from 'https'\nimport crypto from 'node:crypto'\nimport os from 'node:os'\nimport path from 'node:path'\nimport { JwtIdentityPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { convertHumanTimeToSeconds, generateShortUUID } from '../../../common/functions'\nimport { configuration } from '../../../configuration/config.environment'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { HTTP_METHOD } from '../../applications.constants'\nimport { SPACE_OPERATION } from '../../spaces/constants/spaces'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport type { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport type { UserModel } from '../../users/models/user.model'\nimport { getAvatarBase64 } from '../../users/utils/avatar'\nimport { DEPTH, LOCK_SCOPE } from '../../webdav/constants/webdav'\nimport { WebDAVLock } from '../../webdav/interfaces/webdav.interface'\nimport { CACHE_ONLY_OFFICE } from '../constants/cache'\nimport {\n ONLY_OFFICE_CONVERT_ERROR,\n ONLY_OFFICE_CONVERT_EXTENSIONS,\n ONLY_OFFICE_EXTENSIONS,\n ONLY_OFFICE_INTERNAL_URI,\n ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME\n} from '../constants/only-office'\nimport { FILE_MODE } from '../constants/operations'\nimport { API_FILES_ONLY_OFFICE_CALLBACK, API_FILES_ONLY_OFFICE_DOCUMENT } from '../constants/routes'\nimport type { FileProps } from '../interfaces/file-props.interface'\nimport { OnlyOfficeCallBack, OnlyOfficeConfig, OnlyOfficeConvertForm, OnlyOfficeReqConfig } from '../interfaces/only-office-config.interface'\nimport { copyFileContent, fileSize, getProps, isPathExists, isPathIsDir, removeFiles, uniqueFilePathFromDir, writeFromStream } from '../utils/files'\nimport { FilesLockManager } from './files-lock-manager.service'\nimport { FilesQueries } from './files-queries.service'\n\n@Injectable()\nexport class FilesOnlyOfficeManager {\n private logger = new Logger(FilesOnlyOfficeManager.name)\n private readonly externalOnlyOfficeServer = configuration.applications.files.onlyoffice.externalServer || null\n private readonly rejectUnauthorized: boolean = !configuration.applications.files.onlyoffice?.verifySSL\n private readonly convertUrl = this.externalOnlyOfficeServer ? `${this.externalOnlyOfficeServer}/ConvertService.ashx` : null\n private readonly expiration = convertHumanTimeToSeconds(configuration.auth.token.refresh.expiration)\n private readonly mobileRegex: RegExp = /android|webos|iphone|ipad|ipod|blackberry|windows phone|opera mini|iemobile|mobile/i\n\n constructor(\n private readonly http: HttpService,\n private readonly contextManager: ContextManager,\n private readonly cache: Cache,\n private readonly jwt: JwtService,\n private readonly filesLockManager: FilesLockManager,\n private readonly filesQueries: FilesQueries\n ) {}\n\n getStatus(): { enabled: boolean } {\n return { enabled: configuration.applications.files.onlyoffice.enabled }\n }\n\n async getSettings(user: UserModel, space: SpaceEnv, mode: FILE_MODE, req: FastifySpaceRequest): Promise<OnlyOfficeReqConfig> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Document not found', HttpStatus.NOT_FOUND)\n }\n if (await isPathIsDir(space.realPath)) {\n throw new HttpException('Document must be a file', HttpStatus.BAD_REQUEST)\n }\n const fileExtension = path.extname(space.realPath).slice(1)\n if (!ONLY_OFFICE_EXTENSIONS.VIEWABLE.has(fileExtension) && !ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension)) {\n throw new HttpException('Document not supported', HttpStatus.BAD_REQUEST)\n }\n if (mode === FILE_MODE.EDIT && (!ONLY_OFFICE_EXTENSIONS.EDITABLE.has(fileExtension) || !haveSpaceEnvPermissions(space, SPACE_OPERATION.MODIFY))) {\n mode = FILE_MODE.VIEW\n }\n if (mode === FILE_MODE.EDIT) {\n // check lock conflicts\n try {\n await this.filesLockManager.checkConflicts(space.dbFile, DEPTH.RESOURCE, { userId: user.id, lockScope: LOCK_SCOPE.SHARED })\n } catch {\n throw new HttpException('The file is locked', HttpStatus.LOCKED)\n }\n }\n const isMobile: boolean = this.mobileRegex.test(req.headers['user-agent'])\n const fileProps: FileProps = await getProps(space.realPath, space.dbFile.path)\n const fileId: string = ((await this.filesQueries.getSpaceFileId(fileProps, space.dbFile)) || fileProps.id).toString()\n const userToken: string = await this.genUserToken(user)\n const fileUrl = this.getDocumentUrl(space, userToken)\n const callBackUrl = this.getCallBackUrl(space, userToken, fileId)\n const config: OnlyOfficeReqConfig = await this.genConfiguration(user, space, mode, fileId, fileUrl, fileExtension, callBackUrl, isMobile)\n config.config.token = await this.genPayloadToken(config.config)\n return config\n }\n\n async callBack(user: UserModel, space: SpaceEnv, token: string, fileId: string) {\n const callBackData: OnlyOfficeCallBack = await this.jwt.verifyAsync(token, { secret: configuration.applications.files.onlyoffice.secret })\n try {\n switch (callBackData.status) {\n case 1:\n await this.checkFileLock(user, space, callBackData)\n this.logger.debug(`document is being edited : ${space.url}`)\n break\n case 2:\n await this.checkFileLock(user, space, callBackData)\n if (callBackData.notmodified) {\n this.logger.debug(`document was edited but closed with no changes : ${space.url}`)\n } else {\n this.logger.debug(`document was edited but not saved (let's do it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n }\n await this.removeDocumentKey(fileId, space)\n break\n case 3:\n this.logger.error(`document cannot be saved, an error has occurred (try to save it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n case 4:\n await this.removeFileLock(user.id, space)\n await this.removeDocumentKey(fileId, space)\n this.logger.debug(`document was closed with no changes : ${space.url}`)\n break\n case 6:\n this.logger.debug(`document is edited but save was requested : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n case 7:\n this.logger.error(`document cannot be force saved, an error has occurred (try to save it) : ${space.url}`)\n await this.saveDocument(space, callBackData.url)\n break\n default:\n this.logger.error('unhandled case')\n }\n } catch (e) {\n this.logger.error(`${this.callBack.name} - ${e.message} : ${space.url}`)\n return { error: e.message }\n }\n return { error: 0 }\n }\n\n private async genConfiguration(\n user: UserModel,\n space: SpaceEnv,\n mode: FILE_MODE,\n fileId: string,\n fileUrl: string,\n fileExtension: string,\n callBackUrl: string,\n isMobile: boolean\n ): Promise<OnlyOfficeReqConfig> {\n const documentType = ONLY_OFFICE_EXTENSIONS.EDITABLE.get(fileExtension) || ONLY_OFFICE_EXTENSIONS.VIEWABLE.get(fileExtension)\n return {\n documentServerUrl: this.externalOnlyOfficeServer || `${this.contextManager.headerOriginUrl()}${ONLY_OFFICE_INTERNAL_URI}`,\n config: {\n type: isMobile ? 'mobile' : 'desktop',\n height: '100%',\n width: '100%',\n documentType: documentType,\n document: {\n title: path.basename(space.relativeUrl),\n fileType: fileExtension,\n key: await this.getDocumentKey(fileId),\n permissions: {\n download: true,\n edit: mode === FILE_MODE.EDIT,\n changeHistory: false,\n comment: true,\n fillForms: true,\n print: true,\n review: mode === FILE_MODE.EDIT\n },\n url: fileUrl\n },\n editorConfig: {\n mode: mode,\n lang: 'en',\n region: 'en',\n callbackUrl: callBackUrl,\n user: { id: user.id.toString(), name: `${user.fullName} (${user.email})`, image: await getAvatarBase64(user.login) },\n coEditing: {\n mode: 'fast',\n change: true\n },\n embedded: {\n embedUrl: fileUrl,\n saveUrl: fileUrl,\n shareUrl: fileUrl,\n toolbarDocked: 'top'\n },\n customization: {\n about: false,\n autosave: false,\n forcesave: true,\n zoom: documentType === 'slide' ? 60 : 90,\n help: false,\n features: { featuresTips: false },\n plugins: false\n }\n }\n }\n }\n }\n\n private getDocumentUrl(space: SpaceEnv, token: string): string {\n // user refresh token is used here for long session\n return `${this.contextManager.headerOriginUrl()}${API_FILES_ONLY_OFFICE_DOCUMENT}/${space.url}?${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`\n }\n\n private getCallBackUrl(space: SpaceEnv, token: string, fileId: string): string {\n // user refresh token is used here for long session\n return `${this.contextManager.headerOriginUrl()}${API_FILES_ONLY_OFFICE_CALLBACK}/${space.url}?fid=${fileId}&${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${token}`\n }\n\n private genPayloadToken(payload: OnlyOfficeConfig | OnlyOfficeConvertForm): Promise<string> {\n return this.jwt.signAsync(payload, { secret: configuration.applications.files.onlyoffice.secret, expiresIn: 60 })\n }\n\n private genUserToken(user: UserModel): Promise<string> {\n // use refresh expiration to allow long session\n return this.jwt.signAsync(\n {\n identity: {\n id: user.id,\n login: user.login,\n email: user.email,\n fullName: user.fullName,\n language: user.language,\n role: user.role,\n applications: user.applications\n } satisfies JwtIdentityPayload\n },\n {\n secret: configuration.auth.token.access.secret,\n expiresIn: this.expiration\n }\n )\n }\n\n private async checkFileLock(user: UserModel, space: SpaceEnv, callBackData: OnlyOfficeCallBack) {\n for (const action of callBackData.actions) {\n if (action.type === 0) {\n // disconnect\n await this.removeFileLock(parseInt(action.userid), space)\n } else if (action.type === 1) {\n // connect\n await this.genFileLock(user, space)\n }\n }\n }\n\n private async genFileLock(user: UserModel, space: SpaceEnv): Promise<void> {\n const [ok, _fileLock] = await this.filesLockManager.create(\n user,\n space.dbFile,\n DEPTH.RESOURCE,\n {\n lockroot: null,\n locktoken: null,\n lockscope: LOCK_SCOPE.SHARED,\n owner: `OnlyOffice - ${user.fullName} (${user.email})`\n } satisfies WebDAVLock,\n this.expiration\n )\n if (!ok) {\n throw new Error('document is locked')\n }\n }\n\n private async removeFileLock(userId: number, space: SpaceEnv): Promise<void> {\n for (const lock of await this.filesLockManager.getLocksByPath(space.dbFile)) {\n if (lock.owner.id === userId) {\n await this.filesLockManager.removeLock(lock.key)\n }\n }\n }\n\n private async removeDocumentKey(fileId: string, space: SpaceEnv): Promise<void> {\n if (!(await this.filesLockManager.isPathLocked(space.dbFile))) {\n const cacheKey = this.getCacheKey(fileId)\n const r = await this.cache.del(cacheKey)\n this.logger.debug(`${this.removeDocumentKey.name} - ${cacheKey} ${r ? '' : 'not'} removed`)\n }\n }\n\n private async getDocumentKey(fileId: string): Promise<string> {\n const cacheKey = this.getCacheKey(fileId)\n const existingDocKey: string = await this.cache.get(cacheKey)\n if (existingDocKey) {\n return existingDocKey\n }\n const docKey = generateShortUUID(64)\n await this.cache.set(cacheKey, docKey, this.expiration)\n this.logger.debug(`${this.getDocumentKey.name} - ${cacheKey} (${docKey}) created`)\n return docKey\n }\n\n private async saveDocument(space: SpaceEnv, url: string): Promise<void> {\n /* url format:\n https://onlyoffice-server.com/cache/files/data/-33120641_7158/output.pptx/output.pptx\n ?md5=duFHKC-5d47s-RRcYn3hAw&expires=1739400549&shardkey=-33120641&filename=output.pptx\n */\n const urlParams = new URLSearchParams(url.split('?').at(-1))\n // it is not the md5 of the file but a md5 generated by the combination of the elements of the url\n const md5: string = urlParams.get('md5')\n const tmpFilePath = await uniqueFilePathFromDir(path.join(os.tmpdir(), `${md5}-${urlParams.get('filename')}`))\n\n // convert remote file to the local file with the current extension if these extensions aren't equal\n const localExtension = path.extname(space.realPath).slice(1)\n const remoteExtension = path.extname(urlParams.get('filename')).slice(1)\n\n let downloadUrl: string\n if (localExtension !== remoteExtension && !ONLY_OFFICE_CONVERT_EXTENSIONS.ALLOW_AUTO.has(localExtension)) {\n if (ONLY_OFFICE_CONVERT_EXTENSIONS.FROM.has(remoteExtension) && ONLY_OFFICE_CONVERT_EXTENSIONS.TO.has(localExtension)) {\n downloadUrl = await this.convertDocument(urlParams.get('shardkey'), url, remoteExtension, localExtension, space.url)\n } else {\n throw new Error(`document cannot be converted from ${remoteExtension} -> ${localExtension} : ${space.url}`)\n }\n } else {\n downloadUrl = url\n }\n\n // download file\n let res: AxiosResponse\n try {\n res = await this.http.axiosRef({\n method: HTTP_METHOD.GET,\n url: downloadUrl,\n responseType: 'stream',\n httpsAgent: new https.Agent({ rejectUnauthorized: this.rejectUnauthorized })\n })\n await writeFromStream(tmpFilePath, res.data)\n } catch (e) {\n throw new Error(`unable to get document : ${e.message}`)\n }\n\n // try to verify the downloaded size\n const contentLength = parseInt(res.headers['content-length'], 10)\n if (!isNaN(contentLength)) {\n if (contentLength === 0) {\n this.logger.debug(`${this.saveDocument.name} - content length is 0 : ${space.url}`)\n return\n }\n const tmpFileSize = await fileSize(tmpFilePath)\n if (tmpFileSize !== contentLength) {\n throw new Error(`document size differs (${tmpFileSize} != ${contentLength})`)\n }\n }\n // copy contents to avoid inode changes (fileId in some cases)\n try {\n await copyFileContent(tmpFilePath, space.realPath)\n await removeFiles(tmpFilePath)\n } catch (e) {\n throw new Error(`unable to save document : ${e.message}`)\n }\n }\n\n private async convertDocument(id: string, url: string, fileType: string, outputType: string, spaceUrl: string): Promise<string> {\n const key: string = `${id}-${crypto.randomBytes(20).toString('hex')}`.slice(0, 20).replace('-', '_')\n const payload: OnlyOfficeConvertForm = {\n key: key,\n url: url,\n filetype: fileType,\n outputtype: outputType,\n async: false\n }\n payload.token = await this.genPayloadToken(payload)\n let result: { fileUrl?: string; fileType?: string; endConvert?: boolean; error?: number }\n try {\n const res: AxiosResponse = await this.http.axiosRef({\n method: HTTP_METHOD.POST,\n url: this.convertUrl,\n data: payload,\n httpsAgent: new https.Agent({ rejectUnauthorized: this.rejectUnauthorized })\n })\n result = res.data\n } catch (e) {\n throw new Error(`convert failed with status : ${e.response.status}`)\n }\n if (result.error) {\n throw new Error(`convert failed with reason : ${ONLY_OFFICE_CONVERT_ERROR.get(result.error)}`)\n }\n if (result.endConvert) {\n this.logger.log(`${this.convertDocument.name} - ${fileType} -> ${outputType} : ${spaceUrl}`)\n return result.fileUrl\n }\n }\n\n private getCacheKey(fileId: string): string {\n return `${CACHE_ONLY_OFFICE}|${fileId}`\n }\n}\n"],"names":["FilesOnlyOfficeManager","getStatus","enabled","configuration","applications","files","onlyoffice","getSettings","user","space","mode","req","isPathExists","realPath","HttpException","HttpStatus","NOT_FOUND","isPathIsDir","BAD_REQUEST","fileExtension","path","extname","slice","ONLY_OFFICE_EXTENSIONS","VIEWABLE","has","EDITABLE","FILE_MODE","EDIT","haveSpaceEnvPermissions","SPACE_OPERATION","MODIFY","VIEW","filesLockManager","checkConflicts","dbFile","DEPTH","RESOURCE","userId","id","lockScope","LOCK_SCOPE","SHARED","LOCKED","isMobile","mobileRegex","test","headers","fileProps","getProps","fileId","filesQueries","getSpaceFileId","toString","userToken","genUserToken","fileUrl","getDocumentUrl","callBackUrl","getCallBackUrl","config","genConfiguration","token","genPayloadToken","callBack","callBackData","jwt","verifyAsync","secret","status","checkFileLock","logger","debug","url","notmodified","saveDocument","removeDocumentKey","error","removeFileLock","e","name","message","documentType","get","documentServerUrl","externalOnlyOfficeServer","contextManager","headerOriginUrl","ONLY_OFFICE_INTERNAL_URI","type","height","width","document","title","basename","relativeUrl","fileType","key","getDocumentKey","permissions","download","edit","changeHistory","comment","fillForms","print","review","editorConfig","lang","region","callbackUrl","fullName","email","image","getAvatarBase64","login","coEditing","change","embedded","embedUrl","saveUrl","shareUrl","toolbarDocked","customization","about","autosave","forcesave","zoom","help","features","featuresTips","plugins","API_FILES_ONLY_OFFICE_DOCUMENT","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","API_FILES_ONLY_OFFICE_CALLBACK","payload","signAsync","expiresIn","identity","language","role","auth","access","expiration","action","actions","parseInt","userid","genFileLock","ok","_fileLock","create","lockroot","locktoken","lockscope","owner","Error","lock","getLocksByPath","removeLock","isPathLocked","cacheKey","getCacheKey","r","cache","del","existingDocKey","docKey","generateShortUUID","set","urlParams","URLSearchParams","split","at","md5","tmpFilePath","uniqueFilePathFromDir","join","os","tmpdir","localExtension","remoteExtension","downloadUrl","ONLY_OFFICE_CONVERT_EXTENSIONS","ALLOW_AUTO","FROM","TO","convertDocument","res","http","axiosRef","method","HTTP_METHOD","GET","responseType","httpsAgent","https","Agent","rejectUnauthorized","writeFromStream","data","contentLength","isNaN","tmpFileSize","fileSize","copyFileContent","removeFiles","outputType","spaceUrl","crypto","randomBytes","replace","filetype","outputtype","async","result","POST","convertUrl","response","ONLY_OFFICE_CONVERT_ERROR","endConvert","log","CACHE_ONLY_OFFICE","Logger","externalServer","verifySSL","convertHumanTimeToSeconds","refresh"],"mappings":"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"}
@@ -135,7 +135,7 @@ let FilesParser = class FilesParser {
135
135
  id: _sharesschema.shares.id,
136
136
  alias: _sharesschema.shares.alias,
137
137
  externalPath: (0, _drizzleorm.sql)`IF (${_sharesschema.shares.externalPath} IS NOT NULL, ${_sharesschema.shares.externalPath}, ${_spacesrootsschema.spacesRoots.externalPath})`,
138
- isDir: (0, _drizzleorm.sql)`IF (${_sharesschema.shares.externalPath} IS NOT NULL, 1, ${_filesschema.files.isDir})`,
138
+ isDir: (0, _drizzleorm.sql)`IF (${_sharesschema.shares.externalPath} IS NOT NULL AND ${_sharesschema.shares.fileId} IS NULL, 1, ${_filesschema.files.isDir})`,
139
139
  file: {
140
140
  path: (0, _drizzleorm.sql)`IF (${_filesschema.files.id} IS NOT NULL, ${(0, _filesschema.filePathSQL)(_filesschema.files)}, '.')`,
141
141
  fromOwner: _usersschema.users.login,
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-parser.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, eq, inArray, isNotNull, isNull, lte, or, sql } from 'drizzle-orm'\nimport path from 'node:path'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray } from '../../../infrastructure/database/utils'\nimport { SHARE_TYPE } from '../../shares/constants/shares'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { users } from '../../users/schemas/users.schema'\nimport { FileParseContext, FileParseType } from '../interfaces/file-parse-index'\nimport { filePathSQL, files } from '../schemas/files.schema'\nimport { isPathExists } from '../utils/files'\n\n@Injectable()\nexport class FilesParser {\n private readonly logger = new Logger(FilesParser.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n async *allPaths(userId?: number, spaceIds?: number[], shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n yield* this.userPaths(userId)\n yield* this.spacePaths(spaceIds)\n yield* this.sharePaths(shareIds)\n }\n\n async *userPaths(userId?: number): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const user of await this.db\n .select({\n id: users.id,\n login: users.login\n })\n .from(users)\n .where(and(...[eq(users.storageIndexing, true), lte(users.role, USER_ROLE.USER), ...(userId ? [eq(users.id, userId)] : [])]))) {\n const userFilesPath = UserModel.getFilesPath(user.login)\n if (!(await isPathExists(userFilesPath))) {\n this.logger.warn(`${this.userPaths.name} - user path does not exist : ${userFilesPath}`)\n continue\n }\n yield [user.id, 'user', [{ realPath: userFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${SPACE_ALIAS.PERSONAL}`, isDir: true }]]\n }\n }\n\n async *spacePaths(spaceIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const space of await this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n roots: concatDistinctObjectsInArray(spacesRoots.alias, {\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n isDir: sql<boolean>`IF (${spacesRoots.externalPath} IS NOT NULL, 1, ${files.isDir})`,\n file: {\n path: filePathSQL(files),\n fromOwner: users.login\n }\n })\n })\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .where(and(eq(spaces.storageIndexing, true), ...(spaceIds ? [inArray(spaces.id, spaceIds)] : [])))\n .groupBy(spaces.id)) {\n const spaceFilesPath = SpaceModel.getFilesPath(space.alias)\n if (!(await isPathExists(spaceFilesPath))) {\n this.logger.warn(`${this.spacePaths.name} - space path does not exist : ${spaceFilesPath}`)\n continue\n }\n const spacePath = [{ realPath: spaceFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}`, isDir: true }]\n const rootPaths = space.roots.map(\n (r: any): FileParseContext =>\n r.externalPath\n ? {\n realPath: r.externalPath,\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n : {\n realPath: path.join(UserModel.getFilesPath(r.file.fromOwner), r.file.path),\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n )\n yield [space.id, 'space', [...spacePath, ...rootPaths]]\n }\n }\n\n async *sharePaths(shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const share of await this.db\n .select({\n id: shares.id,\n alias: shares.alias,\n externalPath: sql<string>`IF (${shares.externalPath} IS NOT NULL, ${shares.externalPath}, ${spacesRoots.externalPath})`,\n isDir: sql<boolean>`IF (${shares.externalPath} IS NOT NULL, 1, ${files.isDir})`,\n file: { path: sql<string>`IF (${files.id} IS NOT NULL, ${filePathSQL(files)}, '.')`, fromOwner: users.login, fromSpace: spaces.alias }\n })\n .from(shares)\n .leftJoin(spacesRoots, eq(spacesRoots.id, shares.spaceRootId))\n .leftJoin(\n files,\n or(\n // If the child share is from a share with an external path, the child share should have an external path and a fileId\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNull(shares.fileId), isNotNull(spacesRoots.fileId), eq(files.id, spacesRoots.fileId))\n )\n )\n .leftJoin(spaces, and(isNull(shares.externalPath), isNotNull(files.spaceId), eq(spaces.id, files.spaceId), eq(spaces.storageIndexing, true)))\n .leftJoin(users, and(eq(users.id, files.ownerId), eq(users.storageIndexing, true)))\n .where(and(eq(shares.storageIndexing, true), ...[eq(shares.type, SHARE_TYPE.COMMON), ...(shareIds ? [inArray(shares.id, shareIds)] : [])]))\n .groupBy(shares.id)) {\n let shareFilesPath: string\n if (share.externalPath) {\n shareFilesPath = path.join(share.externalPath, share.file.path)\n } else if (share.file.fromOwner) {\n shareFilesPath = path.join(UserModel.getFilesPath(share.file.fromOwner), share.file.path)\n } else if (share.file.fromSpace) {\n shareFilesPath = path.join(SpaceModel.getFilesPath(share.file.fromSpace), share.file.path)\n } else {\n // Exclude shares that don’t match these cases (join conditions)\n continue\n }\n if (!(await isPathExists(shareFilesPath))) {\n this.logger.warn(`${this.sharePaths.name} - share path does not exist : ${shareFilesPath}`)\n continue\n }\n yield [share.id, 'share', [{ realPath: shareFilesPath, pathPrefix: `${SPACE_REPOSITORY.SHARES}/${share.alias}`, isDir: share.isDir }]]\n }\n }\n}\n"],"names":["FilesParser","allPaths","userId","spaceIds","shareIds","userPaths","spacePaths","sharePaths","user","db","select","id","users","login","from","where","and","eq","storageIndexing","lte","role","USER_ROLE","USER","userFilesPath","UserModel","getFilesPath","isPathExists","logger","warn","name","realPath","pathPrefix","SPACE_REPOSITORY","FILES","SPACE_ALIAS","PERSONAL","isDir","space","spaces","alias","roots","concatDistinctObjectsInArray","spacesRoots","externalPath","sql","files","file","path","filePathSQL","fromOwner","leftJoin","spaceId","fileId","ownerId","inArray","groupBy","spaceFilesPath","SpaceModel","spacePath","rootPaths","map","r","join","share","shares","fromSpace","spaceRootId","or","isNotNull","isNull","type","SHARE_TYPE","COMMON","shareFilesPath","SHARES","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-parser.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, eq, inArray, isNotNull, isNull, lte, or, sql } from 'drizzle-orm'\nimport path from 'node:path'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray } from '../../../infrastructure/database/utils'\nimport { SHARE_TYPE } from '../../shares/constants/shares'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { SpaceModel } from '../../spaces/models/space.model'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { USER_ROLE } from '../../users/constants/user'\nimport { UserModel } from '../../users/models/user.model'\nimport { users } from '../../users/schemas/users.schema'\nimport { FileParseContext, FileParseType } from '../interfaces/file-parse-index'\nimport { filePathSQL, files } from '../schemas/files.schema'\nimport { isPathExists } from '../utils/files'\n\n@Injectable()\nexport class FilesParser {\n private readonly logger = new Logger(FilesParser.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n async *allPaths(userId?: number, spaceIds?: number[], shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n yield* this.userPaths(userId)\n yield* this.spacePaths(spaceIds)\n yield* this.sharePaths(shareIds)\n }\n\n async *userPaths(userId?: number): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const user of await this.db\n .select({\n id: users.id,\n login: users.login\n })\n .from(users)\n .where(and(...[eq(users.storageIndexing, true), lte(users.role, USER_ROLE.USER), ...(userId ? [eq(users.id, userId)] : [])]))) {\n const userFilesPath = UserModel.getFilesPath(user.login)\n if (!(await isPathExists(userFilesPath))) {\n this.logger.warn(`${this.userPaths.name} - user path does not exist : ${userFilesPath}`)\n continue\n }\n yield [user.id, 'user', [{ realPath: userFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${SPACE_ALIAS.PERSONAL}`, isDir: true }]]\n }\n }\n\n async *spacePaths(spaceIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const space of await this.db\n .select({\n id: spaces.id,\n alias: spaces.alias,\n roots: concatDistinctObjectsInArray(spacesRoots.alias, {\n alias: spacesRoots.alias,\n externalPath: spacesRoots.externalPath,\n isDir: sql<boolean>`IF (${spacesRoots.externalPath} IS NOT NULL, 1, ${files.isDir})`,\n file: {\n path: filePathSQL(files),\n fromOwner: users.login\n }\n })\n })\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(files, eq(files.id, spacesRoots.fileId))\n .leftJoin(users, eq(users.id, files.ownerId))\n .where(and(eq(spaces.storageIndexing, true), ...(spaceIds ? [inArray(spaces.id, spaceIds)] : [])))\n .groupBy(spaces.id)) {\n const spaceFilesPath = SpaceModel.getFilesPath(space.alias)\n if (!(await isPathExists(spaceFilesPath))) {\n this.logger.warn(`${this.spacePaths.name} - space path does not exist : ${spaceFilesPath}`)\n continue\n }\n const spacePath = [{ realPath: spaceFilesPath, pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}`, isDir: true }]\n const rootPaths = space.roots.map(\n (r: any): FileParseContext =>\n r.externalPath\n ? {\n realPath: r.externalPath,\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n : {\n realPath: path.join(UserModel.getFilesPath(r.file.fromOwner), r.file.path),\n pathPrefix: `${SPACE_REPOSITORY.FILES}/${space.alias}/${r.alias}`,\n isDir: r.isDir\n }\n )\n yield [space.id, 'space', [...spacePath, ...rootPaths]]\n }\n }\n\n async *sharePaths(shareIds?: number[]): AsyncGenerator<[number, FileParseType, FileParseContext[]]> {\n for (const share of await this.db\n .select({\n id: shares.id,\n alias: shares.alias,\n externalPath: sql<string>`IF (${shares.externalPath} IS NOT NULL, ${shares.externalPath}, ${spacesRoots.externalPath})`,\n isDir: sql<boolean>`IF (${shares.externalPath} IS NOT NULL AND ${shares.fileId} IS NULL, 1, ${files.isDir})`,\n file: { path: sql<string>`IF (${files.id} IS NOT NULL, ${filePathSQL(files)}, '.')`, fromOwner: users.login, fromSpace: spaces.alias }\n })\n .from(shares)\n .leftJoin(spacesRoots, eq(spacesRoots.id, shares.spaceRootId))\n .leftJoin(\n files,\n or(\n // If the child share is from a share with an external path, the child share should have an external path and a fileId\n and(isNotNull(shares.fileId), eq(files.id, shares.fileId)),\n and(isNull(shares.externalPath), isNull(shares.fileId), isNotNull(spacesRoots.fileId), eq(files.id, spacesRoots.fileId))\n )\n )\n .leftJoin(spaces, and(isNull(shares.externalPath), isNotNull(files.spaceId), eq(spaces.id, files.spaceId), eq(spaces.storageIndexing, true)))\n .leftJoin(users, and(eq(users.id, files.ownerId), eq(users.storageIndexing, true)))\n .where(and(eq(shares.storageIndexing, true), ...[eq(shares.type, SHARE_TYPE.COMMON), ...(shareIds ? [inArray(shares.id, shareIds)] : [])]))\n .groupBy(shares.id)) {\n let shareFilesPath: string\n if (share.externalPath) {\n shareFilesPath = path.join(share.externalPath, share.file.path)\n } else if (share.file.fromOwner) {\n shareFilesPath = path.join(UserModel.getFilesPath(share.file.fromOwner), share.file.path)\n } else if (share.file.fromSpace) {\n shareFilesPath = path.join(SpaceModel.getFilesPath(share.file.fromSpace), share.file.path)\n } else {\n // Exclude shares that don’t match these cases (join conditions)\n continue\n }\n if (!(await isPathExists(shareFilesPath))) {\n this.logger.warn(`${this.sharePaths.name} - share path does not exist : ${shareFilesPath}`)\n continue\n }\n yield [share.id, 'share', [{ realPath: shareFilesPath, pathPrefix: `${SPACE_REPOSITORY.SHARES}/${share.alias}`, isDir: share.isDir }]]\n }\n }\n}\n"],"names":["FilesParser","allPaths","userId","spaceIds","shareIds","userPaths","spacePaths","sharePaths","user","db","select","id","users","login","from","where","and","eq","storageIndexing","lte","role","USER_ROLE","USER","userFilesPath","UserModel","getFilesPath","isPathExists","logger","warn","name","realPath","pathPrefix","SPACE_REPOSITORY","FILES","SPACE_ALIAS","PERSONAL","isDir","space","spaces","alias","roots","concatDistinctObjectsInArray","spacesRoots","externalPath","sql","files","file","path","filePathSQL","fromOwner","leftJoin","spaceId","fileId","ownerId","inArray","groupBy","spaceFilesPath","SpaceModel","spacePath","rootPaths","map","r","join","share","shares","fromSpace","spaceRootId","or","isNotNull","isNull","type","SHARE_TYPE","COMMON","shareFilesPath","SHARES","Logger"],"mappings":"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"}
@@ -97,6 +97,16 @@ let FilesQueries = class FilesQueries {
97
97
  }
98
98
  return q;
99
99
  }
100
+ async getUserFile(userId, fileId) {
101
+ if (fileId > 0) {
102
+ const [fileInDB] = await this.db.select({
103
+ id: _filesschema.files.id,
104
+ path: (0, _filesschema.filePathSQL)(_filesschema.files)
105
+ }).from(_filesschema.files).where((0, _drizzleorm.and)((0, _drizzleorm.eq)(_filesschema.files.ownerId, userId), (0, _drizzleorm.eq)(_filesschema.files.id, fileId))).limit(1);
106
+ return fileInDB;
107
+ }
108
+ return null;
109
+ }
100
110
  async getOrCreateUserFile(userId, file) {
101
111
  if (file.id && file.id > 0) {
102
112
  const [searchFileInDB] = await this.db.select({
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNull, or, SelectedFields, sql, SQL } from 'drizzle-orm'\nimport { popFromObject } from '../../../common/shared'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, convertToWhere, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { FileDBProps } from '../interfaces/file-db-props.interface'\nimport { FileProps } from '../interfaces/file-props.interface'\nimport { FileRecentLocation } from '../interfaces/file-recent-location.interface'\nimport { FileRecent } from '../schemas/file-recent.interface'\nimport { File } from '../schemas/file.interface'\nimport { filesRecents } from '../schemas/files-recents.schema'\nimport { childFilesFindRegexp, childFilesReplaceRegexp, files } from '../schemas/files.schema'\nimport { dirName, fileName } from '../utils/files'\n\n@Injectable()\nexport class FilesQueries {\n private readonly logger = new Logger(FilesQueries.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n browseFiles(\n userId: number,\n dbFile: FileDBProps,\n options: {\n withSpaces?: boolean\n withShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n ignoreChildShares?: boolean\n }\n ): Promise<FileProps[]> {\n const q = this.db\n .select({\n id: files.id,\n path: files.path,\n name: files.name,\n isDir: files.isDir,\n mime: files.mime,\n size: files.size,\n mtime: files.mtime,\n ctime: files.ctime,\n ...(options.withSpaces && { spaces: concatDistinctObjectsInArray(spaces.id, { id: spaces.id, alias: spaces.alias, name: spaces.name }) }),\n ...(options.withShares && {\n shares: concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })\n }),\n ...(options.withSyncs && {\n syncs: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })\n }),\n ...(options.withHasComments && { hasComments: sql`${fileHasCommentsSubquerySQL(files.id)}`.mapWith(Boolean) })\n })\n .from(files)\n .where(and(...convertToWhere(files, dbFile)))\n .groupBy(files.id)\n if (options.withSpaces) {\n // show spaces for files in personal space\n q.leftJoin(spacesRoots, eq(spacesRoots.fileId, files.id))\n q.leftJoin(spaces, eq(spaces.id, spacesRoots.spaceId))\n }\n if (options.withShares) {\n q.leftJoin(\n shares,\n and(...[eq(shares.ownerId, userId), eq(shares.fileId, files.id)], ...(options.ignoreChildShares ? [isNull(shares.parentId)] : []))\n )\n }\n if (options.withSyncs) {\n q.leftJoin(syncClients, eq(syncClients.ownerId, userId))\n q.leftJoin(syncPaths, and(eq(syncPaths.clientId, syncClients.id), eq(syncPaths.fileId, files.id)))\n }\n return q\n }\n\n async getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n if (file.id && file.id > 0) {\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(eq(files.ownerId, userId), eq(files.id, file.id)))\n .limit(1)\n if (searchFileInDB?.id === file.id) {\n return file.id\n } else {\n this.logger.warn(`${this.getOrCreateUserFile.name} - file mismatch : ${JSON.stringify(searchFileInDB)} !== ${JSON.stringify(file)}`)\n }\n }\n return dbGetInsertedId(await this.db.insert(files).values({ ...file, id: undefined, ownerId: userId } as File))\n }\n\n async getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n if (fileId && fileId > 0) {\n const fileInDB = {\n ...dbFile,\n name: file.name,\n path: file.path,\n isDir: file.isDir\n }\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(...convertToWhere(files, fileInDB), eq(files.id, fileId)))\n .limit(1)\n if (searchFileInDB?.id === fileId) {\n return fileId\n } else {\n this.logger.warn(`${this.getOrCreateSpaceFile.name} - file mismatch : ${JSON.stringify(dbFile)} -> ${fileId} !== ${searchFileInDB?.id}`)\n }\n }\n // order is important, path is replaced by the FileProps.path\n return dbGetInsertedId(await this.db.insert(files).values({ ...dbFile, ...file }))\n }\n\n async getSpaceFileId(file: FileProps, dbFile: FileDBProps): Promise<number> {\n const fileInDB = {\n ...dbFile,\n name: file.name,\n path: file.path,\n isDir: file.isDir\n }\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(...convertToWhere(files, fileInDB)))\n .limit(1)\n return searchFileInDB?.id\n }\n\n async updateFile(id: number, file: Partial<FileProps>): Promise<void> {\n try {\n dbCheckAffectedRows(await this.db.update(files).set(file).where(eq(files.id, id)), 1)\n } catch (e) {\n this.logger.error(`${this.updateFile.name} - file (${id}) properties was not updated : ${e}`)\n }\n }\n\n async deleteFiles(props: FileDBProps, isDir: boolean, force = false): Promise<void> {\n const commonProps: Omit<FileDBProps, 'path'> = {\n ownerId: props.ownerId || null,\n spaceId: props.spaceId || null,\n spaceExternalRootId: props.spaceExternalRootId || null,\n shareExternalId: props.shareExternalId || null,\n inTrash: props.inTrash\n }\n\n // prepare file update/delete\n const fileProps: FileDBProps & { name: string; isDir: boolean } = {\n ...commonProps,\n path: dirName(props.path),\n name: fileName(props.path),\n isDir: isDir\n }\n\n // prepare (or not) the child files update/delete\n const childFiles = isDir ? childFilesFindRegexp(props.path) : null\n if (fileProps.inTrash || force) {\n // delete file\n await this.db.delete(files).where(and(...convertToWhere(files, fileProps)))\n if (childFiles) {\n // delete child files\n await this.db.delete(files).where(and(...[...convertToWhere(files, commonProps), childFiles]))\n }\n } else {\n // move file to trash\n await this.db\n .update(files)\n .set({ inTrash: true } as File)\n .where(and(...convertToWhere(files, fileProps)))\n if (childFiles) {\n // move child files to trash\n await this.db\n .update(files)\n .set({ inTrash: true } as File)\n .where(and(...convertToWhere(files, commonProps), childFiles))\n }\n }\n }\n\n async moveFiles(srcProps: FileDBProps, dstProps: FileDBProps, isDir: boolean): Promise<void> {\n const srcCommonProps: Omit<FileDBProps, 'path'> = {\n ownerId: srcProps.ownerId || null,\n spaceId: srcProps.spaceId || null,\n spaceExternalRootId: srcProps.spaceExternalRootId || null,\n shareExternalId: srcProps.shareExternalId || null,\n inTrash: srcProps.inTrash\n }\n const dstCommonProps: Omit<FileDBProps, 'path'> = {\n ownerId: dstProps.ownerId || null,\n spaceId: dstProps.spaceId || null,\n spaceExternalRootId: dstProps.spaceExternalRootId || null,\n shareExternalId: dstProps.shareExternalId || null,\n inTrash: dstProps.inTrash\n }\n\n // prepare file props update\n const srcFileDB: FileDBProps & { name: string; isDir: boolean } = {\n ...srcCommonProps,\n path: dirName(srcProps.path),\n name: fileName(srcProps.path),\n isDir: isDir\n }\n const dstFileDB: FileDBProps & { name: string; isDir: boolean } = {\n ...dstCommonProps,\n path: dirName(dstProps.path),\n name: fileName(dstProps.path),\n isDir: isDir\n }\n\n // update file props\n await this.db\n .update(files)\n .set(dstFileDB)\n .where(and(...convertToWhere(files, srcFileDB)))\n if (isDir) {\n // prepare child file props update\n const childFiles: SQL<string> = childFilesFindRegexp(srcProps.path)\n const childProps: Omit<FileDBProps, 'path'> & { path: SQL<string> } = {\n ...dstCommonProps,\n path: childFilesReplaceRegexp(srcProps.path, dstProps.path)\n }\n // update child file props\n await this.db\n .update(files)\n .set(childProps)\n .where(and(...convertToWhere(files, srcCommonProps), childFiles))\n }\n }\n\n async compareAndUpdateFileProps(dbFile: FileProps, fsFile: FileProps): Promise<void> {\n if (\n dbFile.isDir !== fsFile.isDir ||\n dbFile.size !== fsFile.size ||\n dbFile.ctime !== fsFile.ctime ||\n dbFile.mtime !== fsFile.mtime ||\n dbFile.mime !== fsFile.mime\n ) {\n this.logger.verbose(`${this.compareAndUpdateFileProps.name} - ${dbFile.path} (${dbFile.id})`)\n await this.updateFile(dbFile.id, {\n isDir: fsFile.isDir,\n size: fsFile.size,\n ctime: fsFile.ctime,\n mtime: fsFile.mtime,\n mime: fsFile.mime\n })\n }\n }\n\n getRecentsFromUser(userId: number, spaceIds: number[], shareIds: number[], limit = 10): Promise<FileRecent[]> {\n return this.db\n .select({\n id: filesRecents.id,\n ownerId: sql<number>`IF(${filesRecents.ownerId} IS NULL, 0, 1)`.as('ownerId'),\n spaceId: sql<number>`IF(${filesRecents.spaceId} IS NULL, 0, 1)`.as('spaceId'),\n shareId: sql<number>`IF(${filesRecents.shareId} IS NULL, 0, 1)`.as('shareId'),\n path: filesRecents.path,\n name: filesRecents.name,\n mime: filesRecents.mime,\n mtime: filesRecents.mtime\n } satisfies FileRecent | SelectedFields<any, any>)\n .from(filesRecents)\n .where(or(eq(filesRecents.ownerId, userId), inArray(filesRecents.spaceId, spaceIds), inArray(filesRecents.shareId, shareIds)))\n .groupBy(filesRecents.id)\n .orderBy(desc(filesRecents.mtime))\n .limit(limit)\n }\n\n getRecentsFromLocation(location: Partial<Record<keyof FileRecent, any>>): Promise<FileRecent[]> {\n const where: SQL[] = convertToWhere(filesRecents, location)\n return this.db\n .select(getTableColumns(filesRecents))\n .from(filesRecents)\n .where(and(...where))\n }\n\n async updateRecents(\n location: FileRecentLocation,\n add: Partial<FileRecent>[] | FileRecent[],\n update: Record<string | 'object', Partial<FileProps> | FileProps>[],\n remove: FileRecent['id'][]\n ): Promise<void> {\n const where: SQL[] = convertToWhere(filesRecents, location)\n // add\n if (add.length) {\n try {\n await this.db.insert(filesRecents).values(add as FileRecent[])\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n // update\n if (update.length) {\n for (const props of update) {\n const f: FileProps = popFromObject('object', props)\n try {\n await this.db\n .update(filesRecents)\n .set({ ...props })\n .where(and(...where, eq(filesRecents.id, f.id)))\n .limit(1)\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n }\n // remove\n if (remove.length) {\n try {\n await this.db.delete(filesRecents).where(and(...where, inArray(filesRecents.id, remove)))\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n }\n}\n"],"names":["FilesQueries","browseFiles","userId","dbFile","options","q","db","select","id","files","path","name","isDir","mime","size","mtime","ctime","withSpaces","spaces","concatDistinctObjectsInArray","alias","withShares","shares","type","withSyncs","syncs","syncPaths","clientId","syncClients","clientName","sql","info","withHasComments","hasComments","fileHasCommentsSubquerySQL","mapWith","Boolean","from","where","and","convertToWhere","groupBy","leftJoin","spacesRoots","eq","fileId","spaceId","ownerId","ignoreChildShares","isNull","parentId","getOrCreateUserFile","file","searchFileInDB","limit","logger","warn","JSON","stringify","dbGetInsertedId","insert","values","undefined","getOrCreateSpaceFile","fileInDB","getSpaceFileId","updateFile","dbCheckAffectedRows","update","set","e","error","deleteFiles","props","force","commonProps","spaceExternalRootId","shareExternalId","inTrash","fileProps","dirName","fileName","childFiles","childFilesFindRegexp","delete","moveFiles","srcProps","dstProps","srcCommonProps","dstCommonProps","srcFileDB","dstFileDB","childProps","childFilesReplaceRegexp","compareAndUpdateFileProps","fsFile","verbose","getRecentsFromUser","spaceIds","shareIds","filesRecents","as","shareId","or","inArray","orderBy","desc","getRecentsFromLocation","location","getTableColumns","updateRecents","add","remove","length","f","popFromObject","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/services/files-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable, Logger } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNull, or, SelectedFields, sql, SQL } from 'drizzle-orm'\nimport { popFromObject } from '../../../common/shared'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, convertToWhere, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { fileHasCommentsSubquerySQL } from '../../comments/schemas/comments.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { syncClients } from '../../sync/schemas/sync-clients.schema'\nimport { syncPaths } from '../../sync/schemas/sync-paths.schema'\nimport { FileDBProps } from '../interfaces/file-db-props.interface'\nimport { FileProps } from '../interfaces/file-props.interface'\nimport { FileRecentLocation } from '../interfaces/file-recent-location.interface'\nimport { FileRecent } from '../schemas/file-recent.interface'\nimport { File } from '../schemas/file.interface'\nimport { filesRecents } from '../schemas/files-recents.schema'\nimport { childFilesFindRegexp, childFilesReplaceRegexp, filePathSQL, files } from '../schemas/files.schema'\nimport { dirName, fileName } from '../utils/files'\n\n@Injectable()\nexport class FilesQueries {\n private readonly logger = new Logger(FilesQueries.name)\n\n constructor(@Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema) {}\n\n browseFiles(\n userId: number,\n dbFile: FileDBProps,\n options: {\n withSpaces?: boolean\n withShares?: boolean\n withSyncs?: boolean\n withHasComments?: boolean\n ignoreChildShares?: boolean\n }\n ): Promise<FileProps[]> {\n const q = this.db\n .select({\n id: files.id,\n path: files.path,\n name: files.name,\n isDir: files.isDir,\n mime: files.mime,\n size: files.size,\n mtime: files.mtime,\n ctime: files.ctime,\n ...(options.withSpaces && { spaces: concatDistinctObjectsInArray(spaces.id, { id: spaces.id, alias: spaces.alias, name: spaces.name }) }),\n ...(options.withShares && {\n shares: concatDistinctObjectsInArray(shares.id, {\n id: shares.id,\n alias: shares.alias,\n name: shares.name,\n type: shares.type\n })\n }),\n ...(options.withSyncs && {\n syncs: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n clientId: syncClients.id,\n clientName: sql`JSON_VALUE(${syncClients.info}, '$.node')`\n })\n }),\n ...(options.withHasComments && { hasComments: sql`${fileHasCommentsSubquerySQL(files.id)}`.mapWith(Boolean) })\n })\n .from(files)\n .where(and(...convertToWhere(files, dbFile)))\n .groupBy(files.id)\n if (options.withSpaces) {\n // show spaces for files in personal space\n q.leftJoin(spacesRoots, eq(spacesRoots.fileId, files.id))\n q.leftJoin(spaces, eq(spaces.id, spacesRoots.spaceId))\n }\n if (options.withShares) {\n q.leftJoin(\n shares,\n and(...[eq(shares.ownerId, userId), eq(shares.fileId, files.id)], ...(options.ignoreChildShares ? [isNull(shares.parentId)] : []))\n )\n }\n if (options.withSyncs) {\n q.leftJoin(syncClients, eq(syncClients.ownerId, userId))\n q.leftJoin(syncPaths, and(eq(syncPaths.clientId, syncClients.id), eq(syncPaths.fileId, files.id)))\n }\n return q\n }\n\n async getUserFile(userId: number, fileId: number): Promise<Pick<File, 'id' | 'path'>> {\n if (fileId > 0) {\n const [fileInDB] = await this.db\n .select({ id: files.id, path: filePathSQL(files) })\n .from(files)\n .where(and(eq(files.ownerId, userId), eq(files.id, fileId)))\n .limit(1)\n return fileInDB\n }\n return null\n }\n\n async getOrCreateUserFile(userId: number, file: FileProps): Promise<number> {\n if (file.id && file.id > 0) {\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(eq(files.ownerId, userId), eq(files.id, file.id)))\n .limit(1)\n if (searchFileInDB?.id === file.id) {\n return file.id\n } else {\n this.logger.warn(`${this.getOrCreateUserFile.name} - file mismatch : ${JSON.stringify(searchFileInDB)} !== ${JSON.stringify(file)}`)\n }\n }\n return dbGetInsertedId(await this.db.insert(files).values({ ...file, id: undefined, ownerId: userId } as File))\n }\n\n async getOrCreateSpaceFile(fileId: number, file: FileProps, dbFile: FileDBProps): Promise<number> {\n if (fileId && fileId > 0) {\n const fileInDB = {\n ...dbFile,\n name: file.name,\n path: file.path,\n isDir: file.isDir\n }\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(...convertToWhere(files, fileInDB), eq(files.id, fileId)))\n .limit(1)\n if (searchFileInDB?.id === fileId) {\n return fileId\n } else {\n this.logger.warn(`${this.getOrCreateSpaceFile.name} - file mismatch : ${JSON.stringify(dbFile)} -> ${fileId} !== ${searchFileInDB?.id}`)\n }\n }\n // order is important, path is replaced by the FileProps.path\n return dbGetInsertedId(await this.db.insert(files).values({ ...dbFile, ...file }))\n }\n\n async getSpaceFileId(file: FileProps, dbFile: FileDBProps): Promise<number> {\n const fileInDB = {\n ...dbFile,\n name: file.name,\n path: file.path,\n isDir: file.isDir\n }\n const [searchFileInDB] = await this.db\n .select({ id: files.id })\n .from(files)\n .where(and(...convertToWhere(files, fileInDB)))\n .limit(1)\n return searchFileInDB?.id\n }\n\n async updateFile(id: number, file: Partial<FileProps>): Promise<void> {\n try {\n dbCheckAffectedRows(await this.db.update(files).set(file).where(eq(files.id, id)), 1)\n } catch (e) {\n this.logger.error(`${this.updateFile.name} - file (${id}) properties was not updated : ${e}`)\n }\n }\n\n async deleteFiles(props: FileDBProps, isDir: boolean, force = false): Promise<void> {\n const commonProps: Omit<FileDBProps, 'path'> = {\n ownerId: props.ownerId || null,\n spaceId: props.spaceId || null,\n spaceExternalRootId: props.spaceExternalRootId || null,\n shareExternalId: props.shareExternalId || null,\n inTrash: props.inTrash\n }\n\n // prepare file update/delete\n const fileProps: FileDBProps & { name: string; isDir: boolean } = {\n ...commonProps,\n path: dirName(props.path),\n name: fileName(props.path),\n isDir: isDir\n }\n\n // prepare (or not) the child files update/delete\n const childFiles = isDir ? childFilesFindRegexp(props.path) : null\n if (fileProps.inTrash || force) {\n // delete file\n await this.db.delete(files).where(and(...convertToWhere(files, fileProps)))\n if (childFiles) {\n // delete child files\n await this.db.delete(files).where(and(...[...convertToWhere(files, commonProps), childFiles]))\n }\n } else {\n // move file to trash\n await this.db\n .update(files)\n .set({ inTrash: true } as File)\n .where(and(...convertToWhere(files, fileProps)))\n if (childFiles) {\n // move child files to trash\n await this.db\n .update(files)\n .set({ inTrash: true } as File)\n .where(and(...convertToWhere(files, commonProps), childFiles))\n }\n }\n }\n\n async moveFiles(srcProps: FileDBProps, dstProps: FileDBProps, isDir: boolean): Promise<void> {\n const srcCommonProps: Omit<FileDBProps, 'path'> = {\n ownerId: srcProps.ownerId || null,\n spaceId: srcProps.spaceId || null,\n spaceExternalRootId: srcProps.spaceExternalRootId || null,\n shareExternalId: srcProps.shareExternalId || null,\n inTrash: srcProps.inTrash\n }\n const dstCommonProps: Omit<FileDBProps, 'path'> = {\n ownerId: dstProps.ownerId || null,\n spaceId: dstProps.spaceId || null,\n spaceExternalRootId: dstProps.spaceExternalRootId || null,\n shareExternalId: dstProps.shareExternalId || null,\n inTrash: dstProps.inTrash\n }\n\n // prepare file props update\n const srcFileDB: FileDBProps & { name: string; isDir: boolean } = {\n ...srcCommonProps,\n path: dirName(srcProps.path),\n name: fileName(srcProps.path),\n isDir: isDir\n }\n const dstFileDB: FileDBProps & { name: string; isDir: boolean } = {\n ...dstCommonProps,\n path: dirName(dstProps.path),\n name: fileName(dstProps.path),\n isDir: isDir\n }\n\n // update file props\n await this.db\n .update(files)\n .set(dstFileDB)\n .where(and(...convertToWhere(files, srcFileDB)))\n if (isDir) {\n // prepare child file props update\n const childFiles: SQL<string> = childFilesFindRegexp(srcProps.path)\n const childProps: Omit<FileDBProps, 'path'> & { path: SQL<string> } = {\n ...dstCommonProps,\n path: childFilesReplaceRegexp(srcProps.path, dstProps.path)\n }\n // update child file props\n await this.db\n .update(files)\n .set(childProps)\n .where(and(...convertToWhere(files, srcCommonProps), childFiles))\n }\n }\n\n async compareAndUpdateFileProps(dbFile: FileProps, fsFile: FileProps): Promise<void> {\n if (\n dbFile.isDir !== fsFile.isDir ||\n dbFile.size !== fsFile.size ||\n dbFile.ctime !== fsFile.ctime ||\n dbFile.mtime !== fsFile.mtime ||\n dbFile.mime !== fsFile.mime\n ) {\n this.logger.verbose(`${this.compareAndUpdateFileProps.name} - ${dbFile.path} (${dbFile.id})`)\n await this.updateFile(dbFile.id, {\n isDir: fsFile.isDir,\n size: fsFile.size,\n ctime: fsFile.ctime,\n mtime: fsFile.mtime,\n mime: fsFile.mime\n })\n }\n }\n\n getRecentsFromUser(userId: number, spaceIds: number[], shareIds: number[], limit = 10): Promise<FileRecent[]> {\n return this.db\n .select({\n id: filesRecents.id,\n ownerId: sql<number>`IF(${filesRecents.ownerId} IS NULL, 0, 1)`.as('ownerId'),\n spaceId: sql<number>`IF(${filesRecents.spaceId} IS NULL, 0, 1)`.as('spaceId'),\n shareId: sql<number>`IF(${filesRecents.shareId} IS NULL, 0, 1)`.as('shareId'),\n path: filesRecents.path,\n name: filesRecents.name,\n mime: filesRecents.mime,\n mtime: filesRecents.mtime\n } satisfies FileRecent | SelectedFields<any, any>)\n .from(filesRecents)\n .where(or(eq(filesRecents.ownerId, userId), inArray(filesRecents.spaceId, spaceIds), inArray(filesRecents.shareId, shareIds)))\n .groupBy(filesRecents.id)\n .orderBy(desc(filesRecents.mtime))\n .limit(limit)\n }\n\n getRecentsFromLocation(location: Partial<Record<keyof FileRecent, any>>): Promise<FileRecent[]> {\n const where: SQL[] = convertToWhere(filesRecents, location)\n return this.db\n .select(getTableColumns(filesRecents))\n .from(filesRecents)\n .where(and(...where))\n }\n\n async updateRecents(\n location: FileRecentLocation,\n add: Partial<FileRecent>[] | FileRecent[],\n update: Record<string | 'object', Partial<FileProps> | FileProps>[],\n remove: FileRecent['id'][]\n ): Promise<void> {\n const where: SQL[] = convertToWhere(filesRecents, location)\n // add\n if (add.length) {\n try {\n await this.db.insert(filesRecents).values(add as FileRecent[])\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n // update\n if (update.length) {\n for (const props of update) {\n const f: FileProps = popFromObject('object', props)\n try {\n await this.db\n .update(filesRecents)\n .set({ ...props })\n .where(and(...where, eq(filesRecents.id, f.id)))\n .limit(1)\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n }\n // remove\n if (remove.length) {\n try {\n await this.db.delete(filesRecents).where(and(...where, inArray(filesRecents.id, remove)))\n } catch (e) {\n this.logger.error(`${this.updateRecents.name} - ${e}`)\n }\n }\n }\n}\n"],"names":["FilesQueries","browseFiles","userId","dbFile","options","q","db","select","id","files","path","name","isDir","mime","size","mtime","ctime","withSpaces","spaces","concatDistinctObjectsInArray","alias","withShares","shares","type","withSyncs","syncs","syncPaths","clientId","syncClients","clientName","sql","info","withHasComments","hasComments","fileHasCommentsSubquerySQL","mapWith","Boolean","from","where","and","convertToWhere","groupBy","leftJoin","spacesRoots","eq","fileId","spaceId","ownerId","ignoreChildShares","isNull","parentId","getUserFile","fileInDB","filePathSQL","limit","getOrCreateUserFile","file","searchFileInDB","logger","warn","JSON","stringify","dbGetInsertedId","insert","values","undefined","getOrCreateSpaceFile","getSpaceFileId","updateFile","dbCheckAffectedRows","update","set","e","error","deleteFiles","props","force","commonProps","spaceExternalRootId","shareExternalId","inTrash","fileProps","dirName","fileName","childFiles","childFilesFindRegexp","delete","moveFiles","srcProps","dstProps","srcCommonProps","dstCommonProps","srcFileDB","dstFileDB","childProps","childFilesReplaceRegexp","compareAndUpdateFileProps","fsFile","verbose","getRecentsFromUser","spaceIds","shareIds","filesRecents","as","shareId","or","inArray","orderBy","desc","getRecentsFromLocation","location","getTableColumns","updateRecents","add","remove","length","f","popFromObject","Logger"],"mappings":"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"}
@@ -12,18 +12,8 @@ Object.defineProperty(exports, "parsePdf", {
12
12
  return parsePdf;
13
13
  }
14
14
  });
15
- const _nodepath = /*#__PURE__*/ _interop_require_default(require("node:path"));
16
- const _pdf = require("pdfjs-dist/legacy/build/pdf.mjs");
17
- function _interop_require_default(obj) {
18
- return obj && obj.__esModule ? obj : {
19
- default: obj
20
- };
21
- }
22
- // Enable parallel PDF parsing via Node.js worker threads
23
- _pdf.GlobalWorkerOptions.workerSrc = require.resolve('pdfjs-dist/legacy/build/pdf.worker.mjs');
24
- const pdfjsDistDir = _nodepath.default.dirname(require.resolve('pdfjs-dist/package.json'));
25
- const standardFontsDir = _nodepath.default.join(pdfjsDistDir, 'standard_fonts') + '/';
26
- // Type guard to filter true text items
15
+ const _promises = require("node:fs/promises");
16
+ const _unpdf = require("unpdf");
27
17
  function isTextItem(item) {
28
18
  return typeof item.str === 'string' && Array.isArray(item.transform);
29
19
  }
@@ -33,14 +23,13 @@ const ignorePdfBadFormat = new Set([
33
23
  ]);
34
24
  async function parsePdf(filePath, options) {
35
25
  let doc;
26
+ const buffer = await (0, _promises.readFile)(filePath);
36
27
  try {
37
28
  // Load the document, allowing system fonts as fallback
38
- const loadingTask = (0, _pdf.getDocument)({
39
- url: filePath,
29
+ const doc = await (0, _unpdf.getDocumentProxy)(new Uint8Array(buffer), {
40
30
  disableFontFace: true,
41
- standardFontDataUrl: standardFontsDir
31
+ verbosity: 0
42
32
  });
43
- doc = await loadingTask.promise;
44
33
  const fragments = [];
45
34
  let lastY = undefined;
46
35
  for(let pageNum = 1; pageNum <= doc.numPages; pageNum++){