@sync-in/server 1.10.1 → 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 (1057) hide show
  1. package/CHANGELOG.md +47 -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 +18 -17
  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-U5E5H2DD.js → chunk-27ATUHBH.js} +1 -1
  940. package/static/{chunk-HZAB6F4Q.js → chunk-2CKLZ3FM.js} +1 -1
  941. package/static/{chunk-XZHWESIY.js → chunk-2QZPX7LO.js} +1 -1
  942. package/static/{chunk-UOK3LKSX.js → chunk-2R6IBBPZ.js} +1 -1
  943. package/static/{chunk-DVCN3P7Q.js → chunk-4FIGEBNL.js} +1 -1
  944. package/static/chunk-4P3JABAP.js +13 -0
  945. package/static/chunk-5CZOSAMZ.js +1 -0
  946. package/static/{chunk-RBTLSPYJ.js → chunk-677WUBCT.js} +1 -1
  947. package/static/{chunk-KEZNIIFH.js → chunk-74CAHBFM.js} +1 -1
  948. package/static/{chunk-WRK2FTKU.js → chunk-7GWW6MJO.js} +1 -1
  949. package/static/{chunk-EKWB5W72.js → chunk-7WOPGQXB.js} +1 -1
  950. package/static/{chunk-IMFO2MI7.js → chunk-A4UGPSWX.js} +1 -1
  951. package/static/{chunk-KDUAB76O.js → chunk-AHO37FKW.js} +1 -1
  952. package/static/chunk-AQCXMKP3.js +1 -0
  953. package/static/chunk-B6PDYCRO.js +3 -0
  954. package/static/{chunk-PPJCVBJH.js → chunk-CU76ATCF.js} +1 -1
  955. package/static/{chunk-ARS47O5X.js → chunk-CWYHOPOP.js} +1 -1
  956. package/static/{chunk-CSVPAZHK.js → chunk-E5WI5725.js} +1 -1
  957. package/static/{chunk-XX3JPJUM.js → chunk-FC5HTKVM.js} +1 -1
  958. package/static/{chunk-QGHNJVJ6.js → chunk-FOSM7EYI.js} +1 -1
  959. package/static/{chunk-JAJ7VXMB.js → chunk-GAZO25PI.js} +1 -1
  960. package/static/{chunk-IHS5LSJJ.js → chunk-GB7ABR5N.js} +1 -1
  961. package/static/{chunk-27V66YJV.js → chunk-GEHFKZQ5.js} +2 -2
  962. package/static/{chunk-3QTROEHV.js → chunk-GQFMWVFD.js} +1 -1
  963. package/static/{chunk-FWQJ4ZCD.js → chunk-GVNTC564.js} +1 -1
  964. package/static/{chunk-4NIYCYRS.js → chunk-HGL3NYP2.js} +2 -2
  965. package/static/chunk-HLIWPWRA.js +1 -0
  966. package/static/{chunk-3VRUIWQG.js → chunk-HNYB3M4S.js} +1 -1
  967. package/static/{chunk-7HJFIMNF.js → chunk-HUXAUQMN.js} +1 -1
  968. package/static/chunk-I2XA6PPK.js +1 -0
  969. package/static/{chunk-RJULB733.js → chunk-ISV3BO6R.js} +1 -1
  970. package/static/{chunk-R4VYKZVJ.js → chunk-IWWBV6EM.js} +1 -1
  971. package/static/{chunk-TTWMFWEC.js → chunk-JV3AGU5B.js} +1 -1
  972. package/static/{chunk-X7NHX5C7.js → chunk-K25E7YGG.js} +1 -1
  973. package/static/chunk-K46PUTZB.js +1 -0
  974. package/static/{chunk-D2MLAO5N.js → chunk-KERFLJ56.js} +1 -7
  975. package/static/{chunk-LZUHREOF.js → chunk-KJD3KFF3.js} +1 -1
  976. package/static/chunk-KPKSI23S.js +1 -0
  977. package/static/{chunk-CMNMPG6Z.js → chunk-KZS7CTNR.js} +1 -1
  978. package/static/{chunk-RNVPQQKT.js → chunk-L5IHUVXL.js} +1 -1
  979. package/static/{chunk-2GXOVGTD.js → chunk-L7RRX2M3.js} +1 -1
  980. package/static/{chunk-WFMEUST4.js → chunk-LGWJ2WKU.js} +1 -1
  981. package/static/{chunk-ZOMRIN3G.js → chunk-MLC7JK2H.js} +2 -2
  982. package/static/{chunk-76REYAEA.js → chunk-MOHNYW2A.js} +1 -1
  983. package/static/{chunk-ZHUBWKA2.js → chunk-MTRXBVWZ.js} +1 -1
  984. package/static/{chunk-QJ22N76V.js → chunk-MZQK6LNV.js} +1 -1
  985. package/static/{chunk-SDJNZULP.js → chunk-NCDUOVMW.js} +1 -1
  986. package/static/chunk-NGUAJIGI.js +1 -0
  987. package/static/chunk-NIPP6JDI.js +1 -0
  988. package/static/{chunk-VD5JHSDS.js → chunk-NMTBMHUL.js} +1 -1
  989. package/static/chunk-O4XXMZFX.js +4 -0
  990. package/static/{chunk-WZPF4LS2.js → chunk-OANZITPM.js} +1 -1
  991. package/static/{chunk-JNTNMIUH.js → chunk-OGE4SAHU.js} +1 -1
  992. package/static/{chunk-S6H2ELRY.js → chunk-OI3ME22C.js} +1 -1
  993. package/static/{chunk-7KAYOR3A.js → chunk-Q3EGCMF5.js} +1 -1
  994. package/static/chunk-QF2NSHZA.js +1 -0
  995. package/static/{chunk-3ZBAQTHJ.js → chunk-QIGUDEZF.js} +1 -1
  996. package/static/{chunk-76M3BMK6.js → chunk-QJVC3SRJ.js} +11 -11
  997. package/static/{chunk-VBTZDHZ3.js → chunk-QKN6LAAA.js} +1 -1
  998. package/static/{chunk-JRXG43AA.js → chunk-QRFESU5O.js} +2 -2
  999. package/static/chunk-QVRVFYJH.js +1 -0
  1000. package/static/{chunk-BCN4T5DO.js → chunk-RFJIPIOK.js} +2 -2
  1001. package/static/{chunk-2RWLNKZH.js → chunk-RLL634K4.js} +1 -1
  1002. package/static/{chunk-D5FQ72R4.js → chunk-RS2OFKWP.js} +1 -1
  1003. package/static/{chunk-CN5YVRFT.js → chunk-RWAAC3A4.js} +1 -1
  1004. package/static/{chunk-LWSCODLD.js → chunk-RWCNTCU5.js} +1 -1
  1005. package/static/{chunk-FTFEQDWH.js → chunk-S5Y64DDS.js} +1 -1
  1006. package/static/{chunk-J7474P3L.js → chunk-SLG5KDU6.js} +1 -1
  1007. package/static/chunk-TJ4CVFEL.js +1 -0
  1008. package/static/{chunk-KAUCN24H.js → chunk-TWCGKSYE.js} +1 -1
  1009. package/static/{chunk-PDG7DOEF.js → chunk-UMDRE4S7.js} +1 -1
  1010. package/static/chunk-VRIOLRYR.js +5 -0
  1011. package/static/chunk-VS4O2XDP.js +1 -0
  1012. package/static/{chunk-ZEJLIGAY.js → chunk-VSBFNFOM.js} +1 -1
  1013. package/static/{chunk-XSURUW7C.js → chunk-WN4WXCVK.js} +1 -1
  1014. package/static/{chunk-S44QIK3G.js → chunk-WX7RXW7K.js} +1 -1
  1015. package/static/{chunk-3ZLBVUCX.js → chunk-XC4POKR3.js} +2 -2
  1016. package/static/{chunk-TNCKNU6I.js → chunk-Y4AUYQTG.js} +1 -1
  1017. package/static/{chunk-3MVPXC3U.js → chunk-Y67J3BOL.js} +1 -1
  1018. package/static/{chunk-QTPIEEZW.js → chunk-YMIXHRJQ.js} +1 -7
  1019. package/static/{chunk-VZFZUI6D.js → chunk-ZUNKFAKP.js} +1 -1
  1020. package/static/index.html +3 -3
  1021. package/static/main-QN4UCOC5.js +5 -0
  1022. package/static/{styles-XLLEY5Y3.css → styles-46GLIE7Y.css} +1 -1
  1023. package/server/authentication/constants/auth-ldap.js.map +0 -1
  1024. package/server/authentication/dto/two-fa-verify.dto.js.map +0 -1
  1025. package/server/authentication/guards/auth-two-fa-guard.js.map +0 -1
  1026. package/server/authentication/interfaces/two-fa-setup.interface.js +0 -10
  1027. package/server/authentication/interfaces/two-fa-setup.interface.js.map +0 -1
  1028. package/server/authentication/models/auth-method.js +0 -18
  1029. package/server/authentication/models/auth-method.js.map +0 -1
  1030. package/server/authentication/services/auth-manager.service.js.map +0 -1
  1031. package/server/authentication/services/auth-manager.service.spec.js.map +0 -1
  1032. package/server/authentication/services/auth-methods/auth-method-database.service.js.map +0 -1
  1033. package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +0 -1
  1034. package/server/authentication/services/auth-methods/auth-method-ldap.service.js +0 -326
  1035. package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +0 -1
  1036. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +0 -534
  1037. package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +0 -1
  1038. package/server/authentication/services/auth-methods/auth-method-two-fa.service.js.map +0 -1
  1039. package/server/authentication/services/auth-methods/auth-method-two-fa.service.spec.js.map +0 -1
  1040. package/static/chunk-2YQ4SX3A.js +0 -13
  1041. package/static/chunk-46TJLPJY.js +0 -1
  1042. package/static/chunk-6OEOADR6.js +0 -1
  1043. package/static/chunk-AALPWGPB.js +0 -3
  1044. package/static/chunk-CVXLHSO5.js +0 -1
  1045. package/static/chunk-G7RZN7HN.js +0 -1
  1046. package/static/chunk-LTJNLOX2.js +0 -1
  1047. package/static/chunk-NIKNG2FX.js +0 -1
  1048. package/static/chunk-NNZWSNAW.js +0 -1
  1049. package/static/chunk-NWKBB7J4.js +0 -1
  1050. package/static/chunk-PVYVY3GD.js +0 -1
  1051. package/static/chunk-Q5X5TPAG.js +0 -1
  1052. package/static/chunk-R4VMWCM5.js +0 -1
  1053. package/static/chunk-SNOOCDJD.js +0 -1
  1054. package/static/chunk-SPQH3ATC.js +0 -5
  1055. package/static/chunk-ZCSHU3D7.js +0 -1
  1056. package/static/chunk-ZU5MQTFN.js +0 -4
  1057. package/static/main-5O3KLGIR.js +0 -11
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-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 { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SyncPathsManager } from './sync-paths-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock modules used directly inside SyncPathsManager\njest.mock('../../../common/shared', () => ({\n currentTimeStamp: jest.fn(() => 1000)\n}))\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n getProps: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n getEnvPermissions: jest.fn(() => 'server-perms')\n}))\njest.mock('../constants/sync', () => ({\n SYNC_PATH_REPOSITORY: {\n SPACES: ['spaces'],\n PERSONAL: ['personal'],\n SHARES: ['shares']\n }\n}))\njest.mock('../../notifications/constants/notifications', () => ({\n NOTIFICATION_APP: { SYNC: 'SYNC' },\n NOTIFICATION_APP_EVENT: { SYNC: { DELETE: 'DELETE', CREATE: 'CREATE', UPDATE: 'UPDATE' } }\n}))\n\ndescribe(SyncPathsManager.name, () => {\n let service: SyncPathsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let spacesManager: { spaceEnv: jest.Mock }\n let usersQueries: Record<string, jest.Mock>\n let filesQueries: { getSpaceFileId: jest.Mock; getOrCreateSpaceFile: jest.Mock }\n let notificationsManager: { create: jest.Mock }\n let syncQueries: {\n getClient: jest.Mock\n clientExistsForOwner: jest.Mock\n createPath: jest.Mock\n deletePath: jest.Mock\n getPaths: jest.Mock\n getPathSettings: jest.Mock\n updatePathSettings: jest.Mock\n clearCachePathSettings: jest.Mock\n }\n\n const userWith = (clientId?: string) => ({ id: 1, clientId })\n const flush = () => new Promise((r) => setImmediate(r))\n\n beforeEach(async () => {\n contextManager = { headerOriginUrl: jest.fn(() => 'http://origin.local') }\n spacesManager = { spaceEnv: jest.fn() }\n usersQueries = {}\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n syncQueries = {\n getClient: jest.fn(),\n clientExistsForOwner: jest.fn(),\n createPath: jest.fn(),\n deletePath: jest.fn(),\n getPaths: jest.fn(),\n getPathSettings: jest.fn(),\n updatePathSettings: jest.fn().mockResolvedValue(undefined),\n clearCachePathSettings: jest.fn()\n }\n ;(isPathExists as jest.Mock).mockReset()\n ;(isPathIsDir as jest.Mock).mockReset()\n ;(getProps as jest.Mock).mockReset()\n ;(getEnvPermissions as jest.Mock).mockReset().mockReturnValue('server-perms')\n ;(currentTimeStamp as jest.Mock).mockReset().mockReturnValue(1000)\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncPathsManager,\n { provide: ContextManager, useValue: contextManager },\n { provide: SpacesManager, useValue: spacesManager },\n { provide: UsersQueries, useValue: usersQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncPathsManager>(SyncPathsManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('createPath', () => {\n const baseReq = () =>\n ({\n user: { id: 1, clientId: 'client-1' },\n params: { '*': 'SPACES/alias/sub' },\n space: {\n realPath: '/real/path',\n quotaIsExceeded: false,\n root: { id: 1, alias: 'alias' },\n inFilesRepository: true,\n paths: ['sub'],\n dbFile: { ownerId: 1, path: '.' },\n id: 10\n }\n }) as any\n\n it('should throw BAD_REQUEST when client id is missing', async () => {\n const req = baseReq()\n req.user.clientId = undefined\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw INSUFFICIENT_STORAGE when storage quota is exceeded', async () => {\n const req = baseReq()\n req.space.quotaIsExceeded = true\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.INSUFFICIENT_STORAGE\n })\n })\n\n it.each([\n {\n title: 'NOT_FOUND when remote path does not exist',\n setup: () => (isPathExists as jest.Mock).mockResolvedValue(false),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Remote path not found : client/remote' }\n },\n {\n title: 'BAD_REQUEST when remote path is not a directory',\n setup: () => ((isPathExists as jest.Mock).mockResolvedValue(true), (isPathIsDir as jest.Mock).mockResolvedValue(false)),\n expected: { status: HttpStatus.BAD_REQUEST, message: 'Remote path must be a directory' }\n },\n {\n title: 'NOT_FOUND when client is not found',\n setup: () => (\n (isPathExists as jest.Mock).mockResolvedValue(true),\n (isPathIsDir as jest.Mock).mockResolvedValue(true),\n syncQueries.getClient.mockResolvedValue(null)\n ),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Client not found' }\n }\n ])('should throw $title', async ({ setup, expected }) => {\n const req = baseReq()\n setup()\n await expect(service.createPath(req, { remotePath: 'client/remote' } as any)).rejects.toMatchObject(expected)\n })\n\n it('should create path and return id and permissions, overriding remotePath and permissions', async () => {\n const req = baseReq()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n ;(getEnvPermissions as jest.Mock).mockReturnValue('env-perms')\n syncQueries.getClient.mockResolvedValue({ id: 'client-1' })\n // Spy on private getDBProps to simplify\n const getDBPropsSpy = jest.spyOn<any, any>(service as any, 'getDBProps').mockResolvedValue({ ownerId: 1 })\n syncQueries.createPath.mockResolvedValue(123)\n\n const res = await service.createPath(req, { remotePath: 'client/remote', permissions: 'client-perms' } as any)\n expect(res).toEqual({ id: 123, permissions: 'env-perms' })\n expect(syncQueries.createPath).toHaveBeenCalledWith(\n 'client-1',\n { ownerId: 1 },\n expect.objectContaining({ remotePath: 'SPACES/alias/sub', permissions: 'env-perms' })\n )\n\n getDBPropsSpy.mockRestore()\n })\n })\n\n describe('deletePath', () => {\n it.each([\n { user: { id: 1, clientId: undefined } as any, id: 10, status: HttpStatus.BAD_REQUEST, msg: 'Client id is missing' },\n { user: { id: 1, clientId: 'c1' } as any, id: 10, status: HttpStatus.FORBIDDEN }\n ])('should handle errors (status=$status)', async ({ user, id, status, msg }) => {\n if (status === HttpStatus.FORBIDDEN) syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.deletePath(user, id)).rejects.toMatchObject(msg ? { status, message: msg } : { status })\n })\n\n it('should catch errors from deletePath and throw BAD_REQUEST', async () => {\n const user: any = { id: 1, clientId: 'c1' }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockRejectedValue(new Error('db'))\n await expect(service.deletePath(user, 10)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Unable to remove path'\n })\n expect(syncQueries.deletePath).toHaveBeenCalledWith('c1', 10)\n })\n\n it('should delete path successfully when allowed', async () => {\n const user: any = { id: 1, clientId: undefined }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockResolvedValue(undefined)\n await expect(service.deletePath(user, 10, 'cX')).resolves.toBeUndefined()\n expect(syncQueries.deletePath).toHaveBeenCalledWith('cX', 10)\n })\n })\n\n describe('updatePath', () => {\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should throw NOT_FOUND when path settings do not exist', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue(null)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Sync path not found'\n })\n })\n\n it('should update path settings, set new timestamp, clear cache and return updated settings', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1, remotePath: '/a', permissions: 'p' })\n syncQueries.updatePathSettings.mockResolvedValue(undefined)\n ;(currentTimeStamp as jest.Mock).mockReturnValue(4242)\n\n const out = await service.updatePath({ id: 1 } as any, 'c1', 5, { id: 666, lastSync: 3, permissions: 'new' } as any)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 5,\n expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' })\n )\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n expect(out).toEqual(expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' }))\n })\n\n it('should clear cache and throw INTERNAL_SERVER_ERROR when update fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1 })\n syncQueries.updatePathSettings.mockRejectedValue(new Error('db'))\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR,\n message: 'Unable to update path'\n })\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n })\n })\n\n describe('updatePaths', () => {\n beforeEach(() => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n })\n\n it('should throw when client id is missing', async () => {\n await expect(service.updatePaths(userWith(undefined) as any, [])).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePaths(userWith('c1') as any, [])).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should mark client paths as deleted and notify when no corresponding server paths (server remotePath undefined)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: undefined }])\n const clientPaths = [{ id: 1, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, clientPaths)\n expect(res.delete).toEqual([1])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should propagate spaceEnv errors as BAD_REQUEST', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 1, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n await expect(\n service.updatePaths(userWith('c1') as any, [{ id: 1, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any])\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'boom'\n })\n })\n\n it('should skip server path when space is null and mark client item as deleted', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue(null)\n const res = await service.updatePaths(userWith('c1') as any, [\n { id: 2, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any\n ])\n expect(res.delete).toEqual([2])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should add server-only path to client with server permissions', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 3, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'perm-xyz' })\n const res = await service.updatePaths(userWith('c1') as any, [])\n expect(res.add).toHaveLength(1)\n expect(res.add[0]).toEqual(expect.objectContaining({ id: 3, remotePath: 'SPACES/x', permissions: 'perm-xyz' }))\n })\n\n it('should update server settings from client when client is newer (no hasUpdates)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 5, settings: { timestamp: 1, lastSync: 1, foo: 'server' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 5, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', foo: 'client' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 5, expect.objectContaining({ foo: 'client', lastSync: 2 }))\n // No client update instructions because hasUpdates=false and serverNewer=false\n })\n\n it('should push server-newer updates to client and also remotePath/permissions corrections', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 7, settings: { timestamp: 20, lastSync: 5, srv: true }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 7, timestamp: 10, lastSync: 5, remotePath: 'SPACES/wrong', permissions: 'old' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Should have two client updates: one full server settings + corrections, and one corrections-only\n expect(res.update).toEqual(\n expect.arrayContaining([\n expect.objectContaining({ id: 7, srv: true, remotePath: 'SPACES/correct', permissions: 'permX' }),\n expect.objectContaining({ id: 7, remotePath: 'SPACES/correct', permissions: 'permX' })\n ])\n )\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 7, expect.objectContaining({ lastSync: 5 }))\n // clear cache called for each update instruction\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledTimes(res.update.length)\n for (const u of res.update) {\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', u.id)\n }\n })\n\n it('should trigger update when lastSync differs even if timestamps and settings match', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 9, settings: { timestamp: 10, lastSync: 1, flag: 'S' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 9, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', flag: 'S' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 9, expect.objectContaining({ lastSync: 2 }))\n })\n\n it('should perform no changes when client and server are identical (no-op branch)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 12, settings: { timestamp: 5, lastSync: 7, flag: 'A' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 12, timestamp: 5, lastSync: 7, remotePath: 'SPACES/x', permissions: 'p', flag: 'A' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n expect(res).toEqual({ add: [], update: [], delete: [] })\n expect(syncQueries.updatePathSettings).not.toHaveBeenCalled()\n })\n\n it('should correct client info while keeping server settings when timestamps are equal (hasUpdates=true)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // Server has srv='S', client has wrong remotePath/permissions and extra clientOnly flag\n syncQueries.getPaths.mockResolvedValue([{ id: 13, settings: { timestamp: 5, lastSync: 1, srv: 'S' }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 13, timestamp: 5, lastSync: 1, remotePath: 'SPACES/wrong', permissions: 'old', clientOnly: 'C' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Server uses its own settings base (srv: 'S') with corrections applied\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 13,\n expect.objectContaining({ srv: 'S', lastSync: 1, remotePath: 'SPACES/correct', permissions: 'permX' })\n )\n // Client should receive corrections for remotePath and permissions\n expect(res.update).toEqual(expect.arrayContaining([expect.objectContaining({ id: 13, remotePath: 'SPACES/correct', permissions: 'permX' })]))\n })\n\n it('should log error when updatePathSettings rejects inside updatePaths', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 11, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n // Force client newer to trigger updatePathSettings\n const client = [{ id: 11, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p' } as any]\n syncQueries.updatePathSettings.mockRejectedValueOnce(new Error('db-fail'))\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n\n await service.updatePaths(userWith('c1') as any, client)\n // wait for microtasks to ensure .catch executed\n await flush()\n\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('updatePaths'))).toBe(true)\n })\n\n it('should catch notify failure at updatePaths level when building notification fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // No server paths: will mark client path as deleted and call notify\n syncQueries.getPaths.mockResolvedValue([])\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n // BAD first segment to make notify fail while building URL (before notificationsManager.create)\n const client = [{ id: 1, remotePath: 'BAD/a/b', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([1])\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('updatePaths'))).toBe(true)\n // create not called because we failed before reaching it\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n\n it('should catch error inside notify when notifications creation fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([])\n // Valid remotePath to build URL correctly\n const client = [{ id: 2, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n notificationsManager.create.mockRejectedValueOnce(new Error('notify-fail'))\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([2])\n expect(loggerSpy).toHaveBeenCalled()\n // error comes from notify() catch\n expect(loggerSpy.mock.calls.some(([msg]) => String(msg).includes('notify'))).toBe(true)\n })\n })\n\n describe('getDBProps (private) branches', () => {\n it('should throw BAD_REQUEST for shares list selection', async () => {\n await expect((service as any).getDBProps({ inSharesList: true } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Sync all shares is not supported, you must select a sub-directory'\n })\n })\n\n it('should return ownerId only for personal space at root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: true,\n paths: [],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42 })\n })\n\n it('should return ownerId and fileId for personal space subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(77)\n const res = await (service as any).getDBProps({\n inPersonalSpace: true,\n paths: ['sub'],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42, fileId: 77 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should throw BAD_REQUEST for whole files repository without alias', async () => {\n await expect((service as any).getDBProps({ inFilesRepository: true, root: { alias: null }, paths: [] } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Sync all space is not yet supported, you must select a sub-directory'\n })\n })\n\n it('should return spaceId and rootId for files repository root selection', async () => {\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3 })\n })\n\n it('should return spaceId, rootId and fileId for files repository subdir or null root', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(88)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: ['sub']\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3, fileId: 88 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return spaceId and null spaceRootId plus fileId when files repository root has no id', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(90)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 6,\n root: { id: undefined, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 6, spaceRootId: null, fileId: 90 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return shareId only for shares repository root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: []\n } as any)\n expect(res).toEqual({ shareId: 9 })\n })\n\n it('should return shareId and fileId for shares repository subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(55)\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: ['sub']\n } as any)\n expect(res).toEqual({ shareId: 9, fileId: 55 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return undefined when no space flags match (no branch taken)', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: false,\n paths: []\n } as any)\n expect(res).toBeUndefined()\n })\n })\n\n describe('getOrCreateFileId (private) branches', () => {\n it('should return existing file id without creation', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(101)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(101)\n expect(filesQueries.getOrCreateSpaceFile).not.toHaveBeenCalled()\n })\n\n it('should create file when not exists and return its id', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ id: 999, name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(202)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(202)\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalledWith(0, expect.objectContaining({ id: undefined }), { path: '.' })\n })\n })\n})\n"],"names":["jest","mock","currentTimeStamp","fn","isPathExists","isPathIsDir","getProps","sanitizePath","p","getEnvPermissions","SYNC_PATH_REPOSITORY","SPACES","PERSONAL","SHARES","NOTIFICATION_APP","SYNC","NOTIFICATION_APP_EVENT","DELETE","CREATE","UPDATE","describe","SyncPathsManager","name","service","contextManager","spacesManager","usersQueries","filesQueries","notificationsManager","syncQueries","userWith","clientId","id","flush","Promise","r","setImmediate","beforeEach","headerOriginUrl","spaceEnv","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","getClient","clientExistsForOwner","createPath","deletePath","getPaths","getPathSettings","updatePathSettings","clearCachePathSettings","mockReset","mockReturnValue","module","Test","createTestingModule","providers","provide","ContextManager","useValue","SpacesManager","UsersQueries","FilesQueries","NotificationsManager","SyncQueries","compile","useLogger","get","it","expect","toBeDefined","baseReq","user","params","space","realPath","quotaIsExceeded","root","alias","inFilesRepository","paths","dbFile","ownerId","path","req","remotePath","rejects","toMatchObject","status","HttpStatus","BAD_REQUEST","message","INSUFFICIENT_STORAGE","each","title","setup","expected","NOT_FOUND","getDBPropsSpy","spyOn","res","permissions","toEqual","toHaveBeenCalledWith","objectContaining","mockRestore","msg","FORBIDDEN","mockRejectedValue","Error","resolves","toBeUndefined","updatePath","timestamp","lastSync","out","INTERNAL_SERVER_ERROR","envPermissions","updatePaths","settings","clientPaths","delete","toHaveBeenCalledTimes","add","toHaveLength","foo","client","srv","update","arrayContaining","length","u","flag","not","toHaveBeenCalled","clientOnly","mockRejectedValueOnce","loggerSpy","logger","mockImplementation","calls","some","String","includes","toBe","getDBProps","inSharesList","inPersonalSpace","getOrCreateFileIdSpy","fileId","spaceId","spaceRootId","inSharesRepository","shareId","getOrCreateFileId"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-paths-manager.service.spec.ts"],"sourcesContent":["import { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { ContextManager } from '../../../infrastructure/context/services/context-manager.service'\nimport { FilesQueries } from '../../files/services/files-queries.service'\nimport { getProps, isPathExists, isPathIsDir } from '../../files/utils/files'\nimport { NotificationsManager } from '../../notifications/services/notifications-manager.service'\nimport { SpacesManager } from '../../spaces/services/spaces-manager.service'\nimport { getEnvPermissions } from '../../spaces/utils/permissions'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SyncPathsManager } from './sync-paths-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Mock modules used directly inside SyncPathsManager\njest.mock('../../../common/shared', () => ({\n currentTimeStamp: jest.fn(() => 1000)\n}))\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn(),\n isPathIsDir: jest.fn(),\n getProps: jest.fn(),\n sanitizePath: jest.fn((p: string) => p)\n}))\njest.mock('../../spaces/utils/permissions', () => ({\n getEnvPermissions: jest.fn(() => 'server-perms')\n}))\njest.mock('../constants/sync', () => ({\n SYNC_PATH_REPOSITORY: {\n SPACES: ['spaces'],\n PERSONAL: ['personal'],\n SHARES: ['shares']\n }\n}))\njest.mock('../../notifications/constants/notifications', () => ({\n NOTIFICATION_APP: { SYNC: 'SYNC' },\n NOTIFICATION_APP_EVENT: { SYNC: { DELETE: 'DELETE', CREATE: 'CREATE', UPDATE: 'UPDATE' } }\n}))\n\ndescribe(SyncPathsManager.name, () => {\n let service: SyncPathsManager\n let contextManager: { headerOriginUrl: jest.Mock }\n let spacesManager: { spaceEnv: jest.Mock }\n let usersQueries: Record<string, jest.Mock>\n let filesQueries: { getSpaceFileId: jest.Mock; getOrCreateSpaceFile: jest.Mock }\n let notificationsManager: { create: jest.Mock }\n let syncQueries: {\n getClient: jest.Mock\n clientExistsForOwner: jest.Mock\n createPath: jest.Mock\n deletePath: jest.Mock\n getPaths: jest.Mock\n getPathSettings: jest.Mock\n updatePathSettings: jest.Mock\n clearCachePathSettings: jest.Mock\n }\n\n const userWith = (clientId?: string) => ({ id: 1, clientId })\n const flush = () => new Promise((r) => setImmediate(r))\n\n beforeEach(async () => {\n contextManager = { headerOriginUrl: jest.fn(() => 'http://origin.local') }\n spacesManager = { spaceEnv: jest.fn() }\n usersQueries = {}\n filesQueries = {\n getSpaceFileId: jest.fn(),\n getOrCreateSpaceFile: jest.fn()\n }\n notificationsManager = {\n create: jest.fn().mockResolvedValue(undefined)\n }\n syncQueries = {\n getClient: jest.fn(),\n clientExistsForOwner: jest.fn(),\n createPath: jest.fn(),\n deletePath: jest.fn(),\n getPaths: jest.fn(),\n getPathSettings: jest.fn(),\n updatePathSettings: jest.fn().mockResolvedValue(undefined),\n clearCachePathSettings: jest.fn()\n }\n ;(isPathExists as jest.Mock).mockReset()\n ;(isPathIsDir as jest.Mock).mockReset()\n ;(getProps as jest.Mock).mockReset()\n ;(getEnvPermissions as jest.Mock).mockReset().mockReturnValue('server-perms')\n ;(currentTimeStamp as jest.Mock).mockReset().mockReturnValue(1000)\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncPathsManager,\n { provide: ContextManager, useValue: contextManager },\n { provide: SpacesManager, useValue: spacesManager },\n { provide: UsersQueries, useValue: usersQueries },\n { provide: FilesQueries, useValue: filesQueries },\n { provide: NotificationsManager, useValue: notificationsManager },\n { provide: SyncQueries, useValue: syncQueries }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncPathsManager>(SyncPathsManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n\n describe('createPath', () => {\n const baseReq = () =>\n ({\n user: { id: 1, clientId: 'client-1' },\n params: { '*': 'SPACES/alias/sub' },\n space: {\n realPath: '/real/path',\n quotaIsExceeded: false,\n root: { id: 1, alias: 'alias' },\n inFilesRepository: true,\n paths: ['sub'],\n dbFile: { ownerId: 1, path: '.' },\n id: 10\n }\n }) as any\n\n it('should throw BAD_REQUEST when client id is missing', async () => {\n const req = baseReq()\n req.user.clientId = undefined\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw INSUFFICIENT_STORAGE when storage quota is exceeded', async () => {\n const req = baseReq()\n req.space.quotaIsExceeded = true\n await expect(service.createPath(req, { remotePath: 'x' } as any)).rejects.toMatchObject({\n status: HttpStatus.INSUFFICIENT_STORAGE\n })\n })\n\n it.each([\n {\n title: 'NOT_FOUND when remote path does not exist',\n setup: () => (isPathExists as jest.Mock).mockResolvedValue(false),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Remote path not found : client/remote' }\n },\n {\n title: 'BAD_REQUEST when remote path is not a directory',\n setup: () => ((isPathExists as jest.Mock).mockResolvedValue(true), (isPathIsDir as jest.Mock).mockResolvedValue(false)),\n expected: { status: HttpStatus.BAD_REQUEST, message: 'Remote path must be a directory' }\n },\n {\n title: 'NOT_FOUND when client is not found',\n setup: () => (\n (isPathExists as jest.Mock).mockResolvedValue(true),\n (isPathIsDir as jest.Mock).mockResolvedValue(true),\n syncQueries.getClient.mockResolvedValue(null)\n ),\n expected: { status: HttpStatus.NOT_FOUND, message: 'Client not found' }\n }\n ])('should throw $title', async ({ setup, expected }) => {\n const req = baseReq()\n setup()\n await expect(service.createPath(req, { remotePath: 'client/remote' } as any)).rejects.toMatchObject(expected)\n })\n\n it('should create path and return id and permissions, overriding remotePath and permissions', async () => {\n const req = baseReq()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(isPathIsDir as jest.Mock).mockResolvedValue(true)\n ;(getEnvPermissions as jest.Mock).mockReturnValue('env-perms')\n syncQueries.getClient.mockResolvedValue({ id: 'client-1' })\n // Spy on private getDBProps to simplify\n const getDBPropsSpy = jest.spyOn<any, any>(service as any, 'getDBProps').mockResolvedValue({ ownerId: 1 })\n syncQueries.createPath.mockResolvedValue(123)\n\n const res = await service.createPath(req, { remotePath: 'client/remote', permissions: 'client-perms' } as any)\n expect(res).toEqual({ id: 123, permissions: 'env-perms' })\n expect(syncQueries.createPath).toHaveBeenCalledWith(\n 'client-1',\n { ownerId: 1 },\n expect.objectContaining({ remotePath: 'SPACES/alias/sub', permissions: 'env-perms' })\n )\n\n getDBPropsSpy.mockRestore()\n })\n })\n\n describe('deletePath', () => {\n it.each([\n { user: { id: 1, clientId: undefined } as any, id: 10, status: HttpStatus.BAD_REQUEST, msg: 'Client id is missing' },\n { user: { id: 1, clientId: 'c1' } as any, id: 10, status: HttpStatus.FORBIDDEN }\n ])('should handle errors (status=$status)', async ({ user, id, status, msg }) => {\n if (status === HttpStatus.FORBIDDEN) syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.deletePath(user, id)).rejects.toMatchObject(msg ? { status, message: msg } : { status })\n })\n\n it('should catch errors from deletePath and throw BAD_REQUEST', async () => {\n const user: any = { id: 1, clientId: 'c1' }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockRejectedValue(new Error('db'))\n await expect(service.deletePath(user, 10)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Unable to remove path'\n })\n expect(syncQueries.deletePath).toHaveBeenCalledWith('c1', 10)\n })\n\n it('should delete path successfully when allowed', async () => {\n const user: any = { id: 1, clientId: undefined }\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.deletePath.mockResolvedValue(undefined)\n await expect(service.deletePath(user, 10, 'cX')).resolves.toBeUndefined()\n expect(syncQueries.deletePath).toHaveBeenCalledWith('cX', 10)\n })\n })\n\n describe('updatePath', () => {\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should throw NOT_FOUND when path settings do not exist', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue(null)\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.NOT_FOUND,\n message: 'Sync path not found'\n })\n })\n\n it('should update path settings, set new timestamp, clear cache and return updated settings', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1, remotePath: '/a', permissions: 'p' })\n syncQueries.updatePathSettings.mockResolvedValue(undefined)\n ;(currentTimeStamp as jest.Mock).mockReturnValue(4242)\n\n const out = await service.updatePath({ id: 1 } as any, 'c1', 5, { id: 666, lastSync: 3, permissions: 'new' } as any)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 5,\n expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' })\n )\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n expect(out).toEqual(expect.objectContaining({ id: 5, lastSync: 3, timestamp: 4242, permissions: 'new' }))\n })\n\n it('should clear cache and throw INTERNAL_SERVER_ERROR when update fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPathSettings.mockResolvedValue({ id: 5, timestamp: 500, lastSync: 1 })\n syncQueries.updatePathSettings.mockRejectedValue(new Error('db'))\n await expect(service.updatePath({ id: 1 } as any, 'c1', 5, {} as any)).rejects.toMatchObject({\n status: HttpStatus.INTERNAL_SERVER_ERROR,\n message: 'Unable to update path'\n })\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', 5)\n })\n })\n\n describe('updatePaths', () => {\n beforeEach(() => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n })\n\n it('should throw when client id is missing', async () => {\n await expect(service.updatePaths(userWith(undefined) as any, [])).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Client id is missing'\n })\n })\n\n it('should throw FORBIDDEN when client does not belong to owner', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(false)\n await expect(service.updatePaths(userWith('c1') as any, [])).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN\n })\n })\n\n it('should mark client paths as deleted and notify when no corresponding server paths (server remotePath undefined)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: undefined }])\n const clientPaths = [{ id: 1, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, clientPaths)\n expect(res.delete).toEqual([1])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should propagate spaceEnv errors as BAD_REQUEST', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 1, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockRejectedValue(new Error('boom'))\n await expect(\n service.updatePaths(userWith('c1') as any, [{ id: 1, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any])\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'boom'\n })\n })\n\n it('should skip server path when space is null and mark client item as deleted', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 2, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue(null)\n const res = await service.updatePaths(userWith('c1') as any, [\n { id: 2, remotePath: 'SPACES/x', timestamp: 1, lastSync: 1, permissions: 'p' } as any\n ])\n expect(res.delete).toEqual([2])\n expect(notificationsManager.create).toHaveBeenCalledTimes(1)\n })\n\n it('should add server-only path to client with server permissions', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 3, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'perm-xyz' })\n const res = await service.updatePaths(userWith('c1') as any, [])\n expect(res.add).toHaveLength(1)\n expect(res.add[0]).toEqual(expect.objectContaining({ id: 3, remotePath: 'SPACES/x', permissions: 'perm-xyz' }))\n })\n\n it('should update server settings from client when client is newer (no hasUpdates)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 5, settings: { timestamp: 1, lastSync: 1, foo: 'server' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 5, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', foo: 'client' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 5, expect.objectContaining({ foo: 'client', lastSync: 2 }))\n // No client update instructions because hasUpdates=false and serverNewer=false\n })\n\n it('should push server-newer updates to client and also remotePath/permissions corrections', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 7, settings: { timestamp: 20, lastSync: 5, srv: true }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 7, timestamp: 10, lastSync: 5, remotePath: 'SPACES/wrong', permissions: 'old' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Should have two client updates: one full server settings + corrections, and one corrections-only\n expect(res.update).toEqual(\n expect.arrayContaining([\n expect.objectContaining({ id: 7, srv: true, remotePath: 'SPACES/correct', permissions: 'permX' }),\n expect.objectContaining({ id: 7, remotePath: 'SPACES/correct', permissions: 'permX' })\n ])\n )\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 7, expect.objectContaining({ lastSync: 5 }))\n // clear cache called for each update instruction\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledTimes(res.update.length)\n for (const u of res.update) {\n expect(syncQueries.clearCachePathSettings).toHaveBeenCalledWith('c1', u.id)\n }\n })\n\n it('should trigger update when lastSync differs even if timestamps and settings match', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 9, settings: { timestamp: 10, lastSync: 1, flag: 'S' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 9, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p', flag: 'S' } as any]\n await service.updatePaths(userWith('c1') as any, client)\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith('c1', 9, expect.objectContaining({ lastSync: 2 }))\n })\n\n it('should perform no changes when client and server are identical (no-op branch)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 12, settings: { timestamp: 5, lastSync: 7, flag: 'A' }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n\n const client = [{ id: 12, timestamp: 5, lastSync: 7, remotePath: 'SPACES/x', permissions: 'p', flag: 'A' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n expect(res).toEqual({ add: [], update: [], delete: [] })\n expect(syncQueries.updatePathSettings).not.toHaveBeenCalled()\n })\n\n it('should correct client info while keeping server settings when timestamps are equal (hasUpdates=true)', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // Server has srv='S', client has wrong remotePath/permissions and extra clientOnly flag\n syncQueries.getPaths.mockResolvedValue([{ id: 13, settings: { timestamp: 5, lastSync: 1, srv: 'S' }, remotePath: 'SPACES/correct' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'permX' })\n\n const client = [{ id: 13, timestamp: 5, lastSync: 1, remotePath: 'SPACES/wrong', permissions: 'old', clientOnly: 'C' } as any]\n const res = await service.updatePaths(userWith('c1') as any, client)\n\n // Server uses its own settings base (srv: 'S') with corrections applied\n expect(syncQueries.updatePathSettings).toHaveBeenCalledWith(\n 'c1',\n 13,\n expect.objectContaining({ srv: 'S', lastSync: 1, remotePath: 'SPACES/correct', permissions: 'permX' })\n )\n // Client should receive corrections for remotePath and permissions\n expect(res.update).toEqual(expect.arrayContaining([expect.objectContaining({ id: 13, remotePath: 'SPACES/correct', permissions: 'permX' })]))\n })\n\n it('should log error when updatePathSettings rejects inside updatePaths', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([{ id: 11, settings: { timestamp: 1, lastSync: 1 }, remotePath: 'SPACES/x' }])\n spacesManager.spaceEnv.mockResolvedValue({ envPermissions: 'p' })\n // Force client newer to trigger updatePathSettings\n const client = [{ id: 11, timestamp: 10, lastSync: 2, remotePath: 'SPACES/x', permissions: 'p' } as any]\n syncQueries.updatePathSettings.mockRejectedValueOnce(new Error('db-fail'))\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n\n await service.updatePaths(userWith('c1') as any, client)\n // wait for microtasks to ensure .catch executed\n await flush()\n\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'updatePaths')).toBe(true)\n })\n\n it('should catch notify failure at updatePaths level when building notification fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n // No server paths: will mark client path as deleted and call notify\n syncQueries.getPaths.mockResolvedValue([])\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n // BAD first segment to make notify fail while building URL (before notificationsManager.create)\n const client = [{ id: 1, remotePath: 'BAD/a/b', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([1])\n expect(loggerSpy).toHaveBeenCalled()\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'updatePaths')).toBe(true)\n // create not called because we failed before reaching it\n expect(notificationsManager.create).not.toHaveBeenCalled()\n })\n\n it('should catch error inside notify when notifications creation fails', async () => {\n syncQueries.clientExistsForOwner.mockResolvedValue(true)\n syncQueries.getPaths.mockResolvedValue([])\n // Valid remotePath to build URL correctly\n const client = [{ id: 2, remotePath: 'SPACES/a', timestamp: 1, lastSync: 1, permissions: 'p' } as any]\n const loggerSpy = jest.spyOn((service as any).logger, 'error').mockImplementation(() => undefined)\n notificationsManager.create.mockRejectedValueOnce(new Error('notify-fail'))\n\n const res = await service.updatePaths(userWith('c1') as any, client)\n await flush()\n\n expect(res.delete).toEqual([2])\n expect(loggerSpy).toHaveBeenCalled()\n // error comes from notify() catch\n expect(loggerSpy.mock.calls.some(([payload]: { tag: string }[]) => payload?.tag === 'notify')).toBe(true)\n })\n })\n\n describe('getDBProps (private) branches', () => {\n it('should throw BAD_REQUEST for shares list selection', async () => {\n await expect((service as any).getDBProps({ inSharesList: true } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing all shares is not supported. Please select a subdirectory'\n })\n })\n\n it('should throw BAD_REQUEST for personal space selection', async () => {\n await expect(\n (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: true,\n paths: [],\n dbFile: { ownerId: 42 }\n } as any)\n ).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing all personal files is not supported. Please select a subdirectory'\n })\n })\n\n it('should return ownerId and fileId for personal space subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(77)\n const res = await (service as any).getDBProps({\n inPersonalSpace: true,\n paths: ['sub'],\n dbFile: { ownerId: 42 }\n } as any)\n expect(res).toEqual({ ownerId: 42, fileId: 77 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should throw BAD_REQUEST for whole files repository without alias', async () => {\n await expect((service as any).getDBProps({ inFilesRepository: true, root: { alias: null }, paths: [] } as any)).rejects.toMatchObject({\n status: HttpStatus.BAD_REQUEST,\n message: 'Syncing the entire space is not yet supported. Please select a subdirectory'\n })\n })\n\n it('should return spaceId and rootId for files repository root selection', async () => {\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3 })\n })\n\n it('should return spaceId, rootId and fileId for files repository subdir or null root', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(88)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 5,\n root: { id: 3, alias: 'x' },\n paths: ['sub']\n } as any)\n expect(res).toEqual({ spaceId: 5, spaceRootId: 3, fileId: 88 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return spaceId and null spaceRootId plus fileId when files repository root has no id', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(90)\n const res = await (service as any).getDBProps({\n inFilesRepository: true,\n id: 6,\n root: { id: undefined, alias: 'x' },\n paths: []\n } as any)\n expect(res).toEqual({ spaceId: 6, spaceRootId: null, fileId: 90 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return shareId only for shares repository root', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: []\n } as any)\n expect(res).toEqual({ shareId: 9 })\n })\n\n it('should return shareId and fileId for shares repository subdir', async () => {\n const getOrCreateFileIdSpy = jest.spyOn<any, any>(service as any, 'getOrCreateFileId').mockResolvedValue(55)\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: true,\n id: 9,\n paths: ['sub']\n } as any)\n expect(res).toEqual({ shareId: 9, fileId: 55 })\n getOrCreateFileIdSpy.mockRestore()\n })\n\n it('should return undefined when no space flags match (no branch taken)', async () => {\n const res = await (service as any).getDBProps({\n inSharesList: false,\n inPersonalSpace: false,\n inFilesRepository: false,\n inSharesRepository: false,\n paths: []\n } as any)\n expect(res).toBeUndefined()\n })\n })\n\n describe('getOrCreateFileId (private) branches', () => {\n it('should return existing file id without creation', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(101)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(101)\n expect(filesQueries.getOrCreateSpaceFile).not.toHaveBeenCalled()\n })\n\n it('should create file when not exists and return its id', async () => {\n ;(getProps as jest.Mock).mockResolvedValue({ id: 999, name: 'file' })\n filesQueries.getSpaceFileId.mockResolvedValue(0)\n filesQueries.getOrCreateSpaceFile.mockResolvedValue(202)\n const id = await (service as any).getOrCreateFileId({\n realPath: '/rp',\n dbFile: { path: '.' }\n })\n expect(id).toBe(202)\n expect(filesQueries.getOrCreateSpaceFile).toHaveBeenCalledWith(0, expect.objectContaining({ id: undefined }), { path: '.' })\n })\n })\n})\n"],"names":["jest","mock","currentTimeStamp","fn","isPathExists","isPathIsDir","getProps","sanitizePath","p","getEnvPermissions","SYNC_PATH_REPOSITORY","SPACES","PERSONAL","SHARES","NOTIFICATION_APP","SYNC","NOTIFICATION_APP_EVENT","DELETE","CREATE","UPDATE","describe","SyncPathsManager","name","service","contextManager","spacesManager","usersQueries","filesQueries","notificationsManager","syncQueries","userWith","clientId","id","flush","Promise","r","setImmediate","beforeEach","headerOriginUrl","spaceEnv","getSpaceFileId","getOrCreateSpaceFile","create","mockResolvedValue","undefined","getClient","clientExistsForOwner","createPath","deletePath","getPaths","getPathSettings","updatePathSettings","clearCachePathSettings","mockReset","mockReturnValue","module","Test","createTestingModule","providers","provide","ContextManager","useValue","SpacesManager","UsersQueries","FilesQueries","NotificationsManager","SyncQueries","compile","useLogger","get","it","expect","toBeDefined","baseReq","user","params","space","realPath","quotaIsExceeded","root","alias","inFilesRepository","paths","dbFile","ownerId","path","req","remotePath","rejects","toMatchObject","status","HttpStatus","BAD_REQUEST","message","INSUFFICIENT_STORAGE","each","title","setup","expected","NOT_FOUND","getDBPropsSpy","spyOn","res","permissions","toEqual","toHaveBeenCalledWith","objectContaining","mockRestore","msg","FORBIDDEN","mockRejectedValue","Error","resolves","toBeUndefined","updatePath","timestamp","lastSync","out","INTERNAL_SERVER_ERROR","envPermissions","updatePaths","settings","clientPaths","delete","toHaveBeenCalledTimes","add","toHaveLength","foo","client","srv","update","arrayContaining","length","u","flag","not","toHaveBeenCalled","clientOnly","mockRejectedValueOnce","loggerSpy","logger","mockImplementation","calls","some","payload","tag","toBe","getDBProps","inSharesList","inPersonalSpace","getOrCreateFileIdSpy","fileId","spaceId","spaceRootId","inSharesRepository","shareId","getOrCreateFileId"],"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
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-queries.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport crypto from 'node:crypto'\nimport { convertHumanTimeToSeconds } from '../../../common/functions'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport type { UserModel } from '../../users/models/user.model'\nimport { CLIENT_TOKEN_EXPIRATION_TIME } from '../constants/auth'\nimport { SYNC_REPOSITORY } from '../constants/sync'\nimport { SyncClientPaths } from '../interfaces/sync-client-paths.interface'\nimport { SyncClientInfo } from '../interfaces/sync-client.interface'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { syncClients } from '../schemas/sync-clients.schema'\nimport { SyncPath } from '../schemas/sync-path.interface'\nimport { syncPaths } from '../schemas/sync-paths.schema'\n\n@Injectable()\nexport class SyncQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async clientExistsForOwner(ownerId: number, clientId: string): Promise<boolean> {\n const [client] = await this.db\n .select({ id: syncClients.id })\n .from(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1)\n return !!client?.id\n }\n\n async getOrCreateClient(ownerId: number, clientId: string, info: SyncClientInfo, ip: string): Promise<string> {\n const client = await this.getClient(clientId, ownerId)\n if (client) {\n if (currentTimeStamp() < client.tokenExpiration) {\n return client.token\n }\n // renew token if it has expired\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db\n .update(syncClients)\n .set({\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME)\n })\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n return token\n } else {\n // create client\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db.insert(syncClients).values({\n id: clientId,\n ownerId: ownerId,\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME),\n info: info,\n currentAccess: new Date(),\n currentIp: ip\n } as SyncClient),\n 1\n )\n return token\n }\n }\n\n async getClient(clientId: string, ownerId?: number, token?: string): Promise<SyncClient> {\n const where: SQL[] = [\n eq(syncClients.id, clientId),\n ...(ownerId ? [eq(syncClients.ownerId, ownerId)] : []),\n ...(token ? [eq(syncClients.token, token)] : [])\n ]\n const [client] = await this.db\n .select({\n id: syncClients.id,\n ownerId: syncClients.ownerId,\n token: syncClients.token,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt\n })\n .from(syncClients)\n .where(and(...where))\n .limit(1)\n return client\n }\n\n async getClients(owner: UserModel): Promise<SyncClientPaths[]> {\n const clientId = owner.clientId || null\n return this.db\n .select({\n id: syncClients.id,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt,\n isCurrentClient: sql<boolean>`IF (${clientId} IS NOT NULL AND ${syncClients.id} = ${clientId}, 1, 0)`.mapWith(Boolean),\n paths: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n settings: syncPaths.settings,\n createdAt: syncPaths.createdAt\n })\n })\n .from(syncClients)\n .leftJoin(syncPaths, eq(syncPaths.clientId, syncClients.id))\n .where(eq(syncClients.ownerId, owner.id))\n .groupBy(syncClients.id)\n .orderBy(desc(syncClients.currentAccess))\n }\n\n async deleteClient(ownerId: number, clientId: string) {\n dbCheckAffectedRows(\n await this.db\n .delete(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n }\n\n async renewClientTokenAndExpiration(clientId: string, token: string, expiration: number) {\n dbCheckAffectedRows(await this.db.update(syncClients).set({ token: token, tokenExpiration: expiration }).where(eq(syncClients.id, clientId)), 1)\n }\n\n async updateClientInfo(client: SyncClient, info: SyncClientInfo, ip: string) {\n await this.db\n .update(syncClients)\n .set({\n lastAccess: client.currentAccess,\n currentAccess: new Date(),\n lastIp: client.currentIp,\n currentIp: ip,\n info: info\n } as SyncClient)\n .where(eq(syncClients.id, client.id))\n }\n\n getPaths(clientId: string): Promise<{ id: number; settings: SyncPathSettings; remotePath: string }[]> {\n const shareFile: any = alias(files, 'shareFile')\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: syncPaths.id,\n remotePath: sql<string>`\n CASE WHEN ${syncPaths.ownerId} IS NOT NULL THEN CONCAT_WS('/', ${SYNC_REPOSITORY.PERSONAL}, ${filePathSQL(files)})\n WHEN ${syncPaths.spaceId} IS NOT NULL THEN CONCAT_WS('/', \n ${SYNC_REPOSITORY.SPACES}, \n ${spaces.alias}, \n CASE WHEN ${syncPaths.spaceRootId} IS NULL \n THEN CONCAT_WS('/', IF (${files.path} = '.', NULL, ${files.path}), ${files.name})\n ELSE\n CASE WHEN ${syncPaths.fileId} IS NULL \n THEN ${spacesRoots.alias}\n ELSE\n IF (${spacesRoots.externalPath} IS NOT NULL, \n CONCAT_WS('/', ${spacesRoots.alias}, IF (${files.path} = '.', NULL, ${files.path}), ${files.name}), \n CONCAT_WS('/', REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}), ${files.name})\n )\n END\n END\n )\n WHEN ${syncPaths.shareId} IS NOT NULL THEN CONCAT_WS('/',\n ${SYNC_REPOSITORY.SHARES},\n CASE WHEN ${syncPaths.fileId} IS NULL THEN ${shares.alias}\n ELSE \n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n END,\n IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})\n )\n ELSE NULL\n END\n `.as('remotePath'),\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .leftJoin(files, eq(files.id, syncPaths.fileId))\n .leftJoin(spaces, eq(spaces.id, syncPaths.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.id, syncPaths.spaceRootId))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(shares, eq(shares.id, syncPaths.shareId))\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .where(eq(syncPaths.clientId, clientId))\n }\n\n @CacheDecorator(900)\n async getPathSettings(clientId: string, pathId: number): Promise<SyncPathSettings> {\n const [path] = await this.db\n .select({\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .where(and(eq(syncPaths.clientId, clientId), eq(syncPaths.id, pathId)))\n .limit(1)\n return path ? path.settings : null\n }\n\n async createPath(clientId: string, dbProps: SyncDBProps, settings: SyncPathSettings): Promise<SyncPath['id']> {\n return dbGetInsertedId(await this.db.insert(syncPaths).values({ clientId: clientId, settings: settings, ...dbProps } as SyncPath))\n }\n\n async deletePath(clientId: string, pathId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(syncPaths).where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))), 1)\n }\n\n async updatePathSettings(clientId: string, pathId: number, settings: SyncPathSettings) {\n dbCheckAffectedRows(\n await this.db\n .update(syncPaths)\n .set({ settings: settings })\n .where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))),\n 1\n )\n }\n\n clearCachePathSettings(clientId: string, pathId: number): void {\n this.cache.del(this.cache.genSlugKey(this.constructor.name, this.getPathSettings.name, clientId, pathId)).catch((e: Error) => console.error(e))\n }\n}\n"],"names":["SyncQueries","clientExistsForOwner","ownerId","clientId","client","db","select","id","syncClients","from","where","and","eq","limit","getOrCreateClient","info","ip","getClient","currentTimeStamp","tokenExpiration","token","crypto","randomUUID","dbCheckAffectedRows","update","set","convertHumanTimeToSeconds","CLIENT_TOKEN_EXPIRATION_TIME","insert","values","currentAccess","Date","currentIp","enabled","lastAccess","lastIp","createdAt","getClients","owner","isCurrentClient","sql","mapWith","Boolean","paths","concatDistinctObjectsInArray","syncPaths","settings","leftJoin","groupBy","orderBy","desc","deleteClient","delete","renewClientTokenAndExpiration","expiration","updateClientInfo","getPaths","shareFile","alias","files","spaceRootFile","remotePath","SYNC_REPOSITORY","PERSONAL","filePathSQL","spaceId","SPACES","spaces","spaceRootId","path","name","fileId","spacesRoots","externalPath","shareId","SHARES","shares","as","getPathSettings","pathId","createPath","dbProps","dbGetInsertedId","deletePath","updatePathSettings","clearCachePathSettings","cache","del","genSlugKey","catch","e","console","error"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-queries.service.ts"],"sourcesContent":["import { Inject, Injectable } from '@nestjs/common'\nimport { and, desc, eq, SQL, sql } from 'drizzle-orm'\nimport { alias } from 'drizzle-orm/mysql-core'\nimport crypto from 'node:crypto'\nimport { convertHumanTimeToSeconds } from '../../../common/functions'\nimport { currentTimeStamp } from '../../../common/shared'\nimport { CacheDecorator } from '../../../infrastructure/cache/cache.decorator'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport type { DBSchema } from '../../../infrastructure/database/interfaces/database.interface'\nimport { concatDistinctObjectsInArray, dbCheckAffectedRows, dbGetInsertedId } from '../../../infrastructure/database/utils'\nimport { filePathSQL, files } from '../../files/schemas/files.schema'\nimport { shares } from '../../shares/schemas/shares.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport type { UserModel } from '../../users/models/user.model'\nimport { CLIENT_TOKEN_EXPIRATION_TIME } from '../constants/auth'\nimport { SYNC_REPOSITORY } from '../constants/sync'\nimport { SyncClientPaths } from '../interfaces/sync-client-paths.interface'\nimport { SyncClientInfo } from '../interfaces/sync-client.interface'\nimport { SyncDBProps, SyncPathSettings } from '../interfaces/sync-path.interface'\nimport { SyncClient } from '../schemas/sync-client.interface'\nimport { syncClients } from '../schemas/sync-clients.schema'\nimport { SyncPath } from '../schemas/sync-path.interface'\nimport { syncPaths } from '../schemas/sync-paths.schema'\n\n@Injectable()\nexport class SyncQueries {\n constructor(\n @Inject(DB_TOKEN_PROVIDER) private readonly db: DBSchema,\n private readonly cache: Cache\n ) {}\n\n async clientExistsForOwner(ownerId: number, clientId: string): Promise<boolean> {\n const [client] = await this.db\n .select({ id: syncClients.id })\n .from(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1)\n return !!client?.id\n }\n\n async getOrCreateClient(ownerId: number, clientId: string, info: SyncClientInfo, ip: string): Promise<string> {\n const client = await this.getClient(clientId, ownerId)\n if (client) {\n if (currentTimeStamp() < client.tokenExpiration) {\n return client.token\n }\n // renew token if it has expired\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db\n .update(syncClients)\n .set({\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME)\n })\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n return token\n } else {\n // create client\n const token = crypto.randomUUID()\n dbCheckAffectedRows(\n await this.db.insert(syncClients).values({\n id: clientId,\n ownerId: ownerId,\n token: token,\n tokenExpiration: currentTimeStamp() + convertHumanTimeToSeconds(CLIENT_TOKEN_EXPIRATION_TIME),\n info: info,\n currentAccess: new Date(),\n currentIp: ip\n } as SyncClient),\n 1\n )\n return token\n }\n }\n\n async getClient(clientId: string, ownerId?: number, token?: string): Promise<SyncClient> {\n const where: SQL[] = [\n eq(syncClients.id, clientId),\n ...(ownerId ? [eq(syncClients.ownerId, ownerId)] : []),\n ...(token ? [eq(syncClients.token, token)] : [])\n ]\n const [client] = await this.db\n .select({\n id: syncClients.id,\n ownerId: syncClients.ownerId,\n token: syncClients.token,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt\n })\n .from(syncClients)\n .where(and(...where))\n .limit(1)\n return client\n }\n\n async getClients(owner: UserModel): Promise<SyncClientPaths[]> {\n const clientId = owner.clientId || null\n return this.db\n .select({\n id: syncClients.id,\n tokenExpiration: syncClients.tokenExpiration,\n info: syncClients.info,\n enabled: syncClients.enabled,\n currentAccess: syncClients.currentAccess,\n currentIp: syncClients.currentIp,\n lastAccess: syncClients.lastAccess,\n lastIp: syncClients.lastIp,\n createdAt: syncClients.createdAt,\n isCurrentClient: sql<boolean>`IF (${clientId} IS NOT NULL AND ${syncClients.id} = ${clientId}, 1, 0)`.mapWith(Boolean),\n paths: concatDistinctObjectsInArray(syncPaths.id, {\n id: syncPaths.id,\n settings: syncPaths.settings,\n createdAt: syncPaths.createdAt\n })\n })\n .from(syncClients)\n .leftJoin(syncPaths, eq(syncPaths.clientId, syncClients.id))\n .where(eq(syncClients.ownerId, owner.id))\n .groupBy(syncClients.id)\n .orderBy(desc(syncClients.currentAccess))\n }\n\n async deleteClient(ownerId: number, clientId: string) {\n dbCheckAffectedRows(\n await this.db\n .delete(syncClients)\n .where(and(eq(syncClients.ownerId, ownerId), eq(syncClients.id, clientId)))\n .limit(1),\n 1\n )\n }\n\n async renewClientTokenAndExpiration(clientId: string, token: string, expiration: number) {\n dbCheckAffectedRows(await this.db.update(syncClients).set({ token: token, tokenExpiration: expiration }).where(eq(syncClients.id, clientId)), 1)\n }\n\n async updateClientInfo(client: SyncClient, info: SyncClientInfo, ip: string) {\n await this.db\n .update(syncClients)\n .set({\n lastAccess: client.currentAccess,\n currentAccess: new Date(),\n lastIp: client.currentIp,\n currentIp: ip,\n info: info\n } as SyncClient)\n .where(eq(syncClients.id, client.id))\n }\n\n getPaths(clientId: string): Promise<{ id: number; settings: SyncPathSettings; remotePath: string }[]> {\n const shareFile: any = alias(files, 'shareFile')\n const spaceRootFile: any = alias(files, 'spaceRootFile')\n return this.db\n .select({\n id: syncPaths.id,\n remotePath: sql<string>`\n CASE WHEN ${syncPaths.ownerId} IS NOT NULL THEN CONCAT_WS('/', ${SYNC_REPOSITORY.PERSONAL}, ${filePathSQL(files)})\n WHEN ${syncPaths.spaceId} IS NOT NULL THEN CONCAT_WS('/', \n ${SYNC_REPOSITORY.SPACES}, \n ${spaces.alias}, \n CASE WHEN ${syncPaths.spaceRootId} IS NULL \n THEN CONCAT_WS('/', IF (${files.path} = '.', NULL, ${files.path}), ${files.name})\n ELSE\n CASE WHEN ${syncPaths.fileId} IS NULL \n THEN ${spacesRoots.alias}\n ELSE\n IF (${spacesRoots.externalPath} IS NOT NULL, \n CONCAT_WS('/', ${spacesRoots.alias}, IF (${files.path} = '.', NULL, ${files.path}), ${files.name}), \n CONCAT_WS('/', REGEXP_REPLACE(${files.path}, ${filePathSQL(spaceRootFile)}, ${spacesRoots.alias}), ${files.name})\n )\n END\n END\n )\n WHEN ${syncPaths.shareId} IS NOT NULL THEN CONCAT_WS('/',\n ${SYNC_REPOSITORY.SHARES},\n CASE WHEN ${syncPaths.fileId} IS NULL THEN ${shares.alias}\n ELSE \n IF (${shareFile.id} IS NOT NULL,\n IF (${files.id} = ${shareFile.id}, NULL, REGEXP_REPLACE(${files.path}, ${filePathSQL(shareFile)}, ${shares.alias})),\n CONCAT_WS('/', ${shares.alias}, IF (${files.path} = '.', NULL, ${files.path}))\n )\n END,\n IF (${files.id} = ${shareFile.id}, ${shares.name}, ${files.name})\n )\n ELSE NULL\n END\n `.as('remotePath'),\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .leftJoin(files, eq(files.id, syncPaths.fileId))\n .leftJoin(spaces, eq(spaces.id, syncPaths.spaceId))\n .leftJoin(spacesRoots, eq(spacesRoots.id, syncPaths.spaceRootId))\n .leftJoin(spaceRootFile, eq(spaceRootFile.id, spacesRoots.fileId))\n .leftJoin(shares, eq(shares.id, syncPaths.shareId))\n .leftJoin(shareFile, eq(shareFile.id, shares.fileId))\n .where(eq(syncPaths.clientId, clientId))\n }\n\n @CacheDecorator(900)\n async getPathSettings(clientId: string, pathId: number): Promise<SyncPathSettings> {\n const [path] = await this.db\n .select({\n settings: syncPaths.settings\n })\n .from(syncPaths)\n .where(and(eq(syncPaths.clientId, clientId), eq(syncPaths.id, pathId)))\n .limit(1)\n return path ? path.settings : null\n }\n\n async createPath(clientId: string, dbProps: SyncDBProps, settings: SyncPathSettings): Promise<SyncPath['id']> {\n return dbGetInsertedId(await this.db.insert(syncPaths).values({ clientId: clientId, settings: settings, ...dbProps } as SyncPath))\n }\n\n async deletePath(clientId: string, pathId: number): Promise<void> {\n dbCheckAffectedRows(await this.db.delete(syncPaths).where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))), 1)\n }\n\n async updatePathSettings(clientId: string, pathId: number, settings: SyncPathSettings) {\n dbCheckAffectedRows(\n await this.db\n .update(syncPaths)\n .set({ settings: settings })\n .where(and(eq(syncPaths.id, pathId), eq(syncPaths.clientId, clientId))),\n 1\n )\n }\n\n clearCachePathSettings(clientId: string, pathId: number): void {\n this.cache.del(this.cache.genSlugKey(this.constructor.name, this.getPathSettings.name, clientId, pathId)).catch((e: Error) => console.error(e))\n }\n}\n"],"names":["SyncQueries","clientExistsForOwner","ownerId","clientId","client","db","select","id","syncClients","from","where","and","eq","limit","getOrCreateClient","info","ip","getClient","currentTimeStamp","tokenExpiration","token","crypto","randomUUID","dbCheckAffectedRows","update","set","convertHumanTimeToSeconds","CLIENT_TOKEN_EXPIRATION_TIME","insert","values","currentAccess","Date","currentIp","enabled","lastAccess","lastIp","createdAt","getClients","owner","isCurrentClient","sql","mapWith","Boolean","paths","concatDistinctObjectsInArray","syncPaths","settings","leftJoin","groupBy","orderBy","desc","deleteClient","delete","renewClientTokenAndExpiration","expiration","updateClientInfo","getPaths","shareFile","alias","files","spaceRootFile","remotePath","SYNC_REPOSITORY","PERSONAL","filePathSQL","spaceId","SPACES","spaces","spaceRootId","path","name","fileId","spacesRoots","externalPath","shareId","SHARES","shares","as","getPathSettings","pathId","createPath","dbProps","dbGetInsertedId","deletePath","updatePathSettings","clearCachePathSettings","cache","del","genSlugKey","catch","e","console","error"],"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
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/sync/sync.config.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 { IsEnum } from 'class-validator'\nimport { APP_STORE_REPOSITORY } from './constants/store'\n\nexport class AppStoreConfig {\n @IsEnum(APP_STORE_REPOSITORY)\n repository: APP_STORE_REPOSITORY = APP_STORE_REPOSITORY.PUBLIC\n}\n"],"names":["AppStoreConfig","repository","APP_STORE_REPOSITORY","PUBLIC"],"mappings":"AAAA;;;;CAIC;;;;+BAKYA;;;eAAAA;;;gCAHU;uBACc;;;;;;;;;;AAE9B,IAAA,AAAMA,iBAAN,MAAMA;;aAEXC,aAAmCC,2BAAoB,CAACC,MAAM;;AAChE"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/sync/sync.config.ts"],"sourcesContent":["import { IsEnum } from 'class-validator'\nimport { APP_STORE_REPOSITORY } from './constants/store'\n\nexport class AppStoreConfig {\n @IsEnum(APP_STORE_REPOSITORY)\n repository: APP_STORE_REPOSITORY = APP_STORE_REPOSITORY.PUBLIC\n}\n"],"names":["AppStoreConfig","repository","APP_STORE_REPOSITORY","PUBLIC"],"mappings":";;;;+BAGaA;;;eAAAA;;;gCAHU;uBACc;;;;;;;;;;AAE9B,IAAA,AAAMA,iBAAN,MAAMA;;aAEXC,aAAmCC,2BAAoB,CAACC,MAAM;;AAChE"}
@@ -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
  });
@@ -15,6 +11,7 @@ Object.defineProperty(exports, "SyncController", {
15
11
  const _common = require("@nestjs/common");
16
12
  const _fastify = require("fastify");
17
13
  const _authtokenskipdecorator = require("../../authentication/decorators/auth-token-skip.decorator");
14
+ const _authrequestinterface = require("../../authentication/interfaces/auth-request.interface");
18
15
  const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
19
16
  const _spaceskippermissionsdecorator = require("../spaces/decorators/space-skip-permissions.decorator");
20
17
  const _spacerequestinterface = require("../spaces/interfaces/space-request.interface");
@@ -28,6 +25,7 @@ const _routes = require("./constants/routes");
28
25
  const _sync = require("./constants/sync");
29
26
  const _syncenvironmentdecorator = require("./decorators/sync-environment.decorator");
30
27
  const _syncclientauthdto = require("./dtos/sync-client-auth.dto");
28
+ const _syncclientregistrationdto = require("./dtos/sync-client-registration.dto");
31
29
  const _syncoperationsdto = require("./dtos/sync-operations.dto");
32
30
  const _syncpathdto = require("./dtos/sync-path.dto");
33
31
  const _syncuploaddto = require("./dtos/sync-upload.dto");
@@ -59,10 +57,14 @@ let SyncController = class SyncController {
59
57
  register(syncClientRegistrationDto, req) {
60
58
  return this.syncClientsManager.register(syncClientRegistrationDto, req.ip);
61
59
  }
60
+ registerWithAuth(clientAuthenticatedRegistrationDto, req) {
61
+ return this.syncClientsManager.registerWithAuth(clientAuthenticatedRegistrationDto, req);
62
+ }
62
63
  unregister(user) {
63
64
  return this.syncClientsManager.unregister(user);
64
65
  }
65
66
  checkAppStore() {
67
+ // This route must be public to allow clients to receive updates
66
68
  return this.syncClientsManager.checkAppStore();
67
69
  }
68
70
  authenticate(type, clientAuthDto, req, res) {
@@ -139,11 +141,24 @@ _ts_decorate([
139
141
  _ts_param(1, (0, _common.Req)()),
140
142
  _ts_metadata("design:type", Function),
141
143
  _ts_metadata("design:paramtypes", [
142
- typeof SyncClientRegistrationDto === "undefined" ? Object : SyncClientRegistrationDto,
144
+ typeof _syncclientregistrationdto.SyncClientRegistrationDto === "undefined" ? Object : _syncclientregistrationdto.SyncClientRegistrationDto,
143
145
  typeof _fastify.FastifyRequest === "undefined" ? Object : _fastify.FastifyRequest
144
146
  ]),
145
147
  _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
146
148
  ], SyncController.prototype, "register", null);
149
+ _ts_decorate([
150
+ (0, _common.Post)(_routes.SYNC_ROUTE.REGISTER_AUTH),
151
+ (0, _permissionsdecorator.UserHavePermission)(_user.USER_PERMISSION.DESKTOP_APP),
152
+ (0, _common.UseGuards)(_permissionsguard.UserPermissionsGuard),
153
+ _ts_param(0, (0, _common.Body)()),
154
+ _ts_param(1, (0, _common.Req)()),
155
+ _ts_metadata("design:type", Function),
156
+ _ts_metadata("design:paramtypes", [
157
+ typeof _syncclientregistrationdto.SyncClientAuthRegistrationDto === "undefined" ? Object : _syncclientregistrationdto.SyncClientAuthRegistrationDto,
158
+ typeof _authrequestinterface.FastifyAuthenticatedRequest === "undefined" ? Object : _authrequestinterface.FastifyAuthenticatedRequest
159
+ ]),
160
+ _ts_metadata("design:returntype", typeof Promise === "undefined" ? Object : Promise)
161
+ ], SyncController.prototype, "registerWithAuth", null);
147
162
  _ts_decorate([
148
163
  (0, _common.Post)(_routes.SYNC_ROUTE.UNREGISTER),
149
164
  (0, _permissionsdecorator.UserHavePermission)(_user.USER_PERMISSION.DESKTOP_APP),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Move,\n Param,\n ParseArrayPipe,\n ParseIntPipe,\n Post,\n Proppatch,\n Put,\n Query,\n Req,\n Res,\n StreamableFile,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { AuthTokenSkip } from '../../authentication/decorators/auth-token-skip.decorator'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { USER_PERMISSION } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { CLIENT_AUTH_TYPE } from './constants/auth'\nimport { SYNC_ROUTE } from './constants/routes'\nimport { CHECK_SERVER_RESP, SYNC_IN_SERVER_AGENT } from './constants/sync'\nimport { SyncEnvironment } from './decorators/sync-environment.decorator'\nimport { SyncClientAuthDto } from './dtos/sync-client-auth.dto'\nimport type { SyncClientRegistrationDto } from './dtos/sync-client-registration.dto'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from './dtos/sync-operations.dto'\nimport { SyncPathDto, SyncPathUpdateDto } from './dtos/sync-path.dto'\nimport { SyncUploadDto } from './dtos/sync-upload.dto'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { AppStoreManifest } from './interfaces/store-manifest.interface'\nimport { ClientAuthCookieDto, ClientAuthTokenDto } from './interfaces/sync-client-auth.interface'\nimport { SyncClientPaths } from './interfaces/sync-client-paths.interface'\nimport { SyncPathSettings } from './interfaces/sync-path.interface'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\n\n@Controller(SYNC_ROUTE.BASE)\nexport class SyncController {\n constructor(\n private readonly syncManager: SyncManager,\n private readonly syncClientsManager: SyncClientsManager,\n private readonly syncPathsManager: SyncPathsManager\n ) {}\n\n /* CLIENT */\n\n @Get(SYNC_ROUTE.HANDSHAKE)\n @AuthTokenSkip()\n handshake(@Req() req: FastifyRequest) {\n if ('user-agent' in req.headers && req.headers['user-agent'].startsWith(SYNC_IN_SERVER_AGENT)) {\n return CHECK_SERVER_RESP\n }\n throw new HttpException('Server not found', HttpStatus.NOT_FOUND)\n }\n\n @Post(SYNC_ROUTE.REGISTER)\n @AuthTokenSkip()\n register(@Body() syncClientRegistrationDto: SyncClientRegistrationDto, @Req() req: FastifyRequest): Promise<{ clientToken: string }> {\n return this.syncClientsManager.register(syncClientRegistrationDto, req.ip)\n }\n\n @Post(SYNC_ROUTE.UNREGISTER)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n unregister(@GetUser() user: UserModel): Promise<void> {\n return this.syncClientsManager.unregister(user)\n }\n\n @Get(SYNC_ROUTE.APP_STORE)\n @AuthTokenSkip()\n checkAppStore(): Promise<AppStoreManifest> {\n return this.syncClientsManager.checkAppStore()\n }\n\n @Post(`${SYNC_ROUTE.AUTH}/:type`)\n @AuthTokenSkip()\n authenticate(\n @Param('type') type: CLIENT_AUTH_TYPE,\n @Body() clientAuthDto: SyncClientAuthDto,\n @Req() req: FastifyRequest,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<ClientAuthCookieDto | ClientAuthTokenDto> {\n return this.syncClientsManager.authenticate(type, clientAuthDto, req.ip, res)\n }\n\n @Get(SYNC_ROUTE.CLIENTS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n getClients(@GetUser() user: UserModel): Promise<SyncClientPaths[]> {\n return this.syncClientsManager.getClients(user)\n }\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n deleteClient(@GetUser() user: UserModel, @Param('id') clientId: string): Promise<void> {\n return this.syncClientsManager.deleteClient(user, clientId)\n }\n\n /* PATHS */\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deleteClientPath(@GetUser() user: UserModel, @Param('id') clientId: string, @Param('pathId', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId, clientId)\n }\n\n @Put(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n updatePath(\n @GetUser() user: UserModel,\n @Param('id') clientId: string,\n @Param('pathId', ParseIntPipe) pathId: number,\n @Body() syncPathUpdateDto: SyncPathUpdateDto\n ): Promise<SyncPathSettings> {\n return this.syncPathsManager.updatePath(user, clientId, pathId, syncPathUpdateDto)\n }\n\n @Post(`${SYNC_ROUTE.PATHS}/*`)\n @SkipSpacePermissionsCheck()\n @SyncEnvironment()\n createPath(\n @Req() req: FastifySpaceRequest,\n @Body() syncPathDto: SyncPathDto\n ): Promise<{\n id: number\n permissions: string\n }> {\n return this.syncPathsManager.createPath(req, syncPathDto)\n }\n\n @Delete(`${SYNC_ROUTE.PATHS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deletePath(@GetUser() user: UserModel, @Param('id', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId)\n }\n\n @Put(SYNC_ROUTE.PATHS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(ContextInterceptor)\n updatePaths(\n @GetUser() user: UserModel,\n @Body(new ParseArrayPipe({ items: SyncPathDto, whitelist: true })) syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n return this.syncPathsManager.updatePaths(user, syncPathsDto)\n }\n\n /* OPERATIONS */\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.DIFF}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(SyncDiffGzipBodyInterceptor)\n diff(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) pathId: number,\n @Body() syncDiffDto: SyncDiffDto,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<void> {\n return this.syncManager.diff(user, pathId, syncDiffDto, res)\n }\n\n @Get(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.syncManager.download(req, res)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadCreate(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Put(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadOverwrite(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.MAKE}/*`)\n @SyncEnvironment()\n make(@Req() req: FastifySpaceRequest, @Body() syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n return this.syncManager.make(req, syncMakeDto)\n }\n\n @Proppatch(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n props(@Req() req: FastifySpaceRequest, @Body() syncPropsDto: SyncPropsDto): Promise<void> {\n return this.syncManager.props(req, syncPropsDto)\n }\n\n @Move(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n move(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<void> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, true)\n }\n\n @Copy(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n copy(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<{ ino: number; mtime: number }> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, false)\n }\n\n @Delete(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n delete(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.syncManager.delete(req)\n }\n}\n"],"names":["SyncController","handshake","req","headers","startsWith","SYNC_IN_SERVER_AGENT","CHECK_SERVER_RESP","HttpException","HttpStatus","NOT_FOUND","register","syncClientRegistrationDto","syncClientsManager","ip","unregister","user","checkAppStore","authenticate","type","clientAuthDto","res","getClients","deleteClient","clientId","deleteClientPath","pathId","syncPathsManager","deletePath","updatePath","syncPathUpdateDto","createPath","syncPathDto","updatePaths","syncPathsDto","diff","syncDiffDto","syncManager","download","uploadCreate","syncUploadDto","upload","uploadOverwrite","make","syncMakeDto","props","syncPropsDto","move","syncCopyMoveDto","copyMove","copy","delete","HANDSHAKE","REGISTER","UNREGISTER","DESKTOP_APP","APP_STORE","SYNC_ROUTE","AUTH","passthrough","CLIENTS","PATHS","DESKTOP_APP_SYNC","ParseArrayPipe","items","SyncPathDto","whitelist","OPERATION","DIFF","MAKE","BASE"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.ts"],"sourcesContent":["import {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n HttpException,\n HttpStatus,\n Move,\n Param,\n ParseArrayPipe,\n ParseIntPipe,\n Post,\n Proppatch,\n Put,\n Query,\n Req,\n Res,\n StreamableFile,\n UseGuards,\n UseInterceptors\n} from '@nestjs/common'\nimport { FastifyReply, FastifyRequest } from 'fastify'\nimport { AuthTokenSkip } from '../../authentication/decorators/auth-token-skip.decorator'\nimport { FastifyAuthenticatedRequest } from '../../authentication/interfaces/auth-request.interface'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { USER_PERMISSION } from '../users/constants/user'\nimport { UserHavePermission } from '../users/decorators/permissions.decorator'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserPermissionsGuard } from '../users/guards/permissions.guard'\nimport { UserModel } from '../users/models/user.model'\nimport { CLIENT_AUTH_TYPE } from './constants/auth'\nimport { SYNC_ROUTE } from './constants/routes'\nimport { CHECK_SERVER_RESP, SYNC_IN_SERVER_AGENT } from './constants/sync'\nimport { SyncEnvironment } from './decorators/sync-environment.decorator'\nimport { SyncClientAuthDto } from './dtos/sync-client-auth.dto'\nimport { SyncClientAuthRegistrationDto, SyncClientRegistrationDto } from './dtos/sync-client-registration.dto'\nimport { SyncCopyMoveDto, SyncDiffDto, SyncMakeDto, SyncPropsDto } from './dtos/sync-operations.dto'\nimport { SyncPathDto, SyncPathUpdateDto } from './dtos/sync-path.dto'\nimport { SyncUploadDto } from './dtos/sync-upload.dto'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { AppStoreManifest } from './interfaces/store-manifest.interface'\nimport { SyncClientAuthCookie, SyncClientAuthRegistration, SyncClientAuthToken } from './interfaces/sync-client-auth.interface'\nimport { SyncClientPaths } from './interfaces/sync-client-paths.interface'\nimport { SyncPathSettings } from './interfaces/sync-path.interface'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\n\n@Controller(SYNC_ROUTE.BASE)\nexport class SyncController {\n constructor(\n private readonly syncManager: SyncManager,\n private readonly syncClientsManager: SyncClientsManager,\n private readonly syncPathsManager: SyncPathsManager\n ) {}\n\n /* CLIENT */\n\n @Get(SYNC_ROUTE.HANDSHAKE)\n @AuthTokenSkip()\n handshake(@Req() req: FastifyRequest) {\n if ('user-agent' in req.headers && req.headers['user-agent'].startsWith(SYNC_IN_SERVER_AGENT)) {\n return CHECK_SERVER_RESP\n }\n throw new HttpException('Server not found', HttpStatus.NOT_FOUND)\n }\n\n @Post(SYNC_ROUTE.REGISTER)\n @AuthTokenSkip()\n register(@Body() syncClientRegistrationDto: SyncClientRegistrationDto, @Req() req: FastifyRequest): Promise<SyncClientAuthRegistration> {\n return this.syncClientsManager.register(syncClientRegistrationDto, req.ip)\n }\n\n @Post(SYNC_ROUTE.REGISTER_AUTH)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n registerWithAuth(\n @Body() clientAuthenticatedRegistrationDto: SyncClientAuthRegistrationDto,\n @Req() req: FastifyAuthenticatedRequest\n ): Promise<SyncClientAuthRegistration> {\n return this.syncClientsManager.registerWithAuth(clientAuthenticatedRegistrationDto, req)\n }\n\n @Post(SYNC_ROUTE.UNREGISTER)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n unregister(@GetUser() user: UserModel): Promise<void> {\n return this.syncClientsManager.unregister(user)\n }\n\n @Get(SYNC_ROUTE.APP_STORE)\n @AuthTokenSkip()\n checkAppStore(): Promise<AppStoreManifest> {\n // This route must be public to allow clients to receive updates\n return this.syncClientsManager.checkAppStore()\n }\n\n @Post(`${SYNC_ROUTE.AUTH}/:type`)\n @AuthTokenSkip()\n authenticate(\n @Param('type') type: CLIENT_AUTH_TYPE,\n @Body() clientAuthDto: SyncClientAuthDto,\n @Req() req: FastifyRequest,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<SyncClientAuthCookie | SyncClientAuthToken> {\n return this.syncClientsManager.authenticate(type, clientAuthDto, req.ip, res)\n }\n\n @Get(SYNC_ROUTE.CLIENTS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n getClients(@GetUser() user: UserModel): Promise<SyncClientPaths[]> {\n return this.syncClientsManager.getClients(user)\n }\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP)\n @UseGuards(UserPermissionsGuard)\n deleteClient(@GetUser() user: UserModel, @Param('id') clientId: string): Promise<void> {\n return this.syncClientsManager.deleteClient(user, clientId)\n }\n\n /* PATHS */\n\n @Delete(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deleteClientPath(@GetUser() user: UserModel, @Param('id') clientId: string, @Param('pathId', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId, clientId)\n }\n\n @Put(`${SYNC_ROUTE.CLIENTS}/:id/${SYNC_ROUTE.PATHS}/:pathId`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n updatePath(\n @GetUser() user: UserModel,\n @Param('id') clientId: string,\n @Param('pathId', ParseIntPipe) pathId: number,\n @Body() syncPathUpdateDto: SyncPathUpdateDto\n ): Promise<SyncPathSettings> {\n return this.syncPathsManager.updatePath(user, clientId, pathId, syncPathUpdateDto)\n }\n\n @Post(`${SYNC_ROUTE.PATHS}/*`)\n @SkipSpacePermissionsCheck()\n @SyncEnvironment()\n createPath(\n @Req() req: FastifySpaceRequest,\n @Body() syncPathDto: SyncPathDto\n ): Promise<{\n id: number\n permissions: string\n }> {\n return this.syncPathsManager.createPath(req, syncPathDto)\n }\n\n @Delete(`${SYNC_ROUTE.PATHS}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n deletePath(@GetUser() user: UserModel, @Param('id', ParseIntPipe) pathId: number): Promise<void> {\n return this.syncPathsManager.deletePath(user, pathId)\n }\n\n @Put(SYNC_ROUTE.PATHS)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(ContextInterceptor)\n updatePaths(\n @GetUser() user: UserModel,\n @Body(new ParseArrayPipe({ items: SyncPathDto, whitelist: true })) syncPathsDto: SyncPathDto[]\n ): Promise<{\n add: SyncPathSettings[]\n update: Partial<Record<keyof SyncPathSettings, any>>[]\n delete: number[]\n }> {\n return this.syncPathsManager.updatePaths(user, syncPathsDto)\n }\n\n /* OPERATIONS */\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.DIFF}/:id`)\n @UserHavePermission(USER_PERMISSION.DESKTOP_APP_SYNC)\n @UseGuards(UserPermissionsGuard)\n @UseInterceptors(SyncDiffGzipBodyInterceptor)\n diff(\n @GetUser() user: UserModel,\n @Param('id', ParseIntPipe) pathId: number,\n @Body() syncDiffDto: SyncDiffDto,\n @Res({ passthrough: true }) res: FastifyReply\n ): Promise<void> {\n return this.syncManager.diff(user, pathId, syncDiffDto, res)\n }\n\n @Get(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.syncManager.download(req, res)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadCreate(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Put(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n uploadOverwrite(@Req() req: FastifySpaceRequest, @Query() syncUploadDto: SyncUploadDto): Promise<{ ino: number }> {\n return this.syncManager.upload(req, syncUploadDto)\n }\n\n @Post(`${SYNC_ROUTE.OPERATION}/${SYNC_ROUTE.MAKE}/*`)\n @SyncEnvironment()\n make(@Req() req: FastifySpaceRequest, @Body() syncMakeDto: SyncMakeDto): Promise<{ ino: number }> {\n return this.syncManager.make(req, syncMakeDto)\n }\n\n @Proppatch(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n props(@Req() req: FastifySpaceRequest, @Body() syncPropsDto: SyncPropsDto): Promise<void> {\n return this.syncManager.props(req, syncPropsDto)\n }\n\n @Move(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n move(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<void> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, true)\n }\n\n @Copy(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n copy(@Req() req: FastifySpaceRequest, @Body() syncCopyMoveDto: SyncCopyMoveDto): Promise<{ ino: number; mtime: number }> {\n return this.syncManager.copyMove(req, syncCopyMoveDto, false)\n }\n\n @Delete(`${SYNC_ROUTE.OPERATION}/*`)\n @SyncEnvironment()\n delete(@Req() req: FastifySpaceRequest): Promise<void> {\n return this.syncManager.delete(req)\n }\n}\n"],"names":["SyncController","handshake","req","headers","startsWith","SYNC_IN_SERVER_AGENT","CHECK_SERVER_RESP","HttpException","HttpStatus","NOT_FOUND","register","syncClientRegistrationDto","syncClientsManager","ip","registerWithAuth","clientAuthenticatedRegistrationDto","unregister","user","checkAppStore","authenticate","type","clientAuthDto","res","getClients","deleteClient","clientId","deleteClientPath","pathId","syncPathsManager","deletePath","updatePath","syncPathUpdateDto","createPath","syncPathDto","updatePaths","syncPathsDto","diff","syncDiffDto","syncManager","download","uploadCreate","syncUploadDto","upload","uploadOverwrite","make","syncMakeDto","props","syncPropsDto","move","syncCopyMoveDto","copyMove","copy","delete","HANDSHAKE","REGISTER","REGISTER_AUTH","DESKTOP_APP","UNREGISTER","APP_STORE","SYNC_ROUTE","AUTH","passthrough","CLIENTS","PATHS","DESKTOP_APP_SYNC","ParseArrayPipe","items","SyncPathDto","whitelist","OPERATION","DIFF","MAKE","BASE"],"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
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncController } from './sync.controller'\n\ndescribe(SyncController.name, () => {\n let controller: SyncController\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [SyncController],\n providers: [\n { provide: ContextManager, useValue: {} },\n { provide: SpacesManager, useValue: {} },\n { provide: SyncManager, useValue: {} },\n { provide: SyncClientsManager, useValue: {} },\n { provide: SyncPathsManager, useValue: {} }\n ]\n }).compile()\n\n controller = module.get<SyncController>(SyncController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n})\n"],"names":["describe","SyncController","name","controller","beforeAll","module","Test","createTestingModule","controllers","providers","provide","ContextManager","useValue","SpacesManager","SyncManager","SyncClientsManager","SyncPathsManager","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;yBAEmC;uCACL;sCACD;2CACK;oCACP;yCACK;gCACF;AAE/BA,SAASC,8BAAc,CAACC,IAAI,EAAE;IAC5B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,aAAa;gBAACP,8BAAc;aAAC;YAC7BQ,WAAW;gBACT;oBAAEC,SAASC,qCAAc;oBAAEC,UAAU,CAAC;gBAAE;gBACxC;oBAAEF,SAASG,mCAAa;oBAAED,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASI,+BAAW;oBAAEF,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASK,6CAAkB;oBAAEH,UAAU,CAAC;gBAAE;gBAC5C;oBAAEF,SAASM,yCAAgB;oBAAEJ,UAAU,CAAC;gBAAE;aAC3C;QACH,GAAGK,OAAO;QAEVd,aAAaE,OAAOa,GAAG,CAAiBjB,8BAAc;IACxD;IAEAkB,GAAG,qBAAqB;QACtBC,OAAOjB,YAAYkB,WAAW;IAChC;AACF"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/sync/sync.controller.spec.ts"],"sourcesContent":["import { Test, TestingModule } from '@nestjs/testing'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncController } from './sync.controller'\n\ndescribe(SyncController.name, () => {\n let controller: SyncController\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n controllers: [SyncController],\n providers: [\n { provide: ContextManager, useValue: {} },\n { provide: SpacesManager, useValue: {} },\n { provide: SyncManager, useValue: {} },\n { provide: SyncClientsManager, useValue: {} },\n { provide: SyncPathsManager, useValue: {} }\n ]\n }).compile()\n\n controller = module.get<SyncController>(SyncController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n})\n"],"names":["describe","SyncController","name","controller","beforeAll","module","Test","createTestingModule","controllers","providers","provide","ContextManager","useValue","SpacesManager","SyncManager","SyncClientsManager","SyncPathsManager","compile","get","it","expect","toBeDefined"],"mappings":";;;;yBAAoC;uCACL;sCACD;2CACK;oCACP;yCACK;gCACF;AAE/BA,SAASC,8BAAc,CAACC,IAAI,EAAE;IAC5B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,aAAa;gBAACP,8BAAc;aAAC;YAC7BQ,WAAW;gBACT;oBAAEC,SAASC,qCAAc;oBAAEC,UAAU,CAAC;gBAAE;gBACxC;oBAAEF,SAASG,mCAAa;oBAAED,UAAU,CAAC;gBAAE;gBACvC;oBAAEF,SAASI,+BAAW;oBAAEF,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASK,6CAAkB;oBAAEH,UAAU,CAAC;gBAAE;gBAC5C;oBAAEF,SAASM,yCAAgB;oBAAEJ,UAAU,CAAC;gBAAE;aAC3C;QACH,GAAGK,OAAO;QAEVd,aAAaE,OAAOa,GAAG,CAAiBjB,8BAAc;IACxD;IAEAkB,GAAG,qBAAqB;QACtBC,OAAOjB,YAAYkB,WAAW;IAChC;AACF"}
@@ -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
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../backend/src/applications/sync/sync.module.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 { Module } from '@nestjs/common'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncQueries } from './services/sync-queries.service'\nimport { SyncController } from './sync.controller'\n\n@Module({\n controllers: [SyncController],\n providers: [SyncDiffGzipBodyInterceptor, SyncClientsManager, SyncQueries, SyncPathsManager, SyncManager]\n})\nexport class SyncModule {}\n"],"names":["SyncModule","controllers","SyncController","providers","SyncDiffGzipBodyInterceptor","SyncClientsManager","SyncQueries","SyncPathsManager","SyncManager"],"mappings":"AAAA;;;;CAIC;;;;+BAcYA;;;eAAAA;;;wBAZU;6CACqB;2CACT;oCACP;yCACK;oCACL;gCACG;;;;;;;AAMxB,IAAA,AAAMA,aAAN,MAAMA;AAAY;;;QAHvBC,aAAa;YAACC,8BAAc;SAAC;QAC7BC,WAAW;YAACC,wDAA2B;YAAEC,6CAAkB;YAAEC,+BAAW;YAAEC,yCAAgB;YAAEC,+BAAW;SAAC"}
1
+ {"version":3,"sources":["../../../../backend/src/applications/sync/sync.module.ts"],"sourcesContent":["import { Module } from '@nestjs/common'\nimport { SyncDiffGzipBodyInterceptor } from './interceptors/sync-diff-gzip-body.interceptor'\nimport { SyncClientsManager } from './services/sync-clients-manager.service'\nimport { SyncManager } from './services/sync-manager.service'\nimport { SyncPathsManager } from './services/sync-paths-manager.service'\nimport { SyncQueries } from './services/sync-queries.service'\nimport { SyncController } from './sync.controller'\n\n@Module({\n controllers: [SyncController],\n providers: [SyncDiffGzipBodyInterceptor, SyncClientsManager, SyncQueries, SyncPathsManager, SyncManager]\n})\nexport class SyncModule {}\n"],"names":["SyncModule","controllers","SyncController","providers","SyncDiffGzipBodyInterceptor","SyncClientsManager","SyncQueries","SyncPathsManager","SyncManager"],"mappings":";;;;+BAYaA;;;eAAAA;;;wBAZU;6CACqB;2CACT;oCACP;yCACK;oCACL;gCACG;;;;;;;AAMxB,IAAA,AAAMA,aAAN,MAAMA;AAAY;;;QAHvBC,aAAa;YAACC,8BAAc;SAAC;QAC7BC,WAAW;YAACC,wDAA2B;YAAEC,6CAAkB;YAAEC,+BAAW;YAAEC,yCAAgB;YAAEC,+BAAW;SAAC"}
@@ -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
  });
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/sync/utils/functions.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 path from 'node:path'\nimport { SYNC_FILE_NAME_PREFIX } from '../constants/sync'\n\nexport function getTmpFilePath(rPath: string): string {\n return `${path.dirname(rPath)}/${SYNC_FILE_NAME_PREFIX}${path.basename(rPath)}`\n}\n"],"names":["getTmpFilePath","rPath","path","dirname","SYNC_FILE_NAME_PREFIX","basename"],"mappings":"AAAA;;;;CAIC;;;;+BAKeA;;;eAAAA;;;iEAHC;sBACqB;;;;;;AAE/B,SAASA,eAAeC,KAAa;IAC1C,OAAO,GAAGC,iBAAI,CAACC,OAAO,CAACF,OAAO,CAAC,EAAEG,2BAAqB,GAAGF,iBAAI,CAACG,QAAQ,CAACJ,QAAQ;AACjF"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/sync/utils/functions.ts"],"sourcesContent":["import path from 'node:path'\nimport { SYNC_FILE_NAME_PREFIX } from '../constants/sync'\n\nexport function getTmpFilePath(rPath: string): string {\n return `${path.dirname(rPath)}/${SYNC_FILE_NAME_PREFIX}${path.basename(rPath)}`\n}\n"],"names":["getTmpFilePath","rPath","path","dirname","SYNC_FILE_NAME_PREFIX","basename"],"mappings":";;;;+BAGgBA;;;eAAAA;;;iEAHC;sBACqB;;;;;;AAE/B,SAASA,eAAeC,KAAa;IAC1C,OAAO,GAAGC,iBAAI,CAACC,OAAO,CAACF,OAAO,CAAC,EAAEG,2BAAqB,GAAGF,iBAAI,CAACG,QAAQ,CAACJ,QAAQ;AACjF"}
@@ -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
  });