@sync-in/server 1.8.0 → 1.9.0

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (611) hide show
  1. package/CHANGELOG.md +64 -10
  2. package/environment/environment.dist.yaml +29 -26
  3. package/package.json +18 -17
  4. package/server/app.bootstrap.js +4 -2
  5. package/server/app.bootstrap.js.map +1 -1
  6. package/server/app.constants.js +9 -0
  7. package/server/app.constants.js.map +1 -1
  8. package/server/app.module.js +4 -0
  9. package/server/app.module.js.map +1 -1
  10. package/server/applications/admin/admin.module.js +6 -1
  11. package/server/applications/admin/admin.module.js.map +1 -1
  12. package/server/applications/{notifications/interfaces/user-mail-notification.js → admin/interfaces/check-update.interfaces.js} +1 -1
  13. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -0
  14. package/server/applications/admin/services/admin-scheduler.service.js +53 -0
  15. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -0
  16. package/server/applications/admin/services/admin.service.js +102 -0
  17. package/server/applications/admin/services/admin.service.js.map +1 -0
  18. package/server/applications/admin/services/admin.service.spec.js +46 -0
  19. package/server/applications/admin/services/admin.service.spec.js.map +1 -0
  20. package/server/applications/admin/utils/check-update.js +28 -0
  21. package/server/applications/admin/utils/check-update.js.map +1 -0
  22. package/server/applications/comments/services/comments-manager.service.js +1 -1
  23. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  24. package/server/applications/comments/services/comments-manager.service.spec.js +1 -1
  25. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  26. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  27. package/server/applications/files/constants/cache.js +10 -1
  28. package/server/applications/files/constants/cache.js.map +1 -1
  29. package/server/applications/files/constants/only-office.js +0 -25
  30. package/server/applications/files/constants/only-office.js.map +1 -1
  31. package/server/applications/files/constants/operations.js +20 -3
  32. package/server/applications/files/constants/operations.js.map +1 -1
  33. package/server/applications/files/dto/file-operations.dto.js +7 -0
  34. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  35. package/server/applications/files/files-only-office.controller.js +3 -2
  36. package/server/applications/files/files-only-office.controller.js.map +1 -1
  37. package/server/applications/files/files-only-office.controller.spec.js +6 -5
  38. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  39. package/server/applications/files/files.controller.js +100 -12
  40. package/server/applications/files/files.controller.js.map +1 -1
  41. package/server/applications/files/files.controller.spec.js +29 -8
  42. package/server/applications/files/files.controller.spec.js.map +1 -1
  43. package/server/applications/files/guards/files-only-office.guard.js +6 -0
  44. package/server/applications/files/guards/files-only-office.guard.js.map +1 -1
  45. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  46. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  47. package/server/applications/files/interfaces/only-office-config.interface.js.map +1 -1
  48. package/server/applications/files/services/files-content-manager.service.js +3 -3
  49. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  50. package/server/applications/files/services/files-lock-manager.service.js +61 -22
  51. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  52. package/server/applications/files/services/files-manager.service.js +122 -24
  53. package/server/applications/files/services/files-manager.service.js.map +1 -1
  54. package/server/applications/files/services/files-manager.service.spec.js +15 -0
  55. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  56. package/server/applications/files/services/files-methods.service.js +39 -14
  57. package/server/applications/files/services/files-methods.service.js.map +1 -1
  58. package/server/applications/files/services/files-only-office-manager.service.js +12 -12
  59. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  60. package/server/applications/files/services/files-parser.service.js +1 -1
  61. package/server/applications/files/services/files-parser.service.js.map +1 -1
  62. package/server/applications/files/services/files-queries.service.js +10 -0
  63. package/server/applications/files/services/files-queries.service.js.map +1 -1
  64. package/server/applications/files/utils/doc-textify/adapters/pdf.js +5 -16
  65. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  66. package/server/applications/files/utils/files.js +1 -1
  67. package/server/applications/files/utils/files.js.map +1 -1
  68. package/server/applications/files/utils/send-file.js +3 -2
  69. package/server/applications/files/utils/send-file.js.map +1 -1
  70. package/server/applications/links/services/links-queries.service.js +1 -1
  71. package/server/applications/links/services/links-queries.service.js.map +1 -1
  72. package/server/applications/notifications/constants/notifications.js +5 -1
  73. package/server/applications/notifications/constants/notifications.js.map +1 -1
  74. package/server/applications/notifications/i18n/de.js +8 -2
  75. package/server/applications/notifications/i18n/de.js.map +1 -1
  76. package/server/applications/notifications/i18n/es.js +8 -2
  77. package/server/applications/notifications/i18n/es.js.map +1 -1
  78. package/server/applications/notifications/i18n/fr.js +8 -2
  79. package/server/applications/notifications/i18n/fr.js.map +1 -1
  80. package/server/applications/notifications/i18n/hi.js +8 -2
  81. package/server/applications/notifications/i18n/hi.js.map +1 -1
  82. package/server/applications/notifications/i18n/it.js +8 -2
  83. package/server/applications/notifications/i18n/it.js.map +1 -1
  84. package/server/applications/notifications/i18n/ja.js +8 -2
  85. package/server/applications/notifications/i18n/ja.js.map +1 -1
  86. package/server/applications/notifications/i18n/ko.js +8 -2
  87. package/server/applications/notifications/i18n/ko.js.map +1 -1
  88. package/server/applications/notifications/i18n/pl.js +8 -2
  89. package/server/applications/notifications/i18n/pl.js.map +1 -1
  90. package/server/applications/notifications/i18n/pt.js +8 -2
  91. package/server/applications/notifications/i18n/pt.js.map +1 -1
  92. package/server/applications/notifications/i18n/pt_br.js +8 -2
  93. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  94. package/server/applications/notifications/i18n/ru.js +8 -2
  95. package/server/applications/notifications/i18n/ru.js.map +1 -1
  96. package/server/applications/notifications/i18n/tr.js +8 -2
  97. package/server/applications/notifications/i18n/tr.js.map +1 -1
  98. package/server/applications/notifications/i18n/zh.js +8 -2
  99. package/server/applications/notifications/i18n/zh.js.map +1 -1
  100. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  101. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +10 -0
  102. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -0
  103. package/server/applications/notifications/mails/models.js +38 -3
  104. package/server/applications/notifications/mails/models.js.map +1 -1
  105. package/server/applications/notifications/mails/templates.js +1 -1
  106. package/server/applications/notifications/mails/templates.js.map +1 -1
  107. package/server/applications/notifications/services/notifications-manager.service.js +8 -1
  108. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  109. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  110. package/server/applications/shares/services/shares-manager.service.js +17 -10
  111. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  112. package/server/applications/shares/services/shares-manager.service.spec.js +10 -3
  113. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  114. package/server/applications/shares/services/shares-queries.service.js +11 -1
  115. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  116. package/server/applications/spaces/guards/space.guard.spec.js +2 -2
  117. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  118. package/server/applications/spaces/services/spaces-browser.service.js +31 -11
  119. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  120. package/server/applications/spaces/services/spaces-manager.service.js +2 -2
  121. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  122. package/server/applications/spaces/services/spaces-queries.service.js +6 -2
  123. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  124. package/server/applications/spaces/utils/permissions.js +2 -2
  125. package/server/applications/spaces/utils/permissions.js.map +1 -1
  126. package/server/applications/sync/services/sync-manager.service.js +1 -0
  127. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  128. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  129. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  130. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  131. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  132. package/server/applications/users/constants/user.js +1 -1
  133. package/server/applications/users/constants/user.js.map +1 -1
  134. package/server/applications/users/services/admin-users-queries.service.js +8 -0
  135. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  136. package/server/applications/users/services/users-manager.service.js +1 -2
  137. package/server/applications/users/services/users-manager.service.js.map +1 -1
  138. package/server/applications/users/services/users-queries.service.js +67 -68
  139. package/server/applications/users/services/users-queries.service.js.map +1 -1
  140. package/server/applications/users/users.gateway.js +6 -0
  141. package/server/applications/users/users.gateway.js.map +1 -1
  142. package/server/applications/users/users.module.js +2 -1
  143. package/server/applications/users/users.module.js.map +1 -1
  144. package/server/applications/webdav/guards/webdav-protocol.guard.js +4 -4
  145. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  146. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +6 -6
  147. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  148. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  149. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  150. package/server/applications/webdav/services/webdav-methods.service.spec.js +2 -2
  151. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  152. package/server/authentication/constants/auth-ldap.js +2 -0
  153. package/server/authentication/constants/auth-ldap.js.map +1 -1
  154. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +34 -21
  155. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
  156. package/server/common/functions.js +0 -8
  157. package/server/common/functions.js.map +1 -1
  158. package/server/common/image.js +63 -58
  159. package/server/common/image.js.map +1 -1
  160. package/server/common/shared.js +18 -1
  161. package/server/common/shared.js.map +1 -1
  162. package/server/infrastructure/context/services/context-manager.service.js +3 -0
  163. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  164. package/server/infrastructure/websocket/adapters/cluster.adapter.js +4 -4
  165. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  166. package/static/3rdpartylicenses.txt +1380 -57
  167. package/static/assets/favicon.svg +2 -25
  168. package/static/assets/logo-dark.svg +2 -32
  169. package/static/assets/logo.svg +2 -32
  170. package/static/assets/mimes/application-sql.svg +29 -1
  171. package/static/assets/mimes/application-x-sql.svg +29 -0
  172. package/static/assets/mimes/image-bmp.svg +12 -0
  173. package/static/assets/pdfjs/build/pdf.mjs +4869 -4454
  174. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  175. package/static/assets/pdfjs/build/pdf.sandbox.mjs +3 -3
  176. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  177. package/static/assets/pdfjs/build/pdf.worker.mjs +885 -596
  178. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  179. package/static/assets/pdfjs/version +1 -1
  180. package/static/assets/pdfjs/web/locale/be/viewer.ftl +40 -0
  181. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +2 -0
  182. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +41 -0
  183. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +43 -0
  184. package/static/assets/pdfjs/web/locale/da/viewer.ftl +39 -0
  185. package/static/assets/pdfjs/web/locale/de/viewer.ftl +41 -0
  186. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +43 -0
  187. package/static/assets/pdfjs/web/locale/el/viewer.ftl +39 -0
  188. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +35 -0
  189. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +41 -0
  190. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +2 -2
  191. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +39 -0
  192. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +41 -0
  193. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +39 -0
  194. package/static/assets/pdfjs/web/locale/es-ES/viewer.ftl +72 -0
  195. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +120 -0
  196. package/static/assets/pdfjs/web/locale/eu/viewer.ftl +41 -0
  197. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +41 -0
  198. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +41 -0
  199. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +77 -0
  200. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +41 -0
  201. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +39 -0
  202. package/static/assets/pdfjs/web/locale/he/viewer.ftl +41 -0
  203. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +43 -0
  204. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +41 -0
  205. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +1 -1
  206. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +41 -0
  207. package/static/assets/pdfjs/web/locale/it/viewer.ftl +41 -0
  208. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +32 -0
  209. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +41 -0
  210. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +73 -0
  211. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +21 -0
  212. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -1
  213. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +39 -0
  214. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +41 -0
  215. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +37 -0
  216. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +37 -0
  217. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -0
  218. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +39 -0
  219. package/static/assets/pdfjs/web/locale/rm/viewer.ftl +73 -0
  220. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +41 -0
  221. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +42 -0
  222. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +6 -0
  223. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +43 -0
  224. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +42 -1
  225. package/static/assets/pdfjs/web/locale/sq/viewer.ftl +77 -0
  226. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +41 -0
  227. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +39 -0
  228. package/static/assets/pdfjs/web/locale/th/viewer.ftl +35 -0
  229. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +39 -0
  230. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +42 -5
  231. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +35 -0
  232. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +37 -0
  233. package/static/assets/pdfjs/web/viewer.css +141 -110
  234. package/static/assets/pdfjs/web/viewer.html +7 -7
  235. package/static/assets/pdfjs/web/viewer.mjs +97 -14
  236. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  237. package/static/chunk-22DWHRCL.js +1 -0
  238. package/static/chunk-23UUFZSR.js +1 -0
  239. package/static/{chunk-VM4YX6Q7.js → chunk-24Q7OUU2.js} +1 -1
  240. package/static/chunk-25QTY2GI.js +1 -0
  241. package/static/chunk-2E7IJZLL.js +1 -0
  242. package/static/chunk-2FC5EKS5.js +1 -0
  243. package/static/chunk-2FOWUJQF.js +1 -0
  244. package/static/chunk-2XPHUNYN.js +1 -0
  245. package/static/chunk-32L7RG2G.js +1 -0
  246. package/static/chunk-3IISSX63.js +1 -0
  247. package/static/chunk-3OHSTP3R.js +1 -0
  248. package/static/chunk-42L6C5MT.js +1 -0
  249. package/static/chunk-4AGQL5GV.js +1 -0
  250. package/static/chunk-4BPSQMI2.js +1 -0
  251. package/static/chunk-4FDRWZWT.js +1 -0
  252. package/static/chunk-4FJUCMEG.js +1 -0
  253. package/static/chunk-4GCCF6PF.js +1 -0
  254. package/static/chunk-4ORP3SBY.js +1 -0
  255. package/static/chunk-4QBOHIC3.js +1 -0
  256. package/static/chunk-4YT6K5KY.js +1 -0
  257. package/static/chunk-556I6YIW.js +1 -0
  258. package/static/chunk-5DPIGJU4.js +1 -0
  259. package/static/chunk-5HNQLBSW.js +3 -0
  260. package/static/chunk-5IL7C45D.js +1 -0
  261. package/static/chunk-5KJXGMKR.js +1 -0
  262. package/static/chunk-5SPGSHKL.js +1 -0
  263. package/static/chunk-5WCQBTXW.js +1 -0
  264. package/static/chunk-5XUIPWOH.js +1 -0
  265. package/static/chunk-62WT7PI3.js +1 -0
  266. package/static/chunk-6F6OMQ5H.js +1 -0
  267. package/static/chunk-6I5BGQHT.js +1 -0
  268. package/static/chunk-6NOS45DG.js +1 -0
  269. package/static/chunk-6OKLPRCD.js +1 -0
  270. package/static/chunk-6VEJCG43.js +1 -0
  271. package/static/chunk-77SS36Z2.js +1 -0
  272. package/static/chunk-7AXEPO3G.js +1 -0
  273. package/static/chunk-7CFSJ4BO.js +1 -0
  274. package/static/chunk-7CKHC72R.js +1 -0
  275. package/static/chunk-7DUTYOJG.js +1 -0
  276. package/static/chunk-7HKFYRPF.js +1 -0
  277. package/static/chunk-7NZJZATZ.js +1 -0
  278. package/static/chunk-AADK5D2H.js +1 -0
  279. package/static/chunk-ACUF7IKP.js +1 -0
  280. package/static/chunk-AGREZPV4.js +1 -0
  281. package/static/chunk-ATBJWFA3.js +1 -0
  282. package/static/chunk-ATXLZN2B.js +1 -0
  283. package/static/chunk-AZ5TF5Y3.js +1 -0
  284. package/static/chunk-BBHYIURC.js +1 -0
  285. package/static/chunk-BHZEPHRI.js +13 -0
  286. package/static/chunk-BQZWSZNN.js +1 -0
  287. package/static/chunk-BSB4VROD.js +2 -0
  288. package/static/chunk-BYWSTP3P.js +1 -0
  289. package/static/chunk-C3AAEQKW.js +1 -0
  290. package/static/chunk-CCGGCHGN.js +1 -0
  291. package/static/chunk-CFTKW432.js +1 -0
  292. package/static/chunk-CNOVT6KU.js +1 -0
  293. package/static/chunk-D56H3XE2.js +1 -0
  294. package/static/chunk-DFOOSIIA.js +1 -0
  295. package/static/chunk-DHFQIFOF.js +1 -0
  296. package/static/{chunk-3GMLWAFZ.js → chunk-DIC2MVRI.js} +1 -1
  297. package/static/chunk-DJDRX53V.js +2 -0
  298. package/static/chunk-DKGXUMLT.js +1 -0
  299. package/static/chunk-DRHPEERW.js +2 -0
  300. package/static/chunk-DWYP6ZGG.js +1 -0
  301. package/static/chunk-EDJAISWO.js +13 -0
  302. package/static/chunk-EIYRBM4J.js +1 -0
  303. package/static/chunk-EKEGRXCV.js +7 -0
  304. package/static/chunk-EL6QL4TP.js +1 -0
  305. package/static/chunk-ERDZ7IVF.js +1 -0
  306. package/static/chunk-EVQKKVUZ.js +1 -0
  307. package/static/chunk-F2XG7EWI.js +1 -0
  308. package/static/chunk-F672FY5I.js +1 -0
  309. package/static/chunk-F6V37MKG.js +1 -0
  310. package/static/chunk-F7TXTNZC.js +1 -0
  311. package/static/chunk-FCGTI42I.js +1 -0
  312. package/static/chunk-FQHOSSCO.js +1 -0
  313. package/static/chunk-FTSIPHMG.js +1 -0
  314. package/static/chunk-GAGHHYLF.js +1 -0
  315. package/static/{chunk-JPT5WEAT.js → chunk-GOJYWL2M.js} +1 -1
  316. package/static/chunk-H6WOTGQ5.js +1 -0
  317. package/static/{chunk-CHJ64RJM.js → chunk-H6ZXFINQ.js} +1 -1
  318. package/static/chunk-HC7F57NA.js +1 -0
  319. package/static/chunk-HHWXIK2M.js +7 -0
  320. package/static/chunk-HKRGIRKB.js +3 -0
  321. package/static/chunk-HNMGPG72.js +1 -0
  322. package/static/chunk-HS4S6BV3.js +1 -0
  323. package/static/chunk-IJ7K7ATQ.js +1 -0
  324. package/static/chunk-IOIBQGHN.js +562 -0
  325. package/static/chunk-ITVA26X2.js +2 -0
  326. package/static/chunk-J6YSFHLZ.js +1 -0
  327. package/static/chunk-JAEJ6IMV.js +1 -0
  328. package/static/chunk-JB5R6V33.js +1 -0
  329. package/static/chunk-JF6WIV6M.js +1 -0
  330. package/static/chunk-JGB4LLUT.js +1 -0
  331. package/static/chunk-JGXVTKLG.js +1 -0
  332. package/static/chunk-JMYAD7E2.js +1 -0
  333. package/static/chunk-JSE63Q5X.js +1 -0
  334. package/static/chunk-JVV3ZL6L.js +1 -0
  335. package/static/chunk-JXZCNFW7.js +1 -0
  336. package/static/chunk-KAVP6UXH.js +1 -0
  337. package/static/{chunk-WLMNXRBS.js → chunk-KDEEERWZ.js} +1 -1
  338. package/static/chunk-KHRF67SG.js +1 -0
  339. package/static/chunk-KLOUBIO4.js +1 -0
  340. package/static/chunk-KMF3ZRAO.js +1 -0
  341. package/static/chunk-KNZ3AQPR.js +1 -0
  342. package/static/chunk-KT3TWCST.js +1 -0
  343. package/static/chunk-L6SYG23T.js +1 -0
  344. package/static/chunk-LJSVNPPQ.js +1 -0
  345. package/static/{chunk-LNTUR3GU.js → chunk-LRDKG274.js} +1 -1
  346. package/static/chunk-LRQSPCYZ.js +1 -0
  347. package/static/chunk-LUSVISM6.js +1 -0
  348. package/static/chunk-LXQGVNU2.js +1 -0
  349. package/static/{chunk-BIKLW4YS.js → chunk-LYZGJZNP.js} +1 -1
  350. package/static/chunk-LZKI5P5T.js +1 -0
  351. package/static/chunk-M4XL3JN5.js +6 -0
  352. package/static/{chunk-UNCPXHHT.js → chunk-MGWG7OD7.js} +1 -1
  353. package/static/chunk-MKUUWY6Y.js +1 -0
  354. package/static/{chunk-HAS5ZOTR.js → chunk-MNNCSSHN.js} +1 -1
  355. package/static/chunk-MR3U7TKQ.js +1 -0
  356. package/static/chunk-MRF3CNLZ.js +1 -0
  357. package/static/chunk-MRMSMTWD.js +1 -0
  358. package/static/chunk-MVZJSG5R.js +1 -0
  359. package/static/chunk-MYM43ENO.js +1 -0
  360. package/static/chunk-N3P6P6GW.js +7 -0
  361. package/static/chunk-NAH4V2R6.js +2 -0
  362. package/static/chunk-NBBDVVUF.js +1 -0
  363. package/static/chunk-NMF2ZFBE.js +1 -0
  364. package/static/chunk-NN4ONTOT.js +1 -0
  365. package/static/chunk-NOPACN4F.js +1 -0
  366. package/static/chunk-NYJPOP4L.js +1 -0
  367. package/static/chunk-OJCAIKUK.js +1 -0
  368. package/static/chunk-OQRWXCLY.js +1 -0
  369. package/static/chunk-PCFH5HCI.js +2 -0
  370. package/static/chunk-PG54TWBO.js +4 -0
  371. package/static/chunk-PJF5XUTO.js +1 -0
  372. package/static/{chunk-FJE6BOFL.js → chunk-PSUAQBYM.js} +1 -1
  373. package/static/chunk-PTLYIUFW.js +1 -0
  374. package/static/chunk-PZGLDZZM.js +1 -0
  375. package/static/chunk-Q4VNZGFI.js +1 -0
  376. package/static/chunk-Q556XB3S.js +1 -0
  377. package/static/{chunk-PB4AIT7O.js → chunk-Q7IXRPOO.js} +1 -1
  378. package/static/chunk-Q7U2VPIS.js +1 -0
  379. package/static/chunk-QM6CQMEX.js +1 -0
  380. package/static/chunk-QMHUIHSR.js +1 -0
  381. package/static/chunk-QNFNXDSX.js +1 -0
  382. package/static/chunk-QVFPHTOH.js +1 -0
  383. package/static/chunk-R4MI25E2.js +1 -0
  384. package/static/chunk-R7JRAR3P.js +1 -0
  385. package/static/chunk-R7PNKQU2.js +1 -0
  386. package/static/chunk-RCAORRB7.js +1 -0
  387. package/static/chunk-RK7XRDNB.js +1 -0
  388. package/static/chunk-RO7SAOLK.js +1 -0
  389. package/static/chunk-RQUUINHV.js +1 -0
  390. package/static/chunk-RT3K6DZR.js +1 -0
  391. package/static/chunk-RUN556VW.js +1 -0
  392. package/static/chunk-RX3YQ67K.js +1 -0
  393. package/static/chunk-S6EVLDHA.js +5 -0
  394. package/static/chunk-S7S5M3AZ.js +1 -0
  395. package/static/chunk-SBLNYV74.js +1 -0
  396. package/static/chunk-SIZCHHUA.js +1 -0
  397. package/static/chunk-SRBOO7AO.js +1 -0
  398. package/static/{chunk-PVDHBQRM.js → chunk-STA7NTYL.js} +1 -1
  399. package/static/chunk-T3YI3BSS.js +1 -0
  400. package/static/chunk-T74SMT7I.js +1 -0
  401. package/static/chunk-TAL3RTTQ.js +1 -0
  402. package/static/chunk-TJZKTNNS.js +1 -0
  403. package/static/chunk-UJTFWZEC.js +1 -0
  404. package/static/chunk-UPGVU5LG.js +1 -0
  405. package/static/chunk-UQ6O3I6W.js +1 -0
  406. package/static/{chunk-5NMSIIQB.js → chunk-V43RGNXA.js} +1 -1
  407. package/static/chunk-VWIRXLNE.js +1 -0
  408. package/static/chunk-VZMVGIVW.js +1 -0
  409. package/static/chunk-VZPCXSRG.js +2 -0
  410. package/static/chunk-WR3MA3L3.js +1 -0
  411. package/static/chunk-XCLK7NJL.js +1 -0
  412. package/static/{chunk-DSWEWLXJ.js → chunk-XCPDPB5G.js} +1 -1
  413. package/static/chunk-XEGHEUP5.js +1 -0
  414. package/static/chunk-XKEBQNQJ.js +1 -0
  415. package/static/chunk-XOF4UW3S.js +1 -0
  416. package/static/chunk-XOTKK2NJ.js +1 -0
  417. package/static/chunk-XX7JXKA6.js +1 -0
  418. package/static/chunk-Y2I36A4K.js +1 -0
  419. package/static/chunk-Y44XDRM5.js +1 -0
  420. package/static/{chunk-QO6BTONN.js → chunk-Y4MAPE2C.js} +1 -1
  421. package/static/chunk-Y5RLD72B.js +1 -0
  422. package/static/{chunk-DPUVSXRB.js → chunk-Y5XTRCFK.js} +1 -1
  423. package/static/chunk-Y63UUJGJ.js +1 -0
  424. package/static/chunk-YBNAC7QM.js +1 -0
  425. package/static/chunk-YCTCESL4.js +1 -0
  426. package/static/chunk-YMAN4LIU.js +1 -0
  427. package/static/chunk-YTDE6SXT.js +1 -0
  428. package/static/chunk-YZPIUJB3.js +1 -0
  429. package/static/chunk-ZCOWBVOT.js +1 -0
  430. package/static/chunk-ZHRYYMYE.js +1 -0
  431. package/static/chunk-ZNXTOQFG.js +1 -0
  432. package/static/{chunk-URHTCJ7G.js → chunk-ZQLBPLXI.js} +1 -1
  433. package/static/favicon.ico +0 -0
  434. package/static/index.html +2 -2
  435. package/static/main-3PLRDZTO.js +11 -0
  436. package/static/styles-Q4OZOSSK.css +1 -0
  437. package/server/applications/notifications/interfaces/user-mail-notification.js.map +0 -1
  438. package/static/assets/codemirror/mode/apl/apl.js +0 -174
  439. package/static/assets/codemirror/mode/asciiarmor/asciiarmor.js +0 -74
  440. package/static/assets/codemirror/mode/asn.1/asn.1.js +0 -204
  441. package/static/assets/codemirror/mode/asterisk/asterisk.js +0 -220
  442. package/static/assets/codemirror/mode/brainfuck/brainfuck.js +0 -85
  443. package/static/assets/codemirror/mode/clike/clike.js +0 -942
  444. package/static/assets/codemirror/mode/clojure/clojure.js +0 -293
  445. package/static/assets/codemirror/mode/cmake/cmake.js +0 -97
  446. package/static/assets/codemirror/mode/cobol/cobol.js +0 -255
  447. package/static/assets/codemirror/mode/coffeescript/coffeescript.js +0 -359
  448. package/static/assets/codemirror/mode/commonlisp/commonlisp.js +0 -125
  449. package/static/assets/codemirror/mode/crystal/crystal.js +0 -433
  450. package/static/assets/codemirror/mode/css/css.js +0 -862
  451. package/static/assets/codemirror/mode/cypher/cypher.js +0 -152
  452. package/static/assets/codemirror/mode/d/d.js +0 -223
  453. package/static/assets/codemirror/mode/dart/dart.js +0 -168
  454. package/static/assets/codemirror/mode/diff/diff.js +0 -47
  455. package/static/assets/codemirror/mode/django/django.js +0 -356
  456. package/static/assets/codemirror/mode/dockerfile/dockerfile.js +0 -211
  457. package/static/assets/codemirror/mode/dtd/dtd.js +0 -142
  458. package/static/assets/codemirror/mode/dylan/dylan.js +0 -352
  459. package/static/assets/codemirror/mode/ebnf/ebnf.js +0 -195
  460. package/static/assets/codemirror/mode/ecl/ecl.js +0 -206
  461. package/static/assets/codemirror/mode/eiffel/eiffel.js +0 -160
  462. package/static/assets/codemirror/mode/elm/elm.js +0 -245
  463. package/static/assets/codemirror/mode/erlang/erlang.js +0 -619
  464. package/static/assets/codemirror/mode/factor/factor.js +0 -85
  465. package/static/assets/codemirror/mode/fcl/fcl.js +0 -173
  466. package/static/assets/codemirror/mode/forth/forth.js +0 -180
  467. package/static/assets/codemirror/mode/fortran/fortran.js +0 -188
  468. package/static/assets/codemirror/mode/gas/gas.js +0 -355
  469. package/static/assets/codemirror/mode/gfm/gfm.js +0 -129
  470. package/static/assets/codemirror/mode/gherkin/gherkin.js +0 -194
  471. package/static/assets/codemirror/mode/go/go.js +0 -187
  472. package/static/assets/codemirror/mode/groovy/groovy.js +0 -245
  473. package/static/assets/codemirror/mode/haml/haml.js +0 -161
  474. package/static/assets/codemirror/mode/handlebars/handlebars.js +0 -70
  475. package/static/assets/codemirror/mode/haskell/haskell.js +0 -268
  476. package/static/assets/codemirror/mode/haskell-literate/haskell-literate.js +0 -43
  477. package/static/assets/codemirror/mode/haxe/haxe.js +0 -515
  478. package/static/assets/codemirror/mode/htmlembedded/htmlembedded.js +0 -37
  479. package/static/assets/codemirror/mode/htmlmixed/htmlmixed.js +0 -153
  480. package/static/assets/codemirror/mode/http/http.js +0 -113
  481. package/static/assets/codemirror/mode/idl/idl.js +0 -290
  482. package/static/assets/codemirror/mode/javascript/javascript.js +0 -960
  483. package/static/assets/codemirror/mode/jinja2/jinja2.js +0 -193
  484. package/static/assets/codemirror/mode/jsx/jsx.js +0 -149
  485. package/static/assets/codemirror/mode/julia/julia.js +0 -390
  486. package/static/assets/codemirror/mode/livescript/livescript.js +0 -280
  487. package/static/assets/codemirror/mode/lua/lua.js +0 -160
  488. package/static/assets/codemirror/mode/markdown/markdown.js +0 -886
  489. package/static/assets/codemirror/mode/mathematica/mathematica.js +0 -176
  490. package/static/assets/codemirror/mode/mbox/mbox.js +0 -129
  491. package/static/assets/codemirror/mode/meta.js +0 -221
  492. package/static/assets/codemirror/mode/mirc/mirc.js +0 -193
  493. package/static/assets/codemirror/mode/mllike/mllike.js +0 -359
  494. package/static/assets/codemirror/mode/modelica/modelica.js +0 -245
  495. package/static/assets/codemirror/mode/mscgen/mscgen.js +0 -175
  496. package/static/assets/codemirror/mode/mumps/mumps.js +0 -148
  497. package/static/assets/codemirror/mode/nginx/nginx.js +0 -178
  498. package/static/assets/codemirror/mode/nsis/nsis.js +0 -95
  499. package/static/assets/codemirror/mode/ntriples/ntriples.js +0 -195
  500. package/static/assets/codemirror/mode/octave/octave.js +0 -139
  501. package/static/assets/codemirror/mode/oz/oz.js +0 -252
  502. package/static/assets/codemirror/mode/pascal/pascal.js +0 -136
  503. package/static/assets/codemirror/mode/pegjs/pegjs.js +0 -111
  504. package/static/assets/codemirror/mode/perl/perl.js +0 -836
  505. package/static/assets/codemirror/mode/php/php.js +0 -234
  506. package/static/assets/codemirror/mode/pig/pig.js +0 -178
  507. package/static/assets/codemirror/mode/powershell/powershell.js +0 -398
  508. package/static/assets/codemirror/mode/properties/properties.js +0 -78
  509. package/static/assets/codemirror/mode/protobuf/protobuf.js +0 -72
  510. package/static/assets/codemirror/mode/pug/pug.js +0 -591
  511. package/static/assets/codemirror/mode/puppet/puppet.js +0 -220
  512. package/static/assets/codemirror/mode/python/python.js +0 -402
  513. package/static/assets/codemirror/mode/q/q.js +0 -139
  514. package/static/assets/codemirror/mode/r/r.js +0 -190
  515. package/static/assets/codemirror/mode/rpm/changes/index.html +0 -66
  516. package/static/assets/codemirror/mode/rpm/rpm.js +0 -109
  517. package/static/assets/codemirror/mode/rst/rst.js +0 -557
  518. package/static/assets/codemirror/mode/ruby/ruby.js +0 -303
  519. package/static/assets/codemirror/mode/rust/rust.js +0 -72
  520. package/static/assets/codemirror/mode/sas/sas.js +0 -303
  521. package/static/assets/codemirror/mode/sass/sass.js +0 -459
  522. package/static/assets/codemirror/mode/scheme/scheme.js +0 -284
  523. package/static/assets/codemirror/mode/shell/shell.js +0 -168
  524. package/static/assets/codemirror/mode/sieve/sieve.js +0 -193
  525. package/static/assets/codemirror/mode/slim/slim.js +0 -575
  526. package/static/assets/codemirror/mode/smalltalk/smalltalk.js +0 -168
  527. package/static/assets/codemirror/mode/smarty/smarty.js +0 -225
  528. package/static/assets/codemirror/mode/solr/solr.js +0 -104
  529. package/static/assets/codemirror/mode/soy/soy.js +0 -665
  530. package/static/assets/codemirror/mode/sparql/sparql.js +0 -184
  531. package/static/assets/codemirror/mode/spreadsheet/spreadsheet.js +0 -112
  532. package/static/assets/codemirror/mode/sql/sql.js +0 -529
  533. package/static/assets/codemirror/mode/stex/stex.js +0 -264
  534. package/static/assets/codemirror/mode/stylus/stylus.js +0 -775
  535. package/static/assets/codemirror/mode/swift/swift.js +0 -221
  536. package/static/assets/codemirror/mode/tcl/tcl.js +0 -140
  537. package/static/assets/codemirror/mode/textile/textile.js +0 -469
  538. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.css +0 -14
  539. package/static/assets/codemirror/mode/tiddlywiki/tiddlywiki.js +0 -308
  540. package/static/assets/codemirror/mode/tiki/tiki.css +0 -26
  541. package/static/assets/codemirror/mode/tiki/tiki.js +0 -312
  542. package/static/assets/codemirror/mode/toml/toml.js +0 -88
  543. package/static/assets/codemirror/mode/tornado/tornado.js +0 -68
  544. package/static/assets/codemirror/mode/troff/troff.js +0 -84
  545. package/static/assets/codemirror/mode/ttcn/ttcn.js +0 -283
  546. package/static/assets/codemirror/mode/ttcn-cfg/ttcn-cfg.js +0 -214
  547. package/static/assets/codemirror/mode/turtle/turtle.js +0 -162
  548. package/static/assets/codemirror/mode/twig/twig.js +0 -141
  549. package/static/assets/codemirror/mode/vb/vb.js +0 -275
  550. package/static/assets/codemirror/mode/vbscript/vbscript.js +0 -350
  551. package/static/assets/codemirror/mode/velocity/velocity.js +0 -202
  552. package/static/assets/codemirror/mode/verilog/verilog.js +0 -781
  553. package/static/assets/codemirror/mode/vhdl/vhdl.js +0 -189
  554. package/static/assets/codemirror/mode/vue/vue.js +0 -77
  555. package/static/assets/codemirror/mode/wast/wast.js +0 -132
  556. package/static/assets/codemirror/mode/webidl/webidl.js +0 -195
  557. package/static/assets/codemirror/mode/xml/xml.js +0 -417
  558. package/static/assets/codemirror/mode/xquery/xquery.js +0 -448
  559. package/static/assets/codemirror/mode/yacas/yacas.js +0 -204
  560. package/static/assets/codemirror/mode/yaml/yaml.js +0 -120
  561. package/static/assets/codemirror/mode/yaml-frontmatter/yaml-frontmatter.js +0 -72
  562. package/static/assets/codemirror/mode/z80/z80.js +0 -116
  563. package/static/chunk-2KLC4T2Z.js +0 -1
  564. package/static/chunk-373XVRXW.js +0 -1
  565. package/static/chunk-3XVM35O2.js +0 -1
  566. package/static/chunk-3YVRP3VM.js +0 -2
  567. package/static/chunk-AF24EYXU.js +0 -1
  568. package/static/chunk-AKQVEHO6.js +0 -2
  569. package/static/chunk-AY2SZ3G6.js +0 -1
  570. package/static/chunk-BCVX464U.js +0 -2
  571. package/static/chunk-C36MW4ME.js +0 -562
  572. package/static/chunk-DKSEQTMX.js +0 -1
  573. package/static/chunk-FZ3JPGYZ.js +0 -1
  574. package/static/chunk-GUGNR5TF.js +0 -3
  575. package/static/chunk-H6NE33VX.js +0 -1
  576. package/static/chunk-HNQRZALS.js +0 -1
  577. package/static/chunk-JSWCNGXJ.js +0 -1
  578. package/static/chunk-KFJIQIGR.js +0 -1
  579. package/static/chunk-LVM4QB22.js +0 -1
  580. package/static/chunk-M3XVNQZQ.js +0 -1
  581. package/static/chunk-MFLIJH6T.js +0 -1
  582. package/static/chunk-MSUHTBB2.js +0 -1
  583. package/static/chunk-N3U6637P.js +0 -1
  584. package/static/chunk-NNV4OXSB.js +0 -1
  585. package/static/chunk-NO2LTNW3.js +0 -1
  586. package/static/chunk-OOGP4WSH.js +0 -2
  587. package/static/chunk-PCWDQPOM.js +0 -2
  588. package/static/chunk-PGZZP5W3.js +0 -1
  589. package/static/chunk-Q5KM7LTX.js +0 -1
  590. package/static/chunk-QHC6ZPQ4.js +0 -1
  591. package/static/chunk-QZU2S5CV.js +0 -1
  592. package/static/chunk-SBZ572Q4.js +0 -2
  593. package/static/chunk-SHIVUDP3.js +0 -1
  594. package/static/chunk-SLHTEGRU.js +0 -1
  595. package/static/chunk-SSFF27P2.js +0 -24
  596. package/static/chunk-TPYBFZS5.js +0 -1
  597. package/static/chunk-UEQCWMXD.js +0 -1
  598. package/static/chunk-UG5DMXYO.js +0 -1
  599. package/static/chunk-UJPPR4MX.js +0 -1
  600. package/static/chunk-V3AT2BKP.js +0 -1
  601. package/static/chunk-VKK5BSLX.js +0 -1
  602. package/static/chunk-WJW7CT6G.js +0 -27
  603. package/static/chunk-X5XGK6T7.js +0 -4
  604. package/static/chunk-YEKR5OPO.js +0 -1
  605. package/static/chunk-YW57T2PF.js +0 -1
  606. package/static/chunk-Z5J5F5SX.js +0 -1
  607. package/static/chunk-ZPF2DSQV.js +0 -1
  608. package/static/chunk-ZTCRGJ6Y.js +0 -7
  609. package/static/main-VOL6OMJ5.js +0 -9
  610. package/static/scripts-WRDOQIU5.js +0 -24
  611. package/static/styles-2C2UNCNB.css +0 -1
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../backend/src/applications/admin/services/admin.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { Injectable, Logger } from '@nestjs/common'\nimport type { AxiosResponse } from 'axios'\nimport { VERSION } from '../../../app.constants'\nimport { APP_URL } from '../../../common/shared'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { HTTP_METHOD } from '../../applications.constants'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport type { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { AdminUsersQueries } from '../../users/services/admin-users-queries.service'\nimport type { ServerReleaseNotification, ServerReleaseVersionManifest } from '../interfaces/check-update.interfaces'\nimport { isServerUpdateAvailable } from '../utils/check-update'\n\n@Injectable()\nexport class AdminService {\n private readonly logger = new Logger(AdminService.name)\n\n constructor(\n private readonly http: HttpService,\n private readonly cache: Cache,\n private readonly notificationsManager: NotificationsManager,\n private readonly adminUsersQueries: AdminUsersQueries\n ) {}\n\n async checkServerUpdateAndNotify() {\n let lastVersion: string\n try {\n const res: AxiosResponse<ServerReleaseVersionManifest> = await this.http.axiosRef({\n method: HTTP_METHOD.GET,\n url: APP_URL.SERVER_VERSION_MANIFEST\n })\n lastVersion = res.data?.tag_name || ''\n } catch (e) {\n this.logger.warn(`${this.checkServerUpdateAndNotify.name} - unable to check update: ${e}`)\n return\n }\n if (!lastVersion.startsWith('v')) {\n this.logger.warn(`${this.checkServerUpdateAndNotify.name} - unable to check version: ${lastVersion}`)\n return\n }\n lastVersion = lastVersion.slice(1) // remove 'v' to compare with the current version\n if (!isServerUpdateAvailable(VERSION, lastVersion)) {\n return\n }\n // Get the last version that was notified to administrators\n const notifiedVersion: ServerReleaseNotification = await this.cache.get(this.checkServerUpdateAndNotify.name)\n if (!notifiedVersion?.version) {\n // The version was never stored, do it\n await this.cache.set(this.checkServerUpdateAndNotify.name, { version: VERSION } satisfies ServerReleaseNotification, 0)\n return\n }\n if (notifiedVersion.version === lastVersion) {\n // Notification was already sent to administrators\n return\n }\n const adminsToNotify: UserMailNotification[] = await this.adminUsersQueries.listAdminsToNotify()\n if (!adminsToNotify.length) {\n return\n }\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.UPDATE_AVAILABLE,\n event: NOTIFICATION_APP_EVENT.UPDATE_AVAILABLE,\n element: lastVersion,\n externalUrl: APP_URL.RELEASES,\n url: null\n }\n this.notificationsManager\n .create(adminsToNotify, notification)\n .then(() => this.cache.set(this.checkServerUpdateAndNotify.name, { version: lastVersion } satisfies ServerReleaseNotification, 0))\n .catch((e: Error) => this.logger.error(`${this.checkServerUpdateAndNotify.name} - ${e}`))\n }\n}\n"],"names":["AdminService","checkServerUpdateAndNotify","lastVersion","res","http","axiosRef","method","HTTP_METHOD","GET","url","APP_URL","SERVER_VERSION_MANIFEST","data","tag_name","e","logger","warn","name","startsWith","slice","isServerUpdateAvailable","VERSION","notifiedVersion","cache","get","version","set","adminsToNotify","adminUsersQueries","listAdminsToNotify","length","notification","app","NOTIFICATION_APP","UPDATE_AVAILABLE","event","NOTIFICATION_APP_EVENT","element","externalUrl","RELEASES","notificationsManager","create","then","catch","error","Logger"],"mappings":"AAAA;;;;CAIC;;;;+BAkBYA;;;eAAAA;;;uBAhBe;wBACO;8BAEX;wBACA;8BACF;uCACM;+BAC6B;6CAGpB;0CACH;6BAEM;;;;;;;;;;AAGjC,IAAA,AAAMA,eAAN,MAAMA;IAUX,MAAMC,6BAA6B;QACjC,IAAIC;QACJ,IAAI;YACF,MAAMC,MAAmD,MAAM,IAAI,CAACC,IAAI,CAACC,QAAQ,CAAC;gBAChFC,QAAQC,kCAAW,CAACC,GAAG;gBACvBC,KAAKC,eAAO,CAACC,uBAAuB;YACtC;YACAT,cAAcC,IAAIS,IAAI,EAAEC,YAAY;QACtC,EAAE,OAAOC,GAAG;YACV,IAAI,CAACC,MAAM,CAACC,IAAI,CAAC,GAAG,IAAI,CAACf,0BAA0B,CAACgB,IAAI,CAAC,2BAA2B,EAAEH,GAAG;YACzF;QACF;QACA,IAAI,CAACZ,YAAYgB,UAAU,CAAC,MAAM;YAChC,IAAI,CAACH,MAAM,CAACC,IAAI,CAAC,GAAG,IAAI,CAACf,0BAA0B,CAACgB,IAAI,CAAC,4BAA4B,EAAEf,aAAa;YACpG;QACF;QACAA,cAAcA,YAAYiB,KAAK,CAAC,IAAG,iDAAiD;QACpF,IAAI,CAACC,IAAAA,oCAAuB,EAACC,qBAAO,EAAEnB,cAAc;YAClD;QACF;QACA,2DAA2D;QAC3D,MAAMoB,kBAA6C,MAAM,IAAI,CAACC,KAAK,CAACC,GAAG,CAAC,IAAI,CAACvB,0BAA0B,CAACgB,IAAI;QAC5G,IAAI,CAACK,iBAAiBG,SAAS;YAC7B,sCAAsC;YACtC,MAAM,IAAI,CAACF,KAAK,CAACG,GAAG,CAAC,IAAI,CAACzB,0BAA0B,CAACgB,IAAI,EAAE;gBAAEQ,SAASJ,qBAAO;YAAC,GAAuC;YACrH;QACF;QACA,IAAIC,gBAAgBG,OAAO,KAAKvB,aAAa;YAC3C,kDAAkD;YAClD;QACF;QACA,MAAMyB,iBAAyC,MAAM,IAAI,CAACC,iBAAiB,CAACC,kBAAkB;QAC9F,IAAI,CAACF,eAAeG,MAAM,EAAE;YAC1B;QACF;QACA,MAAMC,eAAoC;YACxCC,KAAKC,+BAAgB,CAACC,gBAAgB;YACtCC,OAAOC,qCAAsB,CAACF,gBAAgB;YAC9CG,SAASnC;YACToC,aAAa5B,eAAO,CAAC6B,QAAQ;YAC7B9B,KAAK;QACP;QACA,IAAI,CAAC+B,oBAAoB,CACtBC,MAAM,CAACd,gBAAgBI,cACvBW,IAAI,CAAC,IAAM,IAAI,CAACnB,KAAK,CAACG,GAAG,CAAC,IAAI,CAACzB,0BAA0B,CAACgB,IAAI,EAAE;gBAAEQ,SAASvB;YAAY,GAAuC,IAC9HyC,KAAK,CAAC,CAAC7B,IAAa,IAAI,CAACC,MAAM,CAAC6B,KAAK,CAAC,GAAG,IAAI,CAAC3C,0BAA0B,CAACgB,IAAI,CAAC,GAAG,EAAEH,GAAG;IAC3F;IArDA,YACE,AAAiBV,IAAiB,EAClC,AAAiBmB,KAAY,EAC7B,AAAiBiB,oBAA0C,EAC3D,AAAiBZ,iBAAoC,CACrD;aAJiBxB,OAAAA;aACAmB,QAAAA;aACAiB,uBAAAA;aACAZ,oBAAAA;aANFb,SAAS,IAAI8B,cAAM,CAAC7C,aAAaiB,IAAI;IAOnD;AAiDL"}
@@ -0,0 +1,46 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ const _axios = require("@nestjs/axios");
10
+ const _testing = require("@nestjs/testing");
11
+ const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
12
+ const _notificationsmanagerservice = require("../../notifications/services/notifications-manager.service");
13
+ const _adminusersqueriesservice = require("../../users/services/admin-users-queries.service");
14
+ const _adminservice = require("./admin.service");
15
+ describe(_adminservice.AdminService.name, ()=>{
16
+ let service;
17
+ beforeAll(async ()=>{
18
+ const module = await _testing.Test.createTestingModule({
19
+ providers: [
20
+ _adminservice.AdminService,
21
+ {
22
+ provide: _axios.HttpService,
23
+ useValue: {}
24
+ },
25
+ {
26
+ provide: _cacheservice.Cache,
27
+ useValue: {}
28
+ },
29
+ {
30
+ provide: _adminusersqueriesservice.AdminUsersQueries,
31
+ useValue: {}
32
+ },
33
+ {
34
+ provide: _notificationsmanagerservice.NotificationsManager,
35
+ useValue: {}
36
+ }
37
+ ]
38
+ }).compile();
39
+ service = module.get(_adminservice.AdminService);
40
+ });
41
+ it('should be defined', ()=>{
42
+ expect(service).toBeDefined();
43
+ });
44
+ });
45
+
46
+ //# sourceMappingURL=admin.service.spec.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../backend/src/applications/admin/services/admin.service.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 { HttpService } from '@nestjs/axios'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { AdminUsersQueries } from '../../users/services/admin-users-queries.service'\nimport { AdminService } from './admin.service'\n\ndescribe(AdminService.name, () => {\n let service: AdminService\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n AdminService,\n { provide: HttpService, useValue: {} },\n { provide: Cache, useValue: {} },\n { provide: AdminUsersQueries, useValue: {} },\n { provide: NotificationsManager, useValue: {} }\n ]\n }).compile()\n\n service = module.get<AdminService>(AdminService)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","AdminService","name","service","beforeAll","module","Test","createTestingModule","providers","provide","HttpService","useValue","Cache","AdminUsersQueries","NotificationsManager","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;uBAE2B;yBACQ;8BACd;6CACe;0CACH;8BACL;AAE7BA,SAASC,0BAAY,CAACC,IAAI,EAAE;IAC1B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACTP,0BAAY;gBACZ;oBAAEQ,SAASC,kBAAW;oBAAEC,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASG,mBAAK;oBAAED,UAAU,CAAC;gBAAE;gBAC/B;oBAAEF,SAASI,2CAAiB;oBAAEF,UAAU,CAAC;gBAAE;gBAC3C;oBAAEF,SAASK,iDAAoB;oBAAEH,UAAU,CAAC;gBAAE;aAC/C;QACH,GAAGI,OAAO;QAEVZ,UAAUE,OAAOW,GAAG,CAAef,0BAAY;IACjD;IAEAgB,GAAG,qBAAqB;QACtBC,OAAOf,SAASgB,WAAW;IAC7B;AACF"}
@@ -0,0 +1,28 @@
1
+ /*
2
+ * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
3
+ * This file is part of Sync-in | The open source file sync and share solution
4
+ * See the LICENSE file for licensing details
5
+ */ "use strict";
6
+ Object.defineProperty(exports, "__esModule", {
7
+ value: true
8
+ });
9
+ Object.defineProperty(exports, "isServerUpdateAvailable", {
10
+ enumerable: true,
11
+ get: function() {
12
+ return isServerUpdateAvailable;
13
+ }
14
+ });
15
+ function isServerUpdateAvailable(current, latest) {
16
+ const c = current.split('.').map(Number);
17
+ const l = latest.split('.').map(Number);
18
+ const max = Math.max(c.length, l.length);
19
+ for(let i = 0; i < max; i++){
20
+ const cv = c[i] || 0;
21
+ const lv = l[i] || 0;
22
+ if (lv > cv) return true;
23
+ if (lv < cv) return false;
24
+ }
25
+ return false;
26
+ }
27
+
28
+ //# sourceMappingURL=check-update.js.map
@@ -0,0 +1 @@
1
+ {"version":3,"sources":["../../../../../backend/src/applications/admin/utils/check-update.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 function isServerUpdateAvailable(current: string, latest: string) {\n const c = current.split('.').map(Number)\n const l = latest.split('.').map(Number)\n const max = Math.max(c.length, l.length)\n\n for (let i = 0; i < max; i++) {\n const cv = c[i] || 0\n const lv = l[i] || 0\n\n if (lv > cv) return true\n if (lv < cv) return false\n }\n return false\n}\n"],"names":["isServerUpdateAvailable","current","latest","c","split","map","Number","l","max","Math","length","i","cv","lv"],"mappings":"AAAA;;;;CAIC;;;;+BAEeA;;;eAAAA;;;AAAT,SAASA,wBAAwBC,OAAe,EAAEC,MAAc;IACrE,MAAMC,IAAIF,QAAQG,KAAK,CAAC,KAAKC,GAAG,CAACC;IACjC,MAAMC,IAAIL,OAAOE,KAAK,CAAC,KAAKC,GAAG,CAACC;IAChC,MAAME,MAAMC,KAAKD,GAAG,CAACL,EAAEO,MAAM,EAAEH,EAAEG,MAAM;IAEvC,IAAK,IAAIC,IAAI,GAAGA,IAAIH,KAAKG,IAAK;QAC5B,MAAMC,KAAKT,CAAC,CAACQ,EAAE,IAAI;QACnB,MAAME,KAAKN,CAAC,CAACI,EAAE,IAAI;QAEnB,IAAIE,KAAKD,IAAI,OAAO;QACpB,IAAIC,KAAKD,IAAI,OAAO;IACtB;IACA,OAAO;AACT"}
@@ -111,7 +111,7 @@ let CommentsManager = class CommentsManager {
111
111
  };
112
112
  this.notificationsManager.create(members, notification, {
113
113
  author: fromUser,
114
- currentUrl: this.contextManager.get('headerOriginUrl'),
114
+ currentUrl: this.contextManager.headerOriginUrl(),
115
115
  content: comment
116
116
  }).catch((e)=>this.logger.error(`${this.notify.name} - ${e}`));
117
117
  }
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport type { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { UserModel } from '../../users/models/user.model'\nimport { CreateOrUpdateCommentDto, DeleteCommentDto } from '../dto/comment.dto'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport type { Comment } from '../schemas/comment.interface'\nimport { CommentsQueries } from './comments-queries.service'\n\n@Injectable()\nexport class CommentsManager {\n private readonly logger = new Logger(CommentsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly commentQueries: CommentsQueries,\n private readonly filesQueries: FilesQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async getComments(user: UserModel, space: SpaceEnv): Promise<Comment[]> {\n const fileId: number = await this.getFileId(space)\n if (!fileId) {\n return []\n }\n return this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, fileId)\n }\n\n async createComment(user: UserModel, space: SpaceEnv, createCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n if ((space.dbFile.spaceExternalRootId || space.dbFile.shareExternalId) && space.dbFile.path === '.') {\n // If path is empty a file with path = '.' and name = '.' will be created\n // The space browser does not support this kind of file and will remove it\n // Maybe to implement later\n throw new HttpException(`Not supported on this kind of ${space.dbFile.spaceExternalRootId ? 'space root' : 'share'}`, HttpStatus.BAD_REQUEST)\n }\n let fileId: number\n if (createCommentDto.fileId > 0) {\n fileId = await this.getFileId(space)\n if (createCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n } else {\n fileId = await this.getFileId(space, createCommentDto.fileId)\n }\n const commentId: number = await this.commentQueries.createComment(user.id, fileId, createCommentDto.content)\n this.notify(user, fileId, space, createCommentDto.content).catch((e: Error) => this.logger.error(`${this.createComment.name} - ${e}`))\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, commentId))[0]\n }\n\n async updateComment(user: UserModel, space: SpaceEnv, updateCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n const [comment] = await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId)\n if (!comment) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileId: number = await this.getFileId(space)\n if (updateCommentDto.fileId !== fileId || comment.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.updateComment(user.id, updateCommentDto.commentId, updateCommentDto.fileId, updateCommentDto.content))) {\n throw new HttpException('Unable to update', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId))[0]\n }\n\n async deleteComment(user: UserModel, space: SpaceEnv, deleteCommentDto: DeleteCommentDto): Promise<void> {\n const fileId: number = await this.getFileId(space)\n if (deleteCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.deleteComment(user.id, deleteCommentDto.commentId, fileId, space.dbFile?.ownerId === user.id))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n }\n\n private async getFileId(space: SpaceEnv, fileId?: number): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileProps: FileProps = { ...(await getProps(space.realPath, space.dbFile.path)), id: undefined }\n if (fileId) {\n // get or create\n return this.filesQueries.getOrCreateSpaceFile(fileId, fileProps, space.dbFile)\n } else {\n // get only\n return this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n }\n }\n\n async getRecents(user: UserModel, limit: number): Promise<CommentRecent[]> {\n return this.commentQueries.getRecentsFromUser(user, limit)\n }\n\n private async notify(fromUser: UserModel, fileId: number, space: SpaceEnv, comment: string): Promise<void> {\n const members: UserMailNotification[] = await this.commentQueries.membersToNotify(fromUser.id, fileId)\n if (!members.length) {\n return\n }\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.COMMENTS,\n event: NOTIFICATION_APP_EVENT.COMMENTS,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create(members, notification, {\n author: fromUser,\n currentUrl: this.contextManager.get('headerOriginUrl'),\n content: comment\n })\n .catch((e: Error) => this.logger.error(`${this.notify.name} - ${e}`))\n }\n}\n"],"names":["CommentsManager","getComments","user","space","fileId","getFileId","commentQueries","id","dbFile","ownerId","createComment","createCommentDto","spaceExternalRootId","shareExternalId","path","HttpException","HttpStatus","BAD_REQUEST","commentId","content","notify","catch","e","logger","error","name","updateComment","updateCommentDto","comment","NOT_FOUND","INTERNAL_SERVER_ERROR","deleteComment","deleteCommentDto","FORBIDDEN","isPathExists","realPath","fileProps","getProps","undefined","filesQueries","getOrCreateSpaceFile","getSpaceFileId","getRecents","limit","getRecentsFromUser","fromUser","members","membersToNotify","length","notification","app","NOTIFICATION_APP","COMMENTS","event","NOTIFICATION_APP_EVENT","element","fileName","url","dirName","notificationsManager","create","author","currentUrl","contextManager","get","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport type { FileProps } from '../../files/interfaces/file-props.interface'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { UserModel } from '../../users/models/user.model'\nimport { CreateOrUpdateCommentDto, DeleteCommentDto } from '../dto/comment.dto'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport type { Comment } from '../schemas/comment.interface'\nimport { CommentsQueries } from './comments-queries.service'\n\n@Injectable()\nexport class CommentsManager {\n private readonly logger = new Logger(CommentsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly commentQueries: CommentsQueries,\n private readonly filesQueries: FilesQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async getComments(user: UserModel, space: SpaceEnv): Promise<Comment[]> {\n const fileId: number = await this.getFileId(space)\n if (!fileId) {\n return []\n }\n return this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, fileId)\n }\n\n async createComment(user: UserModel, space: SpaceEnv, createCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n if ((space.dbFile.spaceExternalRootId || space.dbFile.shareExternalId) && space.dbFile.path === '.') {\n // If path is empty a file with path = '.' and name = '.' will be created\n // The space browser does not support this kind of file and will remove it\n // Maybe to implement later\n throw new HttpException(`Not supported on this kind of ${space.dbFile.spaceExternalRootId ? 'space root' : 'share'}`, HttpStatus.BAD_REQUEST)\n }\n let fileId: number\n if (createCommentDto.fileId > 0) {\n fileId = await this.getFileId(space)\n if (createCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n } else {\n fileId = await this.getFileId(space, createCommentDto.fileId)\n }\n const commentId: number = await this.commentQueries.createComment(user.id, fileId, createCommentDto.content)\n this.notify(user, fileId, space, createCommentDto.content).catch((e: Error) => this.logger.error(`${this.createComment.name} - ${e}`))\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, commentId))[0]\n }\n\n async updateComment(user: UserModel, space: SpaceEnv, updateCommentDto: CreateOrUpdateCommentDto): Promise<Comment> {\n const [comment] = await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId)\n if (!comment) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileId: number = await this.getFileId(space)\n if (updateCommentDto.fileId !== fileId || comment.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.updateComment(user.id, updateCommentDto.commentId, updateCommentDto.fileId, updateCommentDto.content))) {\n throw new HttpException('Unable to update', HttpStatus.INTERNAL_SERVER_ERROR)\n }\n return (await this.commentQueries.getComments(user.id, space.dbFile?.ownerId === user.id, null, updateCommentDto.commentId))[0]\n }\n\n async deleteComment(user: UserModel, space: SpaceEnv, deleteCommentDto: DeleteCommentDto): Promise<void> {\n const fileId: number = await this.getFileId(space)\n if (deleteCommentDto.fileId !== fileId) {\n throw new HttpException('File id mismatch', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.commentQueries.deleteComment(user.id, deleteCommentDto.commentId, fileId, space.dbFile?.ownerId === user.id))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n }\n\n private async getFileId(space: SpaceEnv, fileId?: number): Promise<number> {\n if (!(await isPathExists(space.realPath))) {\n throw new HttpException('Location not found', HttpStatus.NOT_FOUND)\n }\n const fileProps: FileProps = { ...(await getProps(space.realPath, space.dbFile.path)), id: undefined }\n if (fileId) {\n // get or create\n return this.filesQueries.getOrCreateSpaceFile(fileId, fileProps, space.dbFile)\n } else {\n // get only\n return this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n }\n }\n\n async getRecents(user: UserModel, limit: number): Promise<CommentRecent[]> {\n return this.commentQueries.getRecentsFromUser(user, limit)\n }\n\n private async notify(fromUser: UserModel, fileId: number, space: SpaceEnv, comment: string): Promise<void> {\n const members: UserMailNotification[] = await this.commentQueries.membersToNotify(fromUser.id, fileId)\n if (!members.length) {\n return\n }\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.COMMENTS,\n event: NOTIFICATION_APP_EVENT.COMMENTS,\n element: fileName(space.url),\n url: dirName(space.url)\n }\n this.notificationsManager\n .create(members, notification, {\n author: fromUser,\n currentUrl: this.contextManager.headerOriginUrl(),\n content: comment\n })\n .catch((e: Error) => this.logger.error(`${this.notify.name} - ${e}`))\n }\n}\n"],"names":["CommentsManager","getComments","user","space","fileId","getFileId","commentQueries","id","dbFile","ownerId","createComment","createCommentDto","spaceExternalRootId","shareExternalId","path","HttpException","HttpStatus","BAD_REQUEST","commentId","content","notify","catch","e","logger","error","name","updateComment","updateCommentDto","comment","NOT_FOUND","INTERNAL_SERVER_ERROR","deleteComment","deleteCommentDto","FORBIDDEN","isPathExists","realPath","fileProps","getProps","undefined","filesQueries","getOrCreateSpaceFile","getSpaceFileId","getRecents","limit","getRecentsFromUser","fromUser","members","membersToNotify","length","notification","app","NOTIFICATION_APP","COMMENTS","event","NOTIFICATION_APP_EVENT","element","fileName","url","dirName","notificationsManager","create","author","currentUrl","contextManager","headerOriginUrl","Logger"],"mappings":"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"}
@@ -63,7 +63,7 @@ describe(_commentsmanagerservice.CommentsManager.name, ()=>{
63
63
  create: jest.fn().mockResolvedValue(undefined)
64
64
  };
65
65
  contextManager = {
66
- get: jest.fn().mockReturnValue('https://app.local/path')
66
+ headerOriginUrl: jest.fn().mockReturnValue('https://app.local/path')
67
67
  };
68
68
  const module = await _testing.Test.createTestingModule({
69
69
  providers: [
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.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 { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { CommentsManager } from './comments-manager.service'\nimport { CommentsQueries } from './comments-queries.service'\n\n// Mocks of the file utilities used by the service\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n getProps: jest.fn(),\n dirName: jest.fn(),\n fileName: jest.fn()\n}))\n\ndescribe(CommentsManager.name, () => {\n let commentsManager: CommentsManager\n let contextManager: { get: jest.Mock }\n let commentQueries: {\n getComments: jest.Mock\n createComment: jest.Mock\n updateComment: jest.Mock\n deleteComment: jest.Mock\n getRecentsFromUser: jest.Mock\n membersToNotify: jest.Mock\n }\n let filesQueries: {\n getSpaceFileId: jest.Mock\n getOrCreateSpaceFile: jest.Mock\n }\n let notificationsManager: { create: jest.Mock }\n\n const user = { id: 42, email: 'john@doe.tld' } as any\n\n const makeSpace = (overrides: Partial<any> = {}) =>\n ({\n realPath: '/real/path',\n url: '/space/folder/file.txt',\n dbFile: {\n path: 'folder',\n ownerId: 42,\n spaceExternalRootId: null,\n shareExternalId: null\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n commentQueries = {\n getComments: jest.fn(),\n createComment: jest.fn(),\n updateComment: jest.fn(),\n deleteComment: jest.fn(),\n getRecentsFromUser: jest.fn(),\n membersToNotify: jest.fn()\n }\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n contextManager = {\n get: jest.fn().mockReturnValue('https://app.local/path')\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n { provide: Cache, useValue: {} },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: ContextManager, useValue: contextManager },\n { provide: CommentsManager, useClass: CommentsManager },\n { provide: CommentsQueries, useValue: commentQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: SpacesQueries, useValue: {} },\n { provide: SharesQueries, useValue: {} }\n ]\n }).compile()\n\n commentsManager = module.get<CommentsManager>(CommentsManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file.txt', path: 'folder' })\n ;(dirName as jest.Mock).mockReturnValue('/space/folder')\n ;(fileName as jest.Mock).mockReturnValue('file.txt')\n })\n\n it('should be defined', () => {\n expect(commentsManager).toBeDefined()\n })\n\n describe('getComments', () => {\n it('returns [] if no fileId', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(res).toEqual([])\n expect(filesQueries.getSpaceFileId).toHaveBeenCalledTimes(1)\n expect(commentQueries.getComments).not.toHaveBeenCalled()\n })\n\n it('returns comments if fileId is valid', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(123)\n const expected = [{ id: 1 }, { id: 2 }]\n commentQueries.getComments.mockResolvedValue(expected)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(filesQueries.getSpaceFileId).toHaveBeenCalled()\n expect(commentQueries.getComments).toHaveBeenCalledWith(42, true, 123)\n expect(res).toBe(expected)\n })\n\n it('throws NOT_FOUND if path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toThrow(HttpException)\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n })\n\n describe('createComment', () => {\n it(\"rejects on external root/share at path '.'\", async () => {\n const space = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: 'ext', shareExternalId: null }\n })\n await expect(commentsManager.createComment(user, space, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n\n const space2 = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: null, shareExternalId: 'shr' }\n })\n await expect(commentsManager.createComment(user, space2, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects BAD_REQUEST if provided fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(100)\n\n await expect(commentsManager.createComment(user, makeSpace(), { fileId: 101, content: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('uses getOrCreate when fileId < 0', async () => {\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(555)\n commentQueries.createComment.mockResolvedValue(777)\n commentQueries.getComments.mockResolvedValue([{ id: 777, fileId: 555, content: 'hello' }])\n // Force a rejection in notify() to cover the catch attached to this.notify(...) in createComment\n commentQueries.membersToNotify.mockRejectedValueOnce(new Error('members failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n const res = await commentsManager.createComment(user, makeSpace(), { fileId: -1, content: 'hello' } as any)\n // Let the microtask run the catch of createComment\n await new Promise((r) => setImmediate(r))\n\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalled()\n expect(filesQueries.getSpaceFileId).not.toHaveBeenCalled()\n expect(commentQueries.createComment).toHaveBeenCalledWith(42, 555, 'hello')\n expect(notificationsManager.create).not.toHaveBeenCalled()\n expect(res).toEqual({ id: 777, fileId: 555, content: 'hello' })\n // Verify that the catch of createComment logged the error\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('createComment'))\n loggerSpy.mockRestore()\n })\n\n it('notifies members when present', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection of notification creation to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Let the microtask execute the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n notificationsManager.create.mockClear()\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n\n const space = makeSpace()\n await commentsManager.createComment(user, space, { fileId: 10, content: 'c' } as any)\n\n expect(commentQueries.membersToNotify).toHaveBeenCalledWith(42, 10)\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n const [members, notification, data] = notificationsManager.create.mock.calls[0]\n expect(members).toEqual([{ id: 2, email: 'a@b.c' }])\n expect(notification).toMatchObject({\n app: expect.anything(),\n event: expect.anything(),\n element: 'file.txt',\n url: '/space/folder'\n })\n expect(fileName).toHaveBeenCalledWith(space.url)\n expect(dirName).toHaveBeenCalledWith(space.url)\n expect(data).toMatchObject({\n author: user,\n currentUrl: 'https://app.local/path',\n content: 'c'\n })\n })\n\n it('logs an error if notificationsManager.create rejects (covers catch in notify)', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Allow the microtask to run the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n })\n\n it('does not notify if no members', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1 }])\n commentQueries.membersToNotify.mockResolvedValue([])\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n })\n\n describe('updateComment', () => {\n it('rejects NOT_FOUND if target comment is not found', async () => {\n commentQueries.getComments.mockResolvedValue([])\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 99, fileId: 1, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND\n })\n })\n\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n commentQueries.getComments.mockResolvedValue([{ id: 50, fileId: 123 }])\n filesQueries.getSpaceFileId.mockResolvedValue(999)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 123, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects INTERNAL_SERVER_ERROR if update fails', async () => {\n commentQueries.getComments.mockResolvedValueOnce([{ id: 50, fileId: 5 }])\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(false)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR\n })\n })\n\n it('returns the comment after update', async () => {\n commentQueries.getComments\n .mockResolvedValueOnce([{ id: 50, fileId: 5 }]) // initial fetch\n .mockResolvedValueOnce([{ id: 50, fileId: 5, content: 'updated' }]) // fetch after update -> include content\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(true)\n\n const res = await commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'updated' } as any)\n\n expect(commentQueries.updateComment).toHaveBeenCalledWith(42, 50, 5, 'updated')\n // allow additional fields via toMatchObject\n expect(res).toMatchObject({ id: 50, fileId: 5, content: 'updated' })\n })\n })\n\n describe('deleteComment', () => {\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 11 } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects FORBIDDEN if deletion is denied', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(false)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('resolves when deletion succeeds', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(true)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).resolves.toBeUndefined()\n })\n })\n\n describe('getRecents', () => {\n it('delegates to commentQueries.getRecentsFromUser', async () => {\n const recents = [{ id: 1 }, { id: 2 }]\n commentQueries.getRecentsFromUser.mockResolvedValue(recents)\n\n const res = await commentsManager.getRecents(user, 5)\n\n expect(commentQueries.getRecentsFromUser).toHaveBeenCalledWith(user, 5)\n expect(res).toBe(recents)\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","getProps","dirName","fileName","describe","CommentsManager","name","commentsManager","contextManager","commentQueries","filesQueries","notificationsManager","user","id","email","makeSpace","overrides","realPath","url","dbFile","path","ownerId","spaceExternalRootId","shareExternalId","beforeAll","getComments","createComment","updateComment","deleteComment","getRecentsFromUser","membersToNotify","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","get","mockReturnValue","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","NotificationsManager","ContextManager","useClass","CommentsQueries","FilesQueries","SpacesQueries","SharesQueries","compile","beforeEach","clearAllMocks","it","expect","toBeDefined","res","toEqual","toHaveBeenCalledTimes","not","toHaveBeenCalled","expected","toHaveBeenCalledWith","toBe","rejects","toThrow","HttpException","toMatchObject","status","HttpStatus","NOT_FOUND","space","fileId","content","BAD_REQUEST","space2","mockRejectedValueOnce","Error","loggerSpy","spyOn","mockImplementation","Promise","r","setImmediate","stringContaining","mockRestore","mockClear","members","notification","data","calls","app","anything","event","element","author","currentUrl","commentId","mockResolvedValueOnce","INTERNAL_SERVER_ERROR","FORBIDDEN","resolves","toBeUndefined","recents","getRecents"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-manager.service.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 { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { dirName, fileName, getProps, isPathExists } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { CommentsManager } from './comments-manager.service'\nimport { CommentsQueries } from './comments-queries.service'\n\n// Mocks of the file utilities used by the service\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n getProps: jest.fn(),\n dirName: jest.fn(),\n fileName: jest.fn()\n}))\n\ndescribe(CommentsManager.name, () => {\n let commentsManager: CommentsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let commentQueries: {\n getComments: jest.Mock\n createComment: jest.Mock\n updateComment: jest.Mock\n deleteComment: jest.Mock\n getRecentsFromUser: jest.Mock\n membersToNotify: jest.Mock\n }\n let filesQueries: {\n getSpaceFileId: jest.Mock\n getOrCreateSpaceFile: jest.Mock\n }\n let notificationsManager: { create: jest.Mock }\n\n const user = { id: 42, email: 'john@doe.tld' } as any\n\n const makeSpace = (overrides: Partial<any> = {}) =>\n ({\n realPath: '/real/path',\n url: '/space/folder/file.txt',\n dbFile: {\n path: 'folder',\n ownerId: 42,\n spaceExternalRootId: null,\n shareExternalId: null\n },\n ...overrides\n }) as any\n\n beforeAll(async () => {\n commentQueries = {\n getComments: jest.fn(),\n createComment: jest.fn(),\n updateComment: jest.fn(),\n deleteComment: jest.fn(),\n getRecentsFromUser: jest.fn(),\n membersToNotify: jest.fn()\n }\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n contextManager = {\n headerOriginUrl: jest.fn().mockReturnValue('https://app.local/path')\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n {\n provide: DB_TOKEN_PROVIDER,\n useValue: {}\n },\n { provide: Cache, useValue: {} },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: ContextManager, useValue: contextManager },\n { provide: CommentsManager, useClass: CommentsManager },\n { provide: CommentsQueries, useValue: commentQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: SpacesQueries, useValue: {} },\n { provide: SharesQueries, useValue: {} }\n ]\n }).compile()\n\n commentsManager = module.get<CommentsManager>(CommentsManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file.txt', path: 'folder' })\n ;(dirName as jest.Mock).mockReturnValue('/space/folder')\n ;(fileName as jest.Mock).mockReturnValue('file.txt')\n })\n\n it('should be defined', () => {\n expect(commentsManager).toBeDefined()\n })\n\n describe('getComments', () => {\n it('returns [] if no fileId', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(res).toEqual([])\n expect(filesQueries.getSpaceFileId).toHaveBeenCalledTimes(1)\n expect(commentQueries.getComments).not.toHaveBeenCalled()\n })\n\n it('returns comments if fileId is valid', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(123)\n const expected = [{ id: 1 }, { id: 2 }]\n commentQueries.getComments.mockResolvedValue(expected)\n\n const res = await commentsManager.getComments(user, makeSpace())\n\n expect(filesQueries.getSpaceFileId).toHaveBeenCalled()\n expect(commentQueries.getComments).toHaveBeenCalledWith(42, true, 123)\n expect(res).toBe(expected)\n })\n\n it('throws NOT_FOUND if path does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toThrow(HttpException)\n await expect(commentsManager.getComments(user, makeSpace())).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n })\n\n describe('createComment', () => {\n it(\"rejects on external root/share at path '.'\", async () => {\n const space = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: 'ext', shareExternalId: null }\n })\n await expect(commentsManager.createComment(user, space, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n\n const space2 = makeSpace({\n dbFile: { path: '.', ownerId: 42, spaceExternalRootId: null, shareExternalId: 'shr' }\n })\n await expect(commentsManager.createComment(user, space2, { fileId: 0, content: 'Hi' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects BAD_REQUEST if provided fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(100)\n\n await expect(commentsManager.createComment(user, makeSpace(), { fileId: 101, content: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('uses getOrCreate when fileId < 0', async () => {\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(555)\n commentQueries.createComment.mockResolvedValue(777)\n commentQueries.getComments.mockResolvedValue([{ id: 777, fileId: 555, content: 'hello' }])\n // Force a rejection in notify() to cover the catch attached to this.notify(...) in createComment\n commentQueries.membersToNotify.mockRejectedValueOnce(new Error('members failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n const res = await commentsManager.createComment(user, makeSpace(), { fileId: -1, content: 'hello' } as any)\n // Let the microtask run the catch of createComment\n await new Promise((r) => setImmediate(r))\n\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalled()\n expect(filesQueries.getSpaceFileId).not.toHaveBeenCalled()\n expect(commentQueries.createComment).toHaveBeenCalledWith(42, 555, 'hello')\n expect(notificationsManager.create).not.toHaveBeenCalled()\n expect(res).toEqual({ id: 777, fileId: 555, content: 'hello' })\n // Verify that the catch of createComment logged the error\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('createComment'))\n loggerSpy.mockRestore()\n })\n\n it('notifies members when present', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection of notification creation to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Let the microtask execute the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n notificationsManager.create.mockClear()\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n\n const space = makeSpace()\n await commentsManager.createComment(user, space, { fileId: 10, content: 'c' } as any)\n\n expect(commentQueries.membersToNotify).toHaveBeenCalledWith(42, 10)\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n const [members, notification, data] = notificationsManager.create.mock.calls[0]\n expect(members).toEqual([{ id: 2, email: 'a@b.c' }])\n expect(notification).toMatchObject({\n app: expect.anything(),\n event: expect.anything(),\n element: 'file.txt',\n url: '/space/folder'\n })\n expect(fileName).toHaveBeenCalledWith(space.url)\n expect(dirName).toHaveBeenCalledWith(space.url)\n expect(data).toMatchObject({\n author: user,\n currentUrl: 'https://app.local/path',\n content: 'c'\n })\n })\n\n it('logs an error if notificationsManager.create rejects (covers catch in notify)', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1, fileId: 10, content: 'c' }])\n commentQueries.membersToNotify.mockResolvedValue([{ id: 2, email: 'a@b.c' }])\n // Force rejection to trigger the catch in notify()\n notificationsManager.create.mockRejectedValueOnce(new Error('notify failed'))\n const loggerSpy = jest.spyOn(commentsManager['logger'], 'error').mockImplementation(() => undefined as any)\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n // Allow the microtask to run the internal catch of notify()\n await new Promise((r) => setImmediate(r))\n\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n expect(loggerSpy).toHaveBeenCalledWith(expect.stringContaining('notify'))\n loggerSpy.mockRestore()\n })\n\n it('does not notify if no members', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.createComment.mockResolvedValue(1)\n commentQueries.getComments.mockResolvedValue([{ id: 1 }])\n commentQueries.membersToNotify.mockResolvedValue([])\n\n await commentsManager.createComment(user, makeSpace(), { fileId: 10, content: 'c' } as any)\n\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n })\n\n describe('updateComment', () => {\n it('rejects NOT_FOUND if target comment is not found', async () => {\n commentQueries.getComments.mockResolvedValue([])\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 99, fileId: 1, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND\n })\n })\n\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n commentQueries.getComments.mockResolvedValue([{ id: 50, fileId: 123 }])\n filesQueries.getSpaceFileId.mockResolvedValue(999)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 123, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects INTERNAL_SERVER_ERROR if update fails', async () => {\n commentQueries.getComments.mockResolvedValueOnce([{ id: 50, fileId: 5 }])\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(false)\n\n await expect(commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'z' } as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR\n })\n })\n\n it('returns the comment after update', async () => {\n commentQueries.getComments\n .mockResolvedValueOnce([{ id: 50, fileId: 5 }]) // initial fetch\n .mockResolvedValueOnce([{ id: 50, fileId: 5, content: 'updated' }]) // fetch after update -> include content\n filesQueries.getSpaceFileId.mockResolvedValue(5)\n commentQueries.updateComment.mockResolvedValue(true)\n\n const res = await commentsManager.updateComment(user, makeSpace(), { commentId: 50, fileId: 5, content: 'updated' } as any)\n\n expect(commentQueries.updateComment).toHaveBeenCalledWith(42, 50, 5, 'updated')\n // allow additional fields via toMatchObject\n expect(res).toMatchObject({ id: 50, fileId: 5, content: 'updated' })\n })\n })\n\n describe('deleteComment', () => {\n it('rejects BAD_REQUEST if fileId mismatches', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 11 } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST\n })\n })\n\n it('rejects FORBIDDEN if deletion is denied', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(false)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('resolves when deletion succeeds', async () => {\n filesQueries.getSpaceFileId.mockResolvedValue(10)\n commentQueries.deleteComment.mockResolvedValue(true)\n\n await expect(commentsManager.deleteComment(user, makeSpace(), { commentId: 1, fileId: 10 } as any)).resolves.toBeUndefined()\n })\n })\n\n describe('getRecents', () => {\n it('delegates to commentQueries.getRecentsFromUser', async () => {\n const recents = [{ id: 1 }, { id: 2 }]\n commentQueries.getRecentsFromUser.mockResolvedValue(recents)\n\n const res = await commentsManager.getRecents(user, 5)\n\n expect(commentQueries.getRecentsFromUser).toHaveBeenCalledWith(user, 5)\n expect(res).toBe(recents)\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","getProps","dirName","fileName","describe","CommentsManager","name","commentsManager","contextManager","commentQueries","filesQueries","notificationsManager","user","id","email","makeSpace","overrides","realPath","url","dbFile","path","ownerId","spaceExternalRootId","shareExternalId","beforeAll","getComments","createComment","updateComment","deleteComment","getRecentsFromUser","membersToNotify","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","headerOriginUrl","mockReturnValue","module","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","NotificationsManager","ContextManager","useClass","CommentsQueries","FilesQueries","SpacesQueries","SharesQueries","compile","get","beforeEach","clearAllMocks","it","expect","toBeDefined","res","toEqual","toHaveBeenCalledTimes","not","toHaveBeenCalled","expected","toHaveBeenCalledWith","toBe","rejects","toThrow","HttpException","toMatchObject","status","HttpStatus","NOT_FOUND","space","fileId","content","BAD_REQUEST","space2","mockRejectedValueOnce","Error","loggerSpy","spyOn","mockImplementation","Promise","r","setImmediate","stringContaining","mockRestore","mockClear","members","notification","data","calls","app","anything","event","element","author","currentUrl","commentId","mockResolvedValueOnce","INTERNAL_SERVER_ERROR","FORBIDDEN","resolves","toBeUndefined","recents","getRecents"],"mappings":"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"}
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNotNull, isNull, ne, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport { Comment } from '../schemas/comment.interface'\nimport { comments } from '../schemas/comments.schema'\n\n@Injectable()\nexport class CommentsQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries\n ) {}\n\n getComments(userId: number, isFileOwner: boolean, fromFileId?: number, fromCommentId?: number, limit: number = undefined): Promise<Comment[]> {\n let where: SQL\n if (fromFileId) {\n where = eq(comments.fileId, fromFileId)\n } else if (fromCommentId) {\n where = eq(comments.id, fromCommentId)\n limit = 1\n } else {\n throw Error('fromFileId or fromCommentId must be provided')\n }\n return this.db\n .select({\n ...getTableColumns(comments),\n author: { login: users.login, fullName: userFullNameSQL(users), email: users.email, isAuthor: sql`${users.id} = ${userId}`.mapWith(Boolean) },\n isFileOwner: sql`${+isFileOwner}`.mapWith(Boolean)\n })\n .from(comments)\n .leftJoin(users, eq(users.id, comments.userId))\n .where(where)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async createComment(userId: number, fileId: number, content: string): Promise<Comment['id']> {\n return dbGetInsertedId(await this.db.insert(comments).values({ userId: userId, fileId: fileId, content: content } as Comment))\n }\n\n async updateComment(userId: number, commentId: number, fileId: number, content: string): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .update(comments)\n .set({ content: content } as Comment)\n .where(and(eq(comments.userId, userId), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n async deleteComment(userId: number, commentId: number, fileId: number, isFileOwner: boolean): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(comments)\n .where(and(or(eq(sql`${+isFileOwner}`, 1), eq(comments.userId, userId)), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n membersToNotify(fromUserId: number, fileId: number): Promise<UserMailNotification[]> {\n /* lists the owner of the file and the users who have commented on it */\n const select: UserMailNotification | SelectedFields<any, any> = {\n id: users.id,\n email: users.email,\n language: users.language,\n notification: users.notification\n }\n const fromComments = this.db\n .select(select)\n .from(comments)\n .innerJoin(users, and(eq(users.id, comments.userId), ne(users.id, fromUserId)))\n .where(eq(comments.fileId, fileId))\n const fromFile = this.db\n .select(select)\n .from(files)\n .innerJoin(users, and(eq(users.id, files.ownerId), ne(users.id, fromUserId)))\n .where(eq(files.id, fileId))\n return union(fromComments, fromFile) as any\n }\n\n getRecentsFromShares(userId: number, shareIds: number[], limit: number) {\n const shareFile: any = alias(files, 'shareFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', '${sql.raw(SPACE_REPOSITORY.SHARES)}',\n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`0`.as('inTrash'),\n fromSpace: sql<number>`0`.as('fromSpace'),\n fromShare: sql<number>`1`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(shares)\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .leftJoin(spaces, eq(spaces.id, shareFile.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(\n files,\n or(\n // file linked to the share\n eq(files.id, shareFile.id),\n // all files with an external share id\n and(isNull(shareFile.id), eq(files.shareExternalId, shares.id)),\n // all files under the share\n and(\n isNotNull(shareFile.id),\n eq(shareFile.isDir, true),\n sql`${files.spaceId} <=> ${shareFile.spaceId}`,\n sql`${files.ownerId} <=> ${shareFile.ownerId}`,\n sql`${files.spaceExternalRootId} <=> ${shareFile.spaceExternalRootId}`,\n sql`${files.shareExternalId} <=> ${shareFile.shareExternalId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${shareFile.path} = '.', CONCAT(${shareFile.name}, '(/.*|)$'), CONCAT(${shareFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(shares.id, shareIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n getRecentsFromSpaces(userId: number, spaceIds: number[], limit: number) {\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${spacesRoots.fileId}, ${spacesRoots.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', IF (${files.inTrash} = 0, '${sql.raw(SPACE_REPOSITORY.FILES)}', '${sql.raw(SPACE_REPOSITORY.TRASH)}'), \n IF (${files.ownerId} = ${userId}, '${sql.raw(SPACE_ALIAS.PERSONAL)}', ${spaces.alias}),\n IF (${spaceRootFile.id} IS NOT NULL,\n IF (${files.id} = ${spaceRootFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias})),\n NULLIF(\n CONCAT_WS('/', \n IF (${files.spaceExternalRootId} = ${spacesRoots.id}, ${spacesRoots.alias}, NULL), \n IF (${files.path} = '.', NULL, ${files.path})\n )\n , '')\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`${files.inTrash}`.as('inTrash'),\n fromSpace: sql<number>`IF (${files.ownerId} = ${userId}, 0, 1)`.as('fromSpace'),\n fromShare: sql<number>`0`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(\n files,\n or(\n // all files from user\n eq(files.ownerId, userId),\n // all files from spaces\n eq(files.spaceId, spaces.id),\n // all files from space roots\n eq(files.id, spacesRoots.fileId),\n // all files under the space roots\n and(\n isNotNull(spaceRootFile.id),\n eq(spaceRootFile.isDir, true),\n sql`${files.ownerId} <=> ${spaceRootFile.ownerId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${spaceRootFile.path} = '.', CONCAT(${spaceRootFile.name}, '(/.*|)$'), CONCAT(${spaceRootFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(spaces.id, spaceIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async getRecentsFromUser(user: UserModel, limit = 10): Promise<CommentRecent[]> {\n const [spaceIds, shareIds] = await Promise.all([this.spacesQueries.spaceIds(user.id), this.sharesQueries.shareIds(user.id, +user.isAdmin)])\n const fromSpaces = this.getRecentsFromSpaces(user.id, spaceIds, limit * 2)\n const fromShares = this.getRecentsFromShares(user.id, shareIds, limit * 2)\n const unionAlias = union(fromSpaces, fromShares).as('unionAlias')\n return this.db.select().from(unionAlias).groupBy(unionAlias.id).orderBy(desc(unionAlias.id)).limit(limit)\n }\n}\n"],"names":["CommentsQueries","getComments","userId","isFileOwner","fromFileId","fromCommentId","limit","undefined","where","eq","comments","fileId","id","Error","db","select","getTableColumns","author","login","users","fullName","userFullNameSQL","email","isAuthor","sql","mapWith","Boolean","from","leftJoin","orderBy","desc","createComment","content","dbGetInsertedId","insert","values","updateComment","commentId","dbCheckAffectedRows","update","set","and","deleteComment","delete","or","membersToNotify","fromUserId","language","notification","fromComments","innerJoin","ne","fromFile","files","ownerId","union","getRecentsFromShares","shareIds","shareFile","alias","modifiedAt","as","file","name","shares","path","raw","SPACE_REPOSITORY","SHARES","filePathSQL","mime","inTrash","fromSpace","fromShare","spaces","spaceId","spacesRoots","isNull","shareExternalId","isNotNull","isDir","spaceExternalRootId","inArray","groupBy","getRecentsFromSpaces","spaceIds","spaceRootFile","FILES","TRASH","SPACE_ALIAS","PERSONAL","getRecentsFromUser","user","Promise","all","spacesQueries","sharesQueries","isAdmin","fromSpaces","fromShares","unionAlias"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/comments/services/comments-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, getTableColumns, inArray, isNotNull, isNull, ne, or, SelectedFields, SQL, sql } from 'drizzle-orm'\nimport { alias, union } from 'drizzle-orm/mysql-core'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { UserMailNotification } from '../../notifications/interfaces/user-mail-notification.interface'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { SharesQueries } from '../../shares/services/shares-queries.service'\nimport { SPACE_ALIAS, SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { SpacesQueries } from '../../spaces/services/spaces-queries.service'\nimport { UserModel } from '../../users/models/user.model'\nimport { userFullNameSQL, users } from '../../users/schemas/users.schema'\nimport { CommentRecent } from '../interfaces/comment-recent.interface'\nimport { Comment } from '../schemas/comment.interface'\nimport { comments } from '../schemas/comments.schema'\n\n@Injectable()\nexport class CommentsQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly spacesQueries: SpacesQueries,\n private readonly sharesQueries: SharesQueries\n ) {}\n\n getComments(userId: number, isFileOwner: boolean, fromFileId?: number, fromCommentId?: number, limit: number = undefined): Promise<Comment[]> {\n let where: SQL\n if (fromFileId) {\n where = eq(comments.fileId, fromFileId)\n } else if (fromCommentId) {\n where = eq(comments.id, fromCommentId)\n limit = 1\n } else {\n throw Error('fromFileId or fromCommentId must be provided')\n }\n return this.db\n .select({\n ...getTableColumns(comments),\n author: { login: users.login, fullName: userFullNameSQL(users), email: users.email, isAuthor: sql`${users.id} = ${userId}`.mapWith(Boolean) },\n isFileOwner: sql`${+isFileOwner}`.mapWith(Boolean)\n })\n .from(comments)\n .leftJoin(users, eq(users.id, comments.userId))\n .where(where)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async createComment(userId: number, fileId: number, content: string): Promise<Comment['id']> {\n return dbGetInsertedId(await this.db.insert(comments).values({ userId: userId, fileId: fileId, content: content } as Comment))\n }\n\n async updateComment(userId: number, commentId: number, fileId: number, content: string): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .update(comments)\n .set({ content: content } as Comment)\n .where(and(eq(comments.userId, userId), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n async deleteComment(userId: number, commentId: number, fileId: number, isFileOwner: boolean): Promise<boolean> {\n return dbCheckAffectedRows(\n await this.db\n .delete(comments)\n .where(and(or(eq(sql`${+isFileOwner}`, 1), eq(comments.userId, userId)), eq(comments.id, commentId), eq(comments.fileId, fileId)))\n .limit(1),\n 1,\n false\n )\n }\n\n membersToNotify(fromUserId: number, fileId: number): Promise<UserMailNotification[]> {\n /* lists the owner of the file and the users who have commented on it */\n const select: UserMailNotification | SelectedFields<any, any> = {\n id: users.id,\n email: users.email,\n language: users.language,\n notification: users.notification\n }\n const fromComments = this.db\n .select(select)\n .from(comments)\n .innerJoin(users, and(eq(users.id, comments.userId), ne(users.id, fromUserId)))\n .where(eq(comments.fileId, fileId))\n const fromFile = this.db\n .select(select)\n .from(files)\n .innerJoin(users, and(eq(users.id, files.ownerId), ne(users.id, fromUserId)))\n .where(eq(files.id, fileId))\n return union(fromComments, fromFile) as any\n }\n\n getRecentsFromShares(userId: number, shareIds: number[], limit: number) {\n const shareFile: any = alias(files, 'shareFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', '${sql.raw(SPACE_REPOSITORY.SHARES)}',\n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`0`.as('inTrash'),\n fromSpace: sql<number>`0`.as('fromSpace'),\n fromShare: sql<number>`1`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(shares)\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .leftJoin(spaces, eq(spaces.id, shareFile.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(\n files,\n or(\n // file linked to the share\n eq(files.id, shareFile.id),\n // all files with an external share id\n and(isNull(shareFile.id), eq(files.shareExternalId, shares.id)),\n // all files under the share\n and(\n isNotNull(shareFile.id),\n eq(shareFile.isDir, true),\n sql`${files.spaceId} <=> ${shareFile.spaceId}`,\n sql`${files.ownerId} <=> ${shareFile.ownerId}`,\n sql`${files.spaceExternalRootId} <=> ${shareFile.spaceExternalRootId}`,\n sql`${files.shareExternalId} <=> ${shareFile.shareExternalId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${shareFile.path} = '.', CONCAT(${shareFile.name}, '(/.*|)$'), CONCAT(${shareFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(shares.id, shareIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n getRecentsFromSpaces(userId: number, spaceIds: number[], limit: number) {\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: comments.id,\n content: comments.content,\n modifiedAt: comments.modifiedAt,\n author: { login: users.login, fullName: userFullNameSQL(users).as('fullName'), email: users.email },\n file: {\n name: sql<string>`IF (${files.id} = ${spacesRoots.fileId}, ${spacesRoots.name}, ${files.name})`.as('name'),\n path: sql<string>`\n CONCAT_WS('/', IF (${files.inTrash} = 0, '${sql.raw(SPACE_REPOSITORY.FILES)}', '${sql.raw(SPACE_REPOSITORY.TRASH)}'), \n IF (${files.ownerId} = ${userId}, '${sql.raw(SPACE_ALIAS.PERSONAL)}', ${spaces.alias}),\n IF (${spaceRootFile.id} IS NOT NULL,\n IF (${files.id} = ${spaceRootFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias})),\n NULLIF(\n CONCAT_WS('/', \n IF (${files.spaceExternalRootId} = ${spacesRoots.id}, ${spacesRoots.alias}, NULL), \n IF (${files.path} = '.', NULL, ${files.path})\n )\n , '')\n )\n )`.as('path'),\n mime: files.mime,\n inTrash: sql<number>`${files.inTrash}`.as('inTrash'),\n fromSpace: sql<number>`IF (${files.ownerId} = ${userId}, 0, 1)`.as('fromSpace'),\n fromShare: sql<number>`0`.as('fromShare')\n }\n } satisfies CommentRecent | SelectedFields<any, any>)\n .from(spaces)\n .leftJoin(spacesRoots, eq(spacesRoots.spaceId, spaces.id))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(\n files,\n or(\n // all files from user\n eq(files.ownerId, userId),\n // all files from spaces\n eq(files.spaceId, spaces.id),\n // all files from space roots\n eq(files.id, spacesRoots.fileId),\n // all files under the space roots\n and(\n isNotNull(spaceRootFile.id),\n eq(spaceRootFile.isDir, true),\n sql`${files.ownerId} <=> ${spaceRootFile.ownerId}`,\n sql`${files.path} REGEXP CONCAT('^', IF(${spaceRootFile.path} = '.', CONCAT(${spaceRootFile.name}, '(/.*|)$'), CONCAT(${spaceRootFile.path}, '/')))`\n )\n )\n )\n .innerJoin(comments, and(eq(comments.fileId, files.id), ne(comments.userId, userId)))\n .innerJoin(users, eq(users.id, comments.userId))\n .where(inArray(spaces.id, spaceIds))\n .groupBy(comments.id)\n .orderBy(desc(comments.id))\n .limit(limit)\n }\n\n async getRecentsFromUser(user: UserModel, limit = 10): Promise<CommentRecent[]> {\n const [spaceIds, shareIds] = await Promise.all([this.spacesQueries.spaceIds(user.id), this.sharesQueries.shareIds(user.id, +user.isAdmin)])\n const fromSpaces = this.getRecentsFromSpaces(user.id, spaceIds, limit * 2)\n const fromShares = this.getRecentsFromShares(user.id, shareIds, limit * 2)\n const unionAlias = union(fromSpaces, fromShares).as('unionAlias')\n return this.db.select().from(unionAlias).groupBy(unionAlias.id).orderBy(desc(unionAlias.id)).limit(limit)\n }\n}\n"],"names":["CommentsQueries","getComments","userId","isFileOwner","fromFileId","fromCommentId","limit","undefined","where","eq","comments","fileId","id","Error","db","select","getTableColumns","author","login","users","fullName","userFullNameSQL","email","isAuthor","sql","mapWith","Boolean","from","leftJoin","orderBy","desc","createComment","content","dbGetInsertedId","insert","values","updateComment","commentId","dbCheckAffectedRows","update","set","and","deleteComment","delete","or","membersToNotify","fromUserId","language","notification","fromComments","innerJoin","ne","fromFile","files","ownerId","union","getRecentsFromShares","shareIds","shareFile","alias","modifiedAt","as","file","name","shares","path","raw","SPACE_REPOSITORY","SHARES","filePathSQL","mime","inTrash","fromSpace","fromShare","spaces","spaceId","spacesRoots","isNull","shareExternalId","isNotNull","isDir","spaceExternalRootId","inArray","groupBy","getRecentsFromSpaces","spaceIds","spaceRootFile","FILES","TRASH","SPACE_ALIAS","PERSONAL","getRecentsFromUser","user","Promise","all","spacesQueries","sharesQueries","isAdmin","fromSpaces","fromShares","unionAlias"],"mappings":"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"}
@@ -14,6 +14,12 @@ function _export(target, all) {
14
14
  });
15
15
  }
16
16
  _export(exports, {
17
+ get CACHE_LOCK_DEFAULT_TTL () {
18
+ return CACHE_LOCK_DEFAULT_TTL;
19
+ },
20
+ get CACHE_LOCK_FILE_TTL () {
21
+ return CACHE_LOCK_FILE_TTL;
22
+ },
17
23
  get CACHE_LOCK_PREFIX () {
18
24
  return CACHE_LOCK_PREFIX;
19
25
  },
@@ -28,9 +34,12 @@ _export(exports, {
28
34
  }
29
35
  });
30
36
  const CACHE_TASK_PREFIX = 'ftask';
31
- const CACHE_TASK_TTL = 86400 // 1 day
37
+ const CACHE_TASK_TTL = 86400// one day
32
38
  ;
33
39
  const CACHE_LOCK_PREFIX = 'flock';
40
+ const CACHE_LOCK_DEFAULT_TTL = 28800// 8 hours in seconds
41
+ ;
42
+ const CACHE_LOCK_FILE_TTL = 3600;
34
43
  const CACHE_ONLY_OFFICE = 'foffice';
35
44
 
36
45
  //# sourceMappingURL=cache.js.map
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/constants/cache.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\n// cache task key = `ftask-$(userId}-${taskId}` => FileTask\nexport const CACHE_TASK_PREFIX = 'ftask'\nexport const CACHE_TASK_TTL = 86400 // 1 day\n// cache token key = `flock|token?:${uuid}|path:${path}|ownerId?:${number}|spaceId?:${number}|...props` => FileLock\nexport const CACHE_LOCK_PREFIX = 'flock'\n// cache only office = `office|${fileId}` => docKey\nexport const CACHE_ONLY_OFFICE = 'foffice'\n"],"names":["CACHE_LOCK_PREFIX","CACHE_ONLY_OFFICE","CACHE_TASK_PREFIX","CACHE_TASK_TTL"],"mappings":"AAAA;;;;CAIC,GAED,2DAA2D;;;;;;;;;;;;QAI9CA;eAAAA;;QAEAC;eAAAA;;QALAC;eAAAA;;QACAC;eAAAA;;;AADN,MAAMD,oBAAoB;AAC1B,MAAMC,iBAAiB,MAAM,QAAQ;;AAErC,MAAMH,oBAAoB;AAE1B,MAAMC,oBAAoB"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/constants/cache.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\n// cache task key = `ftask-$(userId}-${taskId}` => FileTask\nexport const CACHE_TASK_PREFIX = 'ftask' as const\nexport const CACHE_TASK_TTL = 86400 as const // one day\n// cache token key = `flock|token?:${uuid}|path:${path}|ownerId?:${number}|spaceId?:${number}|...props` => FileLock\nexport const CACHE_LOCK_PREFIX = 'flock' as const\nexport const CACHE_LOCK_DEFAULT_TTL = 28800 as const // 8 hours in seconds\nexport const CACHE_LOCK_FILE_TTL = 3600 as const\n// cache only office = `office|${fileId}` => docKey\nexport const CACHE_ONLY_OFFICE = 'foffice' as const\n"],"names":["CACHE_LOCK_DEFAULT_TTL","CACHE_LOCK_FILE_TTL","CACHE_LOCK_PREFIX","CACHE_ONLY_OFFICE","CACHE_TASK_PREFIX","CACHE_TASK_TTL"],"mappings":"AAAA;;;;CAIC,GAED,2DAA2D;;;;;;;;;;;;QAK9CA;eAAAA;;QACAC;eAAAA;;QAFAC;eAAAA;;QAIAC;eAAAA;;QAPAC;eAAAA;;QACAC;eAAAA;;;AADN,MAAMD,oBAAoB;AAC1B,MAAMC,iBAAiB,KAAe,UAAU;;AAEhD,MAAMH,oBAAoB;AAC1B,MAAMF,yBAAyB,KAAe,qBAAqB;;AACnE,MAAMC,sBAAsB;AAE5B,MAAME,oBAAoB"}
@@ -95,10 +95,6 @@ const ONLY_OFFICE_EXTENSIONS = {
95
95
  'hwpx',
96
96
  'word'
97
97
  ],
98
- [
99
- 'md',
100
- 'word'
101
- ],
102
98
  [
103
99
  'mht',
104
100
  'word'
@@ -131,10 +127,6 @@ const ONLY_OFFICE_EXTENSIONS = {
131
127
  'sxw',
132
128
  'word'
133
129
  ],
134
- [
135
- 'txt',
136
- 'word'
137
- ],
138
130
  [
139
131
  'wps',
140
132
  'word'
@@ -143,14 +135,6 @@ const ONLY_OFFICE_EXTENSIONS = {
143
135
  'wpt',
144
136
  'word'
145
137
  ],
146
- [
147
- 'xml',
148
- 'word'
149
- ],
150
- [
151
- 'md',
152
- 'word'
153
- ],
154
138
  // CELL
155
139
  [
156
140
  'csv',
@@ -382,14 +366,6 @@ const ONLY_OFFICE_EXTENSIONS = {
382
366
  'rtf',
383
367
  'word'
384
368
  ],
385
- [
386
- 'txt',
387
- 'word'
388
- ],
389
- [
390
- 'md',
391
- 'word'
392
- ],
393
369
  // CELL
394
370
  [
395
371
  'xlsb',
@@ -493,7 +469,6 @@ const ONLY_OFFICE_CONVERT_EXTENSIONS = {
493
469
  'rtf',
494
470
  'stw',
495
471
  'sxw',
496
- 'txt',
497
472
  'wps',
498
473
  'wpt',
499
474
  'xps'
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/files/constants/only-office.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 const ONLY_OFFICE_INTERNAL_URI = '/onlyoffice' // used by nginx as proxy\nexport const ONLY_OFFICE_CONTEXT = 'OnlyOfficeEnvironment'\nexport const ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME = 'token' as const\n\nexport const ONLY_OFFICE_EXTENSIONS = {\n VIEWABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dot', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['fodt', 'word'],\n ['gdoc', 'word'],\n ['htm', 'word'],\n ['html', 'word'],\n ['hwp', 'word'],\n ['hwpx', 'word'],\n ['md', 'word'],\n ['mht', 'word'],\n ['mhtml', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['pages', 'word'],\n ['rtf', 'word'],\n ['stw', 'word'],\n ['sxw', 'word'],\n ['txt', 'word'],\n ['wps', 'word'],\n ['wpt', 'word'],\n ['xml', 'word'],\n ['md', 'word'],\n\n // CELL\n ['csv', 'cell'],\n ['et', 'cell'],\n ['ett', 'cell'],\n ['fods', 'cell'],\n ['gsheet', 'cell'],\n ['numbers', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n ['sxc', 'cell'],\n ['xls', 'cell'],\n ['xlsm', 'cell'],\n ['xlsx', 'cell'],\n ['xlt', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n\n // SLIDE\n ['dps', 'slide'],\n ['dpt', 'slide'],\n ['fodp', 'slide'],\n ['gslide', 'slide'],\n ['key', 'slide'],\n ['odg', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n ['pot', 'slide'],\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['pps', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['ppt', 'slide'],\n ['pptm', 'slide'],\n ['pptx', 'slide'],\n ['sxi', 'slide'],\n\n // PDF\n ['djvu', 'pdf'],\n ['docxf', 'pdf'],\n ['oform', 'pdf'],\n ['oxps', 'pdf'],\n ['pdf', 'pdf'],\n ['xps', 'pdf'],\n\n // DIAGRAM\n ['vsdm', 'diagram'],\n ['vsdx', 'diagram'],\n ['vssm', 'diagram'],\n ['vssx', 'diagram'],\n ['vstm', 'diagram'],\n ['vstx', 'diagram']\n ]),\n\n EDITABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['html', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['rtf', 'word'],\n ['txt', 'word'],\n ['md', 'word'],\n\n // CELL\n ['xlsb', 'cell'],\n ['xlsm', 'cell'],\n ['xls', 'cell'],\n ['xlsx', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n ['csv', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n\n // SLIDE\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['pptm', 'slide'],\n ['ppt', 'slide'],\n ['pptx', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n\n // PDF\n ['pdf', 'pdf']\n ])\n}\n\nexport const ONLY_OFFICE_CONVERT_EXTENSIONS = {\n ALLOW_AUTO: new Set(['doc', 'xls', 'ppt']),\n FROM: new Set([\n 'doc',\n 'docm',\n 'docx',\n 'docxf',\n 'dotx',\n 'epub',\n 'fb2',\n 'html',\n 'mhtml',\n 'odt',\n 'ott',\n 'pdf',\n 'rtf',\n 'stw',\n 'sxw',\n 'txt',\n 'wps',\n 'wpt',\n 'xps'\n ]),\n TO: new Set(['docx', 'docxf', 'dotx', 'epub', 'fb2', 'html', 'jpg', 'odt', 'ott', 'pdf', 'png', 'rtf', 'txt'])\n}\n\nexport const ONLY_OFFICE_CONVERT_ERROR = new Map([\n [-9, 'error conversion output format'],\n [-8, 'error document VKey'],\n [-7, 'error document request'],\n [-6, 'error database'],\n [-5, 'incorrect password'],\n [-4, 'download error'],\n [-3, 'convert error'],\n [-2, 'convert error timeout'],\n [-1, 'convert unknown']\n])\n"],"names":["ONLY_OFFICE_CONTEXT","ONLY_OFFICE_CONVERT_ERROR","ONLY_OFFICE_CONVERT_EXTENSIONS","ONLY_OFFICE_EXTENSIONS","ONLY_OFFICE_INTERNAL_URI","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","VIEWABLE","Map","EDITABLE","ALLOW_AUTO","Set","FROM","TO"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/files/constants/only-office.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 const ONLY_OFFICE_INTERNAL_URI = '/onlyoffice' // used by nginx as proxy\nexport const ONLY_OFFICE_CONTEXT = 'OnlyOfficeEnvironment'\nexport const ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME = 'token' as const\n\nexport const ONLY_OFFICE_EXTENSIONS = {\n VIEWABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dot', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['fodt', 'word'],\n ['gdoc', 'word'],\n ['htm', 'word'],\n ['html', 'word'],\n ['hwp', 'word'],\n ['hwpx', 'word'],\n ['mht', 'word'],\n ['mhtml', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['pages', 'word'],\n ['rtf', 'word'],\n ['stw', 'word'],\n ['sxw', 'word'],\n ['wps', 'word'],\n ['wpt', 'word'],\n\n // CELL\n ['csv', 'cell'],\n ['et', 'cell'],\n ['ett', 'cell'],\n ['fods', 'cell'],\n ['gsheet', 'cell'],\n ['numbers', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n ['sxc', 'cell'],\n ['xls', 'cell'],\n ['xlsm', 'cell'],\n ['xlsx', 'cell'],\n ['xlt', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n\n // SLIDE\n ['dps', 'slide'],\n ['dpt', 'slide'],\n ['fodp', 'slide'],\n ['gslide', 'slide'],\n ['key', 'slide'],\n ['odg', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n ['pot', 'slide'],\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['pps', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['ppt', 'slide'],\n ['pptm', 'slide'],\n ['pptx', 'slide'],\n ['sxi', 'slide'],\n\n // PDF\n ['djvu', 'pdf'],\n ['docxf', 'pdf'],\n ['oform', 'pdf'],\n ['oxps', 'pdf'],\n ['pdf', 'pdf'],\n ['xps', 'pdf'],\n\n // DIAGRAM\n ['vsdm', 'diagram'],\n ['vsdx', 'diagram'],\n ['vssm', 'diagram'],\n ['vssx', 'diagram'],\n ['vstm', 'diagram'],\n ['vstx', 'diagram']\n ]),\n\n EDITABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['html', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['rtf', 'word'],\n\n // CELL\n ['xlsb', 'cell'],\n ['xlsm', 'cell'],\n ['xls', 'cell'],\n ['xlsx', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n ['csv', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n\n // SLIDE\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['pptm', 'slide'],\n ['ppt', 'slide'],\n ['pptx', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n\n // PDF\n ['pdf', 'pdf']\n ])\n}\n\nexport const ONLY_OFFICE_CONVERT_EXTENSIONS = {\n ALLOW_AUTO: new Set(['doc', 'xls', 'ppt']),\n FROM: new Set([\n 'doc',\n 'docm',\n 'docx',\n 'docxf',\n 'dotx',\n 'epub',\n 'fb2',\n 'html',\n 'mhtml',\n 'odt',\n 'ott',\n 'pdf',\n 'rtf',\n 'stw',\n 'sxw',\n 'wps',\n 'wpt',\n 'xps'\n ]),\n TO: new Set(['docx', 'docxf', 'dotx', 'epub', 'fb2', 'html', 'jpg', 'odt', 'ott', 'pdf', 'png', 'rtf', 'txt'])\n}\n\nexport const ONLY_OFFICE_CONVERT_ERROR = new Map([\n [-9, 'error conversion output format'],\n [-8, 'error document VKey'],\n [-7, 'error document request'],\n [-6, 'error database'],\n [-5, 'incorrect password'],\n [-4, 'download error'],\n [-3, 'convert error'],\n [-2, 'convert error timeout'],\n [-1, 'convert unknown']\n])\n"],"names":["ONLY_OFFICE_CONTEXT","ONLY_OFFICE_CONVERT_ERROR","ONLY_OFFICE_CONVERT_EXTENSIONS","ONLY_OFFICE_EXTENSIONS","ONLY_OFFICE_INTERNAL_URI","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","VIEWABLE","Map","EDITABLE","ALLOW_AUTO","Set","FROM","TO"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAGYA;eAAAA;;QAuJAC;eAAAA;;QAzBAC;eAAAA;;QA3HAC;eAAAA;;QAJAC;eAAAA;;QAEAC;eAAAA;;;AAFN,MAAMD,2BAA2B,cAAc,yBAAyB;;AACxE,MAAMJ,sBAAsB;AAC5B,MAAMK,qCAAqC;AAE3C,MAAMF,yBAAyB;IACpCG,UAAU,IAAIC,IAAI;QAChB,OAAO;QACP;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAS;SAAO;QACjB;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAS;SAAO;QACjB;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QAEf,OAAO;QACP;YAAC;YAAO;SAAO;QACf;YAAC;YAAM;SAAO;QACd;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAU;SAAO;QAClB;YAAC;YAAW;SAAO;QACnB;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAEhB,QAAQ;QACR;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAU;SAAQ;QACnB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAO;SAAQ;QAEhB,MAAM;QACN;YAAC;YAAQ;SAAM;QACf;YAAC;YAAS;SAAM;QAChB;YAAC;YAAS;SAAM;QAChB;YAAC;YAAQ;SAAM;QACf;YAAC;YAAO;SAAM;QACd;YAAC;YAAO;SAAM;QAEd,UAAU;QACV;YAAC;YAAQ;SAAU;QACnB;YAAC;YAAQ;SAAU;QACnB;YAAC;YAAQ;SAAU;QACnB;YAAC;YAAQ;SAAU;QACnB;YAAC;YAAQ;SAAU;QACnB;YAAC;YAAQ;SAAU;KACpB;IAEDC,UAAU,IAAID,IAAI;QAChB,OAAO;QACP;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QAEf,OAAO;QACP;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAQ;SAAO;QAChB;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QACf;YAAC;YAAO;SAAO;QAEf,QAAQ;QACR;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAQ;SAAQ;QACjB;YAAC;YAAO;SAAQ;QAChB;YAAC;YAAO;SAAQ;QAEhB,MAAM;QACN;YAAC;YAAO;SAAM;KACf;AACH;AAEO,MAAML,iCAAiC;IAC5CO,YAAY,IAAIC,IAAI;QAAC;QAAO;QAAO;KAAM;IACzCC,MAAM,IAAID,IAAI;QACZ;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;QACA;KACD;IACDE,IAAI,IAAIF,IAAI;QAAC;QAAQ;QAAS;QAAQ;QAAQ;QAAO;QAAQ;QAAO;QAAO;QAAO;QAAO;QAAO;QAAO;KAAM;AAC/G;AAEO,MAAMT,4BAA4B,IAAIM,IAAI;IAC/C;QAAC,CAAC;QAAG;KAAiC;IACtC;QAAC,CAAC;QAAG;KAAsB;IAC3B;QAAC,CAAC;QAAG;KAAyB;IAC9B;QAAC,CAAC;QAAG;KAAiB;IACtB;QAAC,CAAC;QAAG;KAAqB;IAC1B;QAAC,CAAC;QAAG;KAAiB;IACtB;QAAC,CAAC;QAAG;KAAgB;IACrB;QAAC,CAAC;QAAG;KAAwB;IAC7B;QAAC,CAAC;QAAG;KAAkB;CACxB"}
@@ -6,9 +6,17 @@
6
6
  Object.defineProperty(exports, "__esModule", {
7
7
  value: true
8
8
  });
9
- Object.defineProperty(exports, "FILE_OPERATION", {
10
- enumerable: true,
11
- get: function() {
9
+ function _export(target, all) {
10
+ for(var name in all)Object.defineProperty(target, name, {
11
+ enumerable: true,
12
+ get: Object.getOwnPropertyDescriptor(all, name).get
13
+ });
14
+ }
15
+ _export(exports, {
16
+ get FILE_MODE () {
17
+ return FILE_MODE;
18
+ },
19
+ get FILE_OPERATION () {
12
20
  return FILE_OPERATION;
13
21
  }
14
22
  });
@@ -23,7 +31,16 @@ var FILE_OPERATION = /*#__PURE__*/ function(FILE_OPERATION) {
23
31
  FILE_OPERATION["UPLOAD"] = "upload";
24
32
  FILE_OPERATION["TOUCH"] = "touch";
25
33
  FILE_OPERATION["THUMBNAIL"] = "thumbnail";
34
+ FILE_OPERATION["GET_SIZE"] = "getSize";
35
+ FILE_OPERATION["LOCK"] = "lock";
36
+ FILE_OPERATION["UNLOCK"] = "unlock";
37
+ FILE_OPERATION["UNLOCK_REQUEST"] = "unlockRequest";
26
38
  return FILE_OPERATION;
27
39
  }({});
40
+ var FILE_MODE = /*#__PURE__*/ function(FILE_MODE) {
41
+ FILE_MODE["VIEW"] = "view";
42
+ FILE_MODE["EDIT"] = "edit";
43
+ return FILE_MODE;
44
+ }({});
28
45
 
29
46
  //# sourceMappingURL=operations.js.map