@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/constants/operations.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\nexport enum FILE_OPERATION {\n MAKE = 'make',\n COPY = 'copy',\n MOVE = 'move',\n DELETE = 'delete',\n COMPRESS = 'compress',\n DECOMPRESS = 'decompress',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n TOUCH = 'touch',\n THUMBNAIL = 'thumbnail'\n}\n"],"names":["FILE_OPERATION"],"mappings":"AAAA;;;;CAIC;;;;+BAEWA;;;eAAAA;;;AAAL,IAAA,AAAKA,wCAAAA;;;;;;;;;;;WAAAA"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/constants/operations.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\nexport enum FILE_OPERATION {\n MAKE = 'make',\n COPY = 'copy',\n MOVE = 'move',\n DELETE = 'delete',\n COMPRESS = 'compress',\n DECOMPRESS = 'decompress',\n DOWNLOAD = 'download',\n UPLOAD = 'upload',\n TOUCH = 'touch',\n THUMBNAIL = 'thumbnail',\n GET_SIZE = 'getSize',\n LOCK = 'lock',\n UNLOCK = 'unlock',\n UNLOCK_REQUEST = 'unlockRequest'\n}\n\nexport enum FILE_MODE {\n VIEW = 'view',\n EDIT = 'edit'\n}\n"],"names":["FILE_MODE","FILE_OPERATION"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAmBWA;eAAAA;;QAjBAC;eAAAA;;;AAAL,IAAA,AAAKA,wCAAAA;;;;;;;;;;;;;;;WAAAA;;AAiBL,IAAA,AAAKD,mCAAAA;;;WAAAA"}
@@ -44,6 +44,9 @@ function _ts_metadata(k, v) {
44
44
  if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
45
45
  }
46
46
  let CopyMoveFileDto = class CopyMoveFileDto {
47
+ constructor(){
48
+ this.overwrite = false;
49
+ }
47
50
  };
48
51
  _ts_decorate([
49
52
  (0, _classvalidator.IsNotEmpty)(),
@@ -58,6 +61,10 @@ _ts_decorate([
58
61
  }),
59
62
  _ts_metadata("design:type", String)
60
63
  ], CopyMoveFileDto.prototype, "dstName", void 0);
64
+ _ts_decorate([
65
+ (0, _classvalidator.IsOptional)(),
66
+ (0, _classvalidator.IsBoolean)()
67
+ ], CopyMoveFileDto.prototype, "overwrite", void 0);
61
68
  let DownloadFileDto = class DownloadFileDto {
62
69
  };
63
70
  _ts_decorate([
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/dto/file-operations.dto.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 { Transform } from 'class-transformer'\nimport { ArrayMinSize, IsArray, IsBoolean, IsDefined, IsIn, IsInt, IsNotEmpty, IsOptional, IsString, IsUrl } from 'class-validator'\nimport { RejectIfMatch } from '../../../common/decorators'\nimport { regExpInvalidFileName } from '../../../common/shared'\nimport { tarExtension, tarGzExtension } from '../constants/compress'\n\nexport class CopyMoveFileDto {\n @IsNotEmpty()\n @IsString()\n dstDirectory: string\n\n @IsOptional()\n @IsString()\n @RejectIfMatch(regExpInvalidFileName, { message: 'Forbidden characters' })\n // renaming use case\n dstName?: string\n}\n\nexport class DownloadFileDto {\n @IsNotEmpty()\n @IsUrl({\n // only allow HTTP(S)\n protocols: ['http', 'https'],\n require_protocol: true,\n require_valid_protocol: true,\n // reject exotic schemes and underscores\n allow_underscores: false,\n allow_trailing_dot: false\n })\n url: string\n}\n\nexport class MakeFileDto {\n @IsNotEmpty()\n @IsString()\n @IsIn(['file', 'directory'])\n type: 'file' | 'directory'\n}\n\nexport class CompressFileDto {\n @IsOptional()\n @IsString()\n @RejectIfMatch(regExpInvalidFileName, { message: 'Forbidden characters' })\n name?: string // only used on frontend\n\n @IsDefined()\n @IsBoolean()\n compressInDirectory: boolean\n\n @IsNotEmpty({ each: true })\n @IsArray()\n @ArrayMinSize(1)\n files: { name: string; rootAlias: string; path?: string }[]\n\n @IsNotEmpty()\n @IsString()\n @IsIn([tarExtension, tarGzExtension])\n extension: typeof tarExtension | typeof tarGzExtension\n}\n\nexport class SearchFilesDto {\n @IsNotEmpty()\n @IsString()\n @Transform(({ value }) => (value ? value.trim() : null))\n content: string\n\n @IsOptional()\n @IsBoolean()\n fullText?: boolean = false\n\n @IsOptional()\n @IsInt()\n limit?: number = 100\n}\n"],"names":["CompressFileDto","CopyMoveFileDto","DownloadFileDto","MakeFileDto","SearchFilesDto","message","protocols","require_protocol","require_valid_protocol","allow_underscores","allow_trailing_dot","each","tarExtension","tarGzExtension","fullText","limit","value","trim"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAyCYA;eAAAA;;QAjCAC;eAAAA;;QAYAC;eAAAA;;QAcAC;eAAAA;;QA4BAC;eAAAA;;;kCA5Da;gCACwF;4BACpF;wBACQ;0BACO;;;;;;;;;;AAEtC,IAAA,AAAMH,kBAAN,MAAMA;AAUb;;;;;;;;;;QAH0CI,SAAS;;;;AAK5C,IAAA,AAAMH,kBAAN,MAAMA;AAYb;;;;QATI,qBAAqB;QACrBI,WAAW;YAAC;YAAQ;SAAQ;QAC5BC,kBAAkB;QAClBC,wBAAwB;QACxB,wCAAwC;QACxCC,mBAAmB;QACnBC,oBAAoB;;;;AAKjB,IAAA,AAAMP,cAAN,MAAMA;AAKb;;;;;QAFS;QAAQ;;;;AAIV,IAAA,AAAMH,kBAAN,MAAMA;AAmBb;;;;;QAhB0CK,SAAS;;;;;;;;;;;QAOnCM,MAAM;;;;;;;;;;QAObC,sBAAY;QAAEC,wBAAc;;;;AAI9B,IAAA,AAAMT,iBAAN,MAAMA;;aAQXU,WAAqB;aAIrBC,QAAiB;;AACnB;;;;sCAVc,EAAEC,KAAK,EAAE,GAAMA,QAAQA,MAAMC,IAAI,KAAK"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/dto/file-operations.dto.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 { Transform } from 'class-transformer'\nimport { ArrayMinSize, IsArray, IsBoolean, IsDefined, IsIn, IsInt, IsNotEmpty, IsOptional, IsString, IsUrl } from 'class-validator'\nimport { RejectIfMatch } from '../../../common/decorators'\nimport { regExpInvalidFileName } from '../../../common/shared'\nimport { tarExtension, tarGzExtension } from '../constants/compress'\n\nexport class CopyMoveFileDto {\n @IsNotEmpty()\n @IsString()\n dstDirectory: string\n\n @IsOptional()\n @IsString()\n @RejectIfMatch(regExpInvalidFileName, { message: 'Forbidden characters' })\n // Renaming scenario\n dstName?: string\n\n @IsOptional()\n @IsBoolean()\n overwrite? = false\n}\n\nexport class DownloadFileDto {\n @IsNotEmpty()\n @IsUrl({\n // only allow HTTP(S)\n protocols: ['http', 'https'],\n require_protocol: true,\n require_valid_protocol: true,\n // reject exotic schemes and underscores\n allow_underscores: false,\n allow_trailing_dot: false\n })\n url: string\n}\n\nexport class MakeFileDto {\n @IsNotEmpty()\n @IsString()\n @IsIn(['file', 'directory'])\n type: 'file' | 'directory'\n}\n\nexport class CompressFileDto {\n @IsOptional()\n @IsString()\n @RejectIfMatch(regExpInvalidFileName, { message: 'Forbidden characters' })\n name?: string // only used on frontend\n\n @IsDefined()\n @IsBoolean()\n compressInDirectory: boolean\n\n @IsNotEmpty({ each: true })\n @IsArray()\n @ArrayMinSize(1)\n files: { name: string; rootAlias: string; path?: string }[]\n\n @IsNotEmpty()\n @IsString()\n @IsIn([tarExtension, tarGzExtension])\n extension: typeof tarExtension | typeof tarGzExtension\n}\n\nexport class SearchFilesDto {\n @IsNotEmpty()\n @IsString()\n @Transform(({ value }) => (value ? value.trim() : null))\n content: string\n\n @IsOptional()\n @IsBoolean()\n fullText?: boolean = false\n\n @IsOptional()\n @IsInt()\n limit?: number = 100\n}\n"],"names":["CompressFileDto","CopyMoveFileDto","DownloadFileDto","MakeFileDto","SearchFilesDto","overwrite","message","protocols","require_protocol","require_valid_protocol","allow_underscores","allow_trailing_dot","each","tarExtension","tarGzExtension","fullText","limit","value","trim"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QA6CYA;eAAAA;;QArCAC;eAAAA;;QAgBAC;eAAAA;;QAcAC;eAAAA;;QA4BAC;eAAAA;;;kCAhEa;gCACwF;4BACpF;wBACQ;0BACO;;;;;;;;;;AAEtC,IAAA,AAAMH,kBAAN,MAAMA;;aAaXI,YAAa;;AACf;;;;;;;;;;QAP0CC,SAAS;;;;;;;;AAS5C,IAAA,AAAMJ,kBAAN,MAAMA;AAYb;;;;QATI,qBAAqB;QACrBK,WAAW;YAAC;YAAQ;SAAQ;QAC5BC,kBAAkB;QAClBC,wBAAwB;QACxB,wCAAwC;QACxCC,mBAAmB;QACnBC,oBAAoB;;;;AAKjB,IAAA,AAAMR,cAAN,MAAMA;AAKb;;;;;QAFS;QAAQ;;;;AAIV,IAAA,AAAMH,kBAAN,MAAMA;AAmBb;;;;;QAhB0CM,SAAS;;;;;;;;;;;QAOnCM,MAAM;;;;;;;;;;QAObC,sBAAY;QAAEC,wBAAc;;;;AAI9B,IAAA,AAAMV,iBAAN,MAAMA;;aAQXW,WAAqB;aAIrBC,QAAiB;;AACnB;;;;sCAVc,EAAEC,KAAK,EAAE,GAAMA,QAAQA,MAAMC,IAAI,KAAK"}
@@ -21,6 +21,7 @@ const _spacerequestinterface = require("../spaces/interfaces/space-request.inter
21
21
  const _spaceenvmodel = require("../spaces/models/space-env.model");
22
22
  const _userdecorator = require("../users/decorators/user.decorator");
23
23
  const _usermodel = require("../users/models/user.model");
24
+ const _operations = require("./constants/operations");
24
25
  const _routes = require("./constants/routes");
25
26
  const _onlyofficeenvironmentdecorator = require("./decorators/only-office-environment.decorator");
26
27
  const _filesmethodsservice = require("./services/files-methods.service");
@@ -40,7 +41,7 @@ function _ts_param(paramIndex, decorator) {
40
41
  };
41
42
  }
42
43
  let FilesOnlyOfficeController = class FilesOnlyOfficeController {
43
- onlyOfficeSettings(user, space, mode = 'view', req) {
44
+ onlyOfficeSettings(user, space, mode = _operations.FILE_MODE.VIEW, req) {
44
45
  return this.filesOnlyOfficeManager.getSettings(user, space, mode, req);
45
46
  }
46
47
  onlyOfficeDocument(req, res) {
@@ -68,7 +69,7 @@ _ts_decorate([
68
69
  _ts_metadata("design:paramtypes", [
69
70
  typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel,
70
71
  typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv,
71
- String,
72
+ typeof _operations.FILE_MODE === "undefined" ? Object : _operations.FILE_MODE,
72
73
  typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest
73
74
  ]),
74
75
  _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Get, HttpCode, HttpStatus, Post, Query, Request, Res, StreamableFile, UseInterceptors } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { API_FILES_ONLY_OFFICE, FILES_ROUTE } from './constants/routes'\nimport { OnlyOfficeEnvironment } from './decorators/only-office-environment.decorator'\nimport { OnlyOfficeReqConfig } from './interfaces/only-office-config.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\n@Controller(API_FILES_ONLY_OFFICE)\n@OnlyOfficeEnvironment()\nexport class FilesOnlyOfficeController {\n constructor(\n private readonly filesOnlyOfficeManager: FilesOnlyOfficeManager,\n private readonly filesMethods: FilesMethods\n ) {}\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_SETTINGS}/*`)\n @UseInterceptors(ContextInterceptor)\n onlyOfficeSettings(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('mode') mode: 'view' | 'edit' = 'view',\n @Request() req: FastifySpaceRequest\n ): Promise<OnlyOfficeReqConfig> {\n return this.filesOnlyOfficeManager.getSettings(user, space, mode, req)\n }\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}/*`)\n onlyOfficeDocument(@Request() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.ONLY_OFFICE_CALLBACK}/*`)\n @HttpCode(HttpStatus.OK)\n onlyOfficeCallBack(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body('token') token: string, @Query('fid') fileId: string) {\n return this.filesOnlyOfficeManager.callBack(user, space, token, fileId)\n }\n\n @Get(FILES_ROUTE.ONLY_OFFICE_STATUS)\n @SkipSpaceGuard()\n onlyOfficeStatus(): { enabled: boolean } {\n return this.filesOnlyOfficeManager.getStatus()\n }\n}\n"],"names":["FilesOnlyOfficeController","onlyOfficeSettings","user","space","mode","req","filesOnlyOfficeManager","getSettings","onlyOfficeDocument","res","filesMethods","headOrGet","onlyOfficeCallBack","token","fileId","callBack","onlyOfficeStatus","getStatus","FILES_ROUTE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","passthrough","ONLY_OFFICE_CALLBACK","OK","ONLY_OFFICE_STATUS"],"mappings":"AAAA;;;;CAIC;;;;+BAmBYA;;;eAAAA;;;wBAjB2G;yBAC3F;oCACM;yCACJ;gCACN;uCACW;+BACX;+BACD;2BACE;wBACyB;gDACb;qCAET;+CACU;;;;;;;;;;;;;;;AAIhC,IAAA,AAAMA,4BAAN,MAAMA;IAQXC,mBACE,AAAWC,IAAe,EAC1B,AAAYC,KAAe,EAC3B,AAAeC,OAAwB,MAAM,EAC7C,AAAWC,GAAwB,EACL;QAC9B,OAAO,IAAI,CAACC,sBAAsB,CAACC,WAAW,CAACL,MAAMC,OAAOC,MAAMC;IACpE;IAGAG,mBAAmB,AAAWH,GAAwB,EAAE,AAA4BI,GAAiB,EAA2B;QAC9H,OAAO,IAAI,CAACC,YAAY,CAACC,SAAS,CAACN,KAAKI;IAC1C;IAIAG,mBAAmB,AAAWV,IAAe,EAAE,AAAYC,KAAe,EAAE,AAAeU,KAAa,EAAE,AAAcC,MAAc,EAAE;QACtI,OAAO,IAAI,CAACR,sBAAsB,CAACS,QAAQ,CAACb,MAAMC,OAAOU,OAAOC;IAClE;IAIAE,mBAAyC;QACvC,OAAO,IAAI,CAACV,sBAAsB,CAACW,SAAS;IAC9C;IA/BA,YACE,AAAiBX,sBAA8C,EAC/D,AAAiBI,YAA0B,CAC3C;aAFiBJ,yBAAAA;aACAI,eAAAA;IAChB;AA6BL;;wBA3BUQ,mBAAW,CAACC,oBAAoB,CAAC,EAAE;;;;;;;;;;;;;;;;wBAWnCD,mBAAW,CAACE,oBAAoB,CAAC,EAAE;;;QACoBC,aAAa;;;;;;;;;;yBAInEH,mBAAW,CAACI,oBAAoB,CAAC,EAAE;6CACvBC;;;;;;;;;;;;;;;yCAKJC"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Get, HttpCode, HttpStatus, Post, Query, Request, Res, StreamableFile, UseInterceptors } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_MODE } from './constants/operations'\nimport { API_FILES_ONLY_OFFICE, FILES_ROUTE } from './constants/routes'\nimport { OnlyOfficeEnvironment } from './decorators/only-office-environment.decorator'\nimport { OnlyOfficeReqConfig } from './interfaces/only-office-config.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\n@Controller(API_FILES_ONLY_OFFICE)\n@OnlyOfficeEnvironment()\nexport class FilesOnlyOfficeController {\n constructor(\n private readonly filesOnlyOfficeManager: FilesOnlyOfficeManager,\n private readonly filesMethods: FilesMethods\n ) {}\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_SETTINGS}/*`)\n @UseInterceptors(ContextInterceptor)\n onlyOfficeSettings(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('mode') mode: FILE_MODE = FILE_MODE.VIEW,\n @Request() req: FastifySpaceRequest\n ): Promise<OnlyOfficeReqConfig> {\n return this.filesOnlyOfficeManager.getSettings(user, space, mode, req)\n }\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}/*`)\n onlyOfficeDocument(@Request() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.ONLY_OFFICE_CALLBACK}/*`)\n @HttpCode(HttpStatus.OK)\n onlyOfficeCallBack(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body('token') token: string, @Query('fid') fileId: string) {\n return this.filesOnlyOfficeManager.callBack(user, space, token, fileId)\n }\n\n @Get(FILES_ROUTE.ONLY_OFFICE_STATUS)\n @SkipSpaceGuard()\n onlyOfficeStatus(): { enabled: boolean } {\n return this.filesOnlyOfficeManager.getStatus()\n }\n}\n"],"names":["FilesOnlyOfficeController","onlyOfficeSettings","user","space","mode","FILE_MODE","VIEW","req","filesOnlyOfficeManager","getSettings","onlyOfficeDocument","res","filesMethods","headOrGet","onlyOfficeCallBack","token","fileId","callBack","onlyOfficeStatus","getStatus","FILES_ROUTE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","passthrough","ONLY_OFFICE_CALLBACK","OK","ONLY_OFFICE_STATUS"],"mappings":"AAAA;;;;CAIC;;;;+BAoBYA;;;eAAAA;;;wBAlB2G;yBAC3F;oCACM;yCACJ;gCACN;uCACW;+BACX;+BACD;2BACE;4BACA;wBACyB;gDACb;qCAET;+CACU;;;;;;;;;;;;;;;AAIhC,IAAA,AAAMA,4BAAN,MAAMA;IAQXC,mBACE,AAAWC,IAAe,EAC1B,AAAYC,KAAe,EAC3B,AAAeC,OAAkBC,qBAAS,CAACC,IAAI,EAC/C,AAAWC,GAAwB,EACL;QAC9B,OAAO,IAAI,CAACC,sBAAsB,CAACC,WAAW,CAACP,MAAMC,OAAOC,MAAMG;IACpE;IAGAG,mBAAmB,AAAWH,GAAwB,EAAE,AAA4BI,GAAiB,EAA2B;QAC9H,OAAO,IAAI,CAACC,YAAY,CAACC,SAAS,CAACN,KAAKI;IAC1C;IAIAG,mBAAmB,AAAWZ,IAAe,EAAE,AAAYC,KAAe,EAAE,AAAeY,KAAa,EAAE,AAAcC,MAAc,EAAE;QACtI,OAAO,IAAI,CAACR,sBAAsB,CAACS,QAAQ,CAACf,MAAMC,OAAOY,OAAOC;IAClE;IAIAE,mBAAyC;QACvC,OAAO,IAAI,CAACV,sBAAsB,CAACW,SAAS;IAC9C;IA/BA,YACE,AAAiBX,sBAA8C,EAC/D,AAAiBI,YAA0B,CAC3C;aAFiBJ,yBAAAA;aACAI,eAAAA;IAChB;AA6BL;;wBA3BUQ,mBAAW,CAACC,oBAAoB,CAAC,EAAE;;;;;;;;;;;;;;;;wBAWnCD,mBAAW,CAACE,oBAAoB,CAAC,EAAE;;;QACoBC,aAAa;;;;;;;;;;yBAInEH,mBAAW,CAACI,oBAAoB,CAAC,EAAE;6CACvBC;;;;;;;;;;;;;;;yCAKJC"}
@@ -10,6 +10,7 @@ const _testing = require("@nestjs/testing");
10
10
  const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
11
11
  const _contextmanagerservice = require("../../infrastructure/context/services/context-manager.service");
12
12
  const _spacesmanagerservice = require("../spaces/services/spaces-manager.service");
13
+ const _operations = require("./constants/operations");
13
14
  const _filesonlyofficecontroller = require("./files-only-office.controller");
14
15
  const _filesmethodsservice = require("./services/files-methods.service");
15
16
  const _filesonlyofficemanagerservice = require("./services/files-only-office-manager.service");
@@ -65,12 +66,12 @@ describe(_filesonlyofficecontroller.FilesOnlyOfficeController.name, ()=>{
65
66
  };
66
67
  const expected = {
67
68
  config: 'ok',
68
- mode: 'view'
69
+ mode: _operations.FILE_MODE.VIEW
69
70
  };
70
71
  filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected);
71
72
  const result = await controller.onlyOfficeSettings(user, space, undefined, req);
72
73
  expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledTimes(1);
73
- expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'view', req);
74
+ expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, _operations.FILE_MODE.VIEW, req);
74
75
  expect(result).toBe(expected);
75
76
  });
76
77
  it('should pass provided mode to manager', async ()=>{
@@ -87,11 +88,11 @@ describe(_filesonlyofficecontroller.FilesOnlyOfficeController.name, ()=>{
87
88
  };
88
89
  const expected = {
89
90
  config: 'ok',
90
- mode: 'edit'
91
+ mode: _operations.FILE_MODE.EDIT
91
92
  };
92
93
  filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected);
93
- const result = await controller.onlyOfficeSettings(user, space, 'edit', req);
94
- expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'edit', req);
94
+ const result = await controller.onlyOfficeSettings(user, space, _operations.FILE_MODE.EDIT, req);
95
+ expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, _operations.FILE_MODE.EDIT, req);
95
96
  expect(result).toBe(expected);
96
97
  });
97
98
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.spec.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 { Test, TestingModule } from '@nestjs/testing'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { FilesOnlyOfficeController } from './files-only-office.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\ndescribe(FilesOnlyOfficeController.name, () => {\n let controller: FilesOnlyOfficeController\n\n const filesOnlyOfficeManagerMock = {\n getSettings: jest.fn(),\n callBack: jest.fn()\n }\n\n const filesMethodsMock = {\n headOrGet: jest.fn()\n }\n\n beforeEach(async () => {\n jest.clearAllMocks()\n const module: TestingModule = await Test.createTestingModule({\n controllers: [FilesOnlyOfficeController],\n providers: [\n { provide: FilesOnlyOfficeManager, useValue: filesOnlyOfficeManagerMock },\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: SpacesManager, useValue: {} },\n ContextManager,\n ContextInterceptor\n ]\n }).compile()\n\n controller = module.get<FilesOnlyOfficeController>(FilesOnlyOfficeController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n\n describe('onlyOfficeSettings', () => {\n it('should call manager with default mode \"view\" when mode is undefined', async () => {\n const user: any = { id: 1 }\n const space: any = { id: 'space-1' }\n const req: any = { headers: {}, params: {}, query: {} }\n const expected = { config: 'ok', mode: 'view' }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, undefined as any, req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'view', req)\n expect(result).toBe(expected)\n })\n\n it('should pass provided mode to manager', async () => {\n const user: any = { id: 2 }\n const space: any = { id: 'space-2' }\n const req: any = { headers: { 'x-test': '1' } }\n const expected = { config: 'ok', mode: 'edit' }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, 'edit', req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'edit', req)\n expect(result).toBe(expected)\n })\n })\n\n describe('onlyOfficeDocument', () => {\n it('should delegate to filesMethods.headOrGet with req and res', async () => {\n const req: any = { params: { '*': 'path/to/file' } }\n const res: any = { header: jest.fn(), status: jest.fn().mockReturnThis() }\n const stream: any = { readable: true }\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await controller.onlyOfficeDocument(req, res)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledTimes(1)\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(req, res)\n expect(result).toBe(stream)\n })\n })\n\n describe('onlyOfficeCallBack', () => {\n it('should call manager.callBack with user, space, token and fileId (fid)', async () => {\n const user: any = { id: 3 }\n const space: any = { id: 'space-3' }\n const token = 'jwt-token'\n const fileId = 'file-123'\n const expected = { ok: true }\n filesOnlyOfficeManagerMock.callBack.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeCallBack(user, space, token, fileId)\n\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledWith(user, space, token, fileId)\n expect(result).toBe(expected)\n })\n })\n})\n"],"names":["describe","FilesOnlyOfficeController","name","controller","filesOnlyOfficeManagerMock","getSettings","jest","fn","callBack","filesMethodsMock","headOrGet","beforeEach","clearAllMocks","module","Test","createTestingModule","controllers","providers","provide","FilesOnlyOfficeManager","useValue","FilesMethods","SpacesManager","ContextManager","ContextInterceptor","compile","get","it","expect","toBeDefined","user","id","space","req","headers","params","query","expected","config","mode","mockResolvedValue","result","onlyOfficeSettings","undefined","toHaveBeenCalledTimes","toHaveBeenCalledWith","toBe","res","header","status","mockReturnThis","stream","readable","onlyOfficeDocument","token","fileId","ok","onlyOfficeCallBack"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.spec.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 { Test, TestingModule } from '@nestjs/testing'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { FILE_MODE } from './constants/operations'\nimport { FilesOnlyOfficeController } from './files-only-office.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\ndescribe(FilesOnlyOfficeController.name, () => {\n let controller: FilesOnlyOfficeController\n\n const filesOnlyOfficeManagerMock = {\n getSettings: jest.fn(),\n callBack: jest.fn()\n }\n\n const filesMethodsMock = {\n headOrGet: jest.fn()\n }\n\n beforeEach(async () => {\n jest.clearAllMocks()\n const module: TestingModule = await Test.createTestingModule({\n controllers: [FilesOnlyOfficeController],\n providers: [\n { provide: FilesOnlyOfficeManager, useValue: filesOnlyOfficeManagerMock },\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: SpacesManager, useValue: {} },\n ContextManager,\n ContextInterceptor\n ]\n }).compile()\n\n controller = module.get<FilesOnlyOfficeController>(FilesOnlyOfficeController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n\n describe('onlyOfficeSettings', () => {\n it('should call manager with default mode \"view\" when mode is undefined', async () => {\n const user: any = { id: 1 }\n const space: any = { id: 'space-1' }\n const req: any = { headers: {}, params: {}, query: {} }\n const expected = { config: 'ok', mode: FILE_MODE.VIEW }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, undefined as any, req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, FILE_MODE.VIEW, req)\n expect(result).toBe(expected)\n })\n\n it('should pass provided mode to manager', async () => {\n const user: any = { id: 2 }\n const space: any = { id: 'space-2' }\n const req: any = { headers: { 'x-test': '1' } }\n const expected = { config: 'ok', mode: FILE_MODE.EDIT }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, FILE_MODE.EDIT, req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, FILE_MODE.EDIT, req)\n expect(result).toBe(expected)\n })\n })\n\n describe('onlyOfficeDocument', () => {\n it('should delegate to filesMethods.headOrGet with req and res', async () => {\n const req: any = { params: { '*': 'path/to/file' } }\n const res: any = { header: jest.fn(), status: jest.fn().mockReturnThis() }\n const stream: any = { readable: true }\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await controller.onlyOfficeDocument(req, res)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledTimes(1)\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(req, res)\n expect(result).toBe(stream)\n })\n })\n\n describe('onlyOfficeCallBack', () => {\n it('should call manager.callBack with user, space, token and fileId (fid)', async () => {\n const user: any = { id: 3 }\n const space: any = { id: 'space-3' }\n const token = 'jwt-token'\n const fileId = 'file-123'\n const expected = { ok: true }\n filesOnlyOfficeManagerMock.callBack.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeCallBack(user, space, token, fileId)\n\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledWith(user, space, token, fileId)\n expect(result).toBe(expected)\n })\n })\n})\n"],"names":["describe","FilesOnlyOfficeController","name","controller","filesOnlyOfficeManagerMock","getSettings","jest","fn","callBack","filesMethodsMock","headOrGet","beforeEach","clearAllMocks","module","Test","createTestingModule","controllers","providers","provide","FilesOnlyOfficeManager","useValue","FilesMethods","SpacesManager","ContextManager","ContextInterceptor","compile","get","it","expect","toBeDefined","user","id","space","req","headers","params","query","expected","config","mode","FILE_MODE","VIEW","mockResolvedValue","result","onlyOfficeSettings","undefined","toHaveBeenCalledTimes","toHaveBeenCalledWith","toBe","EDIT","res","header","status","mockReturnThis","stream","readable","onlyOfficeDocument","token","fileId","ok","onlyOfficeCallBack"],"mappings":"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"}
@@ -14,6 +14,8 @@ Object.defineProperty(exports, "FilesController", {
14
14
  });
15
15
  const _common = require("@nestjs/common");
16
16
  const _fastify = require("fastify");
17
+ const _image = require("../../common/image");
18
+ const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
17
19
  const _spaceskipguarddecorator = require("../spaces/decorators/space-skip-guard.decorator");
18
20
  const _spaceskippermissionsdecorator = require("../spaces/decorators/space-skip-permissions.decorator");
19
21
  const _spacedecorator = require("../spaces/decorators/space.decorator");
@@ -54,8 +56,14 @@ let FilesController = class FilesController {
54
56
  async make(user, space, makeFileDto) {
55
57
  return this.filesMethods.make(user, space, makeFileDto);
56
58
  }
57
- async upload(req, res) {
58
- return this.filesMethods.upload(req, res);
59
+ async uploadCreate(req) {
60
+ return this.filesMethods.upload(req);
61
+ }
62
+ async uploadOverwrite(req) {
63
+ return this.filesMethods.upload(req);
64
+ }
65
+ async uploadContent(req) {
66
+ return this.filesMethods.upload(req);
59
67
  }
60
68
  async copy(user, space, copyMoveFileDto) {
61
69
  return this.filesMethods.copy(user, space, copyMoveFileDto);
@@ -66,8 +74,23 @@ let FilesController = class FilesController {
66
74
  async delete(user, space) {
67
75
  return this.filesMethods.delete(user, space);
68
76
  }
69
- async genThumbnail(space, size = 256) {
70
- return this.filesMethods.genThumbnail(space, size);
77
+ async genThumbnail(space, size = 256, res) {
78
+ if (size > 1024) size = 1024;
79
+ const thumb = await this.filesMethods.genThumbnail(space, size);
80
+ res.type(_image.webpMimeType);
81
+ return res.send(thumb);
82
+ }
83
+ async lock(user, space) {
84
+ return this.filesMethods.lock(user, space);
85
+ }
86
+ async unlock(user, space, forceAsOwner) {
87
+ return this.filesMethods.unlock(user, space, forceAsOwner);
88
+ }
89
+ async unlockRequest(user, space) {
90
+ return this.filesMethods.unlockRequest(user, space);
91
+ }
92
+ async getSize(space) {
93
+ return this.filesMethods.getSize(space);
71
94
  }
72
95
  // TASKS OPERATIONS
73
96
  async downloadFromUrlAsTask(user, space, downloadFileDto) {
@@ -149,16 +172,30 @@ _ts_decorate([
149
172
  _ts_decorate([
150
173
  (0, _common.Post)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.UPLOAD}/*`),
151
174
  _ts_param(0, (0, _common.Req)()),
152
- _ts_param(1, (0, _common.Res)({
153
- passthrough: true
154
- })),
155
175
  _ts_metadata("design:type", Function),
156
176
  _ts_metadata("design:paramtypes", [
157
- typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest,
158
- typeof _fastify.FastifyReply === "undefined" ? Object : _fastify.FastifyReply
177
+ typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest
178
+ ]),
179
+ _ts_metadata("design:returntype", Promise)
180
+ ], FilesController.prototype, "uploadCreate", null);
181
+ _ts_decorate([
182
+ (0, _common.Put)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.UPLOAD}/*`),
183
+ _ts_param(0, (0, _common.Req)()),
184
+ _ts_metadata("design:type", Function),
185
+ _ts_metadata("design:paramtypes", [
186
+ typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest
187
+ ]),
188
+ _ts_metadata("design:returntype", Promise)
189
+ ], FilesController.prototype, "uploadOverwrite", null);
190
+ _ts_decorate([
191
+ (0, _common.Patch)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.UPLOAD}/*`),
192
+ _ts_param(0, (0, _common.Req)()),
193
+ _ts_metadata("design:type", Function),
194
+ _ts_metadata("design:paramtypes", [
195
+ typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest
159
196
  ]),
160
197
  _ts_metadata("design:returntype", Promise)
161
- ], FilesController.prototype, "upload", null);
198
+ ], FilesController.prototype, "uploadContent", null);
162
199
  _ts_decorate([
163
200
  (0, _common.Copy)(`${_routes.FILES_ROUTE.OPERATION}/*`),
164
201
  _ts_param(0, (0, _userdecorator.GetUser)()),
@@ -199,14 +236,65 @@ _ts_decorate([
199
236
  _ts_decorate([
200
237
  (0, _common.Get)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.THUMBNAIL}/*`),
201
238
  _ts_param(0, (0, _spacedecorator.GetSpace)()),
202
- _ts_param(1, (0, _common.Query)('size')),
239
+ _ts_param(1, (0, _common.Query)('size', new _common.ParseIntPipe({
240
+ optional: true
241
+ }))),
242
+ _ts_param(2, (0, _common.Res)()),
203
243
  _ts_metadata("design:type", Function),
204
244
  _ts_metadata("design:paramtypes", [
205
245
  typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv,
206
- Number
246
+ void 0,
247
+ typeof _fastify.FastifyReply === "undefined" ? Object : _fastify.FastifyReply
207
248
  ]),
208
249
  _ts_metadata("design:returntype", Promise)
209
250
  ], FilesController.prototype, "genThumbnail", null);
251
+ _ts_decorate([
252
+ (0, _common.Lock)(`${_routes.FILES_ROUTE.OPERATION}/*`),
253
+ _ts_param(0, (0, _userdecorator.GetUser)()),
254
+ _ts_param(1, (0, _spacedecorator.GetSpace)()),
255
+ _ts_metadata("design:type", Function),
256
+ _ts_metadata("design:paramtypes", [
257
+ typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel,
258
+ typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv
259
+ ]),
260
+ _ts_metadata("design:returntype", Promise)
261
+ ], FilesController.prototype, "lock", null);
262
+ _ts_decorate([
263
+ (0, _common.Unlock)(`${_routes.FILES_ROUTE.OPERATION}/*`),
264
+ _ts_param(0, (0, _userdecorator.GetUser)()),
265
+ _ts_param(1, (0, _spacedecorator.GetSpace)()),
266
+ _ts_param(2, (0, _common.Query)('forceAsOwner', new _common.ParseBoolPipe({
267
+ optional: true
268
+ }))),
269
+ _ts_metadata("design:type", Function),
270
+ _ts_metadata("design:paramtypes", [
271
+ typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel,
272
+ typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv,
273
+ Boolean
274
+ ]),
275
+ _ts_metadata("design:returntype", Promise)
276
+ ], FilesController.prototype, "unlock", null);
277
+ _ts_decorate([
278
+ (0, _common.Unlock)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.UNLOCK_REQUEST}/*`),
279
+ (0, _common.UseInterceptors)(_contextinterceptor.ContextInterceptor),
280
+ _ts_param(0, (0, _userdecorator.GetUser)()),
281
+ _ts_param(1, (0, _spacedecorator.GetSpace)()),
282
+ _ts_metadata("design:type", Function),
283
+ _ts_metadata("design:paramtypes", [
284
+ typeof _usermodel.UserModel === "undefined" ? Object : _usermodel.UserModel,
285
+ typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv
286
+ ]),
287
+ _ts_metadata("design:returntype", Promise)
288
+ ], FilesController.prototype, "unlockRequest", null);
289
+ _ts_decorate([
290
+ (0, _common.Get)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.GET_SIZE}/*`),
291
+ _ts_param(0, (0, _spacedecorator.GetSpace)()),
292
+ _ts_metadata("design:type", Function),
293
+ _ts_metadata("design:paramtypes", [
294
+ typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv
295
+ ]),
296
+ _ts_metadata("design:returntype", Promise)
297
+ ], FilesController.prototype, "getSize", null);
210
298
  _ts_decorate([
211
299
  (0, _common.Post)(`${_routes.FILES_ROUTE.TASK_OPERATION}/${_operations.FILE_OPERATION.DOWNLOAD}/*`),
212
300
  _ts_param(0, (0, _userdecorator.GetUser)()),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Copy, Delete, Get, Head, Logger, Move, Post, Query, Req, Res, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async upload(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<void> {\n return this.filesMethods.upload(req, res)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(@GetSpace() space: SpaceEnv, @Query('size') size: number = 256): Promise<StreamableFile> {\n return this.filesMethods.genThumbnail(space, size)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","upload","copy","copyMoveFileDto","move","delete","genThumbnail","size","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Lock,\n Logger,\n Move,\n ParseBoolPipe,\n ParseIntPipe,\n Patch,\n Post,\n Put,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n Unlock,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileLockProps } from './interfaces/file-props.interface'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadCreate(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Put(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadOverwrite(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Patch(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async uploadContent(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.filesMethods.upload(req)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n @Lock(`${FILES_ROUTE.OPERATION}/*`)\n async lock(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileLockProps> {\n return this.filesMethods.lock(user, space)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/*`)\n async unlock(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('forceAsOwner', new ParseBoolPipe({ optional: true })) forceAsOwner?: boolean\n ): Promise<void> {\n return this.filesMethods.unlock(user, space, forceAsOwner)\n }\n\n @Unlock(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UNLOCK_REQUEST}/*`)\n @UseInterceptors(ContextInterceptor)\n async unlockRequest(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.unlockRequest(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.GET_SIZE}/*`)\n async getSize(@GetSpace() space: SpaceEnv): Promise<{ size: number }> {\n return this.filesMethods.getSize(space)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","uploadCreate","upload","uploadOverwrite","uploadContent","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","lock","unlock","forceAsOwner","unlockRequest","getSize","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","ParseBoolPipe","UNLOCK_REQUEST","GET_SIZE","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
@@ -7,6 +7,8 @@ Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
9
  const _testing = require("@nestjs/testing");
10
+ const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
11
+ const _contextmanagerservice = require("../../infrastructure/context/services/context-manager.service");
10
12
  const _spaceguard = require("../spaces/guards/space.guard");
11
13
  const _operations = require("./constants/operations");
12
14
  const _filescontroller = require("./files.controller");
@@ -39,6 +41,7 @@ describe(_filescontroller.FilesController.name, ()=>{
39
41
  const fakeRes = {
40
42
  header: jest.fn().mockReturnThis(),
41
43
  status: jest.fn().mockReturnThis(),
44
+ type: jest.fn().mockReturnThis(),
42
45
  send: jest.fn()
43
46
  };
44
47
  // Mocks
@@ -84,7 +87,12 @@ describe(_filescontroller.FilesController.name, ()=>{
84
87
  {
85
88
  provide: _filessearchmanagerservice.FilesSearchManager,
86
89
  useValue: filesSearchMock
87
- }
90
+ },
91
+ {
92
+ provide: _contextmanagerservice.ContextManager,
93
+ useValue: filesSearchMock
94
+ },
95
+ _contextinterceptor.ContextInterceptor
88
96
  ]
89
97
  });
90
98
  // IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies
@@ -124,9 +132,9 @@ describe(_filescontroller.FilesController.name, ()=>{
124
132
  await filesController.make(fakeUser, fakeSpace, dto);
125
133
  expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto);
126
134
  });
127
- it('upload() should call filesMethods.upload(req, res)', async ()=>{
128
- await filesController.upload(fakeReq, fakeRes);
129
- expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq, fakeRes);
135
+ it('upload() should call filesMethods.upload(req)', async ()=>{
136
+ await filesController.uploadCreate(fakeReq);
137
+ expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq);
130
138
  });
131
139
  it('copy() should call filesMethods.copy(user, space, dto) and return its result', async ()=>{
132
140
  const dto = {
@@ -164,16 +172,29 @@ describe(_filescontroller.FilesController.name, ()=>{
164
172
  const stream = {};
165
173
  filesMethodsMock.genThumbnail.mockResolvedValue(stream);
166
174
  // pass undefined to exercise controller default parameter
167
- const result = await filesController.genThumbnail(fakeSpace, undefined);
175
+ const result = await filesController.genThumbnail(fakeSpace, undefined, fakeRes);
168
176
  expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256);
169
- expect(result).toBe(stream);
177
+ expect(fakeRes.type).toHaveBeenCalled();
178
+ expect(fakeRes.send).toHaveBeenCalledWith(stream);
179
+ expect(result).toBeUndefined();
170
180
  });
171
181
  it('genThumbnail() should pass provided size', async ()=>{
172
182
  const stream = {};
173
183
  filesMethodsMock.genThumbnail.mockResolvedValue(stream);
174
- const result = await filesController.genThumbnail(fakeSpace, 512);
184
+ const result = await filesController.genThumbnail(fakeSpace, 512, fakeRes);
175
185
  expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512);
176
- expect(result).toBe(stream);
186
+ expect(fakeRes.type).toHaveBeenCalled();
187
+ expect(fakeRes.send).toHaveBeenCalledWith(stream);
188
+ expect(result).toBeUndefined();
189
+ });
190
+ it('genThumbnail() should reduce size larger than 1024', async ()=>{
191
+ const stream = {};
192
+ filesMethodsMock.genThumbnail.mockResolvedValue(stream);
193
+ const result = await filesController.genThumbnail(fakeSpace, 2048, fakeRes);
194
+ expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 1024);
195
+ expect(fakeRes.type).toHaveBeenCalled();
196
+ expect(fakeRes.send).toHaveBeenCalledWith(stream);
197
+ expect(result).toBeUndefined();
177
198
  });
178
199
  });
179
200
  describe('Tasks operations', ()=>{
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.spec.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 { Test, TestingModule } from '@nestjs/testing'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FilesController } from './files.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\ndescribe(FilesController.name, () => {\n let filesController: FilesController\n\n // Reusable fakes\n const fakeUser: any = { id: 1, login: 'john', role: 1 }\n const fakeSpace: any = { id: 42, key: 'space-key', url: '/space/a', realPath: '/data/space/a', realBasePath: '/data/space' }\n const fakeReq: any = { user: fakeUser, space: fakeSpace, headers: {}, method: 'GET', ip: '127.0.0.1' }\n const fakeRes: any = { header: jest.fn().mockReturnThis(), status: jest.fn().mockReturnThis(), send: jest.fn() }\n\n // Mocks\n const filesMethodsMock = {\n headOrGet: jest.fn(),\n make: jest.fn(),\n upload: jest.fn(),\n copy: jest.fn(),\n move: jest.fn(),\n delete: jest.fn(),\n genThumbnail: jest.fn(),\n downloadFromUrl: jest.fn(),\n compress: jest.fn(),\n decompress: jest.fn()\n }\n\n const filesTasksManagerMock = {\n createTask: jest.fn()\n }\n\n const filesRecentsMock = {\n getRecents: jest.fn()\n }\n\n const filesSearchMock = {\n search: jest.fn()\n }\n\n beforeAll(async () => {\n const testingModuleBuilder = Test.createTestingModule({\n controllers: [FilesController],\n providers: [\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: FilesTasksManager, useValue: filesTasksManagerMock },\n { provide: FilesRecents, useValue: filesRecentsMock },\n { provide: FilesSearchManager, useValue: filesSearchMock }\n ]\n })\n // IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies\n testingModuleBuilder.overrideGuard(SpaceGuard).useValue({ canActivate: jest.fn().mockReturnValue(true) })\n\n const module: TestingModule = await testingModuleBuilder.compile()\n\n filesController = module.get<FilesController>(FilesController)\n })\n\n it('should be defined', () => {\n expect(filesController).toBeDefined()\n })\n\n describe('Operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('head() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.head(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('download() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.download(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('make() should call filesMethods.make(user, space, dto)', async () => {\n const dto = { path: '/a', name: 'b', type: 'directory' } as any\n\n await filesController.make(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n })\n\n it('upload() should call filesMethods.upload(req, res)', async () => {\n await filesController.upload(fakeReq, fakeRes)\n\n expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq, fakeRes)\n })\n\n it('copy() should call filesMethods.copy(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'b' } as any\n const expected = { path: '/dst', name: 'b' }\n filesMethodsMock.copy.mockResolvedValue(expected)\n\n const result = await filesController.copy(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.copy).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('move() should call filesMethods.move(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'c' } as any\n const expected = { path: '/dst', name: 'c' }\n filesMethodsMock.move.mockResolvedValue(expected)\n\n const result = await filesController.move(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.move).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('delete() should call filesMethods.delete(user, space)', async () => {\n await filesController.delete(fakeUser, fakeSpace)\n\n expect(filesMethodsMock.delete).toHaveBeenCalledWith(fakeUser, fakeSpace)\n })\n\n it('genThumbnail() should default size to 256 when not provided', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n // pass undefined to exercise controller default parameter\n const result = await filesController.genThumbnail(fakeSpace, undefined as unknown as number)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256)\n expect(result).toBe(stream)\n })\n\n it('genThumbnail() should pass provided size', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n const result = await filesController.genThumbnail(fakeSpace, 512)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512)\n expect(result).toBe(stream)\n })\n })\n\n describe('Tasks operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('downloadFromUrlAsTask() should create DOWNLOAD task using method name \"downloadFromUrl\"', async () => {\n const dto = { url: 'http://x', to: '/a' } as any\n const task = { id: 1 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.downloadFromUrlAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DOWNLOAD,\n fakeUser,\n fakeSpace,\n dto,\n filesMethodsMock.downloadFromUrl.name\n )\n expect(result).toBe(task)\n })\n\n it('compressAsTask() should call SpaceGuard.checkPermissions when compressInDirectory is true', async () => {\n const dto = { compressInDirectory: true } as any\n const spy = jest.spyOn(SpaceGuard as any, 'checkPermissions').mockImplementation(() => undefined)\n\n filesTasksManagerMock.createTask.mockResolvedValue({} as any)\n await filesController.compressAsTask(fakeReq, dto)\n\n expect(spy).toHaveBeenCalled()\n spy.mockRestore()\n })\n\n it('compressAsTask() should create COMPRESS task with req.user and req.space and method name \"compress\"', async () => {\n const dto = { compressInDirectory: false } as any\n const task = { id: 2 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.compressAsTask(fakeReq, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.COMPRESS,\n fakeReq.user,\n fakeReq.space,\n dto,\n filesMethodsMock.compress.name\n )\n expect(result).toBe(task)\n })\n\n it('decompressAsTask() should create DECOMPRESS task with null dto and method name \"decompress\"', async () => {\n const task = { id: 3 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.decompressAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DECOMPRESS,\n fakeUser,\n fakeSpace,\n null,\n filesMethodsMock.decompress.name\n )\n expect(result).toBe(task)\n })\n\n it('copyAsTask() should create COPY task with method name \"copy\"', async () => {\n const dto = { from: '/a', to: '/b' } as any\n const task = { id: 4 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.copyAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.COPY, fakeUser, fakeSpace, dto, filesMethodsMock.copy.name)\n expect(result).toBe(task)\n })\n\n it('moveAsTask() should create MOVE task with method name \"move\"', async () => {\n const dto = { from: '/a', to: '/c' } as any\n const task = { id: 5 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.moveAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.MOVE, fakeUser, fakeSpace, dto, filesMethodsMock.move.name)\n expect(result).toBe(task)\n })\n\n it('deleteAsTask() should create DELETE task with null dto and method name \"delete\"', async () => {\n const task = { id: 6 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.deleteAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.DELETE, fakeUser, fakeSpace, null, filesMethodsMock.delete.name)\n expect(result).toBe(task)\n })\n })\n\n describe('Recents & Search', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('getRecents() should use limit=10 by default', async () => {\n const recents = [{ path: '/a' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, undefined as unknown as number)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 10)\n expect(result).toBe(recents)\n })\n\n it('getRecents() should forward provided limit', async () => {\n const recents = [{ path: '/b' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, 5)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 5)\n expect(result).toBe(recents)\n })\n\n it('search() should delegate to filesSearch.search(user, dto)', async () => {\n const dto = { query: 'test' } as any\n const items = [{ name: 'file' }] as any\n filesSearchMock.search.mockResolvedValue(items)\n\n const result = await filesController.search(fakeUser, dto)\n\n expect(filesSearchMock.search).toHaveBeenCalledWith(fakeUser, dto)\n expect(result).toBe(items)\n })\n })\n})\n"],"names":["describe","FilesController","name","filesController","fakeUser","id","login","role","fakeSpace","key","url","realPath","realBasePath","fakeReq","user","space","headers","method","ip","fakeRes","header","jest","fn","mockReturnThis","status","send","filesMethodsMock","headOrGet","make","upload","copy","move","delete","genThumbnail","downloadFromUrl","compress","decompress","filesTasksManagerMock","createTask","filesRecentsMock","getRecents","filesSearchMock","search","beforeAll","testingModuleBuilder","Test","createTestingModule","controllers","providers","provide","FilesMethods","useValue","FilesTasksManager","FilesRecents","FilesSearchManager","overrideGuard","SpaceGuard","canActivate","mockReturnValue","module","compile","get","it","expect","toBeDefined","beforeEach","clearAllMocks","stream","mockResolvedValue","result","head","toHaveBeenCalledWith","toBe","download","dto","path","type","dstDirectory","dstName","expected","toEqual","undefined","to","task","downloadFromUrlAsTask","FILE_OPERATION","DOWNLOAD","compressInDirectory","spy","spyOn","mockImplementation","compressAsTask","toHaveBeenCalled","mockRestore","COMPRESS","decompressAsTask","DECOMPRESS","from","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","recents","query","items"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/files/files.controller.spec.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 { Test, TestingModule } from '@nestjs/testing'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FilesController } from './files.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\ndescribe(FilesController.name, () => {\n let filesController: FilesController\n\n // Reusable fakes\n const fakeUser: any = { id: 1, login: 'john', role: 1 }\n const fakeSpace: any = { id: 42, key: 'space-key', url: '/space/a', realPath: '/data/space/a', realBasePath: '/data/space' }\n const fakeReq: any = { user: fakeUser, space: fakeSpace, headers: {}, method: 'GET', ip: '127.0.0.1' }\n const fakeRes: any = { header: jest.fn().mockReturnThis(), status: jest.fn().mockReturnThis(), type: jest.fn().mockReturnThis(), send: jest.fn() }\n\n // Mocks\n const filesMethodsMock = {\n headOrGet: jest.fn(),\n make: jest.fn(),\n upload: jest.fn(),\n copy: jest.fn(),\n move: jest.fn(),\n delete: jest.fn(),\n genThumbnail: jest.fn(),\n downloadFromUrl: jest.fn(),\n compress: jest.fn(),\n decompress: jest.fn()\n }\n\n const filesTasksManagerMock = {\n createTask: jest.fn()\n }\n\n const filesRecentsMock = {\n getRecents: jest.fn()\n }\n\n const filesSearchMock = {\n search: jest.fn()\n }\n\n beforeAll(async () => {\n const testingModuleBuilder = Test.createTestingModule({\n controllers: [FilesController],\n providers: [\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: FilesTasksManager, useValue: filesTasksManagerMock },\n { provide: FilesRecents, useValue: filesRecentsMock },\n { provide: FilesSearchManager, useValue: filesSearchMock },\n { provide: ContextManager, useValue: filesSearchMock },\n ContextInterceptor\n ]\n })\n // IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies\n testingModuleBuilder.overrideGuard(SpaceGuard).useValue({ canActivate: jest.fn().mockReturnValue(true) })\n\n const module: TestingModule = await testingModuleBuilder.compile()\n\n filesController = module.get<FilesController>(FilesController)\n })\n\n it('should be defined', () => {\n expect(filesController).toBeDefined()\n })\n\n describe('Operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('head() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.head(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('download() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.download(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('make() should call filesMethods.make(user, space, dto)', async () => {\n const dto = { path: '/a', name: 'b', type: 'directory' } as any\n\n await filesController.make(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n })\n\n it('upload() should call filesMethods.upload(req)', async () => {\n await filesController.uploadCreate(fakeReq)\n\n expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq)\n })\n\n it('copy() should call filesMethods.copy(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'b' } as any\n const expected = { path: '/dst', name: 'b' }\n filesMethodsMock.copy.mockResolvedValue(expected)\n\n const result = await filesController.copy(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.copy).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('move() should call filesMethods.move(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'c' } as any\n const expected = { path: '/dst', name: 'c' }\n filesMethodsMock.move.mockResolvedValue(expected)\n\n const result = await filesController.move(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.move).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('delete() should call filesMethods.delete(user, space)', async () => {\n await filesController.delete(fakeUser, fakeSpace)\n\n expect(filesMethodsMock.delete).toHaveBeenCalledWith(fakeUser, fakeSpace)\n })\n\n it('genThumbnail() should default size to 256 when not provided', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n // pass undefined to exercise controller default parameter\n const result = await filesController.genThumbnail(fakeSpace, undefined as unknown as number, fakeRes)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256)\n expect(fakeRes.type).toHaveBeenCalled()\n expect(fakeRes.send).toHaveBeenCalledWith(stream)\n expect(result).toBeUndefined()\n })\n\n it('genThumbnail() should pass provided size', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n const result = await filesController.genThumbnail(fakeSpace, 512, fakeRes)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512)\n expect(fakeRes.type).toHaveBeenCalled()\n expect(fakeRes.send).toHaveBeenCalledWith(stream)\n expect(result).toBeUndefined()\n })\n\n it('genThumbnail() should reduce size larger than 1024', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n const result = await filesController.genThumbnail(fakeSpace, 2048, fakeRes)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 1024)\n expect(fakeRes.type).toHaveBeenCalled()\n expect(fakeRes.send).toHaveBeenCalledWith(stream)\n expect(result).toBeUndefined()\n })\n })\n\n describe('Tasks operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('downloadFromUrlAsTask() should create DOWNLOAD task using method name \"downloadFromUrl\"', async () => {\n const dto = { url: 'http://x', to: '/a' } as any\n const task = { id: 1 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.downloadFromUrlAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DOWNLOAD,\n fakeUser,\n fakeSpace,\n dto,\n filesMethodsMock.downloadFromUrl.name\n )\n expect(result).toBe(task)\n })\n\n it('compressAsTask() should call SpaceGuard.checkPermissions when compressInDirectory is true', async () => {\n const dto = { compressInDirectory: true } as any\n const spy = jest.spyOn(SpaceGuard as any, 'checkPermissions').mockImplementation(() => undefined)\n\n filesTasksManagerMock.createTask.mockResolvedValue({} as any)\n await filesController.compressAsTask(fakeReq, dto)\n\n expect(spy).toHaveBeenCalled()\n spy.mockRestore()\n })\n\n it('compressAsTask() should create COMPRESS task with req.user and req.space and method name \"compress\"', async () => {\n const dto = { compressInDirectory: false } as any\n const task = { id: 2 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.compressAsTask(fakeReq, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.COMPRESS,\n fakeReq.user,\n fakeReq.space,\n dto,\n filesMethodsMock.compress.name\n )\n expect(result).toBe(task)\n })\n\n it('decompressAsTask() should create DECOMPRESS task with null dto and method name \"decompress\"', async () => {\n const task = { id: 3 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.decompressAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DECOMPRESS,\n fakeUser,\n fakeSpace,\n null,\n filesMethodsMock.decompress.name\n )\n expect(result).toBe(task)\n })\n\n it('copyAsTask() should create COPY task with method name \"copy\"', async () => {\n const dto = { from: '/a', to: '/b' } as any\n const task = { id: 4 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.copyAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.COPY, fakeUser, fakeSpace, dto, filesMethodsMock.copy.name)\n expect(result).toBe(task)\n })\n\n it('moveAsTask() should create MOVE task with method name \"move\"', async () => {\n const dto = { from: '/a', to: '/c' } as any\n const task = { id: 5 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.moveAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.MOVE, fakeUser, fakeSpace, dto, filesMethodsMock.move.name)\n expect(result).toBe(task)\n })\n\n it('deleteAsTask() should create DELETE task with null dto and method name \"delete\"', async () => {\n const task = { id: 6 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.deleteAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.DELETE, fakeUser, fakeSpace, null, filesMethodsMock.delete.name)\n expect(result).toBe(task)\n })\n })\n\n describe('Recents & Search', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('getRecents() should use limit=10 by default', async () => {\n const recents = [{ path: '/a' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, undefined as unknown as number)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 10)\n expect(result).toBe(recents)\n })\n\n it('getRecents() should forward provided limit', async () => {\n const recents = [{ path: '/b' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, 5)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 5)\n expect(result).toBe(recents)\n })\n\n it('search() should delegate to filesSearch.search(user, dto)', async () => {\n const dto = { query: 'test' } as any\n const items = [{ name: 'file' }] as any\n filesSearchMock.search.mockResolvedValue(items)\n\n const result = await filesController.search(fakeUser, dto)\n\n expect(filesSearchMock.search).toHaveBeenCalledWith(fakeUser, dto)\n expect(result).toBe(items)\n })\n })\n})\n"],"names":["describe","FilesController","name","filesController","fakeUser","id","login","role","fakeSpace","key","url","realPath","realBasePath","fakeReq","user","space","headers","method","ip","fakeRes","header","jest","fn","mockReturnThis","status","type","send","filesMethodsMock","headOrGet","make","upload","copy","move","delete","genThumbnail","downloadFromUrl","compress","decompress","filesTasksManagerMock","createTask","filesRecentsMock","getRecents","filesSearchMock","search","beforeAll","testingModuleBuilder","Test","createTestingModule","controllers","providers","provide","FilesMethods","useValue","FilesTasksManager","FilesRecents","FilesSearchManager","ContextManager","ContextInterceptor","overrideGuard","SpaceGuard","canActivate","mockReturnValue","module","compile","get","it","expect","toBeDefined","beforeEach","clearAllMocks","stream","mockResolvedValue","result","head","toHaveBeenCalledWith","toBe","download","dto","path","uploadCreate","dstDirectory","dstName","expected","toEqual","undefined","toHaveBeenCalled","toBeUndefined","to","task","downloadFromUrlAsTask","FILE_OPERATION","DOWNLOAD","compressInDirectory","spy","spyOn","mockImplementation","compressAsTask","mockRestore","COMPRESS","decompressAsTask","DECOMPRESS","from","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","recents","query","items"],"mappings":"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"}
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "FilesOnlyOfficeGuard", {
15
15
  const _common = require("@nestjs/common");
16
16
  const _passport = require("@nestjs/passport");
17
17
  const _configenvironment = require("../../../configuration/config.environment");
18
+ const _routes = require("../constants/routes");
18
19
  function _ts_decorate(decorators, target, key, desc) {
19
20
  var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
20
21
  if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
@@ -23,6 +24,11 @@ function _ts_decorate(decorators, target, key, desc) {
23
24
  }
24
25
  let FilesOnlyOfficeGuard = class FilesOnlyOfficeGuard extends (0, _passport.AuthGuard)('filesOnlyOfficeToken') {
25
26
  canActivate(ctx) {
27
+ const req = ctx.switchToHttp().getRequest();
28
+ if (req.originalUrl === _routes.API_FILES_ONLY_OFFICE_STATUS) {
29
+ // Skip token validation for the status endpoint
30
+ return true;
31
+ }
26
32
  if (!_configenvironment.configuration.applications.files.onlyoffice.enabled) {
27
33
  this.logger.warn(`${this.canActivate.name} - feature not enabled`);
28
34
  throw new _common.HttpException('Feature not enabled', _common.HttpStatus.BAD_REQUEST);