@sync-in/server 1.11.0 → 2.0.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 (1040) hide show
  1. package/CHANGELOG.md +37 -0
  2. package/LICENSE +1 -1
  3. package/README.md +3 -11
  4. package/environment/environment.dist.min.yaml +1 -1
  5. package/environment/environment.dist.yaml +173 -28
  6. package/package.json +17 -16
  7. package/server/app.bootstrap.js +1 -5
  8. package/server/app.bootstrap.js.map +1 -1
  9. package/server/app.constants.js +1 -5
  10. package/server/app.constants.js.map +1 -1
  11. package/server/app.e2e-spec.js +1 -5
  12. package/server/app.e2e-spec.js.map +1 -1
  13. package/server/app.functions.js +1 -5
  14. package/server/app.functions.js.map +1 -1
  15. package/server/app.module.js +1 -5
  16. package/server/app.module.js.map +1 -1
  17. package/server/app.service.js +1 -5
  18. package/server/app.service.js.map +1 -1
  19. package/server/app.service.spec.js +2 -6
  20. package/server/app.service.spec.js.map +1 -1
  21. package/server/applications/admin/admin.module.js +1 -5
  22. package/server/applications/admin/admin.module.js.map +1 -1
  23. package/server/applications/admin/constants/routes.js +1 -5
  24. package/server/applications/admin/constants/routes.js.map +1 -1
  25. package/server/applications/admin/interfaces/check-update.interfaces.js +1 -5
  26. package/server/applications/admin/interfaces/check-update.interfaces.js.map +1 -1
  27. package/server/applications/admin/services/admin-scheduler.service.js +1 -5
  28. package/server/applications/admin/services/admin-scheduler.service.js.map +1 -1
  29. package/server/applications/admin/services/admin.service.js +13 -8
  30. package/server/applications/admin/services/admin.service.js.map +1 -1
  31. package/server/applications/admin/services/admin.service.spec.js +1 -5
  32. package/server/applications/admin/services/admin.service.spec.js.map +1 -1
  33. package/server/applications/admin/utils/check-update.js +1 -5
  34. package/server/applications/admin/utils/check-update.js.map +1 -1
  35. package/server/applications/applications.config.js +1 -5
  36. package/server/applications/applications.config.js.map +1 -1
  37. package/server/applications/applications.constants.js +5 -5
  38. package/server/applications/applications.constants.js.map +1 -1
  39. package/server/applications/applications.module.js +1 -5
  40. package/server/applications/applications.module.js.map +1 -1
  41. package/server/applications/comments/comments.controller.js +1 -5
  42. package/server/applications/comments/comments.controller.js.map +1 -1
  43. package/server/applications/comments/comments.controller.spec.js +1 -5
  44. package/server/applications/comments/comments.controller.spec.js.map +1 -1
  45. package/server/applications/comments/comments.module.js +1 -5
  46. package/server/applications/comments/comments.module.js.map +1 -1
  47. package/server/applications/comments/constants/routes.js +1 -5
  48. package/server/applications/comments/constants/routes.js.map +1 -1
  49. package/server/applications/comments/dto/comment.dto.js +1 -5
  50. package/server/applications/comments/dto/comment.dto.js.map +1 -1
  51. package/server/applications/comments/interfaces/comment-recent.interface.js +1 -5
  52. package/server/applications/comments/interfaces/comment-recent.interface.js.map +1 -1
  53. package/server/applications/comments/schemas/comment.interface.js +1 -5
  54. package/server/applications/comments/schemas/comment.interface.js.map +1 -1
  55. package/server/applications/comments/schemas/comments.schema.js +1 -5
  56. package/server/applications/comments/schemas/comments.schema.js.map +1 -1
  57. package/server/applications/comments/services/comments-manager.service.js +9 -7
  58. package/server/applications/comments/services/comments-manager.service.js.map +1 -1
  59. package/server/applications/comments/services/comments-manager.service.spec.js +10 -8
  60. package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
  61. package/server/applications/comments/services/comments-queries.service.js +1 -5
  62. package/server/applications/comments/services/comments-queries.service.js.map +1 -1
  63. package/server/applications/files/adapters/files-indexer-mysql.service.js +29 -12
  64. package/server/applications/files/adapters/files-indexer-mysql.service.js.map +1 -1
  65. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +1 -5
  66. package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -1
  67. package/server/applications/files/constants/cache.js +1 -5
  68. package/server/applications/files/constants/cache.js.map +1 -1
  69. package/server/applications/files/constants/compress.js +1 -5
  70. package/server/applications/files/constants/compress.js.map +1 -1
  71. package/server/applications/files/constants/files.js +1 -5
  72. package/server/applications/files/constants/files.js.map +1 -1
  73. package/server/applications/files/constants/indexing.js +1 -5
  74. package/server/applications/files/constants/indexing.js.map +1 -1
  75. package/server/applications/files/constants/operations.js +1 -5
  76. package/server/applications/files/constants/operations.js.map +1 -1
  77. package/server/applications/files/constants/routes.js +1 -5
  78. package/server/applications/files/constants/routes.js.map +1 -1
  79. package/server/applications/files/constants/samples.js +1 -5
  80. package/server/applications/files/constants/samples.js.map +1 -1
  81. package/server/applications/files/dto/file-operations.dto.js +1 -5
  82. package/server/applications/files/dto/file-operations.dto.js.map +1 -1
  83. package/server/applications/files/events/file-task-event.js +1 -5
  84. package/server/applications/files/events/file-task-event.js.map +1 -1
  85. package/server/applications/files/files-tasks.controller.js +1 -5
  86. package/server/applications/files/files-tasks.controller.js.map +1 -1
  87. package/server/applications/files/files-tasks.controller.spec.js +1 -5
  88. package/server/applications/files/files-tasks.controller.spec.js.map +1 -1
  89. package/server/applications/files/files.config.js +1 -5
  90. package/server/applications/files/files.config.js.map +1 -1
  91. package/server/applications/files/files.controller.js +1 -5
  92. package/server/applications/files/files.controller.js.map +1 -1
  93. package/server/applications/files/files.controller.spec.js +1 -5
  94. package/server/applications/files/files.controller.spec.js.map +1 -1
  95. package/server/applications/files/files.module.js +1 -5
  96. package/server/applications/files/files.module.js.map +1 -1
  97. package/server/applications/files/interfaces/file-db-props.interface.js +1 -5
  98. package/server/applications/files/interfaces/file-db-props.interface.js.map +1 -1
  99. package/server/applications/files/interfaces/file-lock.interface.js +1 -5
  100. package/server/applications/files/interfaces/file-lock.interface.js.map +1 -1
  101. package/server/applications/files/interfaces/file-parse-index.js +1 -5
  102. package/server/applications/files/interfaces/file-parse-index.js.map +1 -1
  103. package/server/applications/files/interfaces/file-props.interface.js +1 -5
  104. package/server/applications/files/interfaces/file-props.interface.js.map +1 -1
  105. package/server/applications/files/interfaces/file-recent-location.interface.js +1 -5
  106. package/server/applications/files/interfaces/file-recent-location.interface.js.map +1 -1
  107. package/server/applications/files/interfaces/file-space.interface.js +1 -5
  108. package/server/applications/files/interfaces/file-space.interface.js.map +1 -1
  109. package/server/applications/files/interfaces/file-tree.interface.js +1 -5
  110. package/server/applications/files/interfaces/file-tree.interface.js.map +1 -1
  111. package/server/applications/files/models/file-error.js +1 -5
  112. package/server/applications/files/models/file-error.js.map +1 -1
  113. package/server/applications/files/models/file-lock-error.js +1 -5
  114. package/server/applications/files/models/file-lock-error.js.map +1 -1
  115. package/server/applications/files/models/file-task.js +1 -5
  116. package/server/applications/files/models/file-task.js.map +1 -1
  117. package/server/applications/files/models/files-indexer.js +1 -5
  118. package/server/applications/files/models/files-indexer.js.map +1 -1
  119. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js +1 -5
  120. package/server/applications/files/modules/collabora-online/collabora-online-environment.decorator.js.map +1 -1
  121. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js +21 -10
  122. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.js.map +1 -1
  123. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js +1 -5
  124. package/server/applications/files/modules/collabora-online/collabora-online-manager.service.spec.js.map +1 -1
  125. package/server/applications/files/modules/collabora-online/collabora-online.config.js +1 -5
  126. package/server/applications/files/modules/collabora-online/collabora-online.config.js.map +1 -1
  127. package/server/applications/files/modules/collabora-online/collabora-online.constants.js +1 -5
  128. package/server/applications/files/modules/collabora-online/collabora-online.constants.js.map +1 -1
  129. package/server/applications/files/modules/collabora-online/collabora-online.controller.js +1 -5
  130. package/server/applications/files/modules/collabora-online/collabora-online.controller.js.map +1 -1
  131. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js +1 -5
  132. package/server/applications/files/modules/collabora-online/collabora-online.controller.spec.js.map +1 -1
  133. package/server/applications/files/modules/collabora-online/collabora-online.dtos.js +1 -5
  134. package/server/applications/files/modules/collabora-online/collabora-online.dtos.js.map +1 -1
  135. package/server/applications/files/modules/collabora-online/collabora-online.guard.js +1 -5
  136. package/server/applications/files/modules/collabora-online/collabora-online.guard.js.map +1 -1
  137. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js +1 -5
  138. package/server/applications/files/modules/collabora-online/collabora-online.guard.spec.js.map +1 -1
  139. package/server/applications/files/modules/collabora-online/collabora-online.interface.js +1 -5
  140. package/server/applications/files/modules/collabora-online/collabora-online.interface.js.map +1 -1
  141. package/server/applications/files/modules/collabora-online/collabora-online.module.js +1 -5
  142. package/server/applications/files/modules/collabora-online/collabora-online.module.js.map +1 -1
  143. package/server/applications/files/modules/collabora-online/collabora-online.routes.js +1 -5
  144. package/server/applications/files/modules/collabora-online/collabora-online.routes.js.map +1 -1
  145. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js +1 -5
  146. package/server/applications/files/modules/collabora-online/collabora-online.strategy.js.map +1 -1
  147. package/server/applications/files/modules/collabora-online/collabora-online.utils.js +1 -5
  148. package/server/applications/files/modules/collabora-online/collabora-online.utils.js.map +1 -1
  149. package/server/applications/files/modules/file-editor-providers.interface.js +6 -0
  150. package/server/applications/files/modules/file-editor-providers.interface.js.map +1 -0
  151. package/server/applications/files/modules/only-office/only-office-environment.decorator.js +1 -5
  152. package/server/applications/files/modules/only-office/only-office-environment.decorator.js.map +1 -1
  153. package/server/applications/files/modules/only-office/only-office-manager.service.js +57 -19
  154. package/server/applications/files/modules/only-office/only-office-manager.service.js.map +1 -1
  155. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js +1 -5
  156. package/server/applications/files/modules/only-office/only-office-manager.service.spec.js.map +1 -1
  157. package/server/applications/files/modules/only-office/only-office.config.js +1 -5
  158. package/server/applications/files/modules/only-office/only-office.config.js.map +1 -1
  159. package/server/applications/files/modules/only-office/only-office.constants.js +1 -5
  160. package/server/applications/files/modules/only-office/only-office.constants.js.map +1 -1
  161. package/server/applications/files/modules/only-office/only-office.controller.js +1 -5
  162. package/server/applications/files/modules/only-office/only-office.controller.js.map +1 -1
  163. package/server/applications/files/modules/only-office/only-office.controller.spec.js +1 -5
  164. package/server/applications/files/modules/only-office/only-office.controller.spec.js.map +1 -1
  165. package/server/applications/files/modules/only-office/only-office.dtos.js +1 -5
  166. package/server/applications/files/modules/only-office/only-office.dtos.js.map +1 -1
  167. package/server/applications/files/modules/only-office/only-office.guard.js +1 -5
  168. package/server/applications/files/modules/only-office/only-office.guard.js.map +1 -1
  169. package/server/applications/files/modules/only-office/only-office.guard.spec.js +1 -5
  170. package/server/applications/files/modules/only-office/only-office.guard.spec.js.map +1 -1
  171. package/server/applications/files/modules/only-office/only-office.interface.js +1 -5
  172. package/server/applications/files/modules/only-office/only-office.interface.js.map +1 -1
  173. package/server/applications/files/modules/only-office/only-office.module.js +1 -5
  174. package/server/applications/files/modules/only-office/only-office.module.js.map +1 -1
  175. package/server/applications/files/modules/only-office/only-office.routes.js +1 -5
  176. package/server/applications/files/modules/only-office/only-office.routes.js.map +1 -1
  177. package/server/applications/files/modules/only-office/only-office.strategy.js +1 -5
  178. package/server/applications/files/modules/only-office/only-office.strategy.js.map +1 -1
  179. package/server/applications/files/schemas/file-content.interface.js +1 -5
  180. package/server/applications/files/schemas/file-content.interface.js.map +1 -1
  181. package/server/applications/files/schemas/file-recent.interface.js +1 -5
  182. package/server/applications/files/schemas/file-recent.interface.js.map +1 -1
  183. package/server/applications/files/schemas/file.interface.js +1 -5
  184. package/server/applications/files/schemas/file.interface.js.map +1 -1
  185. package/server/applications/files/schemas/files-content.schema.js +1 -5
  186. package/server/applications/files/schemas/files-content.schema.js.map +1 -1
  187. package/server/applications/files/schemas/files-recents.schema.js +1 -5
  188. package/server/applications/files/schemas/files-recents.schema.js.map +1 -1
  189. package/server/applications/files/schemas/files.schema.js +1 -5
  190. package/server/applications/files/schemas/files.schema.js.map +1 -1
  191. package/server/applications/files/services/files-content-manager.service.js +45 -16
  192. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  193. package/server/applications/files/services/files-lock-manager.service.js +53 -18
  194. package/server/applications/files/services/files-lock-manager.service.js.map +1 -1
  195. package/server/applications/files/services/files-lock-manager.service.spec.js +1 -5
  196. package/server/applications/files/services/files-lock-manager.service.spec.js.map +1 -1
  197. package/server/applications/files/services/files-manager.service.js +77 -24
  198. package/server/applications/files/services/files-manager.service.js.map +1 -1
  199. package/server/applications/files/services/files-manager.service.spec.js +1 -5
  200. package/server/applications/files/services/files-manager.service.spec.js.map +1 -1
  201. package/server/applications/files/services/files-methods.service.js +5 -6
  202. package/server/applications/files/services/files-methods.service.js.map +1 -1
  203. package/server/applications/files/services/files-methods.service.spec.js +1 -5
  204. package/server/applications/files/services/files-methods.service.spec.js.map +1 -1
  205. package/server/applications/files/services/files-parser.service.js +13 -8
  206. package/server/applications/files/services/files-parser.service.js.map +1 -1
  207. package/server/applications/files/services/files-parser.service.spec.js +1 -5
  208. package/server/applications/files/services/files-parser.service.spec.js.map +1 -1
  209. package/server/applications/files/services/files-queries.service.js +29 -12
  210. package/server/applications/files/services/files-queries.service.js.map +1 -1
  211. package/server/applications/files/services/files-recents.service.js +1 -5
  212. package/server/applications/files/services/files-recents.service.js.map +1 -1
  213. package/server/applications/files/services/files-recents.service.spec.js +1 -5
  214. package/server/applications/files/services/files-recents.service.spec.js.map +1 -1
  215. package/server/applications/files/services/files-scheduler.service.js +77 -24
  216. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  217. package/server/applications/files/services/files-search-manager.service.js +9 -7
  218. package/server/applications/files/services/files-search-manager.service.js.map +1 -1
  219. package/server/applications/files/services/files-search-manager.service.spec.js +1 -5
  220. package/server/applications/files/services/files-search-manager.service.spec.js.map +1 -1
  221. package/server/applications/files/services/files-tasks-manager.service.js +77 -24
  222. package/server/applications/files/services/files-tasks-manager.service.js.map +1 -1
  223. package/server/applications/files/services/files-tasks-manager.service.spec.js +1 -5
  224. package/server/applications/files/services/files-tasks-manager.service.spec.js.map +1 -1
  225. package/server/applications/files/utils/doc-textify/adapters/excel.js +1 -5
  226. package/server/applications/files/utils/doc-textify/adapters/excel.js.map +1 -1
  227. package/server/applications/files/utils/doc-textify/adapters/html.js +1 -5
  228. package/server/applications/files/utils/doc-textify/adapters/html.js.map +1 -1
  229. package/server/applications/files/utils/doc-textify/adapters/open-office.js +1 -5
  230. package/server/applications/files/utils/doc-textify/adapters/open-office.js.map +1 -1
  231. package/server/applications/files/utils/doc-textify/adapters/pdf.js +1 -5
  232. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  233. package/server/applications/files/utils/doc-textify/adapters/power-point.js +1 -5
  234. package/server/applications/files/utils/doc-textify/adapters/power-point.js.map +1 -1
  235. package/server/applications/files/utils/doc-textify/adapters/text.js +1 -5
  236. package/server/applications/files/utils/doc-textify/adapters/text.js.map +1 -1
  237. package/server/applications/files/utils/doc-textify/adapters/word.js +1 -5
  238. package/server/applications/files/utils/doc-textify/adapters/word.js.map +1 -1
  239. package/server/applications/files/utils/doc-textify/doc-textify.js +1 -5
  240. package/server/applications/files/utils/doc-textify/doc-textify.js.map +1 -1
  241. package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js +1 -5
  242. package/server/applications/files/utils/doc-textify/interfaces/doc-textify.interfaces.js.map +1 -1
  243. package/server/applications/files/utils/doc-textify/utils/clean.js +1 -5
  244. package/server/applications/files/utils/doc-textify/utils/clean.js.map +1 -1
  245. package/server/applications/files/utils/files-search.js +1 -5
  246. package/server/applications/files/utils/files-search.js.map +1 -1
  247. package/server/applications/files/utils/files-tree.js +1 -5
  248. package/server/applications/files/utils/files-tree.js.map +1 -1
  249. package/server/applications/files/utils/files.js +1 -5
  250. package/server/applications/files/utils/files.js.map +1 -1
  251. package/server/applications/files/utils/send-file.js +1 -5
  252. package/server/applications/files/utils/send-file.js.map +1 -1
  253. package/server/applications/files/utils/unzip-file.js +1 -5
  254. package/server/applications/files/utils/unzip-file.js.map +1 -1
  255. package/server/applications/files/utils/url-file.js +1 -5
  256. package/server/applications/files/utils/url-file.js.map +1 -1
  257. package/server/applications/links/constants/cache.js +1 -5
  258. package/server/applications/links/constants/cache.js.map +1 -1
  259. package/server/applications/links/constants/links.js +1 -5
  260. package/server/applications/links/constants/links.js.map +1 -1
  261. package/server/applications/links/constants/routes.js +1 -5
  262. package/server/applications/links/constants/routes.js.map +1 -1
  263. package/server/applications/links/dto/create-or-update-link.dto.js +1 -5
  264. package/server/applications/links/dto/create-or-update-link.dto.js.map +1 -1
  265. package/server/applications/links/interfaces/link-guest.interface.js +1 -5
  266. package/server/applications/links/interfaces/link-guest.interface.js.map +1 -1
  267. package/server/applications/links/interfaces/link-space.interface.js +1 -5
  268. package/server/applications/links/interfaces/link-space.interface.js.map +1 -1
  269. package/server/applications/links/links.controller.js +1 -5
  270. package/server/applications/links/links.controller.js.map +1 -1
  271. package/server/applications/links/links.controller.spec.js +1 -5
  272. package/server/applications/links/links.controller.spec.js.map +1 -1
  273. package/server/applications/links/schemas/link.interface.js +1 -5
  274. package/server/applications/links/schemas/link.interface.js.map +1 -1
  275. package/server/applications/links/schemas/links.schema.js +1 -5
  276. package/server/applications/links/schemas/links.schema.js.map +1 -1
  277. package/server/applications/links/services/links-manager.service.js +55 -20
  278. package/server/applications/links/services/links-manager.service.js.map +1 -1
  279. package/server/applications/links/services/links-manager.service.spec.js +3 -7
  280. package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
  281. package/server/applications/links/services/links-queries.service.js +1 -5
  282. package/server/applications/links/services/links-queries.service.js.map +1 -1
  283. package/server/applications/notifications/constants/notifications.js +1 -5
  284. package/server/applications/notifications/constants/notifications.js.map +1 -1
  285. package/server/applications/notifications/constants/routes.js +1 -5
  286. package/server/applications/notifications/constants/routes.js.map +1 -1
  287. package/server/applications/notifications/constants/websocket.js +1 -5
  288. package/server/applications/notifications/constants/websocket.js.map +1 -1
  289. package/server/applications/notifications/i18n/de.js +1 -9
  290. package/server/applications/notifications/i18n/de.js.map +1 -1
  291. package/server/applications/notifications/i18n/es.js +1 -5
  292. package/server/applications/notifications/i18n/es.js.map +1 -1
  293. package/server/applications/notifications/i18n/fr.js +1 -5
  294. package/server/applications/notifications/i18n/fr.js.map +1 -1
  295. package/server/applications/notifications/i18n/hi.js +1 -5
  296. package/server/applications/notifications/i18n/hi.js.map +1 -1
  297. package/server/applications/notifications/i18n/index.js +1 -5
  298. package/server/applications/notifications/i18n/index.js.map +1 -1
  299. package/server/applications/notifications/i18n/it.js +1 -5
  300. package/server/applications/notifications/i18n/it.js.map +1 -1
  301. package/server/applications/notifications/i18n/ja.js +1 -5
  302. package/server/applications/notifications/i18n/ja.js.map +1 -1
  303. package/server/applications/notifications/i18n/ko.js +1 -5
  304. package/server/applications/notifications/i18n/ko.js.map +1 -1
  305. package/server/applications/notifications/i18n/pl.js +1 -5
  306. package/server/applications/notifications/i18n/pl.js.map +1 -1
  307. package/server/applications/notifications/i18n/pt.js +1 -5
  308. package/server/applications/notifications/i18n/pt.js.map +1 -1
  309. package/server/applications/notifications/i18n/pt_br.js +1 -5
  310. package/server/applications/notifications/i18n/pt_br.js.map +1 -1
  311. package/server/applications/notifications/i18n/ru.js +1 -5
  312. package/server/applications/notifications/i18n/ru.js.map +1 -1
  313. package/server/applications/notifications/i18n/tr.js +1 -5
  314. package/server/applications/notifications/i18n/tr.js.map +1 -1
  315. package/server/applications/notifications/i18n/zh.js +1 -5
  316. package/server/applications/notifications/i18n/zh.js.map +1 -1
  317. package/server/applications/notifications/interfaces/notification-properties.interface.js +1 -5
  318. package/server/applications/notifications/interfaces/notification-properties.interface.js.map +1 -1
  319. package/server/applications/notifications/interfaces/user-mail-notification.interface.js +1 -5
  320. package/server/applications/notifications/interfaces/user-mail-notification.interface.js.map +1 -1
  321. package/server/applications/notifications/mails/models.js +1 -5
  322. package/server/applications/notifications/mails/models.js.map +1 -1
  323. package/server/applications/notifications/mails/templates.js +1 -5
  324. package/server/applications/notifications/mails/templates.js.map +1 -1
  325. package/server/applications/notifications/mails/urls.js +1 -5
  326. package/server/applications/notifications/mails/urls.js.map +1 -1
  327. package/server/applications/notifications/notifications.controller.js +1 -5
  328. package/server/applications/notifications/notifications.controller.js.map +1 -1
  329. package/server/applications/notifications/notifications.controller.spec.js +1 -5
  330. package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
  331. package/server/applications/notifications/notifications.gateway.js +1 -5
  332. package/server/applications/notifications/notifications.gateway.js.map +1 -1
  333. package/server/applications/notifications/notifications.module.js +1 -5
  334. package/server/applications/notifications/notifications.module.js.map +1 -1
  335. package/server/applications/notifications/schemas/notification.interface.js +1 -5
  336. package/server/applications/notifications/schemas/notification.interface.js.map +1 -1
  337. package/server/applications/notifications/schemas/notifications.schema.js +1 -5
  338. package/server/applications/notifications/schemas/notifications.schema.js.map +1 -1
  339. package/server/applications/notifications/services/notifications-manager.service.js +25 -11
  340. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  341. package/server/applications/notifications/services/notifications-manager.service.spec.js +20 -11
  342. package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
  343. package/server/applications/notifications/services/notifications-queries.service.js +1 -5
  344. package/server/applications/notifications/services/notifications-queries.service.js.map +1 -1
  345. package/server/applications/shares/constants/routes.js +1 -5
  346. package/server/applications/shares/constants/routes.js.map +1 -1
  347. package/server/applications/shares/constants/shares.js +1 -5
  348. package/server/applications/shares/constants/shares.js.map +1 -1
  349. package/server/applications/shares/dto/create-or-update-share.dto.js +1 -5
  350. package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
  351. package/server/applications/shares/interfaces/share-child.interface.js +1 -5
  352. package/server/applications/shares/interfaces/share-child.interface.js.map +1 -1
  353. package/server/applications/shares/interfaces/share-env.interface.js +1 -5
  354. package/server/applications/shares/interfaces/share-env.interface.js.map +1 -1
  355. package/server/applications/shares/interfaces/share-file.interface.js +1 -5
  356. package/server/applications/shares/interfaces/share-file.interface.js.map +1 -1
  357. package/server/applications/shares/interfaces/share-link.interface.js +1 -5
  358. package/server/applications/shares/interfaces/share-link.interface.js.map +1 -1
  359. package/server/applications/shares/interfaces/share-props.interface.js +1 -5
  360. package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
  361. package/server/applications/shares/models/share-child.model.js +1 -5
  362. package/server/applications/shares/models/share-child.model.js.map +1 -1
  363. package/server/applications/shares/schemas/share-members.interface.js +1 -5
  364. package/server/applications/shares/schemas/share-members.interface.js.map +1 -1
  365. package/server/applications/shares/schemas/share.interface.js +1 -5
  366. package/server/applications/shares/schemas/share.interface.js.map +1 -1
  367. package/server/applications/shares/schemas/shares-members.schema.js +1 -5
  368. package/server/applications/shares/schemas/shares-members.schema.js.map +1 -1
  369. package/server/applications/shares/schemas/shares.schema.js +1 -5
  370. package/server/applications/shares/schemas/shares.schema.js.map +1 -1
  371. package/server/applications/shares/services/shares-manager.service.js +214 -68
  372. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  373. package/server/applications/shares/services/shares-manager.service.spec.js +1 -5
  374. package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
  375. package/server/applications/shares/services/shares-queries.service.js +49 -17
  376. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  377. package/server/applications/shares/shares.controller.js +1 -5
  378. package/server/applications/shares/shares.controller.js.map +1 -1
  379. package/server/applications/shares/shares.controller.spec.js +1 -5
  380. package/server/applications/shares/shares.controller.spec.js.map +1 -1
  381. package/server/applications/shares/shares.module.js +1 -5
  382. package/server/applications/shares/shares.module.js.map +1 -1
  383. package/server/applications/spaces/constants/cache.js +1 -5
  384. package/server/applications/spaces/constants/cache.js.map +1 -1
  385. package/server/applications/spaces/constants/routes.js +1 -5
  386. package/server/applications/spaces/constants/routes.js.map +1 -1
  387. package/server/applications/spaces/constants/spaces.js +1 -5
  388. package/server/applications/spaces/constants/spaces.js.map +1 -1
  389. package/server/applications/spaces/decorators/space-override-permission.decorator.js +1 -5
  390. package/server/applications/spaces/decorators/space-override-permission.decorator.js.map +1 -1
  391. package/server/applications/spaces/decorators/space-skip-guard.decorator.js +1 -5
  392. package/server/applications/spaces/decorators/space-skip-guard.decorator.js.map +1 -1
  393. package/server/applications/spaces/decorators/space-skip-permissions.decorator.js +1 -5
  394. package/server/applications/spaces/decorators/space-skip-permissions.decorator.js.map +1 -1
  395. package/server/applications/spaces/decorators/space.decorator.js +1 -5
  396. package/server/applications/spaces/decorators/space.decorator.js.map +1 -1
  397. package/server/applications/spaces/dto/create-or-update-space.dto.js +1 -5
  398. package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
  399. package/server/applications/spaces/dto/delete-space.dto.js +1 -5
  400. package/server/applications/spaces/dto/delete-space.dto.js.map +1 -1
  401. package/server/applications/spaces/dto/search-space.dto.js +1 -5
  402. package/server/applications/spaces/dto/search-space.dto.js.map +1 -1
  403. package/server/applications/spaces/dto/space-roots.dto.js +1 -5
  404. package/server/applications/spaces/dto/space-roots.dto.js.map +1 -1
  405. package/server/applications/spaces/guards/space.guard.js +17 -9
  406. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  407. package/server/applications/spaces/guards/space.guard.spec.js +1 -5
  408. package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
  409. package/server/applications/spaces/interfaces/space-diff.interface.js +1 -5
  410. package/server/applications/spaces/interfaces/space-diff.interface.js.map +1 -1
  411. package/server/applications/spaces/interfaces/space-files.interface.js +1 -5
  412. package/server/applications/spaces/interfaces/space-files.interface.js.map +1 -1
  413. package/server/applications/spaces/interfaces/space-request.interface.js +1 -5
  414. package/server/applications/spaces/interfaces/space-request.interface.js.map +1 -1
  415. package/server/applications/spaces/interfaces/space-trash.interface.js +1 -5
  416. package/server/applications/spaces/interfaces/space-trash.interface.js.map +1 -1
  417. package/server/applications/spaces/models/space-env.model.js +1 -5
  418. package/server/applications/spaces/models/space-env.model.js.map +1 -1
  419. package/server/applications/spaces/models/space-props.model.js +1 -5
  420. package/server/applications/spaces/models/space-props.model.js.map +1 -1
  421. package/server/applications/spaces/models/space-root-props.model.js +1 -5
  422. package/server/applications/spaces/models/space-root-props.model.js.map +1 -1
  423. package/server/applications/spaces/models/space.model.js +1 -5
  424. package/server/applications/spaces/models/space.model.js.map +1 -1
  425. package/server/applications/spaces/schemas/space-members.interface.js +1 -5
  426. package/server/applications/spaces/schemas/space-members.interface.js.map +1 -1
  427. package/server/applications/spaces/schemas/space-root.interface.js +1 -5
  428. package/server/applications/spaces/schemas/space-root.interface.js.map +1 -1
  429. package/server/applications/spaces/schemas/space.interface.js +1 -5
  430. package/server/applications/spaces/schemas/space.interface.js.map +1 -1
  431. package/server/applications/spaces/schemas/spaces-members.schema.js +1 -5
  432. package/server/applications/spaces/schemas/spaces-members.schema.js.map +1 -1
  433. package/server/applications/spaces/schemas/spaces-roots.schema.js +1 -5
  434. package/server/applications/spaces/schemas/spaces-roots.schema.js.map +1 -1
  435. package/server/applications/spaces/schemas/spaces.schema.js +1 -5
  436. package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
  437. package/server/applications/spaces/services/spaces-browser.service.js +77 -24
  438. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  439. package/server/applications/spaces/services/spaces-browser.service.spec.js +1 -5
  440. package/server/applications/spaces/services/spaces-browser.service.spec.js.map +1 -1
  441. package/server/applications/spaces/services/spaces-manager.service.js +193 -53
  442. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  443. package/server/applications/spaces/services/spaces-manager.service.spec.js +1 -5
  444. package/server/applications/spaces/services/spaces-manager.service.spec.js.map +1 -1
  445. package/server/applications/spaces/services/spaces-queries.service.js +65 -21
  446. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  447. package/server/applications/spaces/services/spaces-scheduler.service.js +49 -17
  448. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  449. package/server/applications/spaces/spaces.controller.js +1 -5
  450. package/server/applications/spaces/spaces.controller.js.map +1 -1
  451. package/server/applications/spaces/spaces.controller.spec.js +1 -5
  452. package/server/applications/spaces/spaces.controller.spec.js.map +1 -1
  453. package/server/applications/spaces/spaces.module.js +1 -5
  454. package/server/applications/spaces/spaces.module.js.map +1 -1
  455. package/server/applications/spaces/utils/paths.js +1 -5
  456. package/server/applications/spaces/utils/paths.js.map +1 -1
  457. package/server/applications/spaces/utils/permissions.js +1 -5
  458. package/server/applications/spaces/utils/permissions.js.map +1 -1
  459. package/server/applications/spaces/utils/routes.js +1 -5
  460. package/server/applications/spaces/utils/routes.js.map +1 -1
  461. package/server/applications/sync/constants/auth.js +1 -5
  462. package/server/applications/sync/constants/auth.js.map +1 -1
  463. package/server/applications/sync/constants/routes.js +6 -5
  464. package/server/applications/sync/constants/routes.js.map +1 -1
  465. package/server/applications/sync/constants/store.js +1 -9
  466. package/server/applications/sync/constants/store.js.map +1 -1
  467. package/server/applications/sync/constants/sync.js +2 -6
  468. package/server/applications/sync/constants/sync.js.map +1 -1
  469. package/server/applications/sync/decorators/sync-context.decorator.js +1 -5
  470. package/server/applications/sync/decorators/sync-context.decorator.js.map +1 -1
  471. package/server/applications/sync/decorators/sync-environment.decorator.js +1 -5
  472. package/server/applications/sync/decorators/sync-environment.decorator.js.map +1 -1
  473. package/server/applications/sync/dtos/sync-client-auth.dto.js +12 -8
  474. package/server/applications/sync/dtos/sync-client-auth.dto.js.map +1 -1
  475. package/server/applications/sync/dtos/sync-client-info.dto.js +49 -0
  476. package/server/applications/sync/dtos/sync-client-info.dto.js.map +1 -0
  477. package/server/applications/sync/dtos/sync-client-registration.dto.js +34 -11
  478. package/server/applications/sync/dtos/sync-client-registration.dto.js.map +1 -1
  479. package/server/applications/sync/dtos/sync-operations.dto.js +1 -5
  480. package/server/applications/sync/dtos/sync-operations.dto.js.map +1 -1
  481. package/server/applications/sync/dtos/sync-path.dto.js +1 -5
  482. package/server/applications/sync/dtos/sync-path.dto.js.map +1 -1
  483. package/server/applications/sync/dtos/sync-upload.dto.js +1 -5
  484. package/server/applications/sync/dtos/sync-upload.dto.js.map +1 -1
  485. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js +1 -5
  486. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.js.map +1 -1
  487. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +1 -5
  488. package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -1
  489. package/server/applications/sync/interfaces/store-manifest.interface.js +1 -5
  490. package/server/applications/sync/interfaces/store-manifest.interface.js.map +1 -1
  491. package/server/applications/sync/interfaces/sync-client-auth.interface.js +1 -25
  492. package/server/applications/sync/interfaces/sync-client-auth.interface.js.map +1 -1
  493. package/server/applications/sync/interfaces/sync-client-paths.interface.js +1 -5
  494. package/server/applications/sync/interfaces/sync-client-paths.interface.js.map +1 -1
  495. package/server/applications/sync/interfaces/sync-client.interface.js +1 -5
  496. package/server/applications/sync/interfaces/sync-client.interface.js.map +1 -1
  497. package/server/applications/sync/interfaces/sync-diff.interface.js +1 -5
  498. package/server/applications/sync/interfaces/sync-diff.interface.js.map +1 -1
  499. package/server/applications/sync/interfaces/sync-path.interface.js +1 -5
  500. package/server/applications/sync/interfaces/sync-path.interface.js.map +1 -1
  501. package/server/applications/sync/schemas/sync-client.interface.js +1 -5
  502. package/server/applications/sync/schemas/sync-client.interface.js.map +1 -1
  503. package/server/applications/sync/schemas/sync-clients.schema.js +1 -5
  504. package/server/applications/sync/schemas/sync-clients.schema.js.map +1 -1
  505. package/server/applications/sync/schemas/sync-path.interface.js +1 -5
  506. package/server/applications/sync/schemas/sync-path.interface.js.map +1 -1
  507. package/server/applications/sync/schemas/sync-paths.schema.js +1 -5
  508. package/server/applications/sync/schemas/sync-paths.schema.js.map +1 -1
  509. package/server/applications/sync/services/sync-clients-manager.service.js +108 -44
  510. package/server/applications/sync/services/sync-clients-manager.service.js.map +1 -1
  511. package/server/applications/sync/services/sync-clients-manager.service.spec.js +14 -17
  512. package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
  513. package/server/applications/sync/services/sync-manager.service.js +29 -12
  514. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  515. package/server/applications/sync/services/sync-manager.service.spec.js +1 -5
  516. package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
  517. package/server/applications/sync/services/sync-paths-manager.service.js +27 -17
  518. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  519. package/server/applications/sync/services/sync-paths-manager.service.spec.js +11 -15
  520. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  521. package/server/applications/sync/services/sync-queries.service.js +1 -5
  522. package/server/applications/sync/services/sync-queries.service.js.map +1 -1
  523. package/server/applications/sync/sync.config.js +1 -5
  524. package/server/applications/sync/sync.config.js.map +1 -1
  525. package/server/applications/sync/sync.controller.js +21 -6
  526. package/server/applications/sync/sync.controller.js.map +1 -1
  527. package/server/applications/sync/sync.controller.spec.js +1 -5
  528. package/server/applications/sync/sync.controller.spec.js.map +1 -1
  529. package/server/applications/sync/sync.module.js +1 -5
  530. package/server/applications/sync/sync.module.js.map +1 -1
  531. package/server/applications/sync/utils/functions.js +1 -5
  532. package/server/applications/sync/utils/functions.js.map +1 -1
  533. package/server/applications/sync/utils/normalizedMap.js +1 -5
  534. package/server/applications/sync/utils/normalizedMap.js.map +1 -1
  535. package/server/applications/sync/utils/routes.js +1 -5
  536. package/server/applications/sync/utils/routes.js.map +1 -1
  537. package/server/applications/users/admin-users.controller.js +2 -6
  538. package/server/applications/users/admin-users.controller.js.map +1 -1
  539. package/server/applications/users/admin-users.controller.spec.js +6 -10
  540. package/server/applications/users/admin-users.controller.spec.js.map +1 -1
  541. package/server/applications/users/constants/group.js +1 -5
  542. package/server/applications/users/constants/group.js.map +1 -1
  543. package/server/applications/users/constants/member.js +1 -5
  544. package/server/applications/users/constants/member.js.map +1 -1
  545. package/server/applications/users/constants/routes.js +1 -5
  546. package/server/applications/users/constants/routes.js.map +1 -1
  547. package/server/applications/users/constants/user.js +1 -5
  548. package/server/applications/users/constants/user.js.map +1 -1
  549. package/server/applications/users/constants/websocket.js +1 -5
  550. package/server/applications/users/constants/websocket.js.map +1 -1
  551. package/server/applications/users/decorators/permissions.decorator.js +1 -5
  552. package/server/applications/users/decorators/permissions.decorator.js.map +1 -1
  553. package/server/applications/users/decorators/roles.decorator.js +1 -5
  554. package/server/applications/users/decorators/roles.decorator.js.map +1 -1
  555. package/server/applications/users/decorators/user.decorator.js +1 -5
  556. package/server/applications/users/decorators/user.decorator.js.map +1 -1
  557. package/server/applications/users/dto/create-or-update-group.dto.js +1 -5
  558. package/server/applications/users/dto/create-or-update-group.dto.js.map +1 -1
  559. package/server/applications/users/dto/create-or-update-user.dto.js +1 -5
  560. package/server/applications/users/dto/create-or-update-user.dto.js.map +1 -1
  561. package/server/applications/users/dto/delete-user.dto.js +1 -5
  562. package/server/applications/users/dto/delete-user.dto.js.map +1 -1
  563. package/server/applications/users/dto/search-members.dto.js +1 -5
  564. package/server/applications/users/dto/search-members.dto.js.map +1 -1
  565. package/server/applications/users/dto/user-properties.dto.js +1 -5
  566. package/server/applications/users/dto/user-properties.dto.js.map +1 -1
  567. package/server/applications/users/guards/permissions.guard.js +1 -5
  568. package/server/applications/users/guards/permissions.guard.js.map +1 -1
  569. package/server/applications/users/guards/permissions.guard.spec.js +1 -5
  570. package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
  571. package/server/applications/users/guards/roles.guard.js +1 -5
  572. package/server/applications/users/guards/roles.guard.js.map +1 -1
  573. package/server/applications/users/guards/roles.guard.spec.js +1 -5
  574. package/server/applications/users/guards/roles.guard.spec.js.map +1 -1
  575. package/server/applications/users/interfaces/admin-group.interface.js +1 -5
  576. package/server/applications/users/interfaces/admin-group.interface.js.map +1 -1
  577. package/server/applications/users/interfaces/admin-user.interface.js +1 -5
  578. package/server/applications/users/interfaces/admin-user.interface.js.map +1 -1
  579. package/server/applications/users/interfaces/group-browse.interface.js +1 -5
  580. package/server/applications/users/interfaces/group-browse.interface.js.map +1 -1
  581. package/server/applications/users/interfaces/group-member.js +1 -5
  582. package/server/applications/users/interfaces/group-member.js.map +1 -1
  583. package/server/applications/users/interfaces/guest-user.interface.js +1 -5
  584. package/server/applications/users/interfaces/guest-user.interface.js.map +1 -1
  585. package/server/applications/users/interfaces/member.interface.js +1 -5
  586. package/server/applications/users/interfaces/member.interface.js.map +1 -1
  587. package/server/applications/users/interfaces/owner.interface.js +1 -5
  588. package/server/applications/users/interfaces/owner.interface.js.map +1 -1
  589. package/server/applications/users/interfaces/user-secrets.interface.js +1 -5
  590. package/server/applications/users/interfaces/user-secrets.interface.js.map +1 -1
  591. package/server/applications/users/interfaces/websocket.interface.js +1 -5
  592. package/server/applications/users/interfaces/websocket.interface.js.map +1 -1
  593. package/server/applications/users/models/user.model.js +1 -5
  594. package/server/applications/users/models/user.model.js.map +1 -1
  595. package/server/applications/users/schemas/group.interface.js +1 -5
  596. package/server/applications/users/schemas/group.interface.js.map +1 -1
  597. package/server/applications/users/schemas/groups.schema.js +1 -5
  598. package/server/applications/users/schemas/groups.schema.js.map +1 -1
  599. package/server/applications/users/schemas/user-group.interface.js +1 -5
  600. package/server/applications/users/schemas/user-group.interface.js.map +1 -1
  601. package/server/applications/users/schemas/user.interface.js +1 -5
  602. package/server/applications/users/schemas/user.interface.js.map +1 -1
  603. package/server/applications/users/schemas/users-groups.schema.js +1 -5
  604. package/server/applications/users/schemas/users-groups.schema.js.map +1 -1
  605. package/server/applications/users/schemas/users-guests.schema.js +1 -5
  606. package/server/applications/users/schemas/users-guests.schema.js.map +1 -1
  607. package/server/applications/users/schemas/users.schema.js +1 -5
  608. package/server/applications/users/schemas/users.schema.js.map +1 -1
  609. package/server/applications/users/services/admin-users-manager.service.js +67 -23
  610. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  611. package/server/applications/users/services/admin-users-manager.service.spec.js +3 -7
  612. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  613. package/server/applications/users/services/admin-users-queries.service.js +65 -21
  614. package/server/applications/users/services/admin-users-queries.service.js.map +1 -1
  615. package/server/applications/users/services/users-manager.service.js +81 -25
  616. package/server/applications/users/services/users-manager.service.js.map +1 -1
  617. package/server/applications/users/services/users-manager.service.spec.js +14 -12
  618. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  619. package/server/applications/users/services/users-queries.service.js +49 -17
  620. package/server/applications/users/services/users-queries.service.js.map +1 -1
  621. package/server/applications/users/users.controller.js +2 -6
  622. package/server/applications/users/users.controller.js.map +1 -1
  623. package/server/applications/users/users.controller.spec.js +5 -9
  624. package/server/applications/users/users.controller.spec.js.map +1 -1
  625. package/server/applications/users/users.e2e-spec.js +3 -7
  626. package/server/applications/users/users.e2e-spec.js.map +1 -1
  627. package/server/applications/users/users.gateway.js +29 -12
  628. package/server/applications/users/users.gateway.js.map +1 -1
  629. package/server/applications/users/users.gateway.spec.js +1 -5
  630. package/server/applications/users/users.gateway.spec.js.map +1 -1
  631. package/server/applications/users/users.module.js +1 -5
  632. package/server/applications/users/users.module.js.map +1 -1
  633. package/server/applications/users/utils/avatar.js +1 -5
  634. package/server/applications/users/utils/avatar.js.map +1 -1
  635. package/server/applications/users/utils/test.js +1 -5
  636. package/server/applications/users/utils/test.js.map +1 -1
  637. package/server/applications/webdav/constants/routes.js +1 -5
  638. package/server/applications/webdav/constants/routes.js.map +1 -1
  639. package/server/applications/webdav/constants/webdav.js +1 -5
  640. package/server/applications/webdav/constants/webdav.js.map +1 -1
  641. package/server/applications/webdav/decorators/if-header.decorator.js +1 -5
  642. package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
  643. package/server/applications/webdav/decorators/webdav-context.decorator.js +1 -5
  644. package/server/applications/webdav/decorators/webdav-context.decorator.js.map +1 -1
  645. package/server/applications/webdav/filters/webdav.filter.js +1 -5
  646. package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
  647. package/server/applications/webdav/filters/webdav.filter.spec.js +1 -5
  648. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
  649. package/server/applications/webdav/guards/webdav-protocol.guard.js +54 -20
  650. package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
  651. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +54 -0
  652. package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -1
  653. package/server/applications/webdav/interfaces/if-header.interface.js +1 -5
  654. package/server/applications/webdav/interfaces/if-header.interface.js.map +1 -1
  655. package/server/applications/webdav/interfaces/webdav.interface.js +1 -5
  656. package/server/applications/webdav/interfaces/webdav.interface.js.map +1 -1
  657. package/server/applications/webdav/models/webdav-file.model.js +1 -5
  658. package/server/applications/webdav/models/webdav-file.model.js.map +1 -1
  659. package/server/applications/webdav/services/webdav-methods.service.js +74 -26
  660. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  661. package/server/applications/webdav/services/webdav-methods.service.spec.js +15 -18
  662. package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
  663. package/server/applications/webdav/services/webdav-spaces.service.js +17 -9
  664. package/server/applications/webdav/services/webdav-spaces.service.js.map +1 -1
  665. package/server/applications/webdav/services/webdav-spaces.service.spec.js +1 -5
  666. package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
  667. package/server/applications/webdav/utils/bootstrap.js +1 -5
  668. package/server/applications/webdav/utils/bootstrap.js.map +1 -1
  669. package/server/applications/webdav/utils/if-header.js +1 -5
  670. package/server/applications/webdav/utils/if-header.js.map +1 -1
  671. package/server/applications/webdav/utils/routes.js +1 -5
  672. package/server/applications/webdav/utils/routes.js.map +1 -1
  673. package/server/applications/webdav/utils/webdav.js +1 -5
  674. package/server/applications/webdav/utils/webdav.js.map +1 -1
  675. package/server/applications/webdav/utils/xml.js +1 -5
  676. package/server/applications/webdav/utils/xml.js.map +1 -1
  677. package/server/applications/webdav/webdav.controller.js +1 -5
  678. package/server/applications/webdav/webdav.controller.js.map +1 -1
  679. package/server/applications/webdav/webdav.controller.spec.js +1 -5
  680. package/server/applications/webdav/webdav.controller.spec.js.map +1 -1
  681. package/server/applications/webdav/webdav.e2e-spec.js +1 -5
  682. package/server/applications/webdav/webdav.e2e-spec.js.map +1 -1
  683. package/server/applications/webdav/webdav.module.js +1 -5
  684. package/server/applications/webdav/webdav.module.js.map +1 -1
  685. package/server/authentication/auth.config.js +23 -123
  686. package/server/authentication/auth.config.js.map +1 -1
  687. package/server/authentication/auth.controller.js +27 -21
  688. package/server/authentication/auth.controller.js.map +1 -1
  689. package/server/authentication/auth.controller.spec.js +6 -10
  690. package/server/authentication/auth.controller.spec.js.map +1 -1
  691. package/server/authentication/auth.e2e-spec.js +1 -5
  692. package/server/authentication/auth.e2e-spec.js.map +1 -1
  693. package/server/authentication/auth.module.js +17 -20
  694. package/server/authentication/auth.module.js.map +1 -1
  695. package/server/authentication/{services/auth-manager.service.js → auth.service.js} +41 -18
  696. package/server/authentication/auth.service.js.map +1 -0
  697. package/server/authentication/{services/auth-manager.service.spec.js → auth.service.spec.js} +6 -10
  698. package/server/authentication/auth.service.spec.js.map +1 -0
  699. package/server/authentication/constants/auth.js +1 -5
  700. package/server/authentication/constants/auth.js.map +1 -1
  701. package/server/authentication/constants/routes.js +41 -30
  702. package/server/authentication/constants/routes.js.map +1 -1
  703. package/server/authentication/constants/scope.js +2 -5
  704. package/server/authentication/constants/scope.js.map +1 -1
  705. package/server/authentication/decorators/auth-token-optional.decorator.js +1 -5
  706. package/server/authentication/decorators/auth-token-optional.decorator.js.map +1 -1
  707. package/server/authentication/decorators/auth-token-skip.decorator.js +1 -5
  708. package/server/authentication/decorators/auth-token-skip.decorator.js.map +1 -1
  709. package/server/authentication/dto/login-response.dto.js +1 -10
  710. package/server/authentication/dto/login-response.dto.js.map +1 -1
  711. package/server/authentication/dto/token-response.dto.js +1 -5
  712. package/server/authentication/dto/token-response.dto.js.map +1 -1
  713. package/server/authentication/guards/auth-anonymous.guard.js +1 -5
  714. package/server/authentication/guards/auth-anonymous.guard.js.map +1 -1
  715. package/server/authentication/guards/auth-anonymous.guard.spec.js +1 -5
  716. package/server/authentication/guards/auth-anonymous.guard.spec.js.map +1 -1
  717. package/server/authentication/guards/auth-anonymous.strategy.js +1 -5
  718. package/server/authentication/guards/auth-anonymous.strategy.js.map +1 -1
  719. package/server/authentication/guards/auth-basic.guard.js +1 -5
  720. package/server/authentication/guards/auth-basic.guard.js.map +1 -1
  721. package/server/authentication/guards/auth-basic.guard.spec.js +13 -14
  722. package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
  723. package/server/authentication/guards/auth-basic.strategy.js +10 -11
  724. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  725. package/server/authentication/guards/auth-digest.guard.js +1 -5
  726. package/server/authentication/guards/auth-digest.guard.js.map +1 -1
  727. package/server/authentication/guards/auth-digest.strategy.js +1 -5
  728. package/server/authentication/guards/auth-digest.strategy.js.map +1 -1
  729. package/server/authentication/guards/auth-local.guard.js +1 -5
  730. package/server/authentication/guards/auth-local.guard.js.map +1 -1
  731. package/server/authentication/guards/auth-local.guard.spec.js +9 -13
  732. package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
  733. package/server/authentication/guards/auth-local.strategy.js +6 -10
  734. package/server/authentication/guards/auth-local.strategy.js.map +1 -1
  735. package/server/authentication/guards/auth-token-access.guard.js +1 -5
  736. package/server/authentication/guards/auth-token-access.guard.js.map +1 -1
  737. package/server/authentication/guards/auth-token-access.guard.spec.js +3 -7
  738. package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
  739. package/server/authentication/guards/auth-token-access.strategy.js +3 -7
  740. package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
  741. package/server/authentication/guards/auth-token-refresh.guard.js +1 -5
  742. package/server/authentication/guards/auth-token-refresh.guard.js.map +1 -1
  743. package/server/authentication/guards/auth-token-refresh.guard.spec.js +3 -7
  744. package/server/authentication/guards/auth-token-refresh.guard.spec.js.map +1 -1
  745. package/server/authentication/guards/auth-token-refresh.strategy.js +3 -7
  746. package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
  747. package/server/authentication/guards/implementations/http-basic.strategy.js +1 -5
  748. package/server/authentication/guards/implementations/http-basic.strategy.js.map +1 -1
  749. package/server/authentication/guards/implementations/http-digest.strategy.js +1 -5
  750. package/server/authentication/guards/implementations/http-digest.strategy.js.map +1 -1
  751. package/server/authentication/interfaces/auth-request.interface.js +1 -5
  752. package/server/authentication/interfaces/auth-request.interface.js.map +1 -1
  753. package/server/authentication/interfaces/jwt-payload.interface.js +1 -5
  754. package/server/authentication/interfaces/jwt-payload.interface.js.map +1 -1
  755. package/server/authentication/interfaces/token.interface.js +1 -5
  756. package/server/authentication/interfaces/token.interface.js.map +1 -1
  757. package/server/authentication/providers/auth-providers.constants.js +18 -0
  758. package/server/authentication/providers/auth-providers.constants.js.map +1 -0
  759. package/server/authentication/providers/auth-providers.models.js +14 -0
  760. package/server/authentication/providers/auth-providers.models.js.map +1 -0
  761. package/server/authentication/providers/auth-providers.utils.js +42 -0
  762. package/server/authentication/providers/auth-providers.utils.js.map +1 -0
  763. package/server/authentication/providers/ldap/auth-ldap.config.js +143 -0
  764. package/server/authentication/providers/ldap/auth-ldap.config.js.map +1 -0
  765. package/server/authentication/{constants/auth-ldap.js → providers/ldap/auth-ldap.constants.js} +12 -6
  766. package/server/authentication/providers/ldap/auth-ldap.constants.js.map +1 -0
  767. package/server/authentication/providers/ldap/auth-provider-ldap.service.js +506 -0
  768. package/server/authentication/providers/ldap/auth-provider-ldap.service.js.map +1 -0
  769. package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js +674 -0
  770. package/server/authentication/providers/ldap/auth-provider-ldap.service.spec.js.map +1 -0
  771. package/server/authentication/{services/auth-methods/auth-method-database.service.js → providers/mysql/auth-provider-mysql.service.js} +16 -14
  772. package/server/authentication/providers/mysql/auth-provider-mysql.service.js.map +1 -0
  773. package/server/authentication/{services/auth-methods/auth-method-database.service.spec.js → providers/mysql/auth-provider-mysql.service.spec.js} +15 -19
  774. package/server/authentication/providers/mysql/auth-provider-mysql.service.spec.js.map +1 -0
  775. package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js +30 -0
  776. package/server/authentication/providers/oidc/auth-oidc-desktop.constants.js.map +1 -0
  777. package/server/authentication/providers/oidc/auth-oidc.config.js +149 -0
  778. package/server/authentication/providers/oidc/auth-oidc.config.js.map +1 -0
  779. package/server/authentication/providers/oidc/auth-oidc.constants.js +39 -0
  780. package/server/authentication/providers/oidc/auth-oidc.constants.js.map +1 -0
  781. package/server/authentication/providers/oidc/auth-oidc.controller.js +83 -0
  782. package/server/authentication/providers/oidc/auth-oidc.controller.js.map +1 -0
  783. package/server/authentication/providers/oidc/auth-oidc.interfaces.js +6 -0
  784. package/server/authentication/providers/oidc/auth-oidc.interfaces.js.map +1 -0
  785. package/server/authentication/providers/oidc/auth-provider-oidc.module.js +36 -0
  786. package/server/authentication/providers/oidc/auth-provider-oidc.module.js.map +1 -0
  787. package/server/authentication/providers/oidc/auth-provider-oidc.service.js +373 -0
  788. package/server/authentication/providers/oidc/auth-provider-oidc.service.js.map +1 -0
  789. package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js +270 -0
  790. package/server/authentication/providers/oidc/auth-provider-oidc.service.spec.js.map +1 -0
  791. package/server/authentication/{services/auth-methods/auth-method-two-fa.service.js → providers/two-fa/auth-provider-two-fa.service.js} +56 -38
  792. package/server/authentication/providers/two-fa/auth-provider-two-fa.service.js.map +1 -0
  793. package/server/authentication/{services/auth-methods/auth-method-two-fa.service.spec.js → providers/two-fa/auth-provider-two-fa.service.spec.js} +6 -10
  794. package/server/authentication/providers/two-fa/auth-provider-two-fa.service.spec.js.map +1 -0
  795. package/server/authentication/{guards → providers/two-fa}/auth-two-fa-guard.js +10 -14
  796. package/server/authentication/providers/two-fa/auth-two-fa-guard.js.map +1 -0
  797. package/server/authentication/providers/two-fa/auth-two-fa.config.js +57 -0
  798. package/server/authentication/providers/two-fa/auth-two-fa.config.js.map +1 -0
  799. package/server/authentication/{dto/two-fa-verify.dto.js → providers/two-fa/auth-two-fa.dtos.js} +8 -6
  800. package/server/authentication/providers/two-fa/auth-two-fa.dtos.js.map +1 -0
  801. package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js +6 -0
  802. package/server/authentication/providers/two-fa/auth-two-fa.interfaces.js.map +1 -0
  803. package/server/authentication/utils/crypt-secret.js +1 -5
  804. package/server/authentication/utils/crypt-secret.js.map +1 -1
  805. package/server/common/constants.js +1 -5
  806. package/server/common/constants.js.map +1 -1
  807. package/server/common/decorators.js +1 -5
  808. package/server/common/decorators.js.map +1 -1
  809. package/server/common/functions.js +25 -9
  810. package/server/common/functions.js.map +1 -1
  811. package/server/common/i18n.js +1 -5
  812. package/server/common/i18n.js.map +1 -1
  813. package/server/common/image.js +1 -5
  814. package/server/common/image.js.map +1 -1
  815. package/server/common/interfaces.js +1 -5
  816. package/server/common/interfaces.js.map +1 -1
  817. package/server/common/qrcode.js +1 -5
  818. package/server/common/qrcode.js.map +1 -1
  819. package/server/common/shared.js +6 -6
  820. package/server/common/shared.js.map +1 -1
  821. package/server/configuration/config.constants.js +1 -5
  822. package/server/configuration/config.constants.js.map +1 -1
  823. package/server/configuration/config.environment.js +2 -6
  824. package/server/configuration/config.environment.js.map +1 -1
  825. package/server/configuration/config.interfaces.js +1 -5
  826. package/server/configuration/config.interfaces.js.map +1 -1
  827. package/server/configuration/config.loader.js +1 -5
  828. package/server/configuration/config.loader.js.map +1 -1
  829. package/server/configuration/config.logger.js +4 -8
  830. package/server/configuration/config.logger.js.map +1 -1
  831. package/server/configuration/config.validation.js +7 -5
  832. package/server/configuration/config.validation.js.map +1 -1
  833. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +9 -7
  834. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  835. package/server/infrastructure/cache/adapters/redis-cache.adapter.js +1 -5
  836. package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
  837. package/server/infrastructure/cache/cache.config.js +1 -5
  838. package/server/infrastructure/cache/cache.config.js.map +1 -1
  839. package/server/infrastructure/cache/cache.decorator.js +9 -7
  840. package/server/infrastructure/cache/cache.decorator.js.map +1 -1
  841. package/server/infrastructure/cache/cache.e2e-spec.js +1 -5
  842. package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
  843. package/server/infrastructure/cache/cache.module.js +1 -5
  844. package/server/infrastructure/cache/cache.module.js.map +1 -1
  845. package/server/infrastructure/cache/schemas/mysql-cache.interface.js +1 -5
  846. package/server/infrastructure/cache/schemas/mysql-cache.interface.js.map +1 -1
  847. package/server/infrastructure/cache/schemas/mysql-cache.schema.js +1 -5
  848. package/server/infrastructure/cache/schemas/mysql-cache.schema.js.map +1 -1
  849. package/server/infrastructure/cache/services/cache.service.js +1 -5
  850. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  851. package/server/infrastructure/context/context.module.js +1 -5
  852. package/server/infrastructure/context/context.module.js.map +1 -1
  853. package/server/infrastructure/context/interceptors/context.interceptor.js +1 -5
  854. package/server/infrastructure/context/interceptors/context.interceptor.js.map +1 -1
  855. package/server/infrastructure/context/interceptors/context.interceptor.spec.js +2 -6
  856. package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -1
  857. package/server/infrastructure/context/interfaces/context-store.interface.js +1 -5
  858. package/server/infrastructure/context/interfaces/context-store.interface.js.map +1 -1
  859. package/server/infrastructure/context/services/context-manager.service.js +1 -5
  860. package/server/infrastructure/context/services/context-manager.service.js.map +1 -1
  861. package/server/infrastructure/context/services/context-manager.service.spec.js +1 -5
  862. package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -1
  863. package/server/infrastructure/database/columns.js +1 -5
  864. package/server/infrastructure/database/columns.js.map +1 -1
  865. package/server/infrastructure/database/configuration.js +1 -5
  866. package/server/infrastructure/database/configuration.js.map +1 -1
  867. package/server/infrastructure/database/constants.js +2 -6
  868. package/server/infrastructure/database/constants.js.map +1 -1
  869. package/server/infrastructure/database/database.config.js +1 -5
  870. package/server/infrastructure/database/database.config.js.map +1 -1
  871. package/server/infrastructure/database/database.logger.js +1 -5
  872. package/server/infrastructure/database/database.logger.js.map +1 -1
  873. package/server/infrastructure/database/database.module.js +1 -5
  874. package/server/infrastructure/database/database.module.js.map +1 -1
  875. package/server/infrastructure/database/interfaces/database.interface.js +1 -5
  876. package/server/infrastructure/database/interfaces/database.interface.js.map +1 -1
  877. package/server/infrastructure/database/schema.js +1 -5
  878. package/server/infrastructure/database/schema.js.map +1 -1
  879. package/server/infrastructure/database/scripts/create-user.js +1 -5
  880. package/server/infrastructure/database/scripts/create-user.js.map +1 -1
  881. package/server/infrastructure/database/scripts/db.js +1 -5
  882. package/server/infrastructure/database/scripts/db.js.map +1 -1
  883. package/server/infrastructure/database/scripts/seed/main.js +1 -5
  884. package/server/infrastructure/database/scripts/seed/main.js.map +1 -1
  885. package/server/infrastructure/database/scripts/seed/usersgroups.js +1 -5
  886. package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
  887. package/server/infrastructure/database/utils.js +1 -5
  888. package/server/infrastructure/database/utils.js.map +1 -1
  889. package/server/infrastructure/mailer/interfaces/mail.interface.js +1 -5
  890. package/server/infrastructure/mailer/interfaces/mail.interface.js.map +1 -1
  891. package/server/infrastructure/mailer/mailer.config.js +1 -5
  892. package/server/infrastructure/mailer/mailer.config.js.map +1 -1
  893. package/server/infrastructure/mailer/mailer.module.js +1 -5
  894. package/server/infrastructure/mailer/mailer.module.js.map +1 -1
  895. package/server/infrastructure/mailer/mailer.service.js +1 -5
  896. package/server/infrastructure/mailer/mailer.service.js.map +1 -1
  897. package/server/infrastructure/mailer/mailer.service.spec.js +2 -6
  898. package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -1
  899. package/server/infrastructure/scheduler/scheduler.constants.js +1 -5
  900. package/server/infrastructure/scheduler/scheduler.constants.js.map +1 -1
  901. package/server/infrastructure/scheduler/scheduler.module.js +1 -5
  902. package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
  903. package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -5
  904. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  905. package/server/infrastructure/websocket/adapters/redis.adapter.js +1 -5
  906. package/server/infrastructure/websocket/adapters/redis.adapter.js.map +1 -1
  907. package/server/infrastructure/websocket/adapters/web-socket.adapter.js +1 -5
  908. package/server/infrastructure/websocket/adapters/web-socket.adapter.js.map +1 -1
  909. package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js +1 -5
  910. package/server/infrastructure/websocket/decorators/web-socket-user.decorator.js.map +1 -1
  911. package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js +1 -5
  912. package/server/infrastructure/websocket/interfaces/auth-socket-io.interface.js.map +1 -1
  913. package/server/infrastructure/websocket/utils.js +1 -5
  914. package/server/infrastructure/websocket/utils.js.map +1 -1
  915. package/server/infrastructure/websocket/web-socket.config.js +1 -5
  916. package/server/infrastructure/websocket/web-socket.config.js.map +1 -1
  917. package/server/main.js +5 -0
  918. package/server/main.js.map +1 -1
  919. package/static/assets/pdfjs/build/pdf.mjs +724 -745
  920. package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
  921. package/static/assets/pdfjs/build/pdf.sandbox.mjs +2 -2
  922. package/static/assets/pdfjs/build/pdf.worker.mjs +706 -193
  923. package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
  924. package/static/assets/pdfjs/version +1 -1
  925. package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +5 -5
  926. package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +1 -0
  927. package/static/assets/pdfjs/web/locale/fur/viewer.ftl +5 -0
  928. package/static/assets/pdfjs/web/locale/kk/viewer.ftl +28 -0
  929. package/static/assets/pdfjs/web/locale/ml/viewer.ftl +4 -0
  930. package/static/assets/pdfjs/web/locale/ru/viewer.ftl +3 -3
  931. package/static/assets/pdfjs/web/viewer.css +207 -65
  932. package/static/assets/pdfjs/web/viewer.html +11 -10
  933. package/static/assets/pdfjs/web/viewer.mjs +850 -270
  934. package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
  935. package/static/assets/pdfjs/web/wasm/LICENSE_JBIG2 +196 -0
  936. package/static/assets/pdfjs/web/wasm/LICENSE_PDFJS_JBIG2 +13 -0
  937. package/static/assets/pdfjs/web/wasm/jbig2.wasm +0 -0
  938. package/static/chunk-22TZP6HW.js +1 -0
  939. package/static/{chunk-G7TLKY5X.js → chunk-27ATUHBH.js} +1 -1
  940. package/static/{chunk-CQOQXVYG.js → chunk-2CKLZ3FM.js} +1 -1
  941. package/static/{chunk-FVFOX6OP.js → chunk-2QZPX7LO.js} +1 -1
  942. package/static/{chunk-32AVRWC3.js → chunk-2R6IBBPZ.js} +1 -1
  943. package/static/{chunk-76JDXKD7.js → chunk-4FIGEBNL.js} +1 -1
  944. package/static/{chunk-ACCGBDUZ.js → chunk-4P3JABAP.js} +4 -4
  945. package/static/chunk-5CZOSAMZ.js +1 -0
  946. package/static/{chunk-2PDTP6N4.js → chunk-677WUBCT.js} +1 -1
  947. package/static/{chunk-K5VO5XTG.js → chunk-74CAHBFM.js} +1 -1
  948. package/static/{chunk-WTWGBCFO.js → chunk-7GWW6MJO.js} +1 -1
  949. package/static/{chunk-JXZOYX4N.js → chunk-A4UGPSWX.js} +1 -1
  950. package/static/{chunk-44D7RWET.js → chunk-AHO37FKW.js} +1 -1
  951. package/static/{chunk-WB2DECOA.js → chunk-AQCXMKP3.js} +1 -1
  952. package/static/chunk-B6PDYCRO.js +3 -0
  953. package/static/{chunk-JVGN5V5E.js → chunk-CU76ATCF.js} +1 -1
  954. package/static/{chunk-Q5K4ZUHK.js → chunk-CWYHOPOP.js} +1 -1
  955. package/static/{chunk-IOX3ANJR.js → chunk-E5WI5725.js} +1 -1
  956. package/static/{chunk-NUG54Y65.js → chunk-FC5HTKVM.js} +1 -1
  957. package/static/{chunk-LRK6RNPR.js → chunk-FOSM7EYI.js} +1 -1
  958. package/static/{chunk-B4UP2EQM.js → chunk-GAZO25PI.js} +1 -1
  959. package/static/{chunk-3WBCGTYW.js → chunk-GB7ABR5N.js} +1 -1
  960. package/static/{chunk-XFZ37WVK.js → chunk-GEHFKZQ5.js} +1 -1
  961. package/static/{chunk-4CQLN5HL.js → chunk-GQFMWVFD.js} +1 -1
  962. package/static/{chunk-YBEH442D.js → chunk-GVNTC564.js} +1 -1
  963. package/static/{chunk-WO6GBHBZ.js → chunk-HGL3NYP2.js} +2 -2
  964. package/static/{chunk-IAWRRL6J.js → chunk-HLIWPWRA.js} +1 -1
  965. package/static/{chunk-6LHJBXUE.js → chunk-HNYB3M4S.js} +1 -1
  966. package/static/{chunk-5WTIUYFF.js → chunk-HUXAUQMN.js} +1 -1
  967. package/static/{chunk-VBH3Y2M5.js → chunk-I2XA6PPK.js} +1 -1
  968. package/static/{chunk-I3XI72AV.js → chunk-ISV3BO6R.js} +1 -1
  969. package/static/{chunk-P7X53PEP.js → chunk-JV3AGU5B.js} +1 -1
  970. package/static/{chunk-ZFAXICUH.js → chunk-K25E7YGG.js} +1 -1
  971. package/static/{chunk-CAD3RHAY.js → chunk-K46PUTZB.js} +1 -1
  972. package/static/{chunk-GYFLVCFN.js → chunk-KERFLJ56.js} +1 -7
  973. package/static/{chunk-WSTGWBVW.js → chunk-KJD3KFF3.js} +1 -1
  974. package/static/{chunk-R4P4NBUL.js → chunk-KPKSI23S.js} +1 -1
  975. package/static/{chunk-M7IFVC5D.js → chunk-KZS7CTNR.js} +1 -1
  976. package/static/{chunk-P2IJCGWD.js → chunk-L5IHUVXL.js} +1 -1
  977. package/static/{chunk-DXESTGOH.js → chunk-L7RRX2M3.js} +1 -1
  978. package/static/{chunk-WE3ISL7O.js → chunk-LGWJ2WKU.js} +1 -1
  979. package/static/{chunk-OKI3N5AI.js → chunk-MLC7JK2H.js} +2 -2
  980. package/static/{chunk-NG7QWUFM.js → chunk-MOHNYW2A.js} +1 -1
  981. package/static/{chunk-SQYWQUL4.js → chunk-NCDUOVMW.js} +1 -1
  982. package/static/chunk-NGUAJIGI.js +1 -0
  983. package/static/{chunk-OYPJUVD6.js → chunk-NIPP6JDI.js} +1 -1
  984. package/static/{chunk-Y433XOAJ.js → chunk-NMTBMHUL.js} +1 -1
  985. package/static/chunk-O4XXMZFX.js +4 -0
  986. package/static/{chunk-IOP3ON2H.js → chunk-OANZITPM.js} +1 -1
  987. package/static/{chunk-WJFKUJJX.js → chunk-OGE4SAHU.js} +1 -1
  988. package/static/{chunk-7EHP6HO3.js → chunk-OI3ME22C.js} +1 -1
  989. package/static/{chunk-D4XDSS6P.js → chunk-Q3EGCMF5.js} +1 -1
  990. package/static/{chunk-TQBCGNFG.js → chunk-QF2NSHZA.js} +1 -1
  991. package/static/{chunk-RBBMH2FM.js → chunk-QKN6LAAA.js} +1 -1
  992. package/static/{chunk-J45SD6RC.js → chunk-QRFESU5O.js} +2 -2
  993. package/static/chunk-QVRVFYJH.js +1 -0
  994. package/static/{chunk-BAHNSFET.js → chunk-RFJIPIOK.js} +1 -1
  995. package/static/{chunk-IZ7TCHUW.js → chunk-RLL634K4.js} +1 -1
  996. package/static/{chunk-MOWL3ILT.js → chunk-RS2OFKWP.js} +1 -1
  997. package/static/{chunk-WM56LPJ3.js → chunk-RWAAC3A4.js} +1 -1
  998. package/static/{chunk-F3GMI6OL.js → chunk-S5Y64DDS.js} +1 -1
  999. package/static/{chunk-VNNLMUK7.js → chunk-SLG5KDU6.js} +1 -1
  1000. package/static/chunk-TJ4CVFEL.js +1 -0
  1001. package/static/{chunk-SAN35XTD.js → chunk-TWCGKSYE.js} +1 -1
  1002. package/static/{chunk-EUKVDBBK.js → chunk-UMDRE4S7.js} +1 -1
  1003. package/static/{chunk-YKCUUBZP.js → chunk-VRIOLRYR.js} +4 -4
  1004. package/static/chunk-VS4O2XDP.js +1 -0
  1005. package/static/{chunk-2MRTBCSV.js → chunk-VSBFNFOM.js} +1 -1
  1006. package/static/{chunk-CTPKDDVI.js → chunk-WN4WXCVK.js} +1 -1
  1007. package/static/{chunk-2AA3WMW5.js → chunk-WX7RXW7K.js} +1 -1
  1008. package/static/{chunk-J2BUPRCZ.js → chunk-XC4POKR3.js} +2 -2
  1009. package/static/{chunk-AXLDYLIO.js → chunk-Y4AUYQTG.js} +1 -1
  1010. package/static/{chunk-RPHWIW7S.js → chunk-YMIXHRJQ.js} +1 -7
  1011. package/static/{chunk-AFNUBQMD.js → chunk-ZUNKFAKP.js} +1 -1
  1012. package/static/index.html +3 -3
  1013. package/static/main-QN4UCOC5.js +5 -0
  1014. package/static/{styles-PD6764CP.css → styles-46GLIE7Y.css} +1 -1
  1015. package/server/authentication/constants/auth-ldap.js.map +0 -1
  1016. package/server/authentication/dto/two-fa-verify.dto.js.map +0 -1
  1017. package/server/authentication/guards/auth-two-fa-guard.js.map +0 -1
  1018. package/server/authentication/interfaces/two-fa-setup.interface.js +0 -10
  1019. package/server/authentication/interfaces/two-fa-setup.interface.js.map +0 -1
  1020. package/server/authentication/models/auth-method.js +0 -18
  1021. package/server/authentication/models/auth-method.js.map +0 -1
  1022. package/server/authentication/services/auth-manager.service.js.map +0 -1
  1023. package/server/authentication/services/auth-manager.service.spec.js.map +0 -1
  1024. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +0 -1
  1025. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +0 -1
  1026. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +0 -326
  1027. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +0 -1
  1028. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +0 -534
  1029. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +0 -1
  1030. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +0 -1
  1031. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +0 -1
  1032. package/static/chunk-3I6NPM62.js +0 -1
  1033. package/static/chunk-GCPX3EFC.js +0 -1
  1034. package/static/chunk-KBUIDMCK.js +0 -1
  1035. package/static/chunk-KY6MNZLC.js +0 -1
  1036. package/static/chunk-MPWD4VMY.js +0 -1
  1037. package/static/chunk-QQAF3MLL.js +0 -1
  1038. package/static/chunk-VHZKPUWE.js +0 -4
  1039. package/static/chunk-YWLMFOB4.js +0 -3
  1040. package/static/main-ZXEMCBMI.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-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, StreamableFile } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\n// Helpers to access mocked fs/promises\nimport fsPromisesModule from 'fs/promises'\nimport path from 'node:path'\nimport { FILE_OPERATION } from '../../files/constants/operations'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { checksumFile, isPathExists, isPathIsDir, removeFiles, touchFile } from '../../files/utils/files'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { F_SPECIAL_STAT, F_STAT, SYNC_CHECKSUM_ALG, SYNC_DIFF_DONE } from '../constants/sync'\nimport { SyncManager } from './sync-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock fs/promises used internally by the service\njest.mock('fs/promises', () => ({\n __esModule: true,\n default: {\n stat: jest.fn(),\n readdir: jest.fn()\n }\n}))\n\n// Mock helper functions used in service\njest.mock('../../files/utils/files', () => ({\n __esModule: true,\n checksumFile: jest.fn(),\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n removeFiles: jest.fn(),\n touchFile: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\n\n// Mock regExpPathPattern to a simple, predictable behavior\njest.mock('../../../common/functions', () => ({\n __esModule: true,\n regExpPathPattern: (base: string) => new RegExp('^' + base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n}))\n\n// Mock routes helper used by copyMove to bypass repo validation\njest.mock('../utils/routes', () => ({\n __esModule: true,\n SYNC_PATH_TO_SPACE_SEGMENTS: jest.fn((dst: string) => dst)\n}))\n\n// Mock heavy providers to avoid configuration side-effects on import\njest.mock('../../files/services/files-manager.service', () => ({\n __esModule: true,\n FilesManager: class FilesManager {}\n}))\njest.mock('../../spaces/services/spaces-manager.service', () => ({\n __esModule: true,\n SpacesManager: class SpacesManager {}\n}))\njest.mock('./sync-queries.service', () => ({\n __esModule: true,\n SyncQueries: class SyncQueries {}\n}))\n\nconst fsPromises = fsPromisesModule as unknown as { stat: jest.Mock; readdir: jest.Mock }\n\n// small helper to collect async generators\nconst collect = async <T>(iter: AsyncIterable<T>): Promise<T[]> => {\n const out: T[] = []\n for await (const i of iter) out.push(i)\n return out\n}\n\ndescribe(SyncManager.name, () => {\n let service: SyncManager\n let filesManager: {\n sendFileFromSpace: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n mkFile: jest.Mock\n copyMove: jest.Mock\n }\n let spacesManager: { spaceEnv: jest.Mock }\n let syncQueries: { getPathSettings: jest.Mock }\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n mkFile: jest.fn(),\n copyMove: jest.fn()\n }\n spacesManager = { spaceEnv: jest.fn() }\n syncQueries = { getPathSettings: jest.fn() }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncManager,\n { provide: SpacesManager, useValue: spacesManager },\n { provide: FilesManager, useValue: filesManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncManager>(SyncManager)\n })\n\n beforeEach(() => jest.clearAllMocks())\n\n const makeReq = (over?: Partial<any>) => ({\n method: 'PUT',\n user: { id: 1, clientId: 42 },\n space: { realPath: '/base/file.txt', url: '/space/file.txt' },\n ...over\n })\n\n const makeReply = () => {\n const raw = { writeHead: jest.fn(), write: jest.fn(), end: jest.fn() }\n return { raw, status: jest.fn().mockReturnThis() }\n }\n\n describe('download', () => {\n it('should stream file successfully', async () => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockResolvedValue(undefined)\n const stream = jest.fn().mockResolvedValue(new StreamableFile(Buffer.from('abc')))\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n const result = await service.download(req as any, res as any)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(checks).toHaveBeenCalled()\n expect(stream).toHaveBeenCalledWith(req, res)\n expect(result).toBeInstanceOf(StreamableFile)\n })\n\n it.each([\n ['LockConflict maps to 423', new LockConflict(null, 'locked'), HttpStatus.LOCKED],\n ['FileError maps to its http code', new FileError(HttpStatus.BAD_REQUEST, 'bad'), HttpStatus.BAD_REQUEST],\n ['generic Error maps to 500', new Error('oops'), HttpStatus.INTERNAL_SERVER_ERROR]\n ])('should map errors (%s)', async (_title, thrown, expectedStatus) => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockRejectedValue(thrown)\n const stream = jest.fn()\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n await expect(service.download(req as any, res as any)).rejects.toMatchObject({ status: expectedStatus })\n })\n })\n\n describe('upload', () => {\n it('should upload with checksum OK and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up.bin', url: '/space/up.bin' } })\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('abc')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String), checksumAlg: SYNC_CHECKSUM_ALG })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up.bin', 1710000000)\n expect(r).toEqual({ ino: 123 })\n expect(removeFiles).not.toHaveBeenCalled()\n })\n\n it('should reject when checksum mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('bad')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n\n it('should upload without checksum', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up2.bin', url: '/space/up2.bin' } })\n const dto = { size: 5, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 5, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String) })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up2.bin', 1710000100)\n expect(r).toEqual({ ino: 321 })\n })\n\n it('should reject when size mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { size: 10, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 99, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n })\n\n describe('delete', () => {\n it('should delete successfully', async () => {\n const req = makeReq()\n filesManager.delete.mockResolvedValue(undefined)\n\n await expect(service.delete(req as any)).resolves.toBeUndefined()\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.delete.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.delete(req as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('props', () => {\n it('should touch successfully', async () => {\n const req = makeReq()\n filesManager.touch.mockResolvedValue(undefined)\n\n await expect(service.props(req as any, { mtime: 1710000200 } as any)).resolves.toBeUndefined()\n expect(filesManager.touch).toHaveBeenCalledWith(req.user, req.space, 1710000200, false)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.touch.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.props(req as any, { mtime: 123 } as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n })\n\n describe('make', () => {\n it('should create directory and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newdir', url: '/space/newdir' } })\n filesManager.mkDir.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 555 })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.make(req as any, { type: 'directory', mtime: 1710000300 } as any)\n expect(filesManager.mkDir).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newdir', 1710000300)\n expect(r).toEqual({ ino: 555 })\n })\n\n it('should create file and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newfile', url: '/space/newfile' } })\n filesManager.mkFile.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 777 })\n\n const r = await service.make(req as any, { type: 'file', mtime: 1710000400 } as any)\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newfile', 1710000400)\n expect(r).toEqual({ ino: 777 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.mkDir.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.make(req as any, { type: 'directory', mtime: 0 } as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('copyMove', () => {\n it('should move (no return) and not touch mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/moved', url: '/space/dst/moved' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n\n const r = await service.copyMove(req as any, { destination: '/dst/moved' } as any, true)\n expect(spacesManager.spaceEnv).toHaveBeenCalled()\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, true, true)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toBeUndefined()\n })\n\n it('should copy, touch mtime when provided, and return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied', url: '/space/dst/copied' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 999, mtime: new Date(1710000500 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied', mtime: 1710000500 } as any, false)\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, false, true, true)\n expect(touchFile).toHaveBeenCalledWith('/dst/copied', 1710000500)\n expect(r).toEqual({ ino: 999, mtime: 1710000500 })\n })\n\n it('should copy without mtime and still return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied2', url: '/space/dst/copied2' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 1001, mtime: new Date(1710000600 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied2' } as any, false)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toEqual({ ino: 1001, mtime: 1710000600 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err', url: '/space/dst/err' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.copyMove(req as any, { destination: '/dst/err' } as any, false)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should map errors via handleError for move (isMove=true)', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err-move', url: '/space/dst/err-move' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new LockConflict(null, 'locked'))\n\n const spy = jest.spyOn(service as any, 'handleError')\n\n await expect(service.copyMove(req as any, { destination: '/dst/err-move' } as any, true)).rejects.toMatchObject({\n status: HttpStatus.LOCKED\n })\n\n expect(spy).toHaveBeenCalledWith(req.space, FILE_OPERATION.MOVE, expect.anything(), dstSpace)\n })\n })\n\n describe('parseSyncPath', () => {\n it('should delegate to parseFiles and yield file stats from the base directory', async () => {\n const base = '/base-sync'\n const space = { realPath: base, url: '/space-sync', quotaIsExceeded: false }\n const dirent = { name: 'afile', parentPath: base, isDirectory: () => false, isFile: () => true }\n fsPromises.readdir.mockResolvedValue([dirent])\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 42, ino: 7, mtime: new Date(1234 * 1000) })\n\n const syncDiff: any = { defaultFilters: new Set(), secureDiff: false, firstSync: true, snapshot: new Map() }\n\n const out = await collect<Record<string, any>>((service as any).parseSyncPath(space, syncDiff))\n\n expect(out.length).toBe(1)\n expect(out[0]).toHaveProperty('/afile')\n const stats = out[0]['/afile']\n expect(Array.isArray(stats)).toBe(true)\n expect(stats[F_STAT.IS_DIR]).toBe(false)\n expect(stats[F_STAT.SIZE]).toBe(42)\n expect(stats[F_STAT.MTIME]).toBe(1234)\n expect(stats[F_STAT.INO]).toBe(7)\n expect(stats[F_STAT.CHECKSUM]).toBeNull()\n })\n })\n\n describe('diff', () => {\n it('should fail when clientId is missing', async () => {\n const res = makeReply()\n await expect(service.diff({ id: 1 } as any, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should fail when path settings not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue(undefined)\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should map spaceEnv thrown error to BAD_REQUEST', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST, message: 'boom' })\n })\n\n it('should fail when space not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue(undefined)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should fail when space quota exceeded', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: true })\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.INSUFFICIENT_STORAGE })\n })\n\n it('should fail when remote path does not exist', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Remote path not found : /base'\n })\n })\n\n it('should fail when remote path is not a directory', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Remote path must be a directory'\n })\n })\n\n it('should stream diff results successfully', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n const gen = async function* () {\n yield { '/file1': [false, 1, 2, 3, 'x'] }\n yield { '/file2': [true, 0, 2, 4, null] }\n }\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => gen())\n\n await service.diff(user, 1, { secureDiff: false } as any, res as any)\n\n expect(res.raw.writeHead).toHaveBeenCalledWith(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n })\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file1': [false, 1, 2, 3, 'x'] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file2': [true, 0, 2, 4, null] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(SYNC_DIFF_DONE)\n expect(res.raw.end).toHaveBeenCalled()\n })\n\n it('should handle error during streaming and set status 500', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => {\n throw new Error('parse error')\n })\n\n await service.diff(user, 1, {} as any, res as any)\n\n expect(res.raw.write).toHaveBeenCalledWith('parse error\\n')\n expect(res.status).toHaveBeenCalledWith(HttpStatus.INTERNAL_SERVER_ERROR)\n expect(res.raw.end).toHaveBeenCalled()\n })\n })\n\n describe('internal parseFiles/analyzeFile coverage', () => {\n const makeDirent = (name: string, parentPath: string, kind: 'dir' | 'file' | 'other') => ({\n name,\n parentPath,\n isDirectory: () => kind === 'dir',\n isFile: () => kind === 'file'\n })\n\n it('should walk directory, ignore special files, filter by name/path, reuse snapshot checksum, and compute checksum when needed', async () => {\n const base = '/base'\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: {\n defaultFilters: new Set<string>(['ignoredName']),\n pathFilters: /file2/,\n secureDiff: true,\n firstSync: false,\n snapshot: new Map<string, any>([['/file3', [false, 100, 1000, 33, 'snaphash']]])\n }\n }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => {\n if (dir === base) {\n return [\n makeDirent('special', base, 'other'),\n makeDirent('dir1', base, 'dir'),\n makeDirent('ignoredName', base, 'file'),\n makeDirent('fileStatError', base, 'file'),\n makeDirent('file2', base, 'file'),\n makeDirent('file3', base, 'file'),\n makeDirent('file4', base, 'file')\n ]\n }\n if (dir === path.join(base, 'dir1')) return []\n return []\n })\n\n const mtimeDate = new Date(1000 * 1000)\n fsPromises.stat.mockImplementation(async (p: string) => {\n switch (p) {\n case path.join(base, 'dir1'):\n return { isDirectory: () => true, isFile: () => false, size: 0, ino: 11, mtime: mtimeDate }\n case path.join(base, 'fileStatError'):\n throw new Error('stat fail')\n case path.join(base, 'file2'):\n return { isDirectory: () => false, isFile: () => true, size: 10, ino: 22, mtime: mtimeDate }\n case path.join(base, 'file3'):\n return { isDirectory: () => false, isFile: () => true, size: 100, ino: 33, mtime: new Date(1000 * 1000) }\n case path.join(base, 'file4'):\n return { isDirectory: () => false, isFile: () => true, size: 200, ino: 44, mtime: new Date(2000 * 1000) }\n default:\n return { isDirectory: () => false, isFile: () => false, size: 0, ino: 0, mtime: new Date() }\n }\n })\n ;(checksumFile as jest.Mock).mockResolvedValue('computed-hash')\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n const keys = results.map((o) => Object.keys(o)[0]).sort()\n expect(keys).toEqual(['/dir1', '/file2', '/file3', '/file4', '/fileStatError'])\n\n const fileStatError = results.find((o) => o['/fileStatError'])\n expect(fileStatError?.['/fileStatError'][0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(fileStatError?.['/fileStatError'][1]).toContain('stat fail')\n\n const filtered = results.find((o) => o['/file2'])\n expect(filtered?.['/file2'][0]).toBe(F_SPECIAL_STAT.FILTERED)\n\n const reused = results.find((o) => o['/file3'])?.['/file3']\n expect(reused[F_STAT.CHECKSUM]).toBe('snaphash')\n expect(checksumFile).toHaveBeenCalledTimes(1)\n\n const computed = results.find((o) => o['/file4'])?.['/file4']\n expect(computed[F_STAT.CHECKSUM]).toBe('computed-hash')\n })\n\n it('should throw a generic error when readdir fails', async () => {\n fsPromises.readdir.mockRejectedValue(new Error('readdir fail'))\n\n const ctx: any = { regexBasePath: /./, syncDiff: { defaultFilters: new Set(), secureDiff: false } }\n const iter = (service as any).parseFiles('/any', ctx)\n\n await expect(\n (async () => {\n for await (const _ of iter) {\n /* consume */\n }\n })()\n ).rejects.toThrow('Unable to parse path')\n })\n\n it('should return ERROR when checkSumFile throws during analyzeFile', async () => {\n const base = '/base'\n const dirent = { name: 'badfile', parentPath: base, isDirectory: () => false, isFile: () => true }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => (dir === base ? [dirent] : []))\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 10, ino: 42, mtime: new Date(1234 * 1000) })\n\n jest.spyOn(service as any, 'checkSumFile').mockRejectedValue(new Error('checksum fail'))\n\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: { defaultFilters: new Set<string>(), pathFilters: undefined, secureDiff: true, firstSync: false, snapshot: new Map<string, any>() }\n }\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n expect(results).toHaveLength(1)\n expect(results[0]).toHaveProperty('/badfile')\n const out = results[0]['/badfile']\n expect(Array.isArray(out)).toBe(true)\n expect(out[0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(String(out[1])).toContain('checksum fail')\n })\n })\n})\n"],"names":["jest","mock","__esModule","default","stat","fn","readdir","checksumFile","isPathExists","isPathIsDir","removeFiles","touchFile","sanitizePath","p","regExpPathPattern","base","RegExp","replace","SYNC_PATH_TO_SPACE_SEGMENTS","dst","FilesManager","SpacesManager","SyncQueries","fsPromises","fsPromisesModule","collect","iter","out","i","push","describe","SyncManager","name","service","filesManager","spacesManager","syncQueries","beforeAll","sendFileFromSpace","saveStream","delete","touch","mkDir","mkFile","copyMove","spaceEnv","getPathSettings","module","Test","createTestingModule","providers","provide","useValue","compile","useLogger","get","beforeEach","clearAllMocks","makeReq","over","method","user","id","clientId","space","realPath","url","makeReply","raw","writeHead","write","end","status","mockReturnThis","it","req","res","checks","mockResolvedValue","undefined","stream","StreamableFile","Buffer","from","mockReturnValue","result","download","expect","toHaveBeenCalledWith","toHaveBeenCalled","toBeInstanceOf","each","LockConflict","HttpStatus","LOCKED","FileError","BAD_REQUEST","Error","INTERNAL_SERVER_ERROR","_title","thrown","expectedStatus","mockRejectedValue","rejects","toMatchObject","dto","checksum","size","mtime","ino","Date","r","upload","tmpPath","any","String","checksumAlg","SYNC_CHECKSUM_ALG","toEqual","not","HttpException","resolves","toBeUndefined","props","make","type","dstSpace","destination","spy","spyOn","FILE_OPERATION","MOVE","anything","quotaIsExceeded","dirent","parentPath","isDirectory","isFile","syncDiff","defaultFilters","Set","secureDiff","firstSync","snapshot","Map","parseSyncPath","length","toBe","toHaveProperty","stats","Array","isArray","F_STAT","IS_DIR","SIZE","MTIME","INO","CHECKSUM","toBeNull","diff","NOT_FOUND","remotePath","message","INSUFFICIENT_STORAGE","gen","mockImplementation","JSON","stringify","SYNC_DIFF_DONE","makeDirent","kind","ctx","regexBasePath","pathFilters","dir","path","join","mtimeDate","results","parseFiles","keys","map","o","Object","sort","fileStatError","find","F_SPECIAL_STAT","ERROR","toContain","filtered","FILTERED","reused","toHaveBeenCalledTimes","computed","_","toThrow","toHaveLength"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-manager.service.spec.ts"],"sourcesContent":["import { HttpException, HttpStatus, StreamableFile } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\n// Helpers to access mocked fs/promises\nimport fsPromisesModule from 'fs/promises'\nimport path from 'node:path'\nimport { FILE_OPERATION } from '../../files/constants/operations'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { checksumFile, isPathExists, isPathIsDir, removeFiles, touchFile } from '../../files/utils/files'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { F_SPECIAL_STAT, F_STAT, SYNC_CHECKSUM_ALG, SYNC_DIFF_DONE } from '../constants/sync'\nimport { SyncManager } from './sync-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock fs/promises used internally by the service\njest.mock('fs/promises', () => ({\n __esModule: true,\n default: {\n stat: jest.fn(),\n readdir: jest.fn()\n }\n}))\n\n// Mock helper functions used in service\njest.mock('../../files/utils/files', () => ({\n __esModule: true,\n checksumFile: jest.fn(),\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n removeFiles: jest.fn(),\n touchFile: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\n\n// Mock regExpPathPattern to a simple, predictable behavior\njest.mock('../../../common/functions', () => ({\n __esModule: true,\n regExpPathPattern: (base: string) => new RegExp('^' + base.replace(/[.*+?^${}()|[\\]\\\\]/g, '\\\\$&'))\n}))\n\n// Mock routes helper used by copyMove to bypass repo validation\njest.mock('../utils/routes', () => ({\n __esModule: true,\n SYNC_PATH_TO_SPACE_SEGMENTS: jest.fn((dst: string) => dst)\n}))\n\n// Mock heavy providers to avoid configuration side-effects on import\njest.mock('../../files/services/files-manager.service', () => ({\n __esModule: true,\n FilesManager: class FilesManager {}\n}))\njest.mock('../../spaces/services/spaces-manager.service', () => ({\n __esModule: true,\n SpacesManager: class SpacesManager {}\n}))\njest.mock('./sync-queries.service', () => ({\n __esModule: true,\n SyncQueries: class SyncQueries {}\n}))\n\nconst fsPromises = fsPromisesModule as unknown as { stat: jest.Mock; readdir: jest.Mock }\n\n// small helper to collect async generators\nconst collect = async <T>(iter: AsyncIterable<T>): Promise<T[]> => {\n const out: T[] = []\n for await (const i of iter) out.push(i)\n return out\n}\n\ndescribe(SyncManager.name, () => {\n let service: SyncManager\n let filesManager: {\n sendFileFromSpace: jest.Mock\n saveStream: jest.Mock\n delete: jest.Mock\n touch: jest.Mock\n mkDir: jest.Mock\n mkFile: jest.Mock\n copyMove: jest.Mock\n }\n let spacesManager: { spaceEnv: jest.Mock }\n let syncQueries: { getPathSettings: jest.Mock }\n\n beforeAll(async () => {\n filesManager = {\n sendFileFromSpace: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n mkFile: jest.fn(),\n copyMove: jest.fn()\n }\n spacesManager = { spaceEnv: jest.fn() }\n syncQueries = { getPathSettings: jest.fn() }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncManager,\n { provide: SpacesManager, useValue: spacesManager },\n { provide: FilesManager, useValue: filesManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncManager>(SyncManager)\n })\n\n beforeEach(() => jest.clearAllMocks())\n\n const makeReq = (over?: Partial<any>) => ({\n method: 'PUT',\n user: { id: 1, clientId: 42 },\n space: { realPath: '/base/file.txt', url: '/space/file.txt' },\n ...over\n })\n\n const makeReply = () => {\n const raw = { writeHead: jest.fn(), write: jest.fn(), end: jest.fn() }\n return { raw, status: jest.fn().mockReturnThis() }\n }\n\n describe('download', () => {\n it('should stream file successfully', async () => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockResolvedValue(undefined)\n const stream = jest.fn().mockResolvedValue(new StreamableFile(Buffer.from('abc')))\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n const result = await service.download(req as any, res as any)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(checks).toHaveBeenCalled()\n expect(stream).toHaveBeenCalledWith(req, res)\n expect(result).toBeInstanceOf(StreamableFile)\n })\n\n it.each([\n ['LockConflict maps to 423', new LockConflict(null, 'locked'), HttpStatus.LOCKED],\n ['FileError maps to its http code', new FileError(HttpStatus.BAD_REQUEST, 'bad'), HttpStatus.BAD_REQUEST],\n ['generic Error maps to 500', new Error('oops'), HttpStatus.INTERNAL_SERVER_ERROR]\n ])('should map errors (%s)', async (_title, thrown, expectedStatus) => {\n const req = makeReq()\n const res = makeReply()\n const checks = jest.fn().mockRejectedValue(thrown)\n const stream = jest.fn()\n filesManager.sendFileFromSpace.mockReturnValue({ checks, stream })\n\n await expect(service.download(req as any, res as any)).rejects.toMatchObject({ status: expectedStatus })\n })\n })\n\n describe('upload', () => {\n it('should upload with checksum OK and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up.bin', url: '/space/up.bin' } })\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('abc')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String), checksumAlg: SYNC_CHECKSUM_ALG })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up.bin', 1710000000)\n expect(r).toEqual({ ino: 123 })\n expect(removeFiles).not.toHaveBeenCalled()\n })\n\n it('should reject when checksum mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { checksum: 'abc', size: 10, mtime: 1710000000 }\n filesManager.saveStream.mockResolvedValue('bad')\n fsPromises.stat.mockResolvedValue({ size: 10, ino: 123, mtime: new Date(1710000000 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n\n it('should upload without checksum', async () => {\n const req = makeReq({ space: { realPath: '/tmp/up2.bin', url: '/space/up2.bin' } })\n const dto = { size: 5, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 5, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n const r = await service.upload(req as any, dto as any)\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, { tmpPath: expect.any(String) })\n expect(touchFile).toHaveBeenCalledWith('/tmp/up2.bin', 1710000100)\n expect(r).toEqual({ ino: 321 })\n })\n\n it('should reject when size mismatches and remove tmp', async () => {\n const req = makeReq()\n const dto = { size: 10, mtime: 1710000100 }\n filesManager.saveStream.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ size: 99, ino: 321, mtime: new Date(1710000100 * 1000) })\n\n await expect(service.upload(req as any, dto as any)).rejects.toBeInstanceOf(HttpException)\n expect(removeFiles).toHaveBeenCalledWith(expect.any(String))\n })\n })\n\n describe('delete', () => {\n it('should delete successfully', async () => {\n const req = makeReq()\n filesManager.delete.mockResolvedValue(undefined)\n\n await expect(service.delete(req as any)).resolves.toBeUndefined()\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.delete.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.delete(req as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('props', () => {\n it('should touch successfully', async () => {\n const req = makeReq()\n filesManager.touch.mockResolvedValue(undefined)\n\n await expect(service.props(req as any, { mtime: 1710000200 } as any)).resolves.toBeUndefined()\n expect(filesManager.touch).toHaveBeenCalledWith(req.user, req.space, 1710000200, false)\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.touch.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.props(req as any, { mtime: 123 } as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n })\n\n describe('make', () => {\n it('should create directory and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newdir', url: '/space/newdir' } })\n filesManager.mkDir.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 555 })\n ;(touchFile as jest.Mock).mockResolvedValue(undefined)\n\n const r = await service.make(req as any, { type: 'directory', mtime: 1710000300 } as any)\n expect(filesManager.mkDir).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newdir', 1710000300)\n expect(r).toEqual({ ino: 555 })\n })\n\n it('should create file and return ino', async () => {\n const req = makeReq({ space: { realPath: '/tmp/newfile', url: '/space/newfile' } })\n filesManager.mkFile.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 777 })\n\n const r = await service.make(req as any, { type: 'file', mtime: 1710000400 } as any)\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, true)\n expect(touchFile).toHaveBeenCalledWith('/tmp/newfile', 1710000400)\n expect(r).toEqual({ ino: 777 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n filesManager.mkDir.mockRejectedValue(new LockConflict(null, 'locked'))\n\n await expect(service.make(req as any, { type: 'directory', mtime: 0 } as any)).rejects.toMatchObject({ status: HttpStatus.LOCKED })\n })\n })\n\n describe('copyMove', () => {\n it('should move (no return) and not touch mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/moved', url: '/space/dst/moved' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n\n const r = await service.copyMove(req as any, { destination: '/dst/moved' } as any, true)\n expect(spacesManager.spaceEnv).toHaveBeenCalled()\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, true, true)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toBeUndefined()\n })\n\n it('should copy, touch mtime when provided, and return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied', url: '/space/dst/copied' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 999, mtime: new Date(1710000500 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied', mtime: 1710000500 } as any, false)\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, false, true, true)\n expect(touchFile).toHaveBeenCalledWith('/dst/copied', 1710000500)\n expect(r).toEqual({ ino: 999, mtime: 1710000500 })\n })\n\n it('should copy without mtime and still return ino/mtime', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/copied2', url: '/space/dst/copied2' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockResolvedValue(undefined)\n fsPromises.stat.mockResolvedValue({ ino: 1001, mtime: new Date(1710000600 * 1000) })\n\n const r = await service.copyMove(req as any, { destination: '/dst/copied2' } as any, false)\n expect(touchFile).not.toHaveBeenCalled()\n expect(r).toEqual({ ino: 1001, mtime: 1710000600 })\n })\n\n it('should map errors via handleError', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err', url: '/space/dst/err' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new FileError(HttpStatus.BAD_REQUEST, 'bad'))\n\n await expect(service.copyMove(req as any, { destination: '/dst/err' } as any, false)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should map errors via handleError for move (isMove=true)', async () => {\n const req = makeReq()\n const dstSpace = { realPath: '/dst/err-move', url: '/space/dst/err-move' }\n spacesManager.spaceEnv.mockResolvedValue(dstSpace)\n filesManager.copyMove.mockRejectedValue(new LockConflict(null, 'locked'))\n\n const spy = jest.spyOn(service as any, 'handleError')\n\n await expect(service.copyMove(req as any, { destination: '/dst/err-move' } as any, true)).rejects.toMatchObject({\n status: HttpStatus.LOCKED\n })\n\n expect(spy).toHaveBeenCalledWith(req.space, FILE_OPERATION.MOVE, expect.anything(), dstSpace)\n })\n })\n\n describe('parseSyncPath', () => {\n it('should delegate to parseFiles and yield file stats from the base directory', async () => {\n const base = '/base-sync'\n const space = { realPath: base, url: '/space-sync', quotaIsExceeded: false }\n const dirent = { name: 'afile', parentPath: base, isDirectory: () => false, isFile: () => true }\n fsPromises.readdir.mockResolvedValue([dirent])\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 42, ino: 7, mtime: new Date(1234 * 1000) })\n\n const syncDiff: any = { defaultFilters: new Set(), secureDiff: false, firstSync: true, snapshot: new Map() }\n\n const out = await collect<Record<string, any>>((service as any).parseSyncPath(space, syncDiff))\n\n expect(out.length).toBe(1)\n expect(out[0]).toHaveProperty('/afile')\n const stats = out[0]['/afile']\n expect(Array.isArray(stats)).toBe(true)\n expect(stats[F_STAT.IS_DIR]).toBe(false)\n expect(stats[F_STAT.SIZE]).toBe(42)\n expect(stats[F_STAT.MTIME]).toBe(1234)\n expect(stats[F_STAT.INO]).toBe(7)\n expect(stats[F_STAT.CHECKSUM]).toBeNull()\n })\n })\n\n describe('diff', () => {\n it('should fail when clientId is missing', async () => {\n const res = makeReply()\n await expect(service.diff({ id: 1 } as any, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n\n it('should fail when path settings not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue(undefined)\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should map spaceEnv thrown error to BAD_REQUEST', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST, message: 'boom' })\n })\n\n it('should fail when space not found', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue(undefined)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.NOT_FOUND })\n })\n\n it('should fail when space quota exceeded', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: true })\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({ status: HttpStatus.INSUFFICIENT_STORAGE })\n })\n\n it('should fail when remote path does not exist', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Remote path not found : /base'\n })\n })\n\n it('should fail when remote path is not a directory', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n spacesManager.spaceEnv.mockResolvedValue({ realPath: '/base', url: '/space', quotaIsExceeded: false })\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(false)\n\n await expect(service.diff(user, 1, {} as any, res as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Remote path must be a directory'\n })\n })\n\n it('should stream diff results successfully', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n const gen = async function* () {\n yield { '/file1': [false, 1, 2, 3, 'x'] }\n yield { '/file2': [true, 0, 2, 4, null] }\n }\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => gen())\n\n await service.diff(user, 1, { secureDiff: false } as any, res as any)\n\n expect(res.raw.writeHead).toHaveBeenCalledWith(200, {\n 'Content-Type': 'text/plain; charset=utf-8',\n 'Transfer-Encoding': 'chunked'\n })\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file1': [false, 1, 2, 3, 'x'] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(`${JSON.stringify({ '/file2': [true, 0, 2, 4, null] })}\\n`)\n expect(res.raw.write).toHaveBeenCalledWith(SYNC_DIFF_DONE)\n expect(res.raw.end).toHaveBeenCalled()\n })\n\n it('should handle error during streaming and set status 500', async () => {\n const res = makeReply()\n const user = { id: 1, clientId: 9 } as any\n syncQueries.getPathSettings.mockResolvedValue({ remotePath: '/base' })\n const space = { realPath: '/base', url: '/space', quotaIsExceeded: false }\n spacesManager.spaceEnv.mockResolvedValue(space)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n\n jest.spyOn(service as any, 'parseSyncPath').mockImplementation(() => {\n throw new Error('parse error')\n })\n\n await service.diff(user, 1, {} as any, res as any)\n\n expect(res.raw.write).toHaveBeenCalledWith('parse error\\n')\n expect(res.status).toHaveBeenCalledWith(HttpStatus.INTERNAL_SERVER_ERROR)\n expect(res.raw.end).toHaveBeenCalled()\n })\n })\n\n describe('internal parseFiles/analyzeFile coverage', () => {\n const makeDirent = (name: string, parentPath: string, kind: 'dir' | 'file' | 'other') => ({\n name,\n parentPath,\n isDirectory: () => kind === 'dir',\n isFile: () => kind === 'file'\n })\n\n it('should walk directory, ignore special files, filter by name/path, reuse snapshot checksum, and compute checksum when needed', async () => {\n const base = '/base'\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: {\n defaultFilters: new Set<string>(['ignoredName']),\n pathFilters: /file2/,\n secureDiff: true,\n firstSync: false,\n snapshot: new Map<string, any>([['/file3', [false, 100, 1000, 33, 'snaphash']]])\n }\n }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => {\n if (dir === base) {\n return [\n makeDirent('special', base, 'other'),\n makeDirent('dir1', base, 'dir'),\n makeDirent('ignoredName', base, 'file'),\n makeDirent('fileStatError', base, 'file'),\n makeDirent('file2', base, 'file'),\n makeDirent('file3', base, 'file'),\n makeDirent('file4', base, 'file')\n ]\n }\n if (dir === path.join(base, 'dir1')) return []\n return []\n })\n\n const mtimeDate = new Date(1000 * 1000)\n fsPromises.stat.mockImplementation(async (p: string) => {\n switch (p) {\n case path.join(base, 'dir1'):\n return { isDirectory: () => true, isFile: () => false, size: 0, ino: 11, mtime: mtimeDate }\n case path.join(base, 'fileStatError'):\n throw new Error('stat fail')\n case path.join(base, 'file2'):\n return { isDirectory: () => false, isFile: () => true, size: 10, ino: 22, mtime: mtimeDate }\n case path.join(base, 'file3'):\n return { isDirectory: () => false, isFile: () => true, size: 100, ino: 33, mtime: new Date(1000 * 1000) }\n case path.join(base, 'file4'):\n return { isDirectory: () => false, isFile: () => true, size: 200, ino: 44, mtime: new Date(2000 * 1000) }\n default:\n return { isDirectory: () => false, isFile: () => false, size: 0, ino: 0, mtime: new Date() }\n }\n })\n ;(checksumFile as jest.Mock).mockResolvedValue('computed-hash')\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n const keys = results.map((o) => Object.keys(o)[0]).sort()\n expect(keys).toEqual(['/dir1', '/file2', '/file3', '/file4', '/fileStatError'])\n\n const fileStatError = results.find((o) => o['/fileStatError'])\n expect(fileStatError?.['/fileStatError'][0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(fileStatError?.['/fileStatError'][1]).toContain('stat fail')\n\n const filtered = results.find((o) => o['/file2'])\n expect(filtered?.['/file2'][0]).toBe(F_SPECIAL_STAT.FILTERED)\n\n const reused = results.find((o) => o['/file3'])?.['/file3']\n expect(reused[F_STAT.CHECKSUM]).toBe('snaphash')\n expect(checksumFile).toHaveBeenCalledTimes(1)\n\n const computed = results.find((o) => o['/file4'])?.['/file4']\n expect(computed[F_STAT.CHECKSUM]).toBe('computed-hash')\n })\n\n it('should throw a generic error when readdir fails', async () => {\n fsPromises.readdir.mockRejectedValue(new Error('readdir fail'))\n\n const ctx: any = { regexBasePath: /./, syncDiff: { defaultFilters: new Set(), secureDiff: false } }\n const iter = (service as any).parseFiles('/any', ctx)\n\n await expect(\n (async () => {\n for await (const _ of iter) {\n /* consume */\n }\n })()\n ).rejects.toThrow('Unable to parse path')\n })\n\n it('should return ERROR when checkSumFile throws during analyzeFile', async () => {\n const base = '/base'\n const dirent = { name: 'badfile', parentPath: base, isDirectory: () => false, isFile: () => true }\n\n fsPromises.readdir.mockImplementation(async (dir: string) => (dir === base ? [dirent] : []))\n fsPromises.stat.mockResolvedValue({ isDirectory: () => false, isFile: () => true, size: 10, ino: 42, mtime: new Date(1234 * 1000) })\n\n jest.spyOn(service as any, 'checkSumFile').mockRejectedValue(new Error('checksum fail'))\n\n const ctx: any = {\n regexBasePath: new RegExp('^/base'),\n syncDiff: { defaultFilters: new Set<string>(), pathFilters: undefined, secureDiff: true, firstSync: false, snapshot: new Map<string, any>() }\n }\n\n const results = await collect<Record<string, any>>((service as any).parseFiles(base, ctx))\n\n expect(results).toHaveLength(1)\n expect(results[0]).toHaveProperty('/badfile')\n const out = results[0]['/badfile']\n expect(Array.isArray(out)).toBe(true)\n expect(out[0]).toBe(F_SPECIAL_STAT.ERROR)\n expect(String(out[1])).toContain('checksum fail')\n })\n })\n})\n"],"names":["jest","mock","__esModule","default","stat","fn","readdir","checksumFile","isPathExists","isPathIsDir","removeFiles","touchFile","sanitizePath","p","regExpPathPattern","base","RegExp","replace","SYNC_PATH_TO_SPACE_SEGMENTS","dst","FilesManager","SpacesManager","SyncQueries","fsPromises","fsPromisesModule","collect","iter","out","i","push","describe","SyncManager","name","service","filesManager","spacesManager","syncQueries","beforeAll","sendFileFromSpace","saveStream","delete","touch","mkDir","mkFile","copyMove","spaceEnv","getPathSettings","module","Test","createTestingModule","providers","provide","useValue","compile","useLogger","get","beforeEach","clearAllMocks","makeReq","over","method","user","id","clientId","space","realPath","url","makeReply","raw","writeHead","write","end","status","mockReturnThis","it","req","res","checks","mockResolvedValue","undefined","stream","StreamableFile","Buffer","from","mockReturnValue","result","download","expect","toHaveBeenCalledWith","toHaveBeenCalled","toBeInstanceOf","each","LockConflict","HttpStatus","LOCKED","FileError","BAD_REQUEST","Error","INTERNAL_SERVER_ERROR","_title","thrown","expectedStatus","mockRejectedValue","rejects","toMatchObject","dto","checksum","size","mtime","ino","Date","r","upload","tmpPath","any","String","checksumAlg","SYNC_CHECKSUM_ALG","toEqual","not","HttpException","resolves","toBeUndefined","props","make","type","dstSpace","destination","spy","spyOn","FILE_OPERATION","MOVE","anything","quotaIsExceeded","dirent","parentPath","isDirectory","isFile","syncDiff","defaultFilters","Set","secureDiff","firstSync","snapshot","Map","parseSyncPath","length","toBe","toHaveProperty","stats","Array","isArray","F_STAT","IS_DIR","SIZE","MTIME","INO","CHECKSUM","toBeNull","diff","NOT_FOUND","remotePath","message","INSUFFICIENT_STORAGE","gen","mockImplementation","JSON","stringify","SYNC_DIFF_DONE","makeDirent","kind","ctx","regexBasePath","pathFilters","dir","path","join","mtimeDate","results","parseFiles","keys","map","o","Object","sort","fileStatError","find","F_SPECIAL_STAT","ERROR","toContain","filtered","FILTERED","reused","toHaveBeenCalledTimes","computed","_","toThrow","toHaveLength"],"mappings":"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"}
@@ -1,8 +1,4 @@
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";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -42,6 +38,8 @@ let SyncPathsManager = class SyncPathsManager {
42
38
  if (req.space.quotaIsExceeded) {
43
39
  throw new _common.HttpException('Storage quota exceeded', _common.HttpStatus.INSUFFICIENT_STORAGE);
44
40
  }
41
+ // Check DB path
42
+ const syncDBProps = await this.getDBProps(req.space);
45
43
  if (!await (0, _files.isPathExists)(req.space.realPath)) {
46
44
  throw new _common.HttpException(`Remote path not found : ${syncPathDto.remotePath}`, _common.HttpStatus.NOT_FOUND);
47
45
  }
@@ -52,8 +50,7 @@ let SyncPathsManager = class SyncPathsManager {
52
50
  if (!client) {
53
51
  throw new _common.HttpException('Client not found', _common.HttpStatus.NOT_FOUND);
54
52
  }
55
- const syncDBProps = await this.getDBProps(req.space);
56
- // important : ensures the right remote path is used and stored
53
+ // important: ensures the right remote path is used and stored
57
54
  syncPathDto.remotePath = req.params['*'];
58
55
  // add permissions (skip end point protection using getEnvPermission)
59
56
  syncPathDto.permissions = (0, _permissions.getEnvPermissions)(req.space, req.space.root);
@@ -74,7 +71,10 @@ let SyncPathsManager = class SyncPathsManager {
74
71
  try {
75
72
  await this.syncQueries.deletePath(clientId, pathId);
76
73
  } catch (e) {
77
- this.logger.error(`${this.deletePath.name} - ${e}`);
74
+ this.logger.error({
75
+ tag: this.deletePath.name,
76
+ msg: `${e}`
77
+ });
78
78
  throw new _common.HttpException('Unable to remove path', _common.HttpStatus.BAD_REQUEST);
79
79
  }
80
80
  }
@@ -94,7 +94,10 @@ let SyncPathsManager = class SyncPathsManager {
94
94
  try {
95
95
  await this.syncQueries.updatePathSettings(clientId, pathId, syncPathSettings);
96
96
  } catch (e) {
97
- this.logger.error(`${this.updatePath.name} - ${e}`);
97
+ this.logger.error({
98
+ tag: this.updatePath.name,
99
+ msg: `${e}`
100
+ });
98
101
  throw new _common.HttpException('Unable to update path', _common.HttpStatus.INTERNAL_SERVER_ERROR);
99
102
  } finally{
100
103
  // clear cache
@@ -175,7 +178,10 @@ let SyncPathsManager = class SyncPathsManager {
175
178
  this.syncQueries.updatePathSettings(user.clientId, clientPath.id, {
176
179
  ...updatedSettings,
177
180
  lastSync: clientPath.lastSync
178
- }).catch((e)=>this.logger.error(`${this.updatePaths.name} - ${e}`));
181
+ }).catch((e)=>this.logger.error({
182
+ tag: this.updatePaths.name,
183
+ msg: `${e}`
184
+ }));
179
185
  }
180
186
  if (!clientNewer && hasUpdates) {
181
187
  clientDiff.update.push({
@@ -188,7 +194,10 @@ let SyncPathsManager = class SyncPathsManager {
188
194
  clientDiff.delete = clientPathIds.filter((cid)=>serverPathIds.indexOf(cid) === -1);
189
195
  for (const cPathId of clientDiff.delete){
190
196
  const cPath = syncPathsDto.find((p)=>p.id === cPathId);
191
- this.notify(user.id, _constants.ACTION.DELETE, cPath.remotePath).catch((e)=>this.logger.error(`${this.updatePaths.name} - ${e}`));
197
+ this.notify(user.id, _constants.ACTION.DELETE, cPath.remotePath).catch((e)=>this.logger.error({
198
+ tag: this.updatePaths.name,
199
+ msg: `${e}`
200
+ }));
192
201
  }
193
202
  // clear cache
194
203
  clientDiff.update.forEach((path)=>this.syncQueries.clearCachePathSettings(user.clientId, path.id));
@@ -196,7 +205,7 @@ let SyncPathsManager = class SyncPathsManager {
196
205
  }
197
206
  async getDBProps(space) {
198
207
  if (space.inSharesList) {
199
- throw new _common.HttpException('Sync all shares is not supported, you must select a sub-directory', _common.HttpStatus.BAD_REQUEST);
208
+ throw new _common.HttpException('Syncing all shares is not supported. Please select a subdirectory', _common.HttpStatus.BAD_REQUEST);
200
209
  } else if (space.inPersonalSpace) {
201
210
  if (space.paths.length) {
202
211
  return {
@@ -204,14 +213,12 @@ let SyncPathsManager = class SyncPathsManager {
204
213
  fileId: await this.getOrCreateFileId(space)
205
214
  };
206
215
  } else {
207
- return {
208
- ownerId: space.dbFile.ownerId
209
- };
216
+ throw new _common.HttpException('Syncing all personal files is not supported. Please select a subdirectory', _common.HttpStatus.BAD_REQUEST);
210
217
  }
211
218
  } else if (space.inFilesRepository) {
212
219
  if (!space?.root?.alias) {
213
220
  // The synchronization direction should be adapted for each root depending on the permissions, this is not yet supported
214
- throw new _common.HttpException('Sync all space is not yet supported, you must select a sub-directory', _common.HttpStatus.BAD_REQUEST);
221
+ throw new _common.HttpException('Syncing the entire space is not yet supported. Please select a subdirectory', _common.HttpStatus.BAD_REQUEST);
215
222
  }
216
223
  if (space.root.id && !space.paths.length) {
217
224
  return {
@@ -264,7 +271,10 @@ let SyncPathsManager = class SyncPathsManager {
264
271
  ], notification, {
265
272
  currentUrl: this.contextManager.headerOriginUrl(),
266
273
  action: action
267
- }).catch((e)=>this.logger.error(`${this.notify.name} - ${e}`));
274
+ }).catch((e)=>this.logger.error({
275
+ tag: this.notify.name,
276
+ msg: `${e}`
277
+ }));
268
278
  }
269
279
  constructor(contextManager, spacesManager, filesQueries, syncQueries, notificationsManager){
270
280
  this.contextManager = contextManager;
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-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 { ACTION } from '../../../common/constants'\nimport { currentTimeStamp } from '../../../common/shared'\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 { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UserModel } from '../../users/models/user.model'\nimport { SYNC_PATH_REPOSITORY } from '../constants/sync'\nimport { SyncPathDto, SyncPathUpdateDto } from '../dtos/sync-path.dto'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { SYNC_PATH_TO_SPACE_SEGMENTS } from '../utils/routes'\nimport { SyncQueries } from './sync-queries.service'\n\n@Injectable()\nexport class SyncPathsManager {\n private readonly logger = new Logger(SyncPathsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesManager: SpacesManager,\n private readonly filesQueries: FilesQueries,\n private readonly syncQueries: SyncQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async createPath(req: FastifySpaceRequest, syncPathDto: SyncPathDto): Promise<{ id: number; permissions: string }> {\n if (!req.user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (req.space.quotaIsExceeded) {\n throw new HttpException('Storage quota exceeded', HttpStatus.INSUFFICIENT_STORAGE)\n }\n if (!(await isPathExists(req.space.realPath))) {\n throw new HttpException(`Remote path not found : ${syncPathDto.remotePath}`, HttpStatus.NOT_FOUND)\n }\n if (!(await isPathIsDir(req.space.realPath))) {\n throw new HttpException('Remote path must be a directory', HttpStatus.BAD_REQUEST)\n }\n const client: SyncClient = await this.syncQueries.getClient(req.user.clientId, req.user.id)\n if (!client) {\n throw new HttpException('Client not found', HttpStatus.NOT_FOUND)\n }\n const syncDBProps: SyncDBProps = await this.getDBProps(req.space)\n\n // important : ensures the right remote path is used and stored\n syncPathDto.remotePath = req.params['*']\n // add permissions (skip end point protection using getEnvPermission)\n syncPathDto.permissions = getEnvPermissions(req.space, req.space.root)\n const pathId = await this.syncQueries.createPath(client.id, syncDBProps, syncPathDto)\n return { id: pathId, permissions: syncPathDto.permissions }\n }\n\n async deletePath(user: UserModel, pathId: number, clientId?: string): Promise<void> {\n clientId = user.clientId || clientId\n if (!clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.syncQueries.clientExistsForOwner(user.id, clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n try {\n await this.syncQueries.deletePath(clientId, pathId)\n } catch (e) {\n this.logger.error(`${this.deletePath.name} - ${e}`)\n throw new HttpException('Unable to remove path', HttpStatus.BAD_REQUEST)\n }\n }\n\n async updatePath(user: UserModel, clientId: string, pathId: number, syncPathUpdateDto: SyncPathUpdateDto): Promise<SyncPathSettings> {\n if (!(await this.syncQueries.clientExistsForOwner(user.id, clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const syncPathSettings: SyncPathSettings = await this.syncQueries.getPathSettings(clientId, pathId)\n if (!syncPathSettings) {\n throw new HttpException('Sync path not found', HttpStatus.NOT_FOUND)\n }\n // delete possible id\n delete syncPathUpdateDto.id\n // update current path settings\n Object.assign(syncPathSettings, syncPathUpdateDto)\n syncPathSettings.timestamp = currentTimeStamp()\n try {\n await this.syncQueries.updatePathSettings(clientId, pathId, syncPathSettings)\n } catch (e) {\n this.logger.error(`${this.updatePath.name} - ${e}`)\n throw new HttpException('Unable to update path', HttpStatus.INTERNAL_SERVER_ERROR)\n } finally {\n // clear cache\n this.syncQueries.clearCachePathSettings(clientId, pathId)\n }\n return syncPathSettings\n }\n\n async updatePaths(\n user: UserModel,\n syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n /* Update the client or server paths */\n if (!user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.syncQueries.clientExistsForOwner(user.id, user.clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const clientPathIds: number[] = syncPathsDto.map((p) => p.id)\n const serverPathIds: number[] = []\n\n const clientDiff: { add: SyncPathSettings[]; update: Partial<Record<keyof SyncPathSettings, any>>[]; delete: number[] } = {\n add: [],\n update: [],\n delete: []\n }\n const serverPaths: { id: number; settings: SyncPathSettings; remotePath: string }[] = await this.syncQueries.getPaths(user.clientId)\n for (const serverPath of serverPaths) {\n if (!serverPath.remotePath) {\n // unable to determine path, will be stored as deleted\n continue\n }\n let space: SpaceEnv\n try {\n space = await this.spacesManager.spaceEnv(user, SYNC_PATH_TO_SPACE_SEGMENTS(serverPath.remotePath), true)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n if (!space) {\n // removed or inaccessible space, the path will be stored as deleted\n continue\n }\n serverPathIds.push(serverPath.id)\n if (clientPathIds.indexOf(serverPath.id) === -1) {\n // path exists on server but not on client, add it to client\n clientDiff.add.push({ ...serverPath.settings, id: serverPath.id, remotePath: serverPath.remotePath, permissions: space.envPermissions })\n continue\n }\n\n // path exists on both server and client side\n const clientPath: SyncPathDto = syncPathsDto.find((p) => p.id === serverPath.id)\n // remotePath and permissions settings are only managed by server\n const updateClientInfo: { remotePath?: string; permissions?: string } = {\n ...(serverPath.remotePath !== clientPath.remotePath && { remotePath: serverPath.remotePath }),\n ...(space.envPermissions !== clientPath.permissions && { permissions: space.envPermissions })\n }\n const clientNewer = clientPath.timestamp > serverPath.settings.timestamp\n const serverNewer = clientPath.timestamp < serverPath.settings.timestamp\n const hasUpdates = Object.keys(updateClientInfo).length > 0\n\n let updatedSettings: SyncPathSettings = { ...serverPath.settings, ...updateClientInfo }\n\n if (clientNewer) {\n updatedSettings = { ...clientPath, ...updateClientInfo }\n } else if (serverNewer) {\n clientDiff.update.push({ id: clientPath.id, ...serverPath.settings, ...updateClientInfo })\n }\n\n if (clientNewer || hasUpdates || serverPath.settings.lastSync !== clientPath.lastSync) {\n this.syncQueries\n .updatePathSettings(user.clientId, clientPath.id, { ...updatedSettings, lastSync: clientPath.lastSync })\n .catch((e: Error) => this.logger.error(`${this.updatePaths.name} - ${e}`))\n }\n\n if (!clientNewer && hasUpdates) {\n clientDiff.update.push({ id: clientPath.id, ...updateClientInfo })\n }\n }\n // path does not exist on server side\n clientDiff.delete = clientPathIds.filter((cid) => serverPathIds.indexOf(cid) === -1)\n for (const cPathId of clientDiff.delete) {\n const cPath: SyncPathDto = syncPathsDto.find((p) => p.id === cPathId)\n this.notify(user.id, ACTION.DELETE, cPath.remotePath).catch((e: Error) => this.logger.error(`${this.updatePaths.name} - ${e}`))\n }\n // clear cache\n clientDiff.update.forEach((path) => this.syncQueries.clearCachePathSettings(user.clientId, path.id))\n return clientDiff\n }\n\n private async getDBProps(space: SpaceEnv): Promise<SyncDBProps> {\n if (space.inSharesList) {\n throw new HttpException('Sync all shares is not supported, you must select a sub-directory', HttpStatus.BAD_REQUEST)\n } else if (space.inPersonalSpace) {\n if (space.paths.length) {\n return { ownerId: space.dbFile.ownerId, fileId: await this.getOrCreateFileId(space) }\n } else {\n return { ownerId: space.dbFile.ownerId }\n }\n } else if (space.inFilesRepository) {\n if (!space?.root?.alias) {\n // The synchronization direction should be adapted for each root depending on the permissions, this is not yet supported\n throw new HttpException('Sync all space is not yet supported, you must select a sub-directory', HttpStatus.BAD_REQUEST)\n }\n if (space.root.id && !space.paths.length) {\n return { spaceId: space.id, spaceRootId: space.root.id }\n } else {\n return { spaceId: space.id, spaceRootId: space?.root?.id || null, fileId: await this.getOrCreateFileId(space) }\n }\n } else if (space.inSharesRepository) {\n if (space.paths.length) {\n return { shareId: space.id, fileId: await this.getOrCreateFileId(space) }\n } else {\n return { shareId: space.id }\n }\n }\n }\n\n private async getOrCreateFileId(space: SpaceEnv): Promise<number> {\n const fileProps: FileProps = await getProps(space.realPath, space.dbFile.path)\n let fileId: number = await this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n if (!fileId) {\n fileId = await this.filesQueries.getOrCreateSpaceFile(fileId, { ...fileProps, id: undefined }, space.dbFile)\n }\n return fileId\n }\n\n private async notify(userId: number, action: ACTION, remotePath: string) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SYNC,\n event: NOTIFICATION_APP_EVENT.SYNC[action],\n element: remotePath,\n url: [...SYNC_PATH_REPOSITORY[remotePath.split('/').at(0)], ...remotePath.split('/').slice(1, -1)].join('/')\n }\n this.notificationsManager\n .create([userId], notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n action: action\n })\n .catch((e: Error) => this.logger.error(`${this.notify.name} - ${e}`))\n }\n}\n"],"names":["SyncPathsManager","createPath","req","syncPathDto","user","clientId","HttpException","HttpStatus","BAD_REQUEST","space","quotaIsExceeded","INSUFFICIENT_STORAGE","isPathExists","realPath","remotePath","NOT_FOUND","isPathIsDir","client","syncQueries","getClient","id","syncDBProps","getDBProps","params","permissions","getEnvPermissions","root","pathId","deletePath","clientExistsForOwner","FORBIDDEN","e","logger","error","name","updatePath","syncPathUpdateDto","syncPathSettings","getPathSettings","Object","assign","timestamp","currentTimeStamp","updatePathSettings","INTERNAL_SERVER_ERROR","clearCachePathSettings","updatePaths","syncPathsDto","clientPathIds","map","p","serverPathIds","clientDiff","add","update","delete","serverPaths","getPaths","serverPath","spacesManager","spaceEnv","SYNC_PATH_TO_SPACE_SEGMENTS","message","push","indexOf","settings","envPermissions","clientPath","find","updateClientInfo","clientNewer","serverNewer","hasUpdates","keys","length","updatedSettings","lastSync","catch","filter","cid","cPathId","cPath","notify","ACTION","DELETE","forEach","path","inSharesList","inPersonalSpace","paths","ownerId","dbFile","fileId","getOrCreateFileId","inFilesRepository","alias","spaceId","spaceRootId","inSharesRepository","shareId","fileProps","getProps","filesQueries","getSpaceFileId","getOrCreateSpaceFile","undefined","userId","action","notification","app","NOTIFICATION_APP","SYNC","event","NOTIFICATION_APP_EVENT","element","url","SYNC_PATH_REPOSITORY","split","at","slice","join","notificationsManager","create","currentUrl","contextManager","headerOriginUrl","Logger"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-manager.service.ts"],"sourcesContent":["import { HttpException, HttpStatus, Injectable, Logger } from '@nestjs/common'\nimport { ACTION } from '../../../common/constants'\nimport { currentTimeStamp } from '../../../common/shared'\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 { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NOTIFICATION_APP, NOTIFICATION_APP_EVENT } from '../../notifications/constants/notifications'\nimport { NotificationContent } from '../../notifications/interfaces/notification-properties.interface'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { FastifySpaceRequest } from '../../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../../spaces/models/space-env.model'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UserModel } from '../../users/models/user.model'\nimport { SYNC_PATH_REPOSITORY } from '../constants/sync'\nimport { SyncPathDto, SyncPathUpdateDto } from '../dtos/sync-path.dto'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { SYNC_PATH_TO_SPACE_SEGMENTS } from '../utils/routes'\nimport { SyncQueries } from './sync-queries.service'\n\n@Injectable()\nexport class SyncPathsManager {\n private readonly logger = new Logger(SyncPathsManager.name)\n\n constructor(\n private readonly contextManager: ContextManager,\n private readonly spacesManager: SpacesManager,\n private readonly filesQueries: FilesQueries,\n private readonly syncQueries: SyncQueries,\n private readonly notificationsManager: NotificationsManager\n ) {}\n\n async createPath(req: FastifySpaceRequest, syncPathDto: SyncPathDto): Promise<{ id: number; permissions: string }> {\n if (!req.user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (req.space.quotaIsExceeded) {\n throw new HttpException('Storage quota exceeded', HttpStatus.INSUFFICIENT_STORAGE)\n }\n\n // Check DB path\n const syncDBProps: SyncDBProps = await this.getDBProps(req.space)\n\n if (!(await isPathExists(req.space.realPath))) {\n throw new HttpException(`Remote path not found : ${syncPathDto.remotePath}`, HttpStatus.NOT_FOUND)\n }\n if (!(await isPathIsDir(req.space.realPath))) {\n throw new HttpException('Remote path must be a directory', HttpStatus.BAD_REQUEST)\n }\n const client: SyncClient = await this.syncQueries.getClient(req.user.clientId, req.user.id)\n if (!client) {\n throw new HttpException('Client not found', HttpStatus.NOT_FOUND)\n }\n\n // important: ensures the right remote path is used and stored\n syncPathDto.remotePath = req.params['*']\n // add permissions (skip end point protection using getEnvPermission)\n syncPathDto.permissions = getEnvPermissions(req.space, req.space.root)\n const pathId = await this.syncQueries.createPath(client.id, syncDBProps, syncPathDto)\n return { id: pathId, permissions: syncPathDto.permissions }\n }\n\n async deletePath(user: UserModel, pathId: number, clientId?: string): Promise<void> {\n clientId = user.clientId || clientId\n if (!clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.syncQueries.clientExistsForOwner(user.id, clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n try {\n await this.syncQueries.deletePath(clientId, pathId)\n } catch (e) {\n this.logger.error({ tag: this.deletePath.name, msg: `${e}` })\n throw new HttpException('Unable to remove path', HttpStatus.BAD_REQUEST)\n }\n }\n\n async updatePath(user: UserModel, clientId: string, pathId: number, syncPathUpdateDto: SyncPathUpdateDto): Promise<SyncPathSettings> {\n if (!(await this.syncQueries.clientExistsForOwner(user.id, clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const syncPathSettings: SyncPathSettings = await this.syncQueries.getPathSettings(clientId, pathId)\n if (!syncPathSettings) {\n throw new HttpException('Sync path not found', HttpStatus.NOT_FOUND)\n }\n // delete possible id\n delete syncPathUpdateDto.id\n // update current path settings\n Object.assign(syncPathSettings, syncPathUpdateDto)\n syncPathSettings.timestamp = currentTimeStamp()\n try {\n await this.syncQueries.updatePathSettings(clientId, pathId, syncPathSettings)\n } catch (e) {\n this.logger.error({ tag: this.updatePath.name, msg: `${e}` })\n throw new HttpException('Unable to update path', HttpStatus.INTERNAL_SERVER_ERROR)\n } finally {\n // clear cache\n this.syncQueries.clearCachePathSettings(clientId, pathId)\n }\n return syncPathSettings\n }\n\n async updatePaths(\n user: UserModel,\n syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n /* Update the client or server paths */\n if (!user.clientId) {\n throw new HttpException('Client id is missing', HttpStatus.BAD_REQUEST)\n }\n if (!(await this.syncQueries.clientExistsForOwner(user.id, user.clientId))) {\n throw new HttpException('You are not allowed to do this action', HttpStatus.FORBIDDEN)\n }\n const clientPathIds: number[] = syncPathsDto.map((p) => p.id)\n const serverPathIds: number[] = []\n\n const clientDiff: { add: SyncPathSettings[]; update: Partial<Record<keyof SyncPathSettings, any>>[]; delete: number[] } = {\n add: [],\n update: [],\n delete: []\n }\n const serverPaths: { id: number; settings: SyncPathSettings; remotePath: string }[] = await this.syncQueries.getPaths(user.clientId)\n for (const serverPath of serverPaths) {\n if (!serverPath.remotePath) {\n // unable to determine path, will be stored as deleted\n continue\n }\n let space: SpaceEnv\n try {\n space = await this.spacesManager.spaceEnv(user, SYNC_PATH_TO_SPACE_SEGMENTS(serverPath.remotePath), true)\n } catch (e) {\n throw new HttpException(e.message, HttpStatus.BAD_REQUEST)\n }\n if (!space) {\n // removed or inaccessible space, the path will be stored as deleted\n continue\n }\n serverPathIds.push(serverPath.id)\n if (clientPathIds.indexOf(serverPath.id) === -1) {\n // path exists on server but not on client, add it to client\n clientDiff.add.push({ ...serverPath.settings, id: serverPath.id, remotePath: serverPath.remotePath, permissions: space.envPermissions })\n continue\n }\n\n // path exists on both server and client side\n const clientPath: SyncPathDto = syncPathsDto.find((p) => p.id === serverPath.id)\n // remotePath and permissions settings are only managed by server\n const updateClientInfo: { remotePath?: string; permissions?: string } = {\n ...(serverPath.remotePath !== clientPath.remotePath && { remotePath: serverPath.remotePath }),\n ...(space.envPermissions !== clientPath.permissions && { permissions: space.envPermissions })\n }\n const clientNewer = clientPath.timestamp > serverPath.settings.timestamp\n const serverNewer = clientPath.timestamp < serverPath.settings.timestamp\n const hasUpdates = Object.keys(updateClientInfo).length > 0\n\n let updatedSettings: SyncPathSettings = { ...serverPath.settings, ...updateClientInfo }\n\n if (clientNewer) {\n updatedSettings = { ...clientPath, ...updateClientInfo }\n } else if (serverNewer) {\n clientDiff.update.push({ id: clientPath.id, ...serverPath.settings, ...updateClientInfo })\n }\n\n if (clientNewer || hasUpdates || serverPath.settings.lastSync !== clientPath.lastSync) {\n this.syncQueries\n .updatePathSettings(user.clientId, clientPath.id, { ...updatedSettings, lastSync: clientPath.lastSync })\n .catch((e: Error) => this.logger.error({ tag: this.updatePaths.name, msg: `${e}` }))\n }\n\n if (!clientNewer && hasUpdates) {\n clientDiff.update.push({ id: clientPath.id, ...updateClientInfo })\n }\n }\n // path does not exist on server side\n clientDiff.delete = clientPathIds.filter((cid) => serverPathIds.indexOf(cid) === -1)\n for (const cPathId of clientDiff.delete) {\n const cPath: SyncPathDto = syncPathsDto.find((p) => p.id === cPathId)\n this.notify(user.id, ACTION.DELETE, cPath.remotePath).catch((e: Error) => this.logger.error({ tag: this.updatePaths.name, msg: `${e}` }))\n }\n // clear cache\n clientDiff.update.forEach((path) => this.syncQueries.clearCachePathSettings(user.clientId, path.id))\n return clientDiff\n }\n\n private async getDBProps(space: SpaceEnv): Promise<SyncDBProps> {\n if (space.inSharesList) {\n throw new HttpException('Syncing all shares is not supported. Please select a subdirectory', HttpStatus.BAD_REQUEST)\n } else if (space.inPersonalSpace) {\n if (space.paths.length) {\n return { ownerId: space.dbFile.ownerId, fileId: await this.getOrCreateFileId(space) }\n } else {\n throw new HttpException('Syncing all personal files is not supported. Please select a subdirectory', HttpStatus.BAD_REQUEST)\n }\n } else if (space.inFilesRepository) {\n if (!space?.root?.alias) {\n // The synchronization direction should be adapted for each root depending on the permissions, this is not yet supported\n throw new HttpException('Syncing the entire space is not yet supported. Please select a subdirectory', HttpStatus.BAD_REQUEST)\n }\n if (space.root.id && !space.paths.length) {\n return { spaceId: space.id, spaceRootId: space.root.id }\n } else {\n return { spaceId: space.id, spaceRootId: space?.root?.id || null, fileId: await this.getOrCreateFileId(space) }\n }\n } else if (space.inSharesRepository) {\n if (space.paths.length) {\n return { shareId: space.id, fileId: await this.getOrCreateFileId(space) }\n } else {\n return { shareId: space.id }\n }\n }\n }\n\n private async getOrCreateFileId(space: SpaceEnv): Promise<number> {\n const fileProps: FileProps = await getProps(space.realPath, space.dbFile.path)\n let fileId: number = await this.filesQueries.getSpaceFileId(fileProps, space.dbFile)\n if (!fileId) {\n fileId = await this.filesQueries.getOrCreateSpaceFile(fileId, { ...fileProps, id: undefined }, space.dbFile)\n }\n return fileId\n }\n\n private async notify(userId: number, action: ACTION, remotePath: string) {\n const notification: NotificationContent = {\n app: NOTIFICATION_APP.SYNC,\n event: NOTIFICATION_APP_EVENT.SYNC[action],\n element: remotePath,\n url: [...SYNC_PATH_REPOSITORY[remotePath.split('/').at(0)], ...remotePath.split('/').slice(1, -1)].join('/')\n }\n this.notificationsManager\n .create([userId], notification, {\n currentUrl: this.contextManager.headerOriginUrl(),\n action: action\n })\n .catch((e: Error) => this.logger.error({ tag: this.notify.name, msg: `${e}` }))\n }\n}\n"],"names":["SyncPathsManager","createPath","req","syncPathDto","user","clientId","HttpException","HttpStatus","BAD_REQUEST","space","quotaIsExceeded","INSUFFICIENT_STORAGE","syncDBProps","getDBProps","isPathExists","realPath","remotePath","NOT_FOUND","isPathIsDir","client","syncQueries","getClient","id","params","permissions","getEnvPermissions","root","pathId","deletePath","clientExistsForOwner","FORBIDDEN","e","logger","error","tag","name","msg","updatePath","syncPathUpdateDto","syncPathSettings","getPathSettings","Object","assign","timestamp","currentTimeStamp","updatePathSettings","INTERNAL_SERVER_ERROR","clearCachePathSettings","updatePaths","syncPathsDto","clientPathIds","map","p","serverPathIds","clientDiff","add","update","delete","serverPaths","getPaths","serverPath","spacesManager","spaceEnv","SYNC_PATH_TO_SPACE_SEGMENTS","message","push","indexOf","settings","envPermissions","clientPath","find","updateClientInfo","clientNewer","serverNewer","hasUpdates","keys","length","updatedSettings","lastSync","catch","filter","cid","cPathId","cPath","notify","ACTION","DELETE","forEach","path","inSharesList","inPersonalSpace","paths","ownerId","dbFile","fileId","getOrCreateFileId","inFilesRepository","alias","spaceId","spaceRootId","inSharesRepository","shareId","fileProps","getProps","filesQueries","getSpaceFileId","getOrCreateSpaceFile","undefined","userId","action","notification","app","NOTIFICATION_APP","SYNC","event","NOTIFICATION_APP_EVENT","element","url","SYNC_PATH_REPOSITORY","split","at","slice","join","notificationsManager","create","currentUrl","contextManager","headerOriginUrl","Logger"],"mappings":"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"}
@@ -1,8 +1,4 @@
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";
1
+ "use strict";
6
2
  Object.defineProperty(exports, "__esModule", {
7
3
  value: true
8
4
  });
@@ -708,7 +704,7 @@ describe(_syncpathsmanagerservice.SyncPathsManager.name, ()=>{
708
704
  // wait for microtasks to ensure .catch executed
709
705
  await flush();
710
706
  expect(loggerSpy).toHaveBeenCalled();
711
- expect(loggerSpy.mock.calls.some(([msg])=>String(msg).includes('updatePaths'))).toBe(true);
707
+ expect(loggerSpy.mock.calls.some(([payload])=>payload?.tag === 'updatePaths')).toBe(true);
712
708
  });
713
709
  it('should catch notify failure at updatePaths level when building notification fails', async ()=>{
714
710
  syncQueries.clientExistsForOwner.mockResolvedValue(true);
@@ -731,7 +727,7 @@ describe(_syncpathsmanagerservice.SyncPathsManager.name, ()=>{
731
727
  1
732
728
  ]);
733
729
  expect(loggerSpy).toHaveBeenCalled();
734
- expect(loggerSpy.mock.calls.some(([msg])=>String(msg).includes('updatePaths'))).toBe(true);
730
+ expect(loggerSpy.mock.calls.some(([payload])=>payload?.tag === 'updatePaths')).toBe(true);
735
731
  // create not called because we failed before reaching it
736
732
  expect(notificationsManager.create).not.toHaveBeenCalled();
737
733
  });
@@ -757,7 +753,7 @@ describe(_syncpathsmanagerservice.SyncPathsManager.name, ()=>{
757
753
  ]);
758
754
  expect(loggerSpy).toHaveBeenCalled();
759
755
  // error comes from notify() catch
760
- expect(loggerSpy.mock.calls.some(([msg])=>String(msg).includes('notify'))).toBe(true);
756
+ expect(loggerSpy.mock.calls.some(([payload])=>payload?.tag === 'notify')).toBe(true);
761
757
  });
762
758
  });
763
759
  describe('getDBProps (private) branches', ()=>{
@@ -766,20 +762,20 @@ describe(_syncpathsmanagerservice.SyncPathsManager.name, ()=>{
766
762
  inSharesList: true
767
763
  })).rejects.toMatchObject({
768
764
  status: _common.HttpStatus.BAD_REQUEST,
769
- message: 'Sync all shares is not supported, you must select a sub-directory'
765
+ message: 'Syncing all shares is not supported. Please select a subdirectory'
770
766
  });
771
767
  });
772
- it('should return ownerId only for personal space at root', async ()=>{
773
- const res = await service.getDBProps({
768
+ it('should throw BAD_REQUEST for personal space selection', async ()=>{
769
+ await expect(service.getDBProps({
774
770
  inSharesList: false,
775
771
  inPersonalSpace: true,
776
772
  paths: [],
777
773
  dbFile: {
778
774
  ownerId: 42
779
775
  }
780
- });
781
- expect(res).toEqual({
782
- ownerId: 42
776
+ })).rejects.toMatchObject({
777
+ status: _common.HttpStatus.BAD_REQUEST,
778
+ message: 'Syncing all personal files is not supported. Please select a subdirectory'
783
779
  });
784
780
  });
785
781
  it('should return ownerId and fileId for personal space subdir', async ()=>{
@@ -808,7 +804,7 @@ describe(_syncpathsmanagerservice.SyncPathsManager.name, ()=>{
808
804
  paths: []
809
805
  })).rejects.toMatchObject({
810
806
  status: _common.HttpStatus.BAD_REQUEST,
811
- message: 'Sync all space is not yet supported, you must select a sub-directory'
807
+ message: 'Syncing the entire space is not yet supported. Please select a subdirectory'
812
808
  });
813
809
  });
814
810
  it('should return spaceId and rootId for files repository root selection', async ()=>{