@sync-in/server 1.4.0 → 1.5.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (229) hide show
  1. package/CHANGELOG.md +26 -0
  2. package/README.md +2 -1
  3. package/package.json +5 -5
  4. package/server/applications/comments/comments.controller.spec.js +103 -4
  5. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  6. package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
  7. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  8. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
  9. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
  10. package/server/applications/files/constants/routes.js +6 -1
  11. package/server/applications/files/constants/routes.js.map +1 -1
  12. package/server/applications/files/files-only-office.controller.js +11 -0
  13. package/server/applications/files/files-only-office.controller.js.map +1 -1
  14. package/server/applications/files/files-only-office.controller.spec.js +97 -3
  15. package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
  16. package/server/applications/files/files-tasks.controller.spec.js +91 -1
  17. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  18. package/server/applications/files/files.controller.spec.js +268 -46
  19. package/server/applications/files/files.controller.spec.js.map +1 -1
  20. package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
  21. package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
  22. package/server/applications/files/services/files-only-office-manager.service.js +5 -0
  23. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  24. package/server/applications/links/links.controller.spec.js +91 -58
  25. package/server/applications/links/links.controller.spec.js.map +1 -1
  26. package/server/applications/links/services/links-manager.service.js +4 -6
  27. package/server/applications/links/services/links-manager.service.js.map +1 -1
  28. package/server/applications/links/services/links-manager.service.spec.js +378 -14
  29. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  30. package/server/applications/links/services/links-queries.service.js +1 -1
  31. package/server/applications/links/services/links-queries.service.js.map +1 -1
  32. package/server/applications/notifications/notifications.controller.spec.js +56 -1
  33. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  34. package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
  35. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  36. package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
  37. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  38. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
  39. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
  40. package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
  41. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  42. package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
  43. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  44. package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
  45. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  46. package/server/applications/users/services/admin-users-manager.service.js +22 -24
  47. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  48. package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
  49. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  50. package/server/applications/users/services/users-manager.service.js +1 -1
  51. package/server/applications/users/services/users-manager.service.js.map +1 -1
  52. package/server/applications/users/services/users-manager.service.spec.js +938 -49
  53. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  54. package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
  55. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  56. package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
  57. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
  58. package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
  59. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  60. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
  61. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
  62. package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
  63. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  64. package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
  65. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  66. package/server/applications/webdav/webdav.controller.js +2 -2
  67. package/server/applications/webdav/webdav.controller.js.map +1 -1
  68. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  69. package/server/authentication/guards/auth-digest.guard.js +1 -2
  70. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  71. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  72. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
  73. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
  74. package/static/3rdpartylicenses.txt +26 -26
  75. package/static/assets/pdfjs/build/pdf.mjs +1177 -255
  76. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  77. package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
  78. package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
  79. package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
  80. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  81. package/static/assets/pdfjs/version +1 -1
  82. package/static/assets/pdfjs/web/debugger.css +31 -0
  83. package/static/assets/pdfjs/web/debugger.mjs +144 -2
  84. package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
  85. package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
  86. package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
  87. package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
  88. package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
  89. package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
  90. package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
  91. package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
  92. package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
  93. package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
  94. package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
  95. package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
  96. package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
  97. package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
  98. package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
  99. package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
  100. package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
  101. package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
  102. package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
  103. package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
  104. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
  105. package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
  106. package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
  107. package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
  108. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
  109. package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
  110. package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
  111. package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
  112. package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
  113. package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
  114. package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
  115. package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
  116. package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
  117. package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
  118. package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
  119. package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
  120. package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
  121. package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
  122. package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
  123. package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
  124. package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
  125. package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
  126. package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
  127. package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
  128. package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
  129. package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
  130. package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
  131. package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
  132. package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
  133. package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
  134. package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
  135. package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
  136. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
  137. package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
  138. package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
  139. package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
  140. package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
  141. package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
  142. package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
  143. package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
  144. package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
  145. package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
  146. package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
  147. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
  148. package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
  149. package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
  150. package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
  151. package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
  152. package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
  153. package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
  154. package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
  155. package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
  156. package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
  157. package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
  158. package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
  159. package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
  160. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
  161. package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
  162. package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
  163. package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
  164. package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
  165. package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
  166. package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
  167. package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
  168. package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
  169. package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
  170. package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
  171. package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
  172. package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
  173. package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
  174. package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
  175. package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
  176. package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
  177. package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
  178. package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
  179. package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
  180. package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
  181. package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
  182. package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
  183. package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
  184. package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
  185. package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
  186. package/static/assets/pdfjs/web/viewer.css +649 -120
  187. package/static/assets/pdfjs/web/viewer.html +19 -0
  188. package/static/assets/pdfjs/web/viewer.mjs +489 -38
  189. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  190. package/static/chunk-22EANI6R.js +1 -0
  191. package/static/{chunk-N2LYWNTC.js → chunk-2456KVFZ.js} +1 -1
  192. package/static/{chunk-YCINY2YI.js → chunk-2LVCLKCK.js} +1 -1
  193. package/static/{chunk-5YKWZT33.js → chunk-2V5S7DWD.js} +1 -1
  194. package/static/{chunk-3GC2BQZD.js → chunk-44YDXGNZ.js} +1 -1
  195. package/static/{chunk-W3QXNDI5.js → chunk-4LSJLWYV.js} +1 -1
  196. package/static/{chunk-T55FAU2O.js → chunk-4UT5VH7R.js} +1 -1
  197. package/static/{chunk-VMQMD36Z.js → chunk-5GOMMRRE.js} +1 -1
  198. package/static/{chunk-TXPODW5Q.js → chunk-5J4VRDKB.js} +1 -1
  199. package/static/{chunk-FQ4AFNGE.js → chunk-6PVKNZ7Q.js} +1 -1
  200. package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
  201. package/static/{chunk-X43VWRFP.js → chunk-DFQKHCDR.js} +1 -1
  202. package/static/{chunk-TDQAEVZN.js → chunk-EE2TDTY4.js} +1 -1
  203. package/static/{chunk-MOVWEZ7J.js → chunk-ESNDJ5T6.js} +1 -1
  204. package/static/{chunk-TCFKH6K6.js → chunk-GDKKLLEU.js} +1 -1
  205. package/static/{chunk-VHYIXL7R.js → chunk-GSR2MCQG.js} +1 -1
  206. package/static/{chunk-LJIGRUEF.js → chunk-HR7KS5BR.js} +1 -1
  207. package/static/chunk-HW2H3ISM.js +559 -0
  208. package/static/{chunk-HZA7R43P.js → chunk-IMB3C547.js} +1 -1
  209. package/static/{chunk-B2Y2RNFP.js → chunk-J4ALHUDX.js} +1 -1
  210. package/static/{chunk-PF4K7MVG.js → chunk-KP6LSQTK.js} +1 -1
  211. package/static/{chunk-C23BPTJZ.js → chunk-LUZCOHFN.js} +1 -1
  212. package/static/{chunk-GBCYYDCI.js → chunk-MHSCCXVL.js} +1 -1
  213. package/static/{chunk-PY3BGNJN.js → chunk-OMRQYBXV.js} +1 -1
  214. package/static/chunk-P7CTJ5BG.js +27 -0
  215. package/static/{chunk-Y2CDUS4J.js → chunk-P7PX67IR.js} +4 -4
  216. package/static/{chunk-VMUOUCEI.js → chunk-PPO7DBVO.js} +1 -1
  217. package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
  218. package/static/{chunk-WWIC7UW3.js → chunk-SLGGINMR.js} +1 -1
  219. package/static/{chunk-KZQCFEPT.js → chunk-UHD5XD3G.js} +1 -1
  220. package/static/{chunk-TNW2CGK6.js → chunk-UPYYAJCJ.js} +1 -1
  221. package/static/{chunk-6F55D74O.js → chunk-VHYPQ3D4.js} +1 -1
  222. package/static/{chunk-DGVNNICG.js → chunk-YQSDS6BO.js} +1 -1
  223. package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
  224. package/static/index.html +1 -1
  225. package/static/main-FYD34UEC.js +7 -0
  226. package/static/chunk-RSNLYAN6.js +0 -560
  227. package/static/chunk-WHMS3PJ3.js +0 -24
  228. package/static/chunk-ZZ3LHYOY.js +0 -1
  229. package/static/main-7LDKYVXO.js +0 -10
package/CHANGELOG.md CHANGED
@@ -1,4 +1,30 @@
1
1
 
2
+ ## [1.5.1](https://github.com/Sync-in/server/compare/v1.5.0...v1.5.1) (2025-09-07)
3
+
4
+
5
+ ### Bug Fixes
6
+
7
+ * **docker:** fix /app ownership for .init file ([e43f478](https://github.com/Sync-in/server/commit/e43f47873768fa24ba2e66bc1bbd90214bde5ca1))
8
+
9
+ ## [1.5.0](https://github.com/Sync-in/server/compare/v1.4.0...v1.5.0) (2025-09-07)
10
+
11
+
12
+ ### Features
13
+
14
+ * **files:** optimize document opening to avoid extra API calls ([bf57d93](https://github.com/Sync-in/server/commit/bf57d93dcaea312328db9f1f5290e46471d2f638))
15
+ * **frontend:files:** display count for multiple selected files and open sidebar pasteboard when adding files ([39feccd](https://github.com/Sync-in/server/commit/39feccd3d89f29cdc4effb2bb4c016c7c1258729))
16
+ * **frontend:spaces:** enable keyboard navigation when files are selected in list mode ([7e38ce2](https://github.com/Sync-in/server/commit/7e38ce29fbfe11b84ccd7824aea1e43ae46e0d0f))
17
+
18
+
19
+ ### Bug Fixes
20
+
21
+ * **backend:links:** increment nbAccess even when no limit is set ([d6d2e74](https://github.com/Sync-in/server/commit/d6d2e7425c16510ee9e15107a02f21d2038be89f))
22
+ * **frontend:spaces:** prevent false positives when checking external location ([f1fdd0d](https://github.com/Sync-in/server/commit/f1fdd0d4088e98f4e24f4a4c18cf6f67e3e5d0d4))
23
+
24
+ ### Performance
25
+ * **docker:** only change application data ownership ([6e88991](https://github.com/Sync-in/server/commit/6e889915fedf613030e43919e637d7888aea94a1))
26
+
27
+
2
28
  ## [1.4.0](https://github.com/Sync-in/server/compare/v1.3.9...v1.4.0) (2025-08-26)
3
29
 
4
30
 
package/README.md CHANGED
@@ -18,6 +18,7 @@ _Welcome to the official Sync-in server repository!_
18
18
  <a href="https://hub.docker.com/r/syncin/server" target="_blank"><img src="https://img.shields.io/docker/pulls/syncin/server?logo=docker&label=Docker%20Hub%20Pulls" alt="Docker pulls"/></a>
19
19
  <a href="https://www.npmjs.com/package/@sync-in/server" target="_blank"><img src="https://img.shields.io/npm/d18m/@sync-in/server.svg?logo=npm&label=NPM%20Downloads&color=cb3837" alt="NPM"/></a>
20
20
  <a href="https://discord.gg/qhJyzwaymT" target="_blank"><img src="https://img.shields.io/discord/1391081837849346088?logo=discord&label=Discord" alt="Discord"/></a>
21
+ <a href="https://deepwiki.com/Sync-in/server"><img src="https://deepwiki.com/badge.svg" alt="Ask DeepWiki"></a>
21
22
 
22
23
  The **Sync-in Server** is designed to run on your own infrastructure, it gives you **full control over your data** while offering a modern,
23
24
  intuitive interface for both internal and external users.
@@ -91,7 +92,7 @@ If you find it useful, you can:
91
92
  ## 🤝 Contributing
92
93
  Before submitting your pull request, please confirm the following:
93
94
 
94
- - ✅ I have read and followed the [contribution guide](readme/CONTRIBUTING.md).
95
+ - ✅ I have read and followed the [contribution guide](CONTRIBUTING.md).
95
96
  - ✅ I am submitting this pull request in good faith and to help improve Sync-in.
96
97
 
97
98
  ---
package/package.json CHANGED
@@ -1,6 +1,6 @@
1
1
  {
2
2
  "name": "@sync-in/server",
3
- "version": "1.4.0",
3
+ "version": "1.5.1",
4
4
  "description": "The secure, open-source platform for file storage, sharing, collaboration, and sync",
5
5
  "author": {
6
6
  "name": "Johan Legrand",
@@ -74,7 +74,7 @@
74
74
  "dependencies": {
75
75
  "@fastify/cookie": "11.0.2",
76
76
  "@fastify/helmet": "13.0.1",
77
- "@fastify/multipart": "9.0.3",
77
+ "@fastify/multipart": "9.2.1",
78
78
  "@fastify/send": "4.1.0",
79
79
  "@fastify/static": "8.2.0",
80
80
  "@knaadh/nestjs-drizzle-mysql2": "1.2.0",
@@ -105,14 +105,14 @@
105
105
  "js-yaml": "4.1.0",
106
106
  "ldapts": "8.0.9",
107
107
  "mime-types": "3.0.1",
108
- "mysql2": "3.14.3",
108
+ "mysql2": "3.14.4",
109
109
  "nestjs-pino": "4.4.0",
110
- "nodemailer": "7.0.5",
110
+ "nodemailer": "7.0.6",
111
111
  "passport-http": "0.3.0",
112
112
  "passport-jwt": "4.0.1",
113
113
  "passport-local": "1.0.0",
114
114
  "passport": "0.7.0",
115
- "pdfjs-dist": "5.4.54",
115
+ "pdfjs-dist": "5.4.149",
116
116
  "pino-pretty": "13.1.1",
117
117
  "redis": "4.7.1",
118
118
  "sax": "1.4.1",
@@ -22,7 +22,33 @@ const _commentscontroller = require("./comments.controller");
22
22
  const _commentsmanagerservice = require("./services/comments-manager.service");
23
23
  const _commentsqueriesservice = require("./services/comments-queries.service");
24
24
  describe(_commentscontroller.CommentsController.name, ()=>{
25
- let controller;
25
+ let commentsController;
26
+ let commentsManager;
27
+ const user = {
28
+ id: 'user-1'
29
+ };
30
+ const space = {
31
+ id: 'space-1'
32
+ };
33
+ const commentsSample = [
34
+ {
35
+ id: 'c1'
36
+ },
37
+ {
38
+ id: 'c2'
39
+ }
40
+ ];
41
+ const commentSample = {
42
+ id: 'c1',
43
+ text: 'hello'
44
+ };
45
+ const commentsManagerMock = {
46
+ getComments: jest.fn(),
47
+ createComment: jest.fn(),
48
+ updateComment: jest.fn(),
49
+ deleteComment: jest.fn(),
50
+ getRecents: jest.fn()
51
+ };
26
52
  beforeAll(async ()=>{
27
53
  const module = await _testing.Test.createTestingModule({
28
54
  controllers: [
@@ -42,7 +68,10 @@ describe(_commentscontroller.CommentsController.name, ()=>{
42
68
  useValue: {}
43
69
  },
44
70
  _contextmanagerservice.ContextManager,
45
- _commentsmanagerservice.CommentsManager,
71
+ {
72
+ provide: _commentsmanagerservice.CommentsManager,
73
+ useValue: commentsManagerMock
74
+ },
46
75
  _commentsqueriesservice.CommentsQueries,
47
76
  _spacesmanagerservice.SpacesManager,
48
77
  _spacesqueriesservice.SpacesQueries,
@@ -53,10 +82,80 @@ describe(_commentscontroller.CommentsController.name, ()=>{
53
82
  _linksqueriesservice.LinksQueries
54
83
  ]
55
84
  }).compile();
56
- controller = module.get(_commentscontroller.CommentsController);
85
+ commentsController = module.get(_commentscontroller.CommentsController);
86
+ commentsManager = module.get(_commentsmanagerservice.CommentsManager);
87
+ });
88
+ beforeEach(()=>{
89
+ jest.clearAllMocks();
57
90
  });
58
91
  it('should be defined', ()=>{
59
- expect(controller).toBeDefined();
92
+ expect(commentsController).toBeDefined();
93
+ });
94
+ it('getFromSpace calls CommentsManager.getComments and returns the list', async ()=>{
95
+ commentsManager.getComments.mockResolvedValueOnce(commentsSample);
96
+ const res = await commentsController.getFromSpace(user, space);
97
+ expect(commentsManager.getComments).toHaveBeenCalledTimes(1);
98
+ expect(commentsManager.getComments).toHaveBeenCalledWith(user, space);
99
+ expect(res).toEqual(commentsSample);
100
+ });
101
+ it('createFromSpace calls CommentsManager.createComment and returns the created comment', async ()=>{
102
+ const dto = {
103
+ text: 'new comment'
104
+ };
105
+ commentsManager.createComment.mockResolvedValueOnce(commentSample);
106
+ const res = await commentsController.createFromSpace(user, space, dto);
107
+ expect(commentsManager.createComment).toHaveBeenCalledTimes(1);
108
+ expect(commentsManager.createComment).toHaveBeenCalledWith(user, space, dto);
109
+ expect(res).toEqual(commentSample);
110
+ });
111
+ it('updateFromSpace calls CommentsManager.updateComment and returns the updated comment', async ()=>{
112
+ const dto = {
113
+ id: 'c1',
114
+ text: 'updated'
115
+ };
116
+ const updated = {
117
+ id: 'c1',
118
+ text: 'updated'
119
+ };
120
+ commentsManager.updateComment.mockResolvedValueOnce(updated);
121
+ const res = await commentsController.updateFromSpace(user, space, dto);
122
+ expect(commentsManager.updateComment).toHaveBeenCalledTimes(1);
123
+ expect(commentsManager.updateComment).toHaveBeenCalledWith(user, space, dto);
124
+ expect(res).toEqual(updated);
125
+ });
126
+ it('deleteFromSpace calls CommentsManager.deleteComment', async ()=>{
127
+ const dto = {
128
+ id: 'c1'
129
+ };
130
+ commentsManager.deleteComment.mockResolvedValueOnce(undefined);
131
+ await expect(commentsController.deleteFromSpace(user, space, dto)).resolves.toBeUndefined();
132
+ expect(commentsManager.deleteComment).toHaveBeenCalledTimes(1);
133
+ expect(commentsManager.deleteComment).toHaveBeenCalledWith(user, space, dto);
134
+ });
135
+ it('getRecents calls CommentsManager.getRecents with the provided limit', async ()=>{
136
+ const recents = [
137
+ {
138
+ id: 'r1'
139
+ }
140
+ ];
141
+ commentsManager.getRecents.mockResolvedValueOnce(recents);
142
+ const res = await commentsController.getRecents(user, 5);
143
+ expect(commentsManager.getRecents).toHaveBeenCalledTimes(1);
144
+ expect(commentsManager.getRecents).toHaveBeenCalledWith(user, 5);
145
+ expect(res).toEqual(recents);
146
+ });
147
+ it('getRecents uses the default limit (10) when not provided', async ()=>{
148
+ const recents = [
149
+ {
150
+ id: 'r2'
151
+ }
152
+ ];
153
+ commentsManager.getRecents.mockResolvedValueOnce(recents);
154
+ // Call with undefined to trigger the parameter default value
155
+ const res = await commentsController.getRecents(user, undefined);
156
+ expect(commentsManager.getRecents).toHaveBeenCalledTimes(1);
157
+ expect(commentsManager.getRecents).toHaveBeenCalledWith(user, 10);
158
+ expect(res).toEqual(recents);
60
159
  });
61
160
  });
62
161
 
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/comments/comments.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { 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 { LinksQueries } from '../links/services/links-queries.service'\nimport { NotificationsManager } from '../notifications/services/notifications-manager.service'\nimport { SharesManager } from '../shares/services/shares-manager.service'\nimport { SharesQueries } from '../shares/services/shares-queries.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SpacesQueries } from '../spaces/services/spaces-queries.service'\nimport { UsersQueries } from '../users/services/users-queries.service'\nimport { CommentsController } from './comments.controller'\nimport { CommentsManager } from './services/comments-manager.service'\nimport { CommentsQueries } from './services/comments-queries.service'\n\ndescribe(CommentsController.name, () => {\n let controller: CommentsController\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [CommentsController],\n providers: [\n { provide: NotificationsManager, useValue: {} },\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: Cache, useValue: {} },\n ContextManager,\n CommentsManager,\n CommentsQueries,\n SpacesManager,\n SpacesQueries,\n FilesQueries,\n SharesManager,\n SharesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n controller = module.get<CommentsController>(CommentsController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n})\n"],"names":["describe","CommentsController","name","controller","beforeAll","module","Test","createTestingModule","controllers","providers","provide","NotificationsManager","useValue","DB_TOKEN_PROVIDER","Cache","ContextManager","CommentsManager","CommentsQueries","SpacesManager","SpacesQueries","FilesQueries","SharesManager","SharesQueries","UsersQueries","LinksQueries","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;yBAEmC;8BACd;uCACS;2BACG;qCACL;qCACA;6CACQ;sCACP;sCACA;sCACA;sCACA;qCACD;oCACM;wCACH;wCACA;AAEhCA,SAASC,sCAAkB,CAACC,IAAI,EAAE;IAChC,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,aAAa;gBAACP,sCAAkB;aAAC;YACjCQ,WAAW;gBACT;oBAAEC,SAASC,iDAAoB;oBAAEC,UAAU,CAAC;gBAAE;gBAC9C;oBAAEF,SAASG,4BAAiB;oBAAED,UAAU,CAAC;gBAAE;gBAC3C;oBAAEF,SAASI,mBAAK;oBAAEF,UAAU,CAAC;gBAAE;gBAC/BG,qCAAc;gBACdC,uCAAe;gBACfC,uCAAe;gBACfC,mCAAa;gBACbC,mCAAa;gBACbC,iCAAY;gBACZC,mCAAa;gBACbC,mCAAa;gBACbC,iCAAY;gBACZC,iCAAY;aACb;QACH,GAAGC,OAAO;QAEVtB,aAAaE,OAAOqB,GAAG,CAAqBzB,sCAAkB;IAChE;IAEA0B,GAAG,qBAAqB;QACtBC,OAAOzB,YAAY0B,WAAW;IAChC;AACF"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/comments/comments.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { 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 { LinksQueries } from '../links/services/links-queries.service'\nimport { NotificationsManager } from '../notifications/services/notifications-manager.service'\nimport { SharesManager } from '../shares/services/shares-manager.service'\nimport { SharesQueries } from '../shares/services/shares-queries.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SpacesQueries } from '../spaces/services/spaces-queries.service'\nimport { UsersQueries } from '../users/services/users-queries.service'\nimport { CommentsController } from './comments.controller'\nimport { CommentsManager } from './services/comments-manager.service'\nimport { CommentsQueries } from './services/comments-queries.service'\n\ndescribe(CommentsController.name, () => {\n let commentsController: CommentsController\n let commentsManager: jest.Mocked<CommentsManager>\n\n const user: any = { id: 'user-1' }\n const space: any = { id: 'space-1' }\n\n const commentsSample = [{ id: 'c1' }, { id: 'c2' }] as any\n const commentSample = { id: 'c1', text: 'hello' } as any\n\n const commentsManagerMock: jest.Mocked<CommentsManager> = {\n getComments: jest.fn(),\n createComment: jest.fn(),\n updateComment: jest.fn(),\n deleteComment: jest.fn(),\n getRecents: jest.fn()\n } as any\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [CommentsController],\n providers: [\n { provide: NotificationsManager, useValue: {} },\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n { provide: Cache, useValue: {} },\n ContextManager,\n { provide: CommentsManager, useValue: commentsManagerMock },\n CommentsQueries,\n SpacesManager,\n SpacesQueries,\n FilesQueries,\n SharesManager,\n SharesQueries,\n UsersQueries,\n LinksQueries\n ]\n }).compile()\n\n commentsController = module.get<CommentsController>(CommentsController)\n commentsManager = module.get(CommentsManager)\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(commentsController).toBeDefined()\n })\n\n it('getFromSpace calls CommentsManager.getComments and returns the list', async () => {\n commentsManager.getComments.mockResolvedValueOnce(commentsSample)\n\n const res = await commentsController.getFromSpace(user, space)\n\n expect(commentsManager.getComments).toHaveBeenCalledTimes(1)\n expect(commentsManager.getComments).toHaveBeenCalledWith(user, space)\n expect(res).toEqual(commentsSample)\n })\n\n it('createFromSpace calls CommentsManager.createComment and returns the created comment', async () => {\n const dto: any = { text: 'new comment' }\n commentsManager.createComment.mockResolvedValueOnce(commentSample)\n\n const res = await commentsController.createFromSpace(user, space, dto)\n\n expect(commentsManager.createComment).toHaveBeenCalledTimes(1)\n expect(commentsManager.createComment).toHaveBeenCalledWith(user, space, dto)\n expect(res).toEqual(commentSample)\n })\n\n it('updateFromSpace calls CommentsManager.updateComment and returns the updated comment', async () => {\n const dto: any = { id: 'c1', text: 'updated' }\n const updated = { id: 'c1', text: 'updated' } as any\n commentsManager.updateComment.mockResolvedValueOnce(updated)\n\n const res = await commentsController.updateFromSpace(user, space, dto)\n\n expect(commentsManager.updateComment).toHaveBeenCalledTimes(1)\n expect(commentsManager.updateComment).toHaveBeenCalledWith(user, space, dto)\n expect(res).toEqual(updated)\n })\n\n it('deleteFromSpace calls CommentsManager.deleteComment', async () => {\n const dto: any = { id: 'c1' }\n commentsManager.deleteComment.mockResolvedValueOnce(undefined)\n\n await expect(commentsController.deleteFromSpace(user, space, dto)).resolves.toBeUndefined()\n\n expect(commentsManager.deleteComment).toHaveBeenCalledTimes(1)\n expect(commentsManager.deleteComment).toHaveBeenCalledWith(user, space, dto)\n })\n\n it('getRecents calls CommentsManager.getRecents with the provided limit', async () => {\n const recents = [{ id: 'r1' }] as any\n commentsManager.getRecents.mockResolvedValueOnce(recents)\n\n const res = await commentsController.getRecents(user, 5 as any)\n\n expect(commentsManager.getRecents).toHaveBeenCalledTimes(1)\n expect(commentsManager.getRecents).toHaveBeenCalledWith(user, 5)\n expect(res).toEqual(recents)\n })\n\n it('getRecents uses the default limit (10) when not provided', async () => {\n const recents = [{ id: 'r2' }] as any\n commentsManager.getRecents.mockResolvedValueOnce(recents)\n\n // Call with undefined to trigger the parameter default value\n const res = await commentsController.getRecents(user, undefined as any)\n\n expect(commentsManager.getRecents).toHaveBeenCalledTimes(1)\n expect(commentsManager.getRecents).toHaveBeenCalledWith(user, 10)\n expect(res).toEqual(recents)\n })\n})\n"],"names":["describe","CommentsController","name","commentsController","commentsManager","user","id","space","commentsSample","commentSample","text","commentsManagerMock","getComments","jest","fn","createComment","updateComment","deleteComment","getRecents","beforeAll","module","Test","createTestingModule","controllers","providers","provide","NotificationsManager","useValue","DB_TOKEN_PROVIDER","Cache","ContextManager","CommentsManager","CommentsQueries","SpacesManager","SpacesQueries","FilesQueries","SharesManager","SharesQueries","UsersQueries","LinksQueries","compile","get","beforeEach","clearAllMocks","it","expect","toBeDefined","mockResolvedValueOnce","res","getFromSpace","toHaveBeenCalledTimes","toHaveBeenCalledWith","toEqual","dto","createFromSpace","updated","updateFromSpace","undefined","deleteFromSpace","resolves","toBeUndefined","recents"],"mappings":"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"}