@sync-in/server 1.8.1 → 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 (603) hide show
  1. package/CHANGELOG.md +56 -11
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +15 -15
  4. package/server/app.constants.js +9 -0
  5. package/server/app.constants.js.map +1 -1
  6. package/server/app.module.js +4 -0
  7. package/server/app.module.js.map +1 -1
  8. package/server/applications/admin/admin.module.js +6 -1
  9. package/server/applications/admin/admin.module.js.map +1 -1
  10. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  11. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  12. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  13. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  14. package/server/applications/admin/services/admin.service.js +102 -0
  15. package/server/applications/admin/services/admin.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.spec.js +46 -0
  17. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  18. package/server/applications/admin/utils/check-update.js +28 -0
  19. package/server/applications/admin/utils/check-update.js.map +1 -0
  20. package/server/applications/comments/services/comments-manager.service.js +1 -1
  21. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  22. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  24. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  25. package/server/applications/files/constants/cache.js +10 -1
  26. package/server/applications/files/constants/cache.js.map +1 -1
  27. package/server/applications/files/constants/only-office.js +0 -25
  28. package/server/applications/files/constants/only-office.js.map +1 -1
  29. package/server/applications/files/constants/operations.js +20 -3
  30. package/server/applications/files/constants/operations.js.map +1 -1
  31. package/server/applications/files/dto/file-operations.dto.js +7 -0
  32. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  33. package/server/applications/files/files-only-office.controller.js +3 -2
  34. package/server/applications/files/files-only-office.controller.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  36. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  37. package/server/applications/files/files.controller.js +88 -8
  38. package/server/applications/files/files.controller.js.map +1 -1
  39. package/server/applications/files/files.controller.spec.js +11 -4
  40. package/server/applications/files/files.controller.spec.js.map +1 -1
  41. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  42. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  43. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  44. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  45. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  46. package/server/applications/files/services/files-content-manager.service.js +3 -3
  47. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  48. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  49. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-manager.service.js +122 -24
  51. package/server/applications/files/services/files-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  53. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  54. package/server/applications/files/services/files-methods.service.js +38 -8
  55. package/server/applications/files/services/files-methods.service.js.map +1 -1
  56. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  57. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  58. package/server/applications/files/services/files-parser.service.js +1 -1
  59. package/server/applications/files/services/files-parser.service.js.map +1 -1
  60. package/server/applications/files/services/files-queries.service.js +10 -0
  61. package/server/applications/files/services/files-queries.service.js.map +1 -1
  62. package/server/applications/files/utils/files.js +1 -1
  63. package/server/applications/files/utils/files.js.map +1 -1
  64. package/server/applications/files/utils/send-file.js +3 -2
  65. package/server/applications/files/utils/send-file.js.map +1 -1
  66. package/server/applications/links/services/links-queries.service.js +1 -1
  67. package/server/applications/links/services/links-queries.service.js.map +1 -1
  68. package/server/applications/notifications/constants/notifications.js +5 -1
  69. package/server/applications/notifications/constants/notifications.js.map +1 -1
  70. package/server/applications/notifications/i18n/de.js +8 -2
  71. package/server/applications/notifications/i18n/de.js.map +1 -1
  72. package/server/applications/notifications/i18n/es.js +8 -2
  73. package/server/applications/notifications/i18n/es.js.map +1 -1
  74. package/server/applications/notifications/i18n/fr.js +8 -2
  75. package/server/applications/notifications/i18n/fr.js.map +1 -1
  76. package/server/applications/notifications/i18n/hi.js +8 -2
  77. package/server/applications/notifications/i18n/hi.js.map +1 -1
  78. package/server/applications/notifications/i18n/it.js +8 -2
  79. package/server/applications/notifications/i18n/it.js.map +1 -1
  80. package/server/applications/notifications/i18n/ja.js +8 -2
  81. package/server/applications/notifications/i18n/ja.js.map +1 -1
  82. package/server/applications/notifications/i18n/ko.js +8 -2
  83. package/server/applications/notifications/i18n/ko.js.map +1 -1
  84. package/server/applications/notifications/i18n/pl.js +8 -2
  85. package/server/applications/notifications/i18n/pl.js.map +1 -1
  86. package/server/applications/notifications/i18n/pt.js +8 -2
  87. package/server/applications/notifications/i18n/pt.js.map +1 -1
  88. package/server/applications/notifications/i18n/pt_br.js +8 -2
  89. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  90. package/server/applications/notifications/i18n/ru.js +8 -2
  91. package/server/applications/notifications/i18n/ru.js.map +1 -1
  92. package/server/applications/notifications/i18n/tr.js +8 -2
  93. package/server/applications/notifications/i18n/tr.js.map +1 -1
  94. package/server/applications/notifications/i18n/zh.js +8 -2
  95. package/server/applications/notifications/i18n/zh.js.map +1 -1
  96. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  97. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  98. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  99. package/server/applications/notifications/mails/models.js +38 -3
  100. package/server/applications/notifications/mails/models.js.map +1 -1
  101. package/server/applications/notifications/mails/templates.js +1 -1
  102. package/server/applications/notifications/mails/templates.js.map +1 -1
  103. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  104. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  105. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  106. package/server/applications/shares/services/shares-manager.service.js +17 -10
  107. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  108. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  109. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  110. package/server/applications/shares/services/shares-queries.service.js +11 -1
  111. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  112. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  113. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  114. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  115. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  116. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  117. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  119. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  120. package/server/applications/spaces/utils/permissions.js +2 -2
  121. package/server/applications/spaces/utils/permissions.js.map +1 -1
  122. package/server/applications/sync/services/sync-manager.service.js +1 -0
  123. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  124. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  125. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  126. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  127. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  128. package/server/applications/users/constants/user.js +1 -1
  129. package/server/applications/users/constants/user.js.map +1 -1
  130. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  131. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  132. package/server/applications/users/services/users-queries.service.js +67 -68
  133. package/server/applications/users/services/users-queries.service.js.map +1 -1
  134. package/server/applications/users/users.module.js +2 -1
  135. package/server/applications/users/users.module.js.map +1 -1
  136. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  137. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  138. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  139. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  140. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  141. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  142. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  143. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  144. package/server/authentication/constants/auth-ldap.js +2 -0
  145. package/server/authentication/constants/auth-ldap.js.map +1 -1
  146. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  147. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  148. package/server/common/functions.js +0 -8
  149. package/server/common/functions.js.map +1 -1
  150. package/server/common/image.js +1 -0
  151. package/server/common/image.js.map +1 -1
  152. package/server/common/shared.js +18 -1
  153. package/server/common/shared.js.map +1 -1
  154. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  155. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  156. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  157. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  158. package/static/3rdpartylicenses.txt +1393 -44
  159. package/static/assets/favicon.svg +2 -25
  160. package/static/assets/logo-dark.svg +2 -32
  161. package/static/assets/logo.svg +2 -32
  162. package/static/assets/mimes/application-sql.svg +29 -1
  163. package/static/assets/mimes/application-x-sql.svg +29 -0
  164. package/static/assets/mimes/image-bmp.svg +12 -0
  165. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  166. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  167. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  168. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  169. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  170. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  171. package/static/assets/pdfjs/version +1 -1
  172. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  173. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  174. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  175. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  176. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  177. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  178. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  179. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  180. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  181. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  182. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  183. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  184. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  185. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  186. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  187. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  188. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  189. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  191. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  192. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  195. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  196. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  198. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  200. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  201. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  202. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  203. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  204. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  205. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  206. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  208. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  209. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  210. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  211. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  212. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  213. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  214. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  215. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  216. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  217. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  218. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  219. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  220. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  221. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  222. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  223. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  224. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  225. package/static/assets/pdfjs/web/viewer.css +141 -110
  226. package/static/assets/pdfjs/web/viewer.html +7 -7
  227. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  228. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  229. package/static/chunk-22DWHRCL.js +1 -0
  230. package/static/chunk-23UUFZSR.js +1 -0
  231. package/static/{chunk-MTVSJTIW.js → chunk-24Q7OUU2.js} +1 -1
  232. package/static/chunk-25QTY2GI.js +1 -0
  233. package/static/chunk-2E7IJZLL.js +1 -0
  234. package/static/chunk-2FC5EKS5.js +1 -0
  235. package/static/chunk-2FOWUJQF.js +1 -0
  236. package/static/chunk-2XPHUNYN.js +1 -0
  237. package/static/chunk-32L7RG2G.js +1 -0
  238. package/static/chunk-3IISSX63.js +1 -0
  239. package/static/chunk-3OHSTP3R.js +1 -0
  240. package/static/chunk-42L6C5MT.js +1 -0
  241. package/static/chunk-4AGQL5GV.js +1 -0
  242. package/static/chunk-4BPSQMI2.js +1 -0
  243. package/static/chunk-4FDRWZWT.js +1 -0
  244. package/static/chunk-4FJUCMEG.js +1 -0
  245. package/static/chunk-4GCCF6PF.js +1 -0
  246. package/static/chunk-4ORP3SBY.js +1 -0
  247. package/static/chunk-4QBOHIC3.js +1 -0
  248. package/static/chunk-4YT6K5KY.js +1 -0
  249. package/static/chunk-556I6YIW.js +1 -0
  250. package/static/chunk-5DPIGJU4.js +1 -0
  251. package/static/chunk-5HNQLBSW.js +3 -0
  252. package/static/chunk-5IL7C45D.js +1 -0
  253. package/static/chunk-5KJXGMKR.js +1 -0
  254. package/static/chunk-5SPGSHKL.js +1 -0
  255. package/static/chunk-5WCQBTXW.js +1 -0
  256. package/static/chunk-5XUIPWOH.js +1 -0
  257. package/static/chunk-62WT7PI3.js +1 -0
  258. package/static/chunk-6F6OMQ5H.js +1 -0
  259. package/static/chunk-6I5BGQHT.js +1 -0
  260. package/static/chunk-6NOS45DG.js +1 -0
  261. package/static/chunk-6OKLPRCD.js +1 -0
  262. package/static/chunk-6VEJCG43.js +1 -0
  263. package/static/chunk-77SS36Z2.js +1 -0
  264. package/static/chunk-7AXEPO3G.js +1 -0
  265. package/static/chunk-7CFSJ4BO.js +1 -0
  266. package/static/chunk-7CKHC72R.js +1 -0
  267. package/static/chunk-7DUTYOJG.js +1 -0
  268. package/static/chunk-7HKFYRPF.js +1 -0
  269. package/static/chunk-7NZJZATZ.js +1 -0
  270. package/static/chunk-AADK5D2H.js +1 -0
  271. package/static/chunk-ACUF7IKP.js +1 -0
  272. package/static/chunk-AGREZPV4.js +1 -0
  273. package/static/chunk-ATBJWFA3.js +1 -0
  274. package/static/chunk-ATXLZN2B.js +1 -0
  275. package/static/chunk-AZ5TF5Y3.js +1 -0
  276. package/static/chunk-BBHYIURC.js +1 -0
  277. package/static/chunk-BHZEPHRI.js +13 -0
  278. package/static/chunk-BQZWSZNN.js +1 -0
  279. package/static/chunk-BSB4VROD.js +2 -0
  280. package/static/chunk-BYWSTP3P.js +1 -0
  281. package/static/chunk-C3AAEQKW.js +1 -0
  282. package/static/chunk-CCGGCHGN.js +1 -0
  283. package/static/chunk-CFTKW432.js +1 -0
  284. package/static/chunk-CNOVT6KU.js +1 -0
  285. package/static/chunk-D56H3XE2.js +1 -0
  286. package/static/chunk-DFOOSIIA.js +1 -0
  287. package/static/chunk-DHFQIFOF.js +1 -0
  288. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  289. package/static/chunk-DJDRX53V.js +2 -0
  290. package/static/chunk-DKGXUMLT.js +1 -0
  291. package/static/chunk-DRHPEERW.js +2 -0
  292. package/static/chunk-DWYP6ZGG.js +1 -0
  293. package/static/chunk-EDJAISWO.js +13 -0
  294. package/static/chunk-EIYRBM4J.js +1 -0
  295. package/static/chunk-EKEGRXCV.js +7 -0
  296. package/static/chunk-EL6QL4TP.js +1 -0
  297. package/static/chunk-ERDZ7IVF.js +1 -0
  298. package/static/chunk-EVQKKVUZ.js +1 -0
  299. package/static/chunk-F2XG7EWI.js +1 -0
  300. package/static/chunk-F672FY5I.js +1 -0
  301. package/static/chunk-F6V37MKG.js +1 -0
  302. package/static/chunk-F7TXTNZC.js +1 -0
  303. package/static/chunk-FCGTI42I.js +1 -0
  304. package/static/chunk-FQHOSSCO.js +1 -0
  305. package/static/chunk-FTSIPHMG.js +1 -0
  306. package/static/chunk-GAGHHYLF.js +1 -0
  307. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  308. package/static/chunk-H6WOTGQ5.js +1 -0
  309. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  310. package/static/chunk-HC7F57NA.js +1 -0
  311. package/static/chunk-HHWXIK2M.js +7 -0
  312. package/static/chunk-HKRGIRKB.js +3 -0
  313. package/static/chunk-HNMGPG72.js +1 -0
  314. package/static/chunk-HS4S6BV3.js +1 -0
  315. package/static/chunk-IJ7K7ATQ.js +1 -0
  316. package/static/chunk-IOIBQGHN.js +562 -0
  317. package/static/chunk-ITVA26X2.js +2 -0
  318. package/static/chunk-J6YSFHLZ.js +1 -0
  319. package/static/chunk-JAEJ6IMV.js +1 -0
  320. package/static/chunk-JB5R6V33.js +1 -0
  321. package/static/chunk-JF6WIV6M.js +1 -0
  322. package/static/chunk-JGB4LLUT.js +1 -0
  323. package/static/chunk-JGXVTKLG.js +1 -0
  324. package/static/chunk-JMYAD7E2.js +1 -0
  325. package/static/chunk-JSE63Q5X.js +1 -0
  326. package/static/chunk-JVV3ZL6L.js +1 -0
  327. package/static/chunk-JXZCNFW7.js +1 -0
  328. package/static/chunk-KAVP6UXH.js +1 -0
  329. package/static/{chunk-3R74L4UU.js → chunk-KDEEERWZ.js} +1 -1
  330. package/static/chunk-KHRF67SG.js +1 -0
  331. package/static/chunk-KLOUBIO4.js +1 -0
  332. package/static/chunk-KMF3ZRAO.js +1 -0
  333. package/static/chunk-KNZ3AQPR.js +1 -0
  334. package/static/chunk-KT3TWCST.js +1 -0
  335. package/static/chunk-L6SYG23T.js +1 -0
  336. package/static/chunk-LJSVNPPQ.js +1 -0
  337. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  338. package/static/chunk-LRQSPCYZ.js +1 -0
  339. package/static/chunk-LUSVISM6.js +1 -0
  340. package/static/chunk-LXQGVNU2.js +1 -0
  341. package/static/{chunk-LVSNIS5P.js → chunk-LYZGJZNP.js} +1 -1
  342. package/static/chunk-LZKI5P5T.js +1 -0
  343. package/static/chunk-M4XL3JN5.js +6 -0
  344. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  345. package/static/chunk-MKUUWY6Y.js +1 -0
  346. package/static/{chunk-VJTXJ43D.js → chunk-MNNCSSHN.js} +1 -1
  347. package/static/chunk-MR3U7TKQ.js +1 -0
  348. package/static/chunk-MRF3CNLZ.js +1 -0
  349. package/static/chunk-MRMSMTWD.js +1 -0
  350. package/static/chunk-MVZJSG5R.js +1 -0
  351. package/static/chunk-MYM43ENO.js +1 -0
  352. package/static/chunk-N3P6P6GW.js +7 -0
  353. package/static/chunk-NAH4V2R6.js +2 -0
  354. package/static/chunk-NBBDVVUF.js +1 -0
  355. package/static/chunk-NMF2ZFBE.js +1 -0
  356. package/static/chunk-NN4ONTOT.js +1 -0
  357. package/static/chunk-NOPACN4F.js +1 -0
  358. package/static/chunk-NYJPOP4L.js +1 -0
  359. package/static/chunk-OJCAIKUK.js +1 -0
  360. package/static/chunk-OQRWXCLY.js +1 -0
  361. package/static/chunk-PCFH5HCI.js +2 -0
  362. package/static/chunk-PG54TWBO.js +4 -0
  363. package/static/chunk-PJF5XUTO.js +1 -0
  364. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  365. package/static/chunk-PTLYIUFW.js +1 -0
  366. package/static/chunk-PZGLDZZM.js +1 -0
  367. package/static/chunk-Q4VNZGFI.js +1 -0
  368. package/static/chunk-Q556XB3S.js +1 -0
  369. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  370. package/static/chunk-Q7U2VPIS.js +1 -0
  371. package/static/chunk-QM6CQMEX.js +1 -0
  372. package/static/chunk-QMHUIHSR.js +1 -0
  373. package/static/chunk-QNFNXDSX.js +1 -0
  374. package/static/chunk-QVFPHTOH.js +1 -0
  375. package/static/chunk-R4MI25E2.js +1 -0
  376. package/static/chunk-R7JRAR3P.js +1 -0
  377. package/static/chunk-R7PNKQU2.js +1 -0
  378. package/static/chunk-RCAORRB7.js +1 -0
  379. package/static/chunk-RK7XRDNB.js +1 -0
  380. package/static/chunk-RO7SAOLK.js +1 -0
  381. package/static/chunk-RQUUINHV.js +1 -0
  382. package/static/chunk-RT3K6DZR.js +1 -0
  383. package/static/chunk-RUN556VW.js +1 -0
  384. package/static/chunk-RX3YQ67K.js +1 -0
  385. package/static/chunk-S6EVLDHA.js +5 -0
  386. package/static/chunk-S7S5M3AZ.js +1 -0
  387. package/static/chunk-SBLNYV74.js +1 -0
  388. package/static/chunk-SIZCHHUA.js +1 -0
  389. package/static/chunk-SRBOO7AO.js +1 -0
  390. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  391. package/static/chunk-T3YI3BSS.js +1 -0
  392. package/static/chunk-T74SMT7I.js +1 -0
  393. package/static/chunk-TAL3RTTQ.js +1 -0
  394. package/static/chunk-TJZKTNNS.js +1 -0
  395. package/static/chunk-UJTFWZEC.js +1 -0
  396. package/static/chunk-UPGVU5LG.js +1 -0
  397. package/static/chunk-UQ6O3I6W.js +1 -0
  398. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  399. package/static/chunk-VWIRXLNE.js +1 -0
  400. package/static/chunk-VZMVGIVW.js +1 -0
  401. package/static/chunk-VZPCXSRG.js +2 -0
  402. package/static/chunk-WR3MA3L3.js +1 -0
  403. package/static/chunk-XCLK7NJL.js +1 -0
  404. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  405. package/static/chunk-XEGHEUP5.js +1 -0
  406. package/static/chunk-XKEBQNQJ.js +1 -0
  407. package/static/chunk-XOF4UW3S.js +1 -0
  408. package/static/chunk-XOTKK2NJ.js +1 -0
  409. package/static/chunk-XX7JXKA6.js +1 -0
  410. package/static/chunk-Y2I36A4K.js +1 -0
  411. package/static/chunk-Y44XDRM5.js +1 -0
  412. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  413. package/static/chunk-Y5RLD72B.js +1 -0
  414. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  415. package/static/chunk-Y63UUJGJ.js +1 -0
  416. package/static/chunk-YBNAC7QM.js +1 -0
  417. package/static/chunk-YCTCESL4.js +1 -0
  418. package/static/chunk-YMAN4LIU.js +1 -0
  419. package/static/chunk-YTDE6SXT.js +1 -0
  420. package/static/chunk-YZPIUJB3.js +1 -0
  421. package/static/chunk-ZCOWBVOT.js +1 -0
  422. package/static/chunk-ZHRYYMYE.js +1 -0
  423. package/static/chunk-ZNXTOQFG.js +1 -0
  424. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  425. package/static/favicon.ico +0 -0
  426. package/static/index.html +2 -2
  427. package/static/main-3PLRDZTO.js +11 -0
  428. package/static/styles-Q4OZOSSK.css +1 -0
  429. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  430. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  431. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  432. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  433. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  434. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  435. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  436. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  437. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  438. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  439. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  440. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  441. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  442. package/static/assets/codemirror/mode/css/css.js +0 -862
  443. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  444. package/static/assets/codemirror/mode/d/d.js +0 -223
  445. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  446. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  447. package/static/assets/codemirror/mode/django/django.js +0 -356
  448. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  449. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  450. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  451. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  452. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  453. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  454. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  455. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  456. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  457. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  458. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  459. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  460. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  461. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  462. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  463. package/static/assets/codemirror/mode/go/go.js +0 -187
  464. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  465. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  466. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  467. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  468. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  469. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  470. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  471. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  472. package/static/assets/codemirror/mode/http/http.js +0 -113
  473. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  474. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  475. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  476. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  477. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  478. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  479. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  480. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  481. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  482. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  483. package/static/assets/codemirror/mode/meta.js +0 -221
  484. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  485. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  486. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  487. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  488. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  489. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  490. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  491. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  492. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  493. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  494. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  495. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  496. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  497. package/static/assets/codemirror/mode/php/php.js +0 -234
  498. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  499. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  500. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  501. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  502. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  503. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  504. package/static/assets/codemirror/mode/python/python.js +0 -402
  505. package/static/assets/codemirror/mode/q/q.js +0 -139
  506. package/static/assets/codemirror/mode/r/r.js +0 -190
  507. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  508. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  509. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  510. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  511. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  512. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  513. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  514. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  515. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  516. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  517. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  518. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  519. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  520. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  521. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  522. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  523. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  524. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  525. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  526. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  527. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  528. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  529. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  530. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  531. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  532. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  533. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  534. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  535. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  536. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  537. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  538. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  539. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  540. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  541. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  542. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  543. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  544. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  545. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  546. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  547. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  548. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  549. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  550. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  551. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  552. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  553. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  554. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  555. package/static/chunk-2KLC4T2Z.js +0 -1
  556. package/static/chunk-2VMSXRCB.js +0 -12
  557. package/static/chunk-3OHSRRKH.js +0 -4
  558. package/static/chunk-3R4WKOHQ.js +0 -1
  559. package/static/chunk-3XVM35O2.js +0 -1
  560. package/static/chunk-3YVRP3VM.js +0 -2
  561. package/static/chunk-5UKZLU5H.js +0 -1
  562. package/static/chunk-AF24EYXU.js +0 -1
  563. package/static/chunk-AKQVEHO6.js +0 -2
  564. package/static/chunk-BCVX464U.js +0 -2
  565. package/static/chunk-BQV4FRM6.js +0 -1
  566. package/static/chunk-CETH7UYS.js +0 -1
  567. package/static/chunk-DIT6W7VM.js +0 -562
  568. package/static/chunk-DKSEQTMX.js +0 -1
  569. package/static/chunk-FZ3JPGYZ.js +0 -1
  570. package/static/chunk-IQSKQXC3.js +0 -1
  571. package/static/chunk-ITUFI2BJ.js +0 -1
  572. package/static/chunk-LCTZJ537.js +0 -1
  573. package/static/chunk-LK2UCQJ6.js +0 -1
  574. package/static/chunk-LP5TBXEN.js +0 -7
  575. package/static/chunk-N3U6637P.js +0 -1
  576. package/static/chunk-NNV4OXSB.js +0 -1
  577. package/static/chunk-O6FYXVHI.js +0 -1
  578. package/static/chunk-OOGP4WSH.js +0 -2
  579. package/static/chunk-PCWDQPOM.js +0 -2
  580. package/static/chunk-PNR6M34W.js +0 -1
  581. package/static/chunk-Q5KM7LTX.js +0 -1
  582. package/static/chunk-QHC6ZPQ4.js +0 -1
  583. package/static/chunk-QMRBZHE4.js +0 -1
  584. package/static/chunk-QSJRY3TF.js +0 -1
  585. package/static/chunk-QUUIRSYT.js +0 -1
  586. package/static/chunk-RFH46UW3.js +0 -1
  587. package/static/chunk-RSXHRKM5.js +0 -1
  588. package/static/chunk-RV3VZJPZ.js +0 -1
  589. package/static/chunk-S7HNXVRB.js +0 -1
  590. package/static/chunk-SBZ572Q4.js +0 -2
  591. package/static/chunk-SJR5R3Y4.js +0 -1
  592. package/static/chunk-SLHTEGRU.js +0 -1
  593. package/static/chunk-SSFF27P2.js +0 -24
  594. package/static/chunk-V3LHHZYN.js +0 -1
  595. package/static/chunk-VQQKMY2C.js +0 -1
  596. package/static/chunk-WSSU2HXE.js +0 -1
  597. package/static/chunk-XDZGW64M.js +0 -3
  598. package/static/chunk-XTRDKGKG.js +0 -1
  599. package/static/chunk-YLWTEC3X.js +0 -1
  600. package/static/chunk-Z5J5F5SX.js +0 -1
  601. package/static/main-4H5BJY3J.js +0 -9
  602. package/static/scripts-WRDOQIU5.js +0 -24
  603. package/static/styles-2C2UNCNB.css +0 -1
@@ -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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"}
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "FilesController", {
15
15
  const _common = require("@nestjs/common");
16
16
  const _fastify = require("fastify");
17
17
  const _image = require("../../common/image");
18
+ const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
18
19
  const _spaceskipguarddecorator = require("../spaces/decorators/space-skip-guard.decorator");
19
20
  const _spaceskippermissionsdecorator = require("../spaces/decorators/space-skip-permissions.decorator");
20
21
  const _spacedecorator = require("../spaces/decorators/space.decorator");
@@ -55,8 +56,14 @@ let FilesController = class FilesController {
55
56
  async make(user, space, makeFileDto) {
56
57
  return this.filesMethods.make(user, space, makeFileDto);
57
58
  }
58
- async upload(req, res) {
59
- 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);
60
67
  }
61
68
  async copy(user, space, copyMoveFileDto) {
62
69
  return this.filesMethods.copy(user, space, copyMoveFileDto);
@@ -73,6 +80,18 @@ let FilesController = class FilesController {
73
80
  res.type(_image.webpMimeType);
74
81
  return res.send(thumb);
75
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);
94
+ }
76
95
  // TASKS OPERATIONS
77
96
  async downloadFromUrlAsTask(user, space, downloadFileDto) {
78
97
  return this.filesTasksManager.createTask(_operations.FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name);
@@ -153,16 +172,30 @@ _ts_decorate([
153
172
  _ts_decorate([
154
173
  (0, _common.Post)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.UPLOAD}/*`),
155
174
  _ts_param(0, (0, _common.Req)()),
156
- _ts_param(1, (0, _common.Res)({
157
- passthrough: true
158
- })),
159
175
  _ts_metadata("design:type", Function),
160
176
  _ts_metadata("design:paramtypes", [
161
- typeof _spacerequestinterface.FastifySpaceRequest === "undefined" ? Object : _spacerequestinterface.FastifySpaceRequest,
162
- 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
163
196
  ]),
164
197
  _ts_metadata("design:returntype", Promise)
165
- ], FilesController.prototype, "upload", null);
198
+ ], FilesController.prototype, "uploadContent", null);
166
199
  _ts_decorate([
167
200
  (0, _common.Copy)(`${_routes.FILES_ROUTE.OPERATION}/*`),
168
201
  _ts_param(0, (0, _userdecorator.GetUser)()),
@@ -215,6 +248,53 @@ _ts_decorate([
215
248
  ]),
216
249
  _ts_metadata("design:returntype", Promise)
217
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);
218
298
  _ts_decorate([
219
299
  (0, _common.Post)(`${_routes.FILES_ROUTE.TASK_OPERATION}/${_operations.FILE_OPERATION.DOWNLOAD}/*`),
220
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 {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Logger,\n Move,\n ParseIntPipe,\n Post,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n UseGuards\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\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(\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 // 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","thumb","type","webpMimeType","send","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","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");
@@ -85,7 +87,12 @@ describe(_filescontroller.FilesController.name, ()=>{
85
87
  {
86
88
  provide: _filessearchmanagerservice.FilesSearchManager,
87
89
  useValue: filesSearchMock
88
- }
90
+ },
91
+ {
92
+ provide: _contextmanagerservice.ContextManager,
93
+ useValue: filesSearchMock
94
+ },
95
+ _contextinterceptor.ContextInterceptor
89
96
  ]
90
97
  });
91
98
  // IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies
@@ -125,9 +132,9 @@ describe(_filescontroller.FilesController.name, ()=>{
125
132
  await filesController.make(fakeUser, fakeSpace, dto);
126
133
  expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto);
127
134
  });
128
- it('upload() should call filesMethods.upload(req, res)', async ()=>{
129
- await filesController.upload(fakeReq, fakeRes);
130
- 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);
131
138
  });
132
139
  it('copy() should call filesMethods.copy(user, space, dto) and return its result', async ()=>{
133
140
  const dto = {
@@ -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(), 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 ]\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, 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","overrideGuard","SpaceGuard","canActivate","mockReturnValue","module","compile","get","it","expect","toBeDefined","beforeEach","clearAllMocks","stream","mockResolvedValue","result","head","toHaveBeenCalledWith","toBe","download","dto","path","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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"}
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":"AAAA;;;;CAIC;;;;yBAEmC;oCACD;uCACJ;4BACJ;4BACI;iCACC;qCACH;qCACA;2CACM;0CACD;AAElCA,SAASC,gCAAe,CAACC,IAAI,EAAE;IAC7B,IAAIC;IAEJ,iBAAiB;IACjB,MAAMC,WAAgB;QAAEC,IAAI;QAAGC,OAAO;QAAQC,MAAM;IAAE;IACtD,MAAMC,YAAiB;QAAEH,IAAI;QAAII,KAAK;QAAaC,KAAK;QAAYC,UAAU;QAAiBC,cAAc;IAAc;IAC3H,MAAMC,UAAe;QAAEC,MAAMV;QAAUW,OAAOP;QAAWQ,SAAS,CAAC;QAAGC,QAAQ;QAAOC,IAAI;IAAY;IACrG,MAAMC,UAAe;QAAEC,QAAQC,KAAKC,EAAE,GAAGC,cAAc;QAAIC,QAAQH,KAAKC,EAAE,GAAGC,cAAc;QAAIE,MAAMJ,KAAKC,EAAE,GAAGC,cAAc;QAAIG,MAAML,KAAKC,EAAE;IAAG;IAEjJ,QAAQ;IACR,MAAMK,mBAAmB;QACvBC,WAAWP,KAAKC,EAAE;QAClBO,MAAMR,KAAKC,EAAE;QACbQ,QAAQT,KAAKC,EAAE;QACfS,MAAMV,KAAKC,EAAE;QACbU,MAAMX,KAAKC,EAAE;QACbW,QAAQZ,KAAKC,EAAE;QACfY,cAAcb,KAAKC,EAAE;QACrBa,iBAAiBd,KAAKC,EAAE;QACxBc,UAAUf,KAAKC,EAAE;QACjBe,YAAYhB,KAAKC,EAAE;IACrB;IAEA,MAAMgB,wBAAwB;QAC5BC,YAAYlB,KAAKC,EAAE;IACrB;IAEA,MAAMkB,mBAAmB;QACvBC,YAAYpB,KAAKC,EAAE;IACrB;IAEA,MAAMoB,kBAAkB;QACtBC,QAAQtB,KAAKC,EAAE;IACjB;IAEAsB,UAAU;QACR,MAAMC,uBAAuBC,aAAI,CAACC,mBAAmB,CAAC;YACpDC,aAAa;gBAAC/C,gCAAe;aAAC;YAC9BgD,WAAW;gBACT;oBAAEC,SAASC,iCAAY;oBAAEC,UAAUzB;gBAAiB;gBACpD;oBAAEuB,SAASG,2CAAiB;oBAAED,UAAUd;gBAAsB;gBAC9D;oBAAEY,SAASI,iCAAY;oBAAEF,UAAUZ;gBAAiB;gBACpD;oBAAEU,SAASK,6CAAkB;oBAAEH,UAAUV;gBAAgB;gBACzD;oBAAEQ,SAASM,qCAAc;oBAAEJ,UAAUV;gBAAgB;gBACrDe,sCAAkB;aACnB;QACH;QACA,6FAA6F;QAC7FZ,qBAAqBa,aAAa,CAACC,sBAAU,EAAEP,QAAQ,CAAC;YAAEQ,aAAavC,KAAKC,EAAE,GAAGuC,eAAe,CAAC;QAAM;QAEvG,MAAMC,SAAwB,MAAMjB,qBAAqBkB,OAAO;QAEhE5D,kBAAkB2D,OAAOE,GAAG,CAAkB/D,gCAAe;IAC/D;IAEAgE,GAAG,qBAAqB;QACtBC,OAAO/D,iBAAiBgE,WAAW;IACrC;IAEAnE,SAAS,cAAc;QACrBoE,WAAW;YACT/C,KAAKgD,aAAa;QACpB;QAEAJ,GAAG,oFAAoF;YACrF,MAAMK,SAAS,CAAC;YAChB3C,iBAAiBC,SAAS,CAAC2C,iBAAiB,CAACD;YAE7C,MAAME,SAAS,MAAMrE,gBAAgBsE,IAAI,CAAC5D,SAASM;YAEnD+C,OAAOvC,iBAAiBC,SAAS,EAAE8C,oBAAoB,CAAC7D,SAASM;YACjE+C,OAAOM,QAAQG,IAAI,CAACL;QACtB;QAEAL,GAAG,wFAAwF;YACzF,MAAMK,SAAS,CAAC;YAChB3C,iBAAiBC,SAAS,CAAC2C,iBAAiB,CAACD;YAE7C,MAAME,SAAS,MAAMrE,gBAAgByE,QAAQ,CAAC/D,SAASM;YAEvD+C,OAAOvC,iBAAiBC,SAAS,EAAE8C,oBAAoB,CAAC7D,SAASM;YACjE+C,OAAOM,QAAQG,IAAI,CAACL;QACtB;QAEAL,GAAG,0DAA0D;YAC3D,MAAMY,MAAM;gBAAEC,MAAM;gBAAM5E,MAAM;gBAAKuB,MAAM;YAAY;YAEvD,MAAMtB,gBAAgB0B,IAAI,CAACzB,UAAUI,WAAWqE;YAEhDX,OAAOvC,iBAAiBE,IAAI,EAAE6C,oBAAoB,CAACtE,UAAUI,WAAWqE;QAC1E;QAEAZ,GAAG,iDAAiD;YAClD,MAAM9D,gBAAgB4E,YAAY,CAAClE;YAEnCqD,OAAOvC,iBAAiBG,MAAM,EAAE4C,oBAAoB,CAAC7D;QACvD;QAEAoD,GAAG,gFAAgF;YACjF,MAAMY,MAAM;gBAAEG,cAAc;gBAAQC,SAAS;YAAI;YACjD,MAAMC,WAAW;gBAAEJ,MAAM;gBAAQ5E,MAAM;YAAI;YAC3CyB,iBAAiBI,IAAI,CAACwC,iBAAiB,CAACW;YAExC,MAAMV,SAAS,MAAMrE,gBAAgB4B,IAAI,CAAC3B,UAAUI,WAAWqE;YAE/DX,OAAOvC,iBAAiBI,IAAI,EAAE2C,oBAAoB,CAACtE,UAAUI,WAAWqE;YACxEX,OAAOM,QAAQW,OAAO,CAACD;QACzB;QAEAjB,GAAG,gFAAgF;YACjF,MAAMY,MAAM;gBAAEG,cAAc;gBAAQC,SAAS;YAAI;YACjD,MAAMC,WAAW;gBAAEJ,MAAM;gBAAQ5E,MAAM;YAAI;YAC3CyB,iBAAiBK,IAAI,CAACuC,iBAAiB,CAACW;YAExC,MAAMV,SAAS,MAAMrE,gBAAgB6B,IAAI,CAAC5B,UAAUI,WAAWqE;YAE/DX,OAAOvC,iBAAiBK,IAAI,EAAE0C,oBAAoB,CAACtE,UAAUI,WAAWqE;YACxEX,OAAOM,QAAQW,OAAO,CAACD;QACzB;QAEAjB,GAAG,yDAAyD;YAC1D,MAAM9D,gBAAgB8B,MAAM,CAAC7B,UAAUI;YAEvC0D,OAAOvC,iBAAiBM,MAAM,EAAEyC,oBAAoB,CAACtE,UAAUI;QACjE;QAEAyD,GAAG,+DAA+D;YAChE,MAAMK,SAAS,CAAC;YAChB3C,iBAAiBO,YAAY,CAACqC,iBAAiB,CAACD;YAEhD,0DAA0D;YAC1D,MAAME,SAAS,MAAMrE,gBAAgB+B,YAAY,CAAC1B,WAAW4E,WAAgCjE;YAE7F+C,OAAOvC,iBAAiBO,YAAY,EAAEwC,oBAAoB,CAAClE,WAAW;YACtE0D,OAAO/C,QAAQM,IAAI,EAAE4D,gBAAgB;YACrCnB,OAAO/C,QAAQO,IAAI,EAAEgD,oBAAoB,CAACJ;YAC1CJ,OAAOM,QAAQc,aAAa;QAC9B;QAEArB,GAAG,4CAA4C;YAC7C,MAAMK,SAAS,CAAC;YAChB3C,iBAAiBO,YAAY,CAACqC,iBAAiB,CAACD;YAEhD,MAAME,SAAS,MAAMrE,gBAAgB+B,YAAY,CAAC1B,WAAW,KAAKW;YAElE+C,OAAOvC,iBAAiBO,YAAY,EAAEwC,oBAAoB,CAAClE,WAAW;YACtE0D,OAAO/C,QAAQM,IAAI,EAAE4D,gBAAgB;YACrCnB,OAAO/C,QAAQO,IAAI,EAAEgD,oBAAoB,CAACJ;YAC1CJ,OAAOM,QAAQc,aAAa;QAC9B;QAEArB,GAAG,sDAAsD;YACvD,MAAMK,SAAS,CAAC;YAChB3C,iBAAiBO,YAAY,CAACqC,iBAAiB,CAACD;YAEhD,MAAME,SAAS,MAAMrE,gBAAgB+B,YAAY,CAAC1B,WAAW,MAAMW;YAEnE+C,OAAOvC,iBAAiBO,YAAY,EAAEwC,oBAAoB,CAAClE,WAAW;YACtE0D,OAAO/C,QAAQM,IAAI,EAAE4D,gBAAgB;YACrCnB,OAAO/C,QAAQO,IAAI,EAAEgD,oBAAoB,CAACJ;YAC1CJ,OAAOM,QAAQc,aAAa;QAC9B;IACF;IAEAtF,SAAS,oBAAoB;QAC3BoE,WAAW;YACT/C,KAAKgD,aAAa;QACpB;QAEAJ,GAAG,2FAA2F;YAC5F,MAAMY,MAAM;gBAAEnE,KAAK;gBAAY6E,IAAI;YAAK;YACxC,MAAMC,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgBsF,qBAAqB,CAACrF,UAAUI,WAAWqE;YAEhFX,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAC3DgB,0BAAc,CAACC,QAAQ,EACvBvF,UACAI,WACAqE,KACAlD,iBAAiBQ,eAAe,CAACjC,IAAI;YAEvCgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;QAEAvB,GAAG,6FAA6F;YAC9F,MAAMY,MAAM;gBAAEe,qBAAqB;YAAK;YACxC,MAAMC,MAAMxE,KAAKyE,KAAK,CAACnC,sBAAU,EAAS,oBAAoBoC,kBAAkB,CAAC,IAAMX;YAEvF9C,sBAAsBC,UAAU,CAACgC,iBAAiB,CAAC,CAAC;YACpD,MAAMpE,gBAAgB6F,cAAc,CAACnF,SAASgE;YAE9CX,OAAO2B,KAAKR,gBAAgB;YAC5BQ,IAAII,WAAW;QACjB;QAEAhC,GAAG,uGAAuG;YACxG,MAAMY,MAAM;gBAAEe,qBAAqB;YAAM;YACzC,MAAMJ,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgB6F,cAAc,CAACnF,SAASgE;YAE7DX,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAC3DgB,0BAAc,CAACQ,QAAQ,EACvBrF,QAAQC,IAAI,EACZD,QAAQE,KAAK,EACb8D,KACAlD,iBAAiBS,QAAQ,CAAClC,IAAI;YAEhCgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;QAEAvB,GAAG,+FAA+F;YAChG,MAAMuB,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgBgG,gBAAgB,CAAC/F,UAAUI;YAEhE0D,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAC3DgB,0BAAc,CAACU,UAAU,EACzBhG,UACAI,WACA,MACAmB,iBAAiBU,UAAU,CAACnC,IAAI;YAElCgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;QAEAvB,GAAG,gEAAgE;YACjE,MAAMY,MAAM;gBAAEwB,MAAM;gBAAMd,IAAI;YAAK;YACnC,MAAMC,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgBmG,UAAU,CAAClG,UAAUI,WAAWqE;YAErEX,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAACgB,0BAAc,CAACa,IAAI,EAAEnG,UAAUI,WAAWqE,KAAKlD,iBAAiBI,IAAI,CAAC7B,IAAI;YACvIgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;QAEAvB,GAAG,gEAAgE;YACjE,MAAMY,MAAM;gBAAEwB,MAAM;gBAAMd,IAAI;YAAK;YACnC,MAAMC,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgBqG,UAAU,CAACpG,UAAUI,WAAWqE;YAErEX,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAACgB,0BAAc,CAACe,IAAI,EAAErG,UAAUI,WAAWqE,KAAKlD,iBAAiBK,IAAI,CAAC9B,IAAI;YACvIgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;QAEAvB,GAAG,mFAAmF;YACpF,MAAMuB,OAAO;gBAAEnF,IAAI;YAAE;YACrBiC,sBAAsBC,UAAU,CAACgC,iBAAiB,CAACiB;YAEnD,MAAMhB,SAAS,MAAMrE,gBAAgBuG,YAAY,CAACtG,UAAUI;YAE5D0D,OAAO5B,sBAAsBC,UAAU,EAAEmC,oBAAoB,CAACgB,0BAAc,CAACiB,MAAM,EAAEvG,UAAUI,WAAW,MAAMmB,iBAAiBM,MAAM,CAAC/B,IAAI;YAC5IgE,OAAOM,QAAQG,IAAI,CAACa;QACtB;IACF;IAEAxF,SAAS,oBAAoB;QAC3BoE,WAAW;YACT/C,KAAKgD,aAAa;QACpB;QAEAJ,GAAG,+CAA+C;YAChD,MAAM2C,UAAU;gBAAC;oBAAE9B,MAAM;gBAAK;aAAE;YAChCtC,iBAAiBC,UAAU,CAAC8B,iBAAiB,CAACqC;YAE9C,MAAMpC,SAAS,MAAMrE,gBAAgBsC,UAAU,CAACrC,UAAUgF;YAE1DlB,OAAO1B,iBAAiBC,UAAU,EAAEiC,oBAAoB,CAACtE,UAAU;YACnE8D,OAAOM,QAAQG,IAAI,CAACiC;QACtB;QAEA3C,GAAG,8CAA8C;YAC/C,MAAM2C,UAAU;gBAAC;oBAAE9B,MAAM;gBAAK;aAAE;YAChCtC,iBAAiBC,UAAU,CAAC8B,iBAAiB,CAACqC;YAE9C,MAAMpC,SAAS,MAAMrE,gBAAgBsC,UAAU,CAACrC,UAAU;YAE1D8D,OAAO1B,iBAAiBC,UAAU,EAAEiC,oBAAoB,CAACtE,UAAU;YACnE8D,OAAOM,QAAQG,IAAI,CAACiC;QACtB;QAEA3C,GAAG,6DAA6D;YAC9D,MAAMY,MAAM;gBAAEgC,OAAO;YAAO;YAC5B,MAAMC,QAAQ;gBAAC;oBAAE5G,MAAM;gBAAO;aAAE;YAChCwC,gBAAgBC,MAAM,CAAC4B,iBAAiB,CAACuC;YAEzC,MAAMtC,SAAS,MAAMrE,gBAAgBwC,MAAM,CAACvC,UAAUyE;YAEtDX,OAAOxB,gBAAgBC,MAAM,EAAE+B,oBAAoB,CAACtE,UAAUyE;YAC9DX,OAAOM,QAAQG,IAAI,CAACmC;QACtB;IACF;AACF"}
@@ -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);
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.guard.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 { ExecutionContext, HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard, IAuthGuard } from '@nestjs/passport'\nimport { Observable } from 'rxjs'\nimport { configuration } from '../../../configuration/config.environment'\n\n@Injectable()\nexport class FilesOnlyOfficeGuard extends AuthGuard('filesOnlyOfficeToken') implements IAuthGuard {\n private readonly logger = new Logger(FilesOnlyOfficeGuard.name)\n\n canActivate(ctx: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {\n if (!configuration.applications.files.onlyoffice.enabled) {\n this.logger.warn(`${this.canActivate.name} - feature not enabled`)\n throw new HttpException('Feature not enabled', HttpStatus.BAD_REQUEST)\n }\n return super.canActivate(ctx)\n }\n\n handleRequest<TUser = any>(err: any, user: any, info: Error, ctx: ExecutionContext, status?: any): TUser {\n const req = this.getRequest(ctx)\n req.raw.user = user?.login || 'unauthorized'\n if (info) {\n this.logger.warn(`<${req.raw.user}> <${req.ip}> ${info}`)\n }\n return super.handleRequest(err, user, info, ctx, status)\n }\n}\n"],"names":["FilesOnlyOfficeGuard","AuthGuard","canActivate","ctx","configuration","applications","files","onlyoffice","enabled","logger","warn","name","HttpException","HttpStatus","BAD_REQUEST","handleRequest","err","user","info","status","req","getRequest","raw","login","ip","Logger"],"mappings":"AAAA;;;;CAIC;;;;+BAQYA;;;eAAAA;;;wBANmE;0BAC1C;mCAER;;;;;;;AAGvB,IAAA,AAAMA,uBAAN,MAAMA,6BAA6BC,IAAAA,mBAAS,EAAC;IAGlDC,YAAYC,GAAqB,EAAoD;QACnF,IAAI,CAACC,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,EAAE;YACxD,IAAI,CAACC,MAAM,CAACC,IAAI,CAAC,GAAG,IAAI,CAACR,WAAW,CAACS,IAAI,CAAC,sBAAsB,CAAC;YACjE,MAAM,IAAIC,qBAAa,CAAC,uBAAuBC,kBAAU,CAACC,WAAW;QACvE;QACA,OAAO,KAAK,CAACZ,YAAYC;IAC3B;IAEAY,cAA2BC,GAAQ,EAAEC,IAAS,EAAEC,IAAW,EAAEf,GAAqB,EAAEgB,MAAY,EAAS;QACvG,MAAMC,MAAM,IAAI,CAACC,UAAU,CAAClB;QAC5BiB,IAAIE,GAAG,CAACL,IAAI,GAAGA,MAAMM,SAAS;QAC9B,IAAIL,MAAM;YACR,IAAI,CAACT,MAAM,CAACC,IAAI,CAAC,CAAC,CAAC,EAAEU,IAAIE,GAAG,CAACL,IAAI,CAAC,GAAG,EAAEG,IAAII,EAAE,CAAC,EAAE,EAAEN,MAAM;QAC1D;QACA,OAAO,KAAK,CAACH,cAAcC,KAAKC,MAAMC,MAAMf,KAAKgB;IACnD;;QAlBK,qBACYV,SAAS,IAAIgB,cAAM,CAACzB,qBAAqBW,IAAI;;AAkBhE"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.guard.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 { ExecutionContext, HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { AuthGuard, IAuthGuard } from '@nestjs/passport'\nimport { FastifyRequest } from 'fastify'\nimport { Observable } from 'rxjs'\nimport { configuration } from '../../../configuration/config.environment'\nimport { API_FILES_ONLY_OFFICE_STATUS } from '../constants/routes'\n\n@Injectable()\nexport class FilesOnlyOfficeGuard extends AuthGuard('filesOnlyOfficeToken') implements IAuthGuard {\n private readonly logger = new Logger(FilesOnlyOfficeGuard.name)\n\n canActivate(ctx: ExecutionContext): boolean | Promise<boolean> | Observable<boolean> {\n const req: FastifyRequest = ctx.switchToHttp().getRequest()\n if (req.originalUrl === API_FILES_ONLY_OFFICE_STATUS) {\n // Skip token validation for the status endpoint\n return true\n }\n if (!configuration.applications.files.onlyoffice.enabled) {\n this.logger.warn(`${this.canActivate.name} - feature not enabled`)\n throw new HttpException('Feature not enabled', HttpStatus.BAD_REQUEST)\n }\n return super.canActivate(ctx)\n }\n\n handleRequest<TUser = any>(err: any, user: any, info: Error, ctx: ExecutionContext, status?: any): TUser {\n const req = this.getRequest(ctx)\n req.raw.user = user?.login || 'unauthorized'\n if (info) {\n this.logger.warn(`<${req.raw.user}> <${req.ip}> ${info}`)\n }\n return super.handleRequest(err, user, info, ctx, status)\n }\n}\n"],"names":["FilesOnlyOfficeGuard","AuthGuard","canActivate","ctx","req","switchToHttp","getRequest","originalUrl","API_FILES_ONLY_OFFICE_STATUS","configuration","applications","files","onlyoffice","enabled","logger","warn","name","HttpException","HttpStatus","BAD_REQUEST","handleRequest","err","user","info","status","raw","login","ip","Logger"],"mappings":"AAAA;;;;CAIC;;;;+BAUYA;;;eAAAA;;;wBARmE;0BAC1C;mCAGR;wBACe;;;;;;;AAGtC,IAAA,AAAMA,uBAAN,MAAMA,6BAA6BC,IAAAA,mBAAS,EAAC;IAGlDC,YAAYC,GAAqB,EAAoD;QACnF,MAAMC,MAAsBD,IAAIE,YAAY,GAAGC,UAAU;QACzD,IAAIF,IAAIG,WAAW,KAAKC,oCAA4B,EAAE;YACpD,gDAAgD;YAChD,OAAO;QACT;QACA,IAAI,CAACC,gCAAa,CAACC,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,EAAE;YACxD,IAAI,CAACC,MAAM,CAACC,IAAI,CAAC,GAAG,IAAI,CAACb,WAAW,CAACc,IAAI,CAAC,sBAAsB,CAAC;YACjE,MAAM,IAAIC,qBAAa,CAAC,uBAAuBC,kBAAU,CAACC,WAAW;QACvE;QACA,OAAO,KAAK,CAACjB,YAAYC;IAC3B;IAEAiB,cAA2BC,GAAQ,EAAEC,IAAS,EAAEC,IAAW,EAAEpB,GAAqB,EAAEqB,MAAY,EAAS;QACvG,MAAMpB,MAAM,IAAI,CAACE,UAAU,CAACH;QAC5BC,IAAIqB,GAAG,CAACH,IAAI,GAAGA,MAAMI,SAAS;QAC9B,IAAIH,MAAM;YACR,IAAI,CAACT,MAAM,CAACC,IAAI,CAAC,CAAC,CAAC,EAAEX,IAAIqB,GAAG,CAACH,IAAI,CAAC,GAAG,EAAElB,IAAIuB,EAAE,CAAC,EAAE,EAAEJ,MAAM;QAC1D;QACA,OAAO,KAAK,CAACH,cAAcC,KAAKC,MAAMC,MAAMpB,KAAKqB;IACnD;;QAvBK,qBACYV,SAAS,IAAIc,cAAM,CAAC5B,qBAAqBgB,IAAI;;AAuBhE"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-db-props.interface.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 type { File } from '../schemas/file.interface'\n\nexport interface FileDBProps extends Partial<Pick<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash' | 'path'>> {\n // warn: used during lock creation, new fields will be used in lock key\n ownerId?: number\n spaceId?: number\n spaceExternalRootId?: number\n shareExternalId?: number\n inTrash: boolean\n // full path with name\n path: string\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-db-props.interface.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 type { File } from '../schemas/file.interface'\n\nexport interface FileDBProps extends Partial<Pick<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash' | 'path'>> {\n // warn: used during lock creation, new fields will be used in the lock key\n ownerId?: number\n spaceId?: number\n spaceExternalRootId?: number\n shareExternalId?: number\n inTrash: boolean\n // full path with name\n path: string\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileProps extends Omit<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash'> {\n id: number\n name: string\n path: string\n isDir: boolean\n size: number\n ctime: number\n mtime: number\n mime: string\n inTrash?: boolean\n // used with shares\n origin?: { ownerLogin: string; spaceAlias: string; spaceRootExternalPath?: string }\n // root can be a share or a space root\n // enabled & description are only used for shares\n root?: Pick<SpaceRoot, 'id' | 'alias' | 'permissions'> &\n Partial<Pick<SpaceRoot, 'name' | 'externalPath'>> &\n Partial<Pick<Share, 'enabled' | 'description'>> & {\n owner: Owner\n }\n lock?: { owner: string; ownerLogin: string; isExclusive: boolean }\n // used by the files browser to enrich files\n spaces?: Pick<Space, 'id' | 'alias' | 'name'>[]\n shares?: Pick<Share, 'id' | 'alias' | 'name' | 'type'>[]\n syncs?: Pick<SyncPath, 'clientId' | 'id'> & { clientName: string }[]\n hasComments?: boolean\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/file-props.interface.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 type { Share } from '../../shares/schemas/share.interface'\nimport type { SpaceRoot } from '../../spaces/schemas/space-root.interface'\nimport type { Space } from '../../spaces/schemas/space.interface'\nimport type { SyncPath } from '../../sync/schemas/sync-path.interface'\nimport type { Owner } from '../../users/interfaces/owner.interface'\nimport type { File } from '../schemas/file.interface'\n\nexport interface FileLockProps {\n owner: string\n ownerLogin: string\n isExclusive: boolean\n}\n\nexport interface FileProps extends Omit<File, 'ownerId' | 'spaceId' | 'spaceExternalRootId' | 'shareExternalId' | 'inTrash'> {\n id: number\n name: string\n path: string\n isDir: boolean\n size: number\n ctime: number\n mtime: number\n mime: string\n inTrash?: boolean\n // used with shares\n origin?: {\n ownerId: number\n ownerLogin: string\n spaceId: number\n spaceAlias: string\n spaceExternalRootId: number\n spaceRootExternalPath: string\n shareExternalId: number\n }\n // root can be a share or a space root\n // enabled, and description are only used for shares\n root?: Pick<SpaceRoot, 'id' | 'alias' | 'permissions'> &\n Partial<Pick<SpaceRoot, 'name' | 'externalPath'>> &\n Partial<Pick<Share, 'enabled' | 'description'>> & {\n owner: Owner\n }\n lock?: FileLockProps\n // used by the file browser to enrich files\n spaces?: Pick<Space, 'id' | 'alias' | 'name'>[]\n shares?: Pick<Share, 'id' | 'alias' | 'name' | 'type'>[]\n syncs?: Pick<SyncPath, 'clientId' | 'id'> & { clientName: string }[]\n hasComments?: boolean\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/only-office-config.interface.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 interface OnlyOfficeReqConfig {\n documentServerUrl: string\n config: OnlyOfficeConfig\n}\n\nexport interface OnlyOfficeConvertForm {\n key: string\n url: string\n outputtype: string\n filetype: string\n async: boolean\n token?: string\n}\n\nexport interface OnlyOfficeConfig {\n documentType?: string\n token?: string\n type?: 'mobile' | 'desktop'\n height?: string\n width?: string\n document?: {\n fileType: string\n key: string\n referenceData?: {\n fileKey: string\n instanceId: string\n }\n title: string\n url: string\n info?: {\n owner?: string\n uploaded?: string\n favorite?: boolean\n folder?: string\n sharingSettings?: any[]\n }\n permissions?: {\n /**\n * @deprecated Deprecated since version 5.5, please add the onRequestRestore field instead.\n */\n changeHistory?: boolean\n chat?: boolean\n comment?: boolean\n commentGroups?: any\n copy?: boolean\n deleteCommentAuthorOnly?: boolean\n download?: boolean\n edit?: boolean\n editCommentAuthorOnly?: boolean\n fillForms?: boolean\n modifyContentControl?: boolean\n modifyFilter?: boolean\n print?: boolean\n protect?: boolean\n review?: boolean\n reviewGroups?: string[]\n userInfoGroups?: string[]\n }\n }\n editorConfig?: {\n actionLink?: any\n callbackUrl?: string\n coEditing?: {\n mode: string\n change: boolean\n }\n createUrl?: string\n lang?: string\n mode?: 'view' | 'edit'\n recent?: any[]\n region?: string\n templates?: any[]\n user?: {\n group?: string\n id?: string\n image?: string\n name?: string\n }\n customization?: {\n anonymous?: {\n request?: boolean\n label?: string\n }\n autosave?: boolean\n forcesave?: boolean\n close?: {\n visible: boolean\n text: string\n }\n comments?: boolean\n compactHeader?: boolean\n compactToolbar?: boolean\n compatibleFeatures?: boolean\n customer?: {\n address?: string\n info?: string\n logo?: string\n logoDark?: string\n mail?: string\n name?: string\n phone?: string\n www?: string\n }\n features?: any\n feedback?: any\n goback?: any\n help?: boolean\n hideNotes?: boolean\n hideRightMenu?: boolean\n hideRulers?: boolean\n integrationMode?: string\n logo?: {\n image?: string\n imageDark?: string\n imageLight?: string\n imageEmbedded?: string\n url?: string\n visible?: boolean\n }\n macros?: boolean\n macrosMode?: string\n mentionShare?: boolean\n mobileForceView?: boolean\n plugins?: boolean\n review?: {\n hideReviewDisplay?: boolean\n hoverMode?: boolean\n reviewDisplay?: string\n showReviewChanges?: boolean\n trackChanges?: boolean\n }\n submitForm?: boolean\n toolbarHideFileName?: boolean\n toolbarNoTabs?: boolean\n uiTheme?: string\n unit?: string\n zoom?: number\n about?: boolean\n }\n embedded?: {\n embedUrl?: string\n fullscreenUrl?: string\n saveUrl?: string\n shareUrl?: string\n toolbarDocked?: string\n }\n plugins?: {\n autostart?: string[]\n options?: {\n all?: any\n pluginGuid: any\n }\n pluginsData?: string[]\n }\n }\n events?: {\n onAppReady?: (event: object) => void\n onCollaborativeChanges?: (event: object) => void\n onDocumentReady?: (event: object) => void\n onDocumentStateChange?: (event: object) => void\n onDownloadAs?: (event: object) => void\n onError?: (event: object) => void\n onInfo?: (event: object) => void\n onMetaChange?: (event: object) => void\n onMakeActionLink?: (event: object) => void\n onRequestRefreshFile?: (event: object) => void\n onPluginsReady?: (event: object) => void\n onReady?: (event: object) => void\n onRequestClose?: (event: object) => void\n onRequestCreateNew?: (event: object) => void\n onRequestEditRights?: (event: object) => void\n onRequestHistory?: (event: object) => void\n onRequestHistoryClose?: (event: object) => void\n onRequestHistoryData?: (event: object) => void\n onRequestInsertImage?: (event: object) => void\n onRequestOpen?: (event: object) => void\n onRequestReferenceData?: (event: object) => void\n onRequestReferenceSource?: (event: object) => void\n onRequestRename?: (event: object) => void\n onRequestRestore?: (event: object) => void\n onRequestSaveAs?: (event: object) => void\n onRequestSelectDocument?: (event: object) => void\n onRequestSelectSpreadsheet?: (event: object) => void\n onRequestSendNotify?: (event: object) => void\n onRequestSharingSettings?: (event: object) => void\n onRequestStartFilling: (event: object) => void\n onRequestUsers?: (event: object) => void\n onSubmit?: (event: object) => void\n onWarning?: (event: object) => void\n }\n}\n\nexport interface OnlyOfficeCallBack {\n /* documentation : https://api.onlyoffice.com/docs/docs-api/usage-api/callback-handler/ */\n key: string // document key\n /*\n status:\n 1 - document is being edited\n 2 - document is ready for saving\n 3 - document saving error has occurred\n 4 - document is closed with no changes\n 6 - document is being edited, but the current document state is saved\n 7 - error has occurred while force saving the document\n */\n status: 1 | 2 | 3 | 4 | 6 | 7\n url?: string // link to download the modified version (for status: 2, 3, 6 or 7)\n notmodified?: boolean // only with status 2\n /*\n actions:\n 0 - the user disconnects from the document co-editing\n 1 - the new user connects to the document co-editing\n 2 - the user clicks the forcesave button.\n */\n actions?: { type: 0 | 1 | 2; userid: string }[]\n forcesavetype?: 0 | 1 | 2 | 3 // The type is present when the status value is equal to 6 or 7 only\n /*\n forcesavetype:\n 0 - to the command service\n 1 - each time the saving is done (e.g. the Save button is clicked), which is only available when the forcesave option is set to true\n 2 - by timer with the settings from the server config\n 3 - each time the form is submitted (e.g. the Complete & Submit button is clicked)\n */\n users?: string[] // when multiple users are editing the document\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/interfaces/only-office-config.interface.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 { FILE_MODE } from '../constants/operations'\n\nexport interface OnlyOfficeReqConfig {\n documentServerUrl: string\n config: OnlyOfficeConfig\n}\n\nexport interface OnlyOfficeConvertForm {\n key: string\n url: string\n outputtype: string\n filetype: string\n async: boolean\n token?: string\n}\n\nexport interface OnlyOfficeConfig {\n documentType?: string\n token?: string\n type?: 'mobile' | 'desktop'\n height?: string\n width?: string\n document?: {\n fileType: string\n key: string\n referenceData?: {\n fileKey: string\n instanceId: string\n }\n title: string\n url: string\n info?: {\n owner?: string\n uploaded?: string\n favorite?: boolean\n folder?: string\n sharingSettings?: any[]\n }\n permissions?: {\n /**\n * @deprecated Deprecated since version 5.5, please add the onRequestRestore field instead.\n */\n changeHistory?: boolean\n chat?: boolean\n comment?: boolean\n commentGroups?: any\n copy?: boolean\n deleteCommentAuthorOnly?: boolean\n download?: boolean\n edit?: boolean\n editCommentAuthorOnly?: boolean\n fillForms?: boolean\n modifyContentControl?: boolean\n modifyFilter?: boolean\n print?: boolean\n protect?: boolean\n review?: boolean\n reviewGroups?: string[]\n userInfoGroups?: string[]\n }\n }\n editorConfig?: {\n actionLink?: any\n callbackUrl?: string\n coEditing?: {\n mode: string\n change: boolean\n }\n createUrl?: string\n lang?: string\n mode?: FILE_MODE\n recent?: any[]\n region?: string\n templates?: any[]\n user?: {\n group?: string\n id?: string\n image?: string\n name?: string\n }\n customization?: {\n anonymous?: {\n request?: boolean\n label?: string\n }\n autosave?: boolean\n forcesave?: boolean\n close?: {\n visible: boolean\n text: string\n }\n comments?: boolean\n compactHeader?: boolean\n compactToolbar?: boolean\n compatibleFeatures?: boolean\n customer?: {\n address?: string\n info?: string\n logo?: string\n logoDark?: string\n mail?: string\n name?: string\n phone?: string\n www?: string\n }\n features?: any\n feedback?: any\n goback?: any\n help?: boolean\n hideNotes?: boolean\n hideRightMenu?: boolean\n hideRulers?: boolean\n integrationMode?: string\n logo?: {\n image?: string\n imageDark?: string\n imageLight?: string\n imageEmbedded?: string\n url?: string\n visible?: boolean\n }\n macros?: boolean\n macrosMode?: string\n mentionShare?: boolean\n mobileForceView?: boolean\n plugins?: boolean\n review?: {\n hideReviewDisplay?: boolean\n hoverMode?: boolean\n reviewDisplay?: string\n showReviewChanges?: boolean\n trackChanges?: boolean\n }\n submitForm?: boolean\n toolbarHideFileName?: boolean\n toolbarNoTabs?: boolean\n uiTheme?: string\n unit?: string\n zoom?: number\n about?: boolean\n }\n embedded?: {\n embedUrl?: string\n fullscreenUrl?: string\n saveUrl?: string\n shareUrl?: string\n toolbarDocked?: string\n }\n plugins?: {\n autostart?: string[]\n options?: {\n all?: any\n pluginGuid: any\n }\n pluginsData?: string[]\n }\n }\n events?: {\n onAppReady?: (event: object) => void\n onCollaborativeChanges?: (event: object) => void\n onDocumentReady?: (event: object) => void\n onDocumentStateChange?: (event: object) => void\n onDownloadAs?: (event: object) => void\n onError?: (event: object) => void\n onInfo?: (event: object) => void\n onMetaChange?: (event: object) => void\n onMakeActionLink?: (event: object) => void\n onRequestRefreshFile?: (event: object) => void\n onPluginsReady?: (event: object) => void\n onReady?: (event: object) => void\n onRequestClose?: (event: object) => void\n onRequestCreateNew?: (event: object) => void\n onRequestEditRights?: (event: object) => void\n onRequestHistory?: (event: object) => void\n onRequestHistoryClose?: (event: object) => void\n onRequestHistoryData?: (event: object) => void\n onRequestInsertImage?: (event: object) => void\n onRequestOpen?: (event: object) => void\n onRequestReferenceData?: (event: object) => void\n onRequestReferenceSource?: (event: object) => void\n onRequestRename?: (event: object) => void\n onRequestRestore?: (event: object) => void\n onRequestSaveAs?: (event: object) => void\n onRequestSelectDocument?: (event: object) => void\n onRequestSelectSpreadsheet?: (event: object) => void\n onRequestSendNotify?: (event: object) => void\n onRequestSharingSettings?: (event: object) => void\n onRequestStartFilling: (event: object) => void\n onRequestUsers?: (event: object) => void\n onSubmit?: (event: object) => void\n onWarning?: (event: object) => void\n }\n}\n\nexport interface OnlyOfficeCallBack {\n /* documentation : https://api.onlyoffice.com/docs/docs-api/usage-api/callback-handler/ */\n key: string // document key\n /*\n status:\n 1 - document is being edited\n 2 - document is ready for saving\n 3 - document saving error has occurred\n 4 - document is closed with no changes\n 6 - document is being edited, but the current document state is saved\n 7 - error has occurred while force saving the document\n */\n status: 1 | 2 | 3 | 4 | 6 | 7\n url?: string // link to download the modified version (for status: 2, 3, 6 or 7)\n notmodified?: boolean // only with status 2\n /*\n actions:\n 0 - the user disconnects from the document co-editing\n 1 - the new user connects to the document co-editing\n 2 - the user clicks the forcesave button.\n */\n actions?: { type: 0 | 1 | 2; userid: string }[]\n forcesavetype?: 0 | 1 | 2 | 3 // The type is present when the status value is equal to 6 or 7 only\n /*\n forcesavetype:\n 0 - to the command service\n 1 - each time the saving is done (e.g. the Save button is clicked), which is only available when the forcesave option is set to true\n 2 - by timer with the settings from the server config\n 3 - each time the form is submitted (e.g. the Complete & Submit button is clicked)\n */\n users?: string[] // when multiple users are editing the document\n}\n"],"names":[],"mappings":"AAAA;;;;CAIC"}