@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/webdav/services/webdav-methods.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { FileLock } from '../../files/interfaces/file-lock.interface'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, genEtag, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { DEPTH, LOCK_DISCOVERY_PROP, PROPSTAT, STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\n// Mock external dependencies\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn().mockReturnValue(false),\n isPathIsDir: jest.fn(),\n fileName: jest.fn().mockReturnValue('fileName'),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag-123\"')\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe('WebDAVMethods', () => {\n let service: WebDAVMethods\n let filesManager: jest.Mocked<FilesManager>\n let filesLockManager: jest.Mocked<FilesLockManager>\n let webDAVSpaces: jest.Mocked<WebDAVSpaces>\n\n // Helper to create a mocked response object\n const createMockResponse = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n // Helper to create a base request object\n const createBaseRequest = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'test-user', fullName: 'Test User', email: 'test-user@sync-in.com' },\n dav: {\n url: '/webdav/test/file.txt',\n depth: '0',\n httpVersion: 'HTTP/1.1',\n body: '<lockinfo/>',\n lock: {\n timeout: 60,\n lockscope: 'exclusive',\n owner: 'test-user',\n token: 'opaquelocktoken:abc123'\n },\n ifHeaders: []\n },\n space: {\n id: 1,\n alias: 'test-space',\n url: '/webdav/test/file.txt',\n realPath: '/real/path/to/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt', spaceId: 1, inTrash: false }\n },\n ...overrides\n }) as any\n\n beforeEach(async () => {\n // Initialize mocks\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n copyMove: jest.fn()\n } as any\n\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn(),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn(),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn(),\n genDAVToken: jest.fn().mockReturnValue('opaquelocktoken:new-token')\n } as any\n\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n } as any\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n { provide: FilesManager, useValue: filesManager },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n\n // Reset global mocks\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/to')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n describe('Service initialization', () => {\n it('should be defined', () => {\n expect(service).toBeDefined()\n expect(service).toBeInstanceOf(WebDAVMethods)\n })\n })\n\n describe('headOrGet', () => {\n describe('Success cases', () => {\n it('should stream file when repository is FILES and not in shares list', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const streamable = { stream: 'file-content' }\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(sendFile.checks).toHaveBeenCalledTimes(1)\n expect(sendFile.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n })\n\n describe('Error cases', () => {\n it('should return 403 when repository is not FILES', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.headOrGet(req, res, 'OTHER_REPO')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should return 403 when resource is in shares list', async () => {\n const req = createBaseRequest({ space: { ...createBaseRequest().space, inSharesList: true } })\n const res = createMockResponse()\n\n await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should handle errors from sendFile.checks', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('File check failed')\n const sendFile = {\n checks: jest.fn().mockRejectedValue(error),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n\n it('should handle errors from sendFile.stream', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('Stream failed')\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockRejectedValue(error)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n })\n })\n\n describe('lock', () => {\n describe('Lock refresh (without body)', () => {\n it('should return 400 if resource does not exist for lock refresh', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('should delegate to lockRefresh when resource exists and no body', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('refresh-ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('refresh-ok')\n })\n })\n\n describe('Lock creation on existing resource', () => {\n it('should create lock successfully and return 200', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options, _timeout) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n } as Partial<FileLock>\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n expect(res.body).toBeDefined()\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock creation on non-existent resource', () => {\n it('should return 403 when user lacks ADD permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should return 409 when parent directory does not exist', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(false) // parent\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/missing')\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should create empty file and lock, return 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(true) // parent exists\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, false, false, false)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n })\n })\n\n describe('Lock conflict', () => {\n it('should return 423 when lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockResolvedValue([\n false,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n }\n ] as any)\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n })\n })\n })\n\n describe('unlock', () => {\n describe('Success cases', () => {\n it('should unlock resource and return 204', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 1, login: 'test-user' },\n key: 'lock-key-123'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('lock-key-123')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('Error cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 409 when lock token does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' },\n key: 'lock-key-456'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('propfind', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist in FILES repository', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, propfindMode: 'prop' } })\n const res = createMockResponse()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return multistatus with property names in PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: 'propname' }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/webdav/test/file.txt')\n })\n\n it('should return multistatus with property values in PROP mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield {\n href: '/webdav/test/file.txt',\n name: 'file.txt',\n getlastmodified: 'Mon, 01 Jan 2024 00:00:00 GMT'\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock discovery', () => {\n it('should collect locks with depth 0', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: DEPTH.RESOURCE,\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should collect parent and child locks with depth infinity', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: 'infinity',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should not collect locks for PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: PROPSTAT.PROPNAME }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test', name: 'test' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n expect(filesLockManager.browseParentChildLocks).not.toHaveBeenCalled()\n })\n\n it('should not collect locks for shares list', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n space: { ...createBaseRequest().space, inSharesList: true },\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/shares', name: 'shares' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('put', () => {\n describe('Success cases', () => {\n it('should return 204 when updating existing file', async () => {\n filesManager.saveStream.mockResolvedValue(true) // file existed\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, expect.objectContaining({ dav: expect.any(Object) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should return 201 when creating new file', async () => {\n filesManager.saveStream.mockResolvedValue(false) // file didn't exist\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should extract and pass lock tokens from if-headers', async () => {\n filesManager.saveStream.mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PUT',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:xyz', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:xyz'])\n\n await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(\n req.user,\n req.space,\n req,\n expect.objectContaining({\n dav: expect.objectContaining({\n lockTokens: ['opaquelocktoken:xyz']\n })\n })\n )\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.saveStream.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file error', async () => {\n const fileError = new FileError(409, 'File conflict')\n filesManager.saveStream.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Unexpected error')\n filesManager.saveStream.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await expect(service.put(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('delete', () => {\n describe('Success cases', () => {\n it('should delete resource and return 204', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: expect.any(Array) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(result).toBe(res)\n })\n\n it('should extract lock tokens from if-headers', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'DELETE',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:abc'])\n\n await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: ['opaquelocktoken:abc'] }))\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.delete.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(404, 'File not found')\n filesManager.delete.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Database error')\n filesManager.delete.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await expect(service.delete(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('proppatch', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { invalidaction: {} } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('should return 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { notprop: {} } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n })\n\n describe('SET action', () => {\n it('should successfully modify lastmodified property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('should return 207 with 403 for unsupported properties', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ unsupportedProp: 'value' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n })\n\n it('should handle Win32 properties correctly', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('should return 424 failed dependency when touch fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValue(new Error('Touch failed'))\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('424')\n })\n\n it('should mark supported props as 424 when unsupported prop fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: { prop: [{ unsupportedProp: 'fail' }, { Win32CreationTime: 'ok' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('424')\n })\n })\n\n describe('REMOVE action', () => {\n it('should handle REMOVE action on supported property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n remove: { prop: [{ Win32CreationTime: '' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n })\n\n describe('Data normalization', () => {\n it('should normalize array of propertyupdate items', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-01-01' } }, { prop: { Win32CreationTime: 'ok' } }]\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('lastmodified')\n })\n\n it('should wrap single prop object into array', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: 'HTTP/1.1',\n body: {\n propertyupdate: {\n set: { prop: { lastmodified: '2024-01-01' } }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n })\n\n describe('Lock handling', () => {\n it('should check lock conflicts before applying changes', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: 'ok' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesLockManager.checkConflicts).toHaveBeenCalledWith(\n req.space.dbFile,\n req.dav.depth,\n expect.objectContaining({\n userId: req.user.id,\n lockTokens: expect.any(Array)\n })\n )\n })\n\n it('should handle lock conflict error', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesLockManager.checkConflicts.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n })\n\n describe('mkcol', () => {\n describe('Success cases', () => {\n it('should create directory and return 201', async () => {\n filesManager.mkDir.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalledWith(\n req.user,\n req.space,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'dir',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.mkDir.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(409, 'Directory already exists')\n filesManager.mkDir.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Directory already exists')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Filesystem error')\n filesManager.mkDir.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await expect(service.mkcol(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('copyMove', () => {\n describe('Base cases', () => {\n it('should return 404 when destination space not found', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/unknown', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/webdav/unknown')\n })\n })\n\n describe('COPY operation', () => {\n it('should copy file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/copy.txt',\n realPath: '/real/path/to/copy.txt',\n dbFile: { path: 'copy.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/copy.txt', isMove: false, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(\n req.user,\n req.space,\n dstSpace,\n false,\n false,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should copy file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('MOVE operation', () => {\n it('should move file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/moved.txt',\n realPath: '/real/path/to/moved.txt',\n dbFile: { path: 'moved.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/moved.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, false, false, expect.any(Object))\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should move file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: true, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('If-Headers on destination', () => {\n it('should return early when evaluateIfHeaders fails for destination', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', etag: { value: 'W/\"wrong\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n\n it('should return 412 when destination If-Header haveLock mismatches', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue(dstSpace.dbFile)\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'dest.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle lock conflict without lockRoot (fallback to dbFilePath)', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict({ dbFilePath: 'dest.txt' } as any, 'Lock conflict')\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const fileError = new FileError(409, 'File conflict')\n filesManager.copyMove.mockRejectedValue(fileError)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const unexpectedError = new Error('Unexpected filesystem error')\n filesManager.copyMove.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await expect(service.copyMove(req, res)).rejects.toThrow(HttpException)\n })\n\n it('should include destination URL in error log', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n filesManager.copyMove.mockRejectedValue(new Error('Copy failed'))\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n try {\n await service.copyMove(req, res)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /webdav/test/dest.txt'))\n })\n })\n })\n\n describe('evaluateIfHeaders', () => {\n describe('Base cases', () => {\n it('should return true when no if-headers present', async () => {\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, ifHeaders: undefined } })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return true when at least one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return false when path cannot be resolved', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ path: '/webdav/unknown/file.txt' }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBeUndefined()\n })\n })\n\n describe('haveLock condition', () => {\n it('should return true when haveLock matches (lock exists, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when haveLock matches (no lock, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when haveLock mismatches (lock exists, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock mismatches (no lock, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock lookup throws error', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('Database error'))\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n\n describe('token condition', () => {\n it('should return true when token exists and path matches lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when token exists and path is child of lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/subfolder/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when token not found', async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when token exists but path does not match lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/other/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should evaluate token condition with explicit path in if-header', async () => {\n const explicitSpace = {\n ...createBaseRequest().space,\n url: '/webdav/explicit/path.txt',\n realPath: '/real/path/to/explicit.txt',\n dbFile: { path: 'explicit/path.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(explicitSpace)\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/explicit' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n {\n path: '/webdav/explicit/path.txt',\n token: { value: 'opaquelocktoken:xyz', mustMatch: true }\n }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(webDAVSpaces.spaceEnv).toHaveBeenCalledWith(req.user, '/webdav/explicit/path.txt')\n expect(result).toBe(true)\n })\n })\n\n describe('etag condition', () => {\n it('should return true when etag matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when etag does not match and mustMatch=false', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"different\"', mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when etag mismatches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should cache etag for multiple conditions on same path', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong1\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(genEtag).toHaveBeenCalledTimes(1) // Cached\n })\n })\n\n describe('Multiple conditions', () => {\n it('should evaluate multiple conditions and return true if any matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { haveLock: { mustMatch: true } }, // Will fail (no lock)\n { haveLock: { mustMatch: false } } // Will succeed (no lock)\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when all conditions fail', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { etag: { value: 'W/\"wrong1\"', mustMatch: true } },\n { etag: { value: 'W/\"wrong2\"', mustMatch: true } },\n { token: { value: 'opaquelocktoken:missing', mustMatch: true } }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n })\n\n describe('lockRefresh (private method)', () => {\n describe('Parameter validation', () => {\n it('should return 400 when no if-headers present', async () => {\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, body: undefined, ifHeaders: [] }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when more than one if-header present', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'token1', mustMatch: true } }, { token: { value: 'token2', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when token extraction fails', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ notAToken: true }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockImplementation(() => {\n throw new Error('No token found')\n })\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unable to extract token')\n })\n })\n\n describe('Token validation', () => {\n it('should return 412 when token not found or does not match path', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:missing')\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith('opaquelocktoken:missing', 'file.txt')\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n const req = createBaseRequest({\n user: { id: 1, login: 'user1' },\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' }\n } as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n })\n\n describe('Successful refresh', () => {\n it('should refresh lock and return 200 with XML body', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: 180 },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt', lockToken: 'opaquelocktoken:abc' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, 180)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n\n it('should use default timeout when not specified', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: undefined },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, undefined)\n })\n })\n })\n\n describe('handleError (private method)', () => {\n describe('LockConflict errors', () => {\n it('should handle LockConflict with lockRoot', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n } as any,\n 'Lock conflict'\n )\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toContain('application/xml')\n })\n\n it('should handle LockConflict without lockRoot (fallback to dbFilePath)', async () => {\n const lockError = new LockConflict({ dbFilePath: 'file.txt' } as any, 'Lock conflict')\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('FileError errors', () => {\n it('should handle FileError and return correct status code', async () => {\n const fileError = new FileError(409, 'Conflict: file already exists')\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Conflict: file already exists')\n })\n\n it('should strip additional error information after comma', async () => {\n const fileError = new FileError(404, 'File not found, /real/path/details')\n const req = createBaseRequest({ method: 'GET' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n })\n\n describe('Unexpected errors', () => {\n it('should throw HttpException for unexpected errors', () => {\n const unexpectedError = new Error('Database connection failed')\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n expect(() => {\n ;(service as any).handleError(req, res, unexpectedError)\n }).toThrow(HttpException)\n })\n\n it('should log error with method and URL', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'PUT', dav: { ...createBaseRequest().dav, url: '/webdav/test.txt' } })\n const res = createMockResponse()\n const error = new Error('Test error')\n\n try {\n ;(service as any).handleError(req, res, error)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('PUT'))\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining('/webdav/test.txt'))\n })\n\n it('should include destination URL in log when provided', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'COPY' })\n const res = createMockResponse()\n const error = new Error('Copy error')\n\n try {\n ;(service as any).handleError(req, res, error, '/webdav/destination.txt')\n } catch {\n // Expected to throw\n }\n\n expect(logSpy).toHaveBeenCalledWith(expect.stringContaining(' -> /webdav/destination.txt'))\n })\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","mockReturnValue","isPathIsDir","fileName","dirName","genEtag","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","service","filesManager","filesLockManager","webDAVSpaces","createMockResponse","res","statusCode","body","headers","contentType","status","code","send","payload","header","name","value","toLowerCase","type","ct","createBaseRequest","overrides","method","user","id","login","fullName","email","dav","url","depth","httpVersion","lock","timeout","lockscope","owner","token","ifHeaders","space","alias","realPath","inSharesList","dbFile","path","spaceId","inTrash","beforeEach","sendFileFromSpace","mkFile","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","genDAVToken","propfind","spaceEnv","module","Test","createTestingModule","providers","WebDAVMethods","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","clearAllMocks","mockResolvedValue","afterEach","restoreAllMocks","it","expect","toBeDefined","toBeInstanceOf","req","streamable","stream","sendFile","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","error","Error","mockRejectedValue","spyOn","BAD_REQUEST","lockRefreshSpy","mockImplementation","_user","_dbFile","_app","_depth","options","_timeout","dbFilePath","lockRoot","lockToken","lockScope","lockInfo","OK","toContain","not","toHaveBeenCalled","mockResolvedValueOnce","CONFLICT","CREATED","LOCKED","key","unlock","NO_CONTENT","NOT_FOUND","propfindMode","href","MULTI_STATUS","prop","STANDARD_PROPS","getlastmodified","DEPTH","RESOURCE","LOCK_DISCOVERY_PROP","PROPSTAT","PROPNAME","put","objectContaining","any","Object","mustMatch","IfHeaderUtils","lockTokens","lockError","LockConflict","fileError","FileError","unexpectedError","rejects","toThrow","HttpException","Array","propertyupdate","set","lastmodified","proppatch","invalidaction","notprop","unsupportedProp","Win32CreationTime","remove","userId","mkcol","destination","isMove","overwrite","dstSpace","etag","toBeUndefined","PathsUtils","haveLock","PRECONDITION_FAILED","logSpy","stringContaining","evaluateIfHeaders","explicitSpace","lockRefresh","notAToken","mockLock","handleError"],"mappings":"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"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/webdav/services/webdav-methods.service.spec.ts"],"sourcesContent":["import { HttpException, HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { HTTP_VERSION } from '../../applications.constants'\nimport { FileLock } from '../../files/interfaces/file-lock.interface'\nimport { FileError } from '../../files/models/file-error'\nimport { LockConflict } from '../../files/models/file-lock-error'\nimport { FilesLockManager } from '../../files/services/files-lock-manager.service'\nimport { FilesManager } from '../../files/services/files-manager.service'\nimport { dirName, genEtag, isPathExists } from '../../files/utils/files'\nimport { SPACE_REPOSITORY } from '../../spaces/constants/spaces'\nimport * as PathsUtils from '../../spaces/utils/paths'\nimport { haveSpaceEnvPermissions } from '../../spaces/utils/permissions'\nimport { DEPTH, LOCK_DISCOVERY_PROP, PROPSTAT, STANDARD_PROPS } from '../constants/webdav'\nimport * as IfHeaderUtils from '../utils/if-header'\nimport { WebDAVMethods } from './webdav-methods.service'\nimport { WebDAVSpaces } from './webdav-spaces.service'\n\n// Mock external dependencies\njest.mock('../../files/utils/files', () => ({\n isPathExists: jest.fn().mockReturnValue(false),\n isPathIsDir: jest.fn(),\n fileName: jest.fn().mockReturnValue('fileName'),\n dirName: jest.fn(),\n genEtag: jest.fn().mockReturnValue('W/\"etag-123\"')\n}))\n\njest.mock('../../spaces/utils/permissions', () => ({\n haveSpaceEnvPermissions: jest.fn()\n}))\n\njest.mock('../../spaces/utils/paths', () => {\n const actual = jest.requireActual('../../spaces/utils/paths')\n return { ...actual, dbFileFromSpace: jest.fn() }\n})\n\njest.mock('../decorators/if-header.decorator', () => ({\n IfHeaderDecorator: () => (_target?: any, _key?: string, _desc?: any) => undefined\n}))\n\ndescribe('WebDAVMethods', () => {\n let service: WebDAVMethods\n let filesManager: jest.Mocked<FilesManager>\n let filesLockManager: jest.Mocked<FilesLockManager>\n let webDAVSpaces: jest.Mocked<WebDAVSpaces>\n\n // Helper to create a mocked response object\n const createMockResponse = () => {\n const res: any = {\n statusCode: undefined,\n body: undefined,\n headers: {} as Record<string, string>,\n contentType: undefined,\n status(code: number) {\n this.statusCode = code\n return this\n },\n send(payload?: any) {\n this.body = payload\n return this\n },\n header(name: string, value: string) {\n this.headers[name.toLowerCase()] = value\n return this\n },\n type(ct: string) {\n this.contentType = ct\n return this\n }\n }\n return res\n }\n\n // Helper to create a base request object\n const createBaseRequest = (overrides: Partial<any> = {}) =>\n ({\n method: 'GET',\n user: { id: 1, login: 'test-user', fullName: 'Test User', email: 'test-user@sync-in.com' },\n dav: {\n url: '/webdav/test/file.txt',\n depth: '0',\n httpVersion: HTTP_VERSION,\n body: '<lockinfo/>',\n lock: {\n timeout: 60,\n lockscope: 'exclusive',\n owner: 'test-user',\n token: 'opaquelocktoken:abc123'\n },\n ifHeaders: []\n },\n space: {\n id: 1,\n alias: 'test-space',\n url: '/webdav/test/file.txt',\n realPath: '/real/path/to/file.txt',\n inSharesList: false,\n dbFile: { path: 'file.txt', spaceId: 1, inTrash: false }\n },\n ...overrides\n }) as any\n\n beforeEach(async () => {\n // Initialize mocks\n filesManager = {\n sendFileFromSpace: jest.fn(),\n mkFile: jest.fn(),\n saveStream: jest.fn(),\n delete: jest.fn(),\n touch: jest.fn(),\n mkDir: jest.fn(),\n copyMove: jest.fn()\n } as any\n\n filesLockManager = {\n create: jest.fn(),\n isLockedWithToken: jest.fn(),\n removeLock: jest.fn(),\n browseLocks: jest.fn(),\n browseParentChildLocks: jest.fn(),\n checkConflicts: jest.fn(),\n getLocksByPath: jest.fn(),\n getLockByToken: jest.fn(),\n refreshLockTimeout: jest.fn(),\n genDAVToken: jest.fn().mockReturnValue('opaquelocktoken:new-token')\n } as any\n\n webDAVSpaces = {\n propfind: jest.fn(),\n spaceEnv: jest.fn()\n } as any\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n WebDAVMethods,\n { provide: WebDAVSpaces, useValue: webDAVSpaces },\n { provide: FilesManager, useValue: filesManager },\n { provide: FilesLockManager, useValue: filesLockManager }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<WebDAVMethods>(WebDAVMethods)\n\n // Reset global mocks\n jest.clearAllMocks()\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/to')\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n })\n\n afterEach(() => {\n jest.restoreAllMocks()\n })\n\n describe('Service initialization', () => {\n it('should be defined', () => {\n expect(service).toBeDefined()\n expect(service).toBeInstanceOf(WebDAVMethods)\n })\n })\n\n describe('headOrGet', () => {\n describe('Success cases', () => {\n it('should stream file when repository is FILES and not in shares list', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const streamable = { stream: 'file-content' }\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockResolvedValue(streamable)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesManager.sendFileFromSpace).toHaveBeenCalledWith(req.space)\n expect(sendFile.checks).toHaveBeenCalledTimes(1)\n expect(sendFile.stream).toHaveBeenCalledWith(req, res)\n expect(result).toBe(streamable)\n })\n })\n\n describe('Error cases', () => {\n it('should return 403 when repository is not FILES', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.headOrGet(req, res, 'OTHER_REPO')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should return 403 when resource is in shares list', async () => {\n const req = createBaseRequest({ space: { ...createBaseRequest().space, inSharesList: true } })\n const res = createMockResponse()\n\n await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Not allowed on this resource')\n })\n\n it('should handle errors from sendFile.checks', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('File check failed')\n const sendFile = {\n checks: jest.fn().mockRejectedValue(error),\n stream: jest.fn()\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n\n it('should handle errors from sendFile.stream', async () => {\n const req = createBaseRequest()\n const res = createMockResponse()\n const error = new Error('Stream failed')\n const sendFile = {\n checks: jest.fn().mockResolvedValue(undefined),\n stream: jest.fn().mockRejectedValue(error)\n }\n filesManager.sendFileFromSpace.mockReturnValue(sendFile as any)\n jest.spyOn<any, any>(service, 'handleError').mockReturnValue('error-handled')\n\n const result = await service.headOrGet(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe('error-handled')\n })\n })\n })\n\n describe('lock', () => {\n describe('Lock refresh (without body)', () => {\n it('should return 400 if resource does not exist for lock refresh', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toBe('Lock refresh must specify an existing resource')\n })\n\n it('should delegate to lockRefresh when resource exists and no body', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, body: undefined } })\n const res = createMockResponse()\n const lockRefreshSpy = jest.spyOn<any, any>(service, 'lockRefresh').mockResolvedValue('refresh-ok')\n\n const result = await service.lock(req, res)\n\n expect(lockRefreshSpy).toHaveBeenCalledWith(req, res, req.space.dbFile.path)\n expect(result).toBe('refresh-ok')\n })\n })\n\n describe('Lock creation on existing resource', () => {\n it('should create lock successfully and return 200', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options, _timeout) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n } as Partial<FileLock>\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesLockManager.create).toHaveBeenCalledTimes(1)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n expect(res.body).toBeDefined()\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock creation on non-existent resource', () => {\n it('should return 403 when user lacks ADD permission', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('You are not allowed to do this action')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should return 409 when parent directory does not exist', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(false) // parent\n ;(haveSpaceEnvPermissions as jest.Mock).mockReturnValue(true)\n ;(dirName as jest.Mock).mockReturnValue('/real/path/missing')\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n expect(res.body).toBe('Parent must exists')\n expect(filesLockManager.create).not.toHaveBeenCalled()\n })\n\n it('should create empty file and lock, return 201', async () => {\n ;(isPathExists as jest.Mock)\n .mockResolvedValueOnce(false) // resource\n .mockResolvedValueOnce(true) // parent exists\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockImplementation(async (_user, _dbFile, _app, _depth, options) => {\n return [\n true,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: _dbFile?.path,\n options: {\n lockRoot: options.lockRoot,\n lockToken: options.lockToken,\n lockScope: options.lockScope,\n lockInfo: options.lockInfo\n }\n }\n ] as any\n })\n\n await service.lock(req, res)\n\n expect(filesManager.mkFile).toHaveBeenCalledWith(req.user, req.space, false, false, false)\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['lock-token']).toContain('opaquelocktoken:new-token')\n })\n })\n\n describe('Lock conflict', () => {\n it('should return 423 when lock conflict occurs', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n filesLockManager.create.mockResolvedValue([\n false,\n {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n }\n ] as any)\n\n await service.lock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toBe('application/xml; charset=utf-8')\n })\n })\n })\n\n describe('unlock', () => {\n describe('Success cases', () => {\n it('should unlock resource and return 204', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 1, login: 'test-user' },\n key: 'lock-key-123'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.removeLock).toHaveBeenCalledWith('lock-key-123')\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('Error cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 409 when lock token does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith(req.dav.lock.token, req.space.dbFile.path)\n expect(res.statusCode).toBe(HttpStatus.CONFLICT)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' },\n key: 'lock-key-456'\n } as any)\n const req = createBaseRequest()\n const res = createMockResponse()\n\n await service.unlock(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Token was created by another user')\n expect(filesLockManager.removeLock).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('propfind', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist in FILES repository', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, propfindMode: 'prop' } })\n const res = createMockResponse()\n\n const result = await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return multistatus with property names in PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: 'propname' }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('/webdav/test/file.txt')\n })\n\n it('should return multistatus with property values in PROP mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [STANDARD_PROPS[0]]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield {\n href: '/webdav/test/file.txt',\n name: 'file.txt',\n getlastmodified: 'Mon, 01 Jan 2024 00:00:00 GMT'\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n })\n\n describe('Lock discovery', () => {\n it('should collect locks with depth 0', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: DEPTH.RESOURCE,\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should collect parent and child locks with depth infinity', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n depth: 'infinity',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test/file.txt', name: 'file.txt' }\n } as any)\n\n filesLockManager.browseParentChildLocks.mockResolvedValue({\n 'file.txt': {\n owner: { fullName: 'LockOwner', email: 'lock-owner@sync-in.com' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseParentChildLocks).toHaveBeenCalledWith(req.space.dbFile)\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n\n it('should not collect locks for PROPNAME mode', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, propfindMode: PROPSTAT.PROPNAME }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/test', name: 'test' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n expect(filesLockManager.browseParentChildLocks).not.toHaveBeenCalled()\n })\n\n it('should not collect locks for shares list', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n space: { ...createBaseRequest().space, inSharesList: true },\n dav: {\n ...createBaseRequest().dav,\n propfindMode: 'prop',\n body: { propfind: { prop: { [LOCK_DISCOVERY_PROP]: '' } } }\n }\n })\n const res = createMockResponse()\n\n webDAVSpaces.propfind.mockImplementation(async function* () {\n yield { href: '/webdav/shares', name: 'shares' }\n } as any)\n\n await service.propfind(req, res, SPACE_REPOSITORY.FILES)\n\n expect(filesLockManager.browseLocks).not.toHaveBeenCalled()\n })\n })\n })\n\n describe('put', () => {\n describe('Success cases', () => {\n it('should return 204 when updating existing file', async () => {\n filesManager.saveStream.mockResolvedValue(true) // file existed\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(req.user, req.space, req, expect.objectContaining({ dav: expect.any(Object) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should return 201 when creating new file', async () => {\n filesManager.saveStream.mockResolvedValue(false) // file didn't exist\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n expect(res.headers['etag']).toBeDefined()\n expect(result).toBe(res)\n })\n\n it('should extract and pass lock tokens from if-headers', async () => {\n filesManager.saveStream.mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PUT',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:xyz', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:xyz'])\n\n await service.put(req, res)\n\n expect(filesManager.saveStream).toHaveBeenCalledWith(\n req.user,\n req.space,\n req,\n expect.objectContaining({\n dav: expect.objectContaining({\n lockTokens: ['opaquelocktoken:xyz']\n })\n })\n )\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.saveStream.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file error', async () => {\n const fileError = new FileError(409, 'File conflict')\n filesManager.saveStream.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await service.put(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Unexpected error')\n filesManager.saveStream.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n await expect(service.put(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('delete', () => {\n describe('Success cases', () => {\n it('should delete resource and return 204', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: expect.any(Array) }))\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n expect(result).toBe(res)\n })\n\n it('should extract lock tokens from if-headers', async () => {\n filesManager.delete.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'DELETE',\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractAllTokens').mockReturnValue(['opaquelocktoken:abc'])\n\n await service.delete(req, res)\n\n expect(filesManager.delete).toHaveBeenCalledWith(req.user, req.space, expect.objectContaining({ lockTokens: ['opaquelocktoken:abc'] }))\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.delete.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(404, 'File not found')\n filesManager.delete.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await service.delete(req, res)\n\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Database error')\n filesManager.delete.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n await expect(service.delete(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('proppatch', () => {\n describe('Base cases', () => {\n it('should return 404 when resource does not exist', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe(req.dav.url)\n })\n\n it('should return 400 for unknown action tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { invalidaction: {} } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n\n it('should return 400 when missing prop tag', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { notprop: {} } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unknown tag')\n })\n })\n\n describe('SET action', () => {\n it('should successfully modify lastmodified property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n expect(res.body).toContain('lastmodified')\n expect(res.body).toContain('200')\n })\n\n it('should return 207 with 403 for unsupported properties', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: { propertyupdate: { set: { prop: [{ unsupportedProp: 'value' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n })\n\n it('should handle Win32 properties correctly', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n\n it('should return 424 failed dependency when touch fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockRejectedValue(new Error('Touch failed'))\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('424')\n })\n\n it('should mark supported props as 424 when unsupported prop fails', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: {\n propertyupdate: {\n set: { prop: [{ unsupportedProp: 'fail' }, { Win32CreationTime: 'ok' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('unsupportedProp')\n expect(res.body).toContain('403')\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('424')\n })\n })\n\n describe('REMOVE action', () => {\n it('should handle REMOVE action on supported property', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: {\n propertyupdate: {\n remove: { prop: [{ Win32CreationTime: '' }] }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).not.toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('Win32CreationTime')\n expect(res.body).toContain('200')\n })\n })\n\n describe('Data normalization', () => {\n it('should normalize array of propertyupdate items', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: {\n propertyupdate: {\n set: [{ prop: { lastmodified: '2024-01-01' } }, { prop: { Win32CreationTime: 'ok' } }]\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n expect(res.body).toContain('lastmodified')\n })\n\n it('should wrap single prop object into array', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n filesManager.touch.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n httpVersion: HTTP_VERSION,\n body: {\n propertyupdate: {\n set: { prop: { lastmodified: '2024-01-01' } }\n }\n }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesManager.touch).toHaveBeenCalled()\n expect(res.statusCode).toBe(HttpStatus.MULTI_STATUS)\n })\n })\n\n describe('Lock handling', () => {\n it('should check lock conflicts before applying changes', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n filesLockManager.checkConflicts.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ Win32CreationTime: 'ok' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(filesLockManager.checkConflicts).toHaveBeenCalledWith(\n req.space.dbFile,\n req.dav.depth,\n expect.objectContaining({\n userId: req.user.id,\n lockTokens: expect.any(Array)\n })\n )\n })\n\n it('should handle lock conflict error', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesLockManager.checkConflicts.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'PROPPATCH',\n dav: {\n ...createBaseRequest().dav,\n body: { propertyupdate: { set: { prop: [{ lastmodified: '2024-01-01' }] } } }\n }\n })\n const res = createMockResponse()\n\n await service.proppatch(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n })\n\n describe('mkcol', () => {\n describe('Success cases', () => {\n it('should create directory and return 201', async () => {\n filesManager.mkDir.mockResolvedValue(undefined)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(filesManager.mkDir).toHaveBeenCalledWith(\n req.user,\n req.space,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'dir',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.mkDir.mockRejectedValue(lockError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const fileError = new FileError(409, 'Directory already exists')\n filesManager.mkDir.mockRejectedValue(fileError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await service.mkcol(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Directory already exists')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const unexpectedError = new Error('Filesystem error')\n filesManager.mkDir.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n await expect(service.mkcol(req, res)).rejects.toThrow(HttpException)\n })\n })\n })\n\n describe('copyMove', () => {\n describe('Base cases', () => {\n it('should return 404 when destination space not found', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/unknown', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NOT_FOUND)\n expect(res.body).toBe('/webdav/unknown')\n })\n })\n\n describe('COPY operation', () => {\n it('should copy file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/copy.txt',\n realPath: '/real/path/to/copy.txt',\n dbFile: { path: 'copy.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/copy.txt', isMove: false, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(\n req.user,\n req.space,\n dstSpace,\n false,\n false,\n false,\n expect.objectContaining({\n depth: req.dav.depth,\n lockTokens: expect.any(Array)\n })\n )\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should copy file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('MOVE operation', () => {\n it('should move file and return 201 when destination does not exist', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/moved.txt',\n realPath: '/real/path/to/moved.txt',\n dbFile: { path: 'moved.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/moved.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(filesManager.copyMove).toHaveBeenCalledWith(req.user, req.space, dstSpace, true, false, false, expect.any(Object))\n expect(res.statusCode).toBe(HttpStatus.CREATED)\n })\n\n it('should move file and return 204 when destination exists', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/existing.txt',\n realPath: '/real/path/to/existing.txt',\n dbFile: { path: 'existing.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n filesManager.copyMove.mockResolvedValue(undefined)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/existing.txt', isMove: true, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.NO_CONTENT)\n })\n })\n\n describe('If-Headers on destination', () => {\n it('should return early when evaluateIfHeaders fails for destination', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(false)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', etag: { value: 'W/\"wrong\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(filesManager.copyMove).not.toHaveBeenCalled()\n })\n\n it('should return 412 when destination If-Header haveLock mismatches', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue(dstSpace.dbFile)\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true },\n ifHeaders: [{ path: '/webdav/test/dest.txt', haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await service.copyMove(req, res)\n\n expect(result).toBeUndefined()\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n })\n\n describe('Error handling', () => {\n it('should handle lock conflict error', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict(\n {\n dbFilePath: 'dest.txt',\n options: { lockRoot: '/webdav/locked' }\n } as any,\n 'Lock conflict'\n )\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle lock conflict without lockRoot (fallback to dbFilePath)', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const lockError = new LockConflict({ dbFilePath: 'dest.txt' } as any, 'Lock conflict')\n filesManager.copyMove.mockRejectedValue(lockError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n\n it('should handle file errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const fileError = new FileError(409, 'File conflict')\n filesManager.copyMove.mockRejectedValue(fileError)\n const req = createBaseRequest({\n method: 'MOVE',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: true, overwrite: false }\n }\n })\n const res = createMockResponse()\n\n await service.copyMove(req, res)\n\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('File conflict')\n })\n\n it('should throw HttpException for unexpected errors', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const unexpectedError = new Error('Unexpected filesystem error')\n filesManager.copyMove.mockRejectedValue(unexpectedError)\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n await expect(service.copyMove(req, res)).rejects.toThrow(HttpException)\n })\n\n it('should include destination URL in error log', async () => {\n const dstSpace = {\n ...createBaseRequest().space,\n url: '/webdav/test/dest.txt',\n realPath: '/real/path/to/dest.txt',\n dbFile: { path: 'dest.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(dstSpace)\n jest.spyOn<any, any>(service, 'evaluateIfHeaders').mockResolvedValue(true)\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined as any)\n filesManager.copyMove.mockRejectedValue(new Error('Copy failed'))\n const req = createBaseRequest({\n method: 'COPY',\n dav: {\n ...createBaseRequest().dav,\n copyMove: { destination: '/webdav/test/dest.txt', isMove: false, overwrite: true }\n }\n })\n const res = createMockResponse()\n\n try {\n await service.copyMove(req, res)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy.mock.calls.some(([payload]: { msg: string }[]) => payload?.msg?.includes(' -> /webdav/test/dest.txt'))).toBe(true)\n })\n })\n })\n\n describe('evaluateIfHeaders', () => {\n describe('Base cases', () => {\n it('should return true when no if-headers present', async () => {\n const req = createBaseRequest({ dav: { ...createBaseRequest().dav, ifHeaders: undefined } })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return true when at least one condition matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(res.statusCode).toBeUndefined()\n })\n\n it('should return false when path cannot be resolved', async () => {\n webDAVSpaces.spaceEnv.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ path: '/webdav/unknown/file.txt' }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBeUndefined()\n })\n })\n\n describe('haveLock condition', () => {\n it('should return true when haveLock matches (lock exists, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when haveLock matches (no lock, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when haveLock mismatches (lock exists, mustMatch=false)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([{ key: 'lock1' }] as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock mismatches (no lock, mustMatch=true)', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when haveLock lookup throws error', async () => {\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockRejectedValue(new Error('Database error'))\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ haveLock: { mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n\n describe('token condition', () => {\n it('should return true when token exists and path matches lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when token exists and path is child of lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/test' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/subfolder/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when token not found', async () => {\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when token exists but path does not match lockroot', async () => {\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/other/file.txt' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n url: '/webdav/test/file.txt',\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should evaluate token condition with explicit path in if-header', async () => {\n const explicitSpace = {\n ...createBaseRequest().space,\n url: '/webdav/explicit/path.txt',\n realPath: '/real/path/to/explicit.txt',\n dbFile: { path: 'explicit/path.txt', spaceId: 1, inTrash: false }\n }\n webDAVSpaces.spaceEnv.mockResolvedValue(explicitSpace)\n filesLockManager.getLockByToken.mockResolvedValue({\n options: { lockRoot: '/webdav/explicit' }\n } as any)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n {\n path: '/webdav/explicit/path.txt',\n token: { value: 'opaquelocktoken:xyz', mustMatch: true }\n }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(webDAVSpaces.spaceEnv).toHaveBeenCalledWith(req.user, '/webdav/explicit/path.txt')\n expect(result).toBe(true)\n })\n })\n\n describe('etag condition', () => {\n it('should return true when etag matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return true when etag does not match and mustMatch=false', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"different\"', mustMatch: false } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when etag mismatches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong-etag\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return false with 412 when resource does not exist (null etag)', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should cache etag for multiple conditions on same path', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [{ etag: { value: 'W/\"wrong1\"', mustMatch: true } }, { etag: { value: 'W/\"etag-123\"', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n expect(genEtag).toHaveBeenCalledTimes(1) // Cached\n })\n })\n\n describe('Multiple conditions', () => {\n it('should evaluate multiple conditions and return true if any matches', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(PathsUtils.dbFileFromSpace as jest.Mock).mockReturnValue({ path: 'file.txt', spaceId: 1 })\n filesLockManager.getLocksByPath.mockResolvedValue([])\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { haveLock: { mustMatch: true } }, // Will fail (no lock)\n { haveLock: { mustMatch: false } } // Will succeed (no lock)\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(true)\n })\n\n it('should return false with 412 when all conditions fail', async () => {\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(genEtag as jest.Mock).mockReturnValue('W/\"etag-123\"')\n filesLockManager.getLockByToken.mockResolvedValue(null)\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n ifHeaders: [\n { etag: { value: 'W/\"wrong1\"', mustMatch: true } },\n { etag: { value: 'W/\"wrong2\"', mustMatch: true } },\n { token: { value: 'opaquelocktoken:missing', mustMatch: true } }\n ]\n }\n })\n const res = createMockResponse()\n\n const result = await (service as any).evaluateIfHeaders(req, res)\n\n expect(result).toBe(false)\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n expect(res.body).toBe('If header condition failed')\n })\n })\n })\n\n describe('lockRefresh (private method)', () => {\n describe('Parameter validation', () => {\n it('should return 400 when no if-headers present', async () => {\n const req = createBaseRequest({\n dav: { ...createBaseRequest().dav, body: undefined, ifHeaders: [] }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when more than one if-header present', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'token1', mustMatch: true } }, { token: { value: 'token2', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Expected a lock token')\n })\n\n it('should return 400 when token extraction fails', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ notAToken: true }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockImplementation(() => {\n throw new Error('No token found')\n })\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.BAD_REQUEST)\n expect(res.body).toContain('Unable to extract token')\n })\n })\n\n describe('Token validation', () => {\n it('should return 412 when token not found or does not match path', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:missing', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:missing')\n filesLockManager.isLockedWithToken.mockResolvedValue(null)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.isLockedWithToken).toHaveBeenCalledWith('opaquelocktoken:missing', 'file.txt')\n expect(res.statusCode).toBe(HttpStatus.PRECONDITION_FAILED)\n })\n\n it('should return 403 when lock owner is different user', async () => {\n const req = createBaseRequest({\n user: { id: 1, login: 'user1' },\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue({\n owner: { id: 999, login: 'other-user' }\n } as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(res.statusCode).toBe(HttpStatus.FORBIDDEN)\n expect(res.body).toBe('Lock token does not match owner')\n })\n })\n\n describe('Successful refresh', () => {\n it('should refresh lock and return 200 with XML body', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: 180 },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt', lockToken: 'opaquelocktoken:abc' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, 180)\n expect(res.statusCode).toBe(HttpStatus.OK)\n expect(res.contentType).toContain('application/xml')\n expect(typeof res.body).toBe('string')\n })\n\n it('should use default timeout when not specified', async () => {\n const req = createBaseRequest({\n dav: {\n ...createBaseRequest().dav,\n body: undefined,\n lock: { ...createBaseRequest().dav.lock, timeout: undefined },\n ifHeaders: [{ token: { value: 'opaquelocktoken:abc', mustMatch: true } }]\n }\n })\n const res = createMockResponse()\n const mockLock = {\n owner: { id: 1, login: 'test-user' },\n options: { lockRoot: '/webdav/test/file.txt' }\n }\n jest.spyOn(IfHeaderUtils, 'extractOneToken').mockReturnValue('opaquelocktoken:abc')\n filesLockManager.isLockedWithToken.mockResolvedValue(mockLock as any)\n\n await (service as any).lockRefresh(req, res, 'file.txt')\n\n expect(filesLockManager.refreshLockTimeout).toHaveBeenCalledWith(mockLock, undefined)\n })\n })\n })\n\n describe('handleError (private method)', () => {\n describe('LockConflict errors', () => {\n it('should handle LockConflict with lockRoot', async () => {\n const lockError = new LockConflict(\n {\n dbFilePath: 'file.txt',\n options: { lockRoot: '/webdav/locked/resource' }\n } as any,\n 'Lock conflict'\n )\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n expect(res.contentType).toContain('application/xml')\n })\n\n it('should handle LockConflict without lockRoot (fallback to dbFilePath)', async () => {\n const lockError = new LockConflict({ dbFilePath: 'file.txt' } as any, 'Lock conflict')\n const req = createBaseRequest({ method: 'DELETE' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, lockError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(HttpStatus.LOCKED)\n })\n })\n\n describe('FileError errors', () => {\n it('should handle FileError and return correct status code', async () => {\n const fileError = new FileError(409, 'Conflict: file already exists')\n const req = createBaseRequest({ method: 'MKCOL' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(409)\n expect(res.body).toBe('Conflict: file already exists')\n })\n\n it('should strip additional error information after comma', async () => {\n const fileError = new FileError(404, 'File not found, /real/path/details')\n const req = createBaseRequest({ method: 'GET' })\n const res = createMockResponse()\n\n const result = (service as any).handleError(req, res, fileError)\n\n expect(result).toBe(res)\n expect(res.statusCode).toBe(404)\n expect(res.body).toBe('File not found')\n })\n })\n\n describe('Unexpected errors', () => {\n it('should throw HttpException for unexpected errors', () => {\n const unexpectedError = new Error('Database connection failed')\n const req = createBaseRequest({ method: 'PUT' })\n const res = createMockResponse()\n\n expect(() => {\n ;(service as any).handleError(req, res, unexpectedError)\n }).toThrow(HttpException)\n })\n\n it('should log error with method and URL', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'PUT', dav: { ...createBaseRequest().dav, url: '/webdav/test.txt' } })\n const res = createMockResponse()\n const error = new Error('Test error')\n\n try {\n ;(service as any).handleError(req, res, error)\n } catch {\n // Expected to throw\n }\n\n expect(logSpy.mock.calls.some(([payload]: { msg: string }[]) => payload?.msg?.includes('PUT'))).toBe(true)\n expect(logSpy.mock.calls.some(([payload]: { msg: string }[]) => payload?.msg?.includes('/webdav/test.txt'))).toBe(true)\n })\n\n it('should include destination URL in log when provided', () => {\n const logSpy = jest.spyOn((service as any)['logger'], 'error').mockImplementation(() => undefined)\n const req = createBaseRequest({ method: 'COPY' })\n const res = createMockResponse()\n const error = new Error('Copy error')\n\n try {\n ;(service as any).handleError(req, res, error, '/webdav/destination.txt')\n } catch {\n // Expected to throw\n }\n\n expect(logSpy.mock.calls.some(([payload]: { msg: string }[]) => payload?.msg?.includes(' -> /webdav/destination.txt'))).toBe(true)\n })\n })\n })\n})\n"],"names":["jest","mock","isPathExists","fn","mockReturnValue","isPathIsDir","fileName","dirName","genEtag","haveSpaceEnvPermissions","actual","requireActual","dbFileFromSpace","IfHeaderDecorator","_target","_key","_desc","undefined","describe","service","filesManager","filesLockManager","webDAVSpaces","createMockResponse","res","statusCode","body","headers","contentType","status","code","send","payload","header","name","value","toLowerCase","type","ct","createBaseRequest","overrides","method","user","id","login","fullName","email","dav","url","depth","httpVersion","HTTP_VERSION","lock","timeout","lockscope","owner","token","ifHeaders","space","alias","realPath","inSharesList","dbFile","path","spaceId","inTrash","beforeEach","sendFileFromSpace","mkFile","saveStream","delete","touch","mkDir","copyMove","create","isLockedWithToken","removeLock","browseLocks","browseParentChildLocks","checkConflicts","getLocksByPath","getLockByToken","refreshLockTimeout","genDAVToken","propfind","spaceEnv","module","Test","createTestingModule","providers","WebDAVMethods","provide","WebDAVSpaces","useValue","FilesManager","FilesLockManager","compile","useLogger","get","clearAllMocks","mockResolvedValue","afterEach","restoreAllMocks","it","expect","toBeDefined","toBeInstanceOf","req","streamable","stream","sendFile","checks","result","headOrGet","SPACE_REPOSITORY","FILES","toHaveBeenCalledWith","toHaveBeenCalledTimes","toBe","HttpStatus","FORBIDDEN","error","Error","mockRejectedValue","spyOn","BAD_REQUEST","lockRefreshSpy","mockImplementation","_user","_dbFile","_app","_depth","options","_timeout","dbFilePath","lockRoot","lockToken","lockScope","lockInfo","OK","toContain","not","toHaveBeenCalled","mockResolvedValueOnce","CONFLICT","CREATED","LOCKED","key","unlock","NO_CONTENT","NOT_FOUND","propfindMode","href","MULTI_STATUS","prop","STANDARD_PROPS","getlastmodified","DEPTH","RESOURCE","LOCK_DISCOVERY_PROP","PROPSTAT","PROPNAME","put","objectContaining","any","Object","mustMatch","IfHeaderUtils","lockTokens","lockError","LockConflict","fileError","FileError","unexpectedError","rejects","toThrow","HttpException","Array","propertyupdate","set","lastmodified","proppatch","invalidaction","notprop","unsupportedProp","Win32CreationTime","remove","userId","mkcol","destination","isMove","overwrite","dstSpace","etag","toBeUndefined","PathsUtils","haveLock","PRECONDITION_FAILED","logSpy","calls","some","msg","includes","evaluateIfHeaders","explicitSpace","lockRefresh","notAToken","mockLock","handleError"],"mappings":"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"}