@sync-in/server 1.7.0 → 1.8.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (275) hide show
  1. package/CHANGELOG.md +173 -58
  2. package/environment/environment.dist.yaml +6 -3
  3. package/migrations/0003_giant_luckman.sql +6 -0
  4. package/migrations/meta/0003_snapshot.json +2463 -0
  5. package/migrations/meta/_journal.json +7 -0
  6. package/package.json +19 -17
  7. package/server/app.bootstrap.js +5 -2
  8. package/server/app.bootstrap.js.map +1 -1
  9. package/server/app.constants.js +0 -4
  10. package/server/app.constants.js.map +1 -1
  11. package/server/app.service.js +7 -6
  12. package/server/app.service.js.map +1 -1
  13. package/server/applications/files/constants/only-office.js +12 -0
  14. package/server/applications/files/constants/only-office.js.map +1 -1
  15. package/server/applications/files/files.config.js +5 -0
  16. package/server/applications/files/files.config.js.map +1 -1
  17. package/server/applications/files/files.controller.js +12 -4
  18. package/server/applications/files/files.controller.js.map +1 -1
  19. package/server/applications/files/files.controller.spec.js +18 -4
  20. package/server/applications/files/files.controller.spec.js.map +1 -1
  21. package/server/applications/files/services/files-content-manager.service.js +6 -6
  22. package/server/applications/files/services/files-content-manager.service.js.map +1 -1
  23. package/server/applications/files/services/files-manager.service.js +4 -4
  24. package/server/applications/files/services/files-manager.service.js.map +1 -1
  25. package/server/applications/files/services/files-methods.service.js +4 -7
  26. package/server/applications/files/services/files-methods.service.js.map +1 -1
  27. package/server/applications/files/services/files-only-office-manager.service.js +2 -2
  28. package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
  29. package/server/applications/files/services/files-parser.service.js +6 -3
  30. package/server/applications/files/services/files-parser.service.js.map +1 -1
  31. package/server/applications/files/services/files-scheduler.service.js +51 -3
  32. package/server/applications/files/services/files-scheduler.service.js.map +1 -1
  33. package/server/applications/files/services/files-search-manager.service.js +4 -0
  34. package/server/applications/files/services/files-search-manager.service.js.map +1 -1
  35. package/server/applications/files/utils/doc-textify/adapters/pdf.js +6 -8
  36. package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
  37. package/server/applications/notifications/i18n/de.js +56 -0
  38. package/server/applications/notifications/i18n/de.js.map +1 -0
  39. package/server/applications/notifications/i18n/es.js +52 -0
  40. package/server/applications/notifications/i18n/es.js.map +1 -0
  41. package/server/applications/notifications/i18n/hi.js +52 -0
  42. package/server/applications/notifications/i18n/hi.js.map +1 -0
  43. package/server/applications/notifications/i18n/index.js +73 -8
  44. package/server/applications/notifications/i18n/index.js.map +1 -1
  45. package/server/applications/notifications/i18n/it.js +52 -0
  46. package/server/applications/notifications/i18n/it.js.map +1 -0
  47. package/server/applications/notifications/i18n/ja.js +52 -0
  48. package/server/applications/notifications/i18n/ja.js.map +1 -0
  49. package/server/applications/notifications/i18n/ko.js +52 -0
  50. package/server/applications/notifications/i18n/ko.js.map +1 -0
  51. package/server/applications/notifications/i18n/pl.js +52 -0
  52. package/server/applications/notifications/i18n/pl.js.map +1 -0
  53. package/server/applications/notifications/i18n/pt.js +52 -0
  54. package/server/applications/notifications/i18n/pt.js.map +1 -0
  55. package/server/applications/notifications/i18n/pt_br.js +52 -0
  56. package/server/applications/notifications/i18n/pt_br.js.map +1 -0
  57. package/server/applications/notifications/i18n/ru.js +52 -0
  58. package/server/applications/notifications/i18n/ru.js.map +1 -0
  59. package/server/applications/notifications/i18n/tr.js +52 -0
  60. package/server/applications/notifications/i18n/tr.js.map +1 -0
  61. package/server/applications/notifications/i18n/zh.js +52 -0
  62. package/server/applications/notifications/i18n/zh.js.map +1 -0
  63. package/server/applications/notifications/mails/models.js +6 -7
  64. package/server/applications/notifications/mails/models.js.map +1 -1
  65. package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
  66. package/server/applications/shares/dto/create-or-update-share.dto.js +11 -0
  67. package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
  68. package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
  69. package/server/applications/shares/schemas/share.interface.js.map +1 -1
  70. package/server/applications/shares/schemas/shares.schema.js +9 -0
  71. package/server/applications/shares/schemas/shares.schema.js.map +1 -1
  72. package/server/applications/shares/services/shares-manager.service.js +46 -17
  73. package/server/applications/shares/services/shares-manager.service.js.map +1 -1
  74. package/server/applications/shares/services/shares-queries.service.js +24 -5
  75. package/server/applications/shares/services/shares-queries.service.js.map +1 -1
  76. package/server/applications/spaces/constants/cache.js +4 -0
  77. package/server/applications/spaces/constants/cache.js.map +1 -1
  78. package/server/applications/spaces/dto/create-or-update-space.dto.js +5 -0
  79. package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
  80. package/server/applications/spaces/guards/space.guard.js +3 -3
  81. package/server/applications/spaces/guards/space.guard.js.map +1 -1
  82. package/server/applications/spaces/models/space-props.model.js.map +1 -1
  83. package/server/applications/spaces/models/space.model.js.map +1 -1
  84. package/server/applications/spaces/schemas/space.interface.js.map +1 -1
  85. package/server/applications/spaces/schemas/spaces.schema.js +1 -0
  86. package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
  87. package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
  88. package/server/applications/spaces/services/spaces-manager.service.js +34 -31
  89. package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
  90. package/server/applications/spaces/services/spaces-queries.service.js +23 -7
  91. package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
  92. package/server/applications/spaces/services/spaces-scheduler.service.js +21 -20
  93. package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
  94. package/server/applications/spaces/spaces.controller.js +4 -2
  95. package/server/applications/spaces/spaces.controller.js.map +1 -1
  96. package/server/applications/spaces/utils/paths.js +14 -16
  97. package/server/applications/spaces/utils/paths.js.map +1 -1
  98. package/server/applications/sync/services/sync-manager.service.js +4 -3
  99. package/server/applications/sync/services/sync-manager.service.js.map +1 -1
  100. package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
  101. package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
  102. package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
  103. package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
  104. package/server/applications/sync/sync.controller.js +2 -1
  105. package/server/applications/sync/sync.controller.js.map +1 -1
  106. package/server/applications/users/constants/routes.js +5 -0
  107. package/server/applications/users/constants/routes.js.map +1 -1
  108. package/server/applications/users/constants/user.js +0 -16
  109. package/server/applications/users/constants/user.js.map +1 -1
  110. package/server/applications/users/dto/user-properties.dto.js +10 -0
  111. package/server/applications/users/dto/user-properties.dto.js.map +1 -1
  112. package/server/applications/users/models/user.model.js.map +1 -1
  113. package/server/applications/users/schemas/user.interface.js.map +1 -1
  114. package/server/applications/users/schemas/users.schema.js +3 -2
  115. package/server/applications/users/schemas/users.schema.js.map +1 -1
  116. package/server/applications/users/services/admin-users-manager.service.js +1 -0
  117. package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
  118. package/server/applications/users/services/admin-users-manager.service.spec.js +2 -1
  119. package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
  120. package/server/applications/users/services/users-manager.service.js +7 -2
  121. package/server/applications/users/services/users-manager.service.js.map +1 -1
  122. package/server/applications/users/services/users-manager.service.spec.js +1 -0
  123. package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
  124. package/server/applications/users/services/users-queries.service.js +18 -4
  125. package/server/applications/users/services/users-queries.service.js.map +1 -1
  126. package/server/applications/users/users.controller.js +15 -0
  127. package/server/applications/users/users.controller.js.map +1 -1
  128. package/server/applications/users/users.gateway.js +6 -0
  129. package/server/applications/users/users.gateway.js.map +1 -1
  130. package/server/applications/users/utils/test.js +2 -2
  131. package/server/applications/users/utils/test.js.map +1 -1
  132. package/server/applications/webdav/constants/routes.js +2 -2
  133. package/server/applications/webdav/constants/routes.js.map +1 -1
  134. package/server/applications/webdav/constants/webdav.js +2 -2
  135. package/server/applications/webdav/constants/webdav.js.map +1 -1
  136. package/server/applications/webdav/filters/webdav.filter.js +2 -2
  137. package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
  138. package/server/applications/webdav/filters/webdav.filter.spec.js +2 -2
  139. package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
  140. package/server/applications/webdav/services/webdav-methods.service.js +3 -2
  141. package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
  142. package/server/applications/webdav/utils/webdav.js +1 -2
  143. package/server/applications/webdav/utils/webdav.js.map +1 -1
  144. package/server/authentication/auth.config.js +2 -2
  145. package/server/authentication/auth.config.js.map +1 -1
  146. package/server/authentication/guards/auth-basic.strategy.js +2 -2
  147. package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
  148. package/server/common/i18n.js +52 -0
  149. package/server/common/i18n.js.map +1 -0
  150. package/server/common/image.js +63 -43
  151. package/server/common/image.js.map +1 -1
  152. package/server/common/interfaces.js.map +1 -1
  153. package/server/common/shared.js +5 -2
  154. package/server/common/shared.js.map +1 -1
  155. package/server/configuration/config.validation.js +3 -3
  156. package/server/configuration/config.validation.js.map +1 -1
  157. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +8 -6
  158. package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
  159. package/server/infrastructure/cache/adapters/redis-cache.adapter.js +22 -17
  160. package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
  161. package/server/infrastructure/cache/cache.e2e-spec.js +1 -0
  162. package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
  163. package/server/infrastructure/cache/cache.module.js +1 -14
  164. package/server/infrastructure/cache/cache.module.js.map +1 -1
  165. package/server/infrastructure/cache/services/cache.service.js.map +1 -1
  166. package/server/infrastructure/database/database.module.js +20 -1
  167. package/server/infrastructure/database/database.module.js.map +1 -1
  168. package/server/infrastructure/database/utils.js +48 -0
  169. package/server/infrastructure/database/utils.js.map +1 -1
  170. package/server/infrastructure/scheduler/scheduler.module.js +1 -1
  171. package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
  172. package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -3
  173. package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
  174. package/static/3rdpartylicenses.txt +137 -163
  175. package/static/chunk-2KLC4T2Z.js +1 -0
  176. package/static/chunk-2VMSXRCB.js +12 -0
  177. package/static/chunk-3GMLWAFZ.js +1 -0
  178. package/static/chunk-3OHSRRKH.js +4 -0
  179. package/static/chunk-3R4WKOHQ.js +1 -0
  180. package/static/{chunk-7ITZXYYJ.js → chunk-3R74L4UU.js} +1 -1
  181. package/static/chunk-3XVM35O2.js +1 -0
  182. package/static/chunk-3YVRP3VM.js +2 -0
  183. package/static/chunk-5NMSIIQB.js +1 -0
  184. package/static/chunk-5UKZLU5H.js +1 -0
  185. package/static/chunk-AF24EYXU.js +1 -0
  186. package/static/chunk-AKQVEHO6.js +2 -0
  187. package/static/chunk-BCVX464U.js +2 -0
  188. package/static/chunk-BQV4FRM6.js +1 -0
  189. package/static/{chunk-EVIE5F2U.js → chunk-CETH7UYS.js} +1 -1
  190. package/static/chunk-CHJ64RJM.js +1 -0
  191. package/static/chunk-DIT6W7VM.js +562 -0
  192. package/static/chunk-DKSEQTMX.js +1 -0
  193. package/static/chunk-DM4NXKEP.js +1 -0
  194. package/static/chunk-DPUVSXRB.js +1 -0
  195. package/static/chunk-DSWEWLXJ.js +1 -0
  196. package/static/chunk-FJE6BOFL.js +1 -0
  197. package/static/chunk-FZ3JPGYZ.js +1 -0
  198. package/static/chunk-IQSKQXC3.js +1 -0
  199. package/static/chunk-ITUFI2BJ.js +1 -0
  200. package/static/chunk-JPT5WEAT.js +1 -0
  201. package/static/chunk-LCTZJ537.js +1 -0
  202. package/static/chunk-LK2UCQJ6.js +1 -0
  203. package/static/chunk-LNTUR3GU.js +1 -0
  204. package/static/chunk-LP5TBXEN.js +7 -0
  205. package/static/{chunk-IPAC4VAF.js → chunk-LVSNIS5P.js} +1 -1
  206. package/static/{chunk-SIPE37PA.js → chunk-MTVSJTIW.js} +1 -1
  207. package/static/chunk-N3U6637P.js +1 -0
  208. package/static/chunk-NNV4OXSB.js +1 -0
  209. package/static/chunk-O6FYXVHI.js +1 -0
  210. package/static/chunk-OOGP4WSH.js +2 -0
  211. package/static/chunk-PB4AIT7O.js +1 -0
  212. package/static/chunk-PCWDQPOM.js +2 -0
  213. package/static/chunk-PNR6M34W.js +1 -0
  214. package/static/chunk-PVDHBQRM.js +1 -0
  215. package/static/chunk-Q5KM7LTX.js +1 -0
  216. package/static/chunk-QHC6ZPQ4.js +1 -0
  217. package/static/chunk-QMRBZHE4.js +1 -0
  218. package/static/chunk-QO6BTONN.js +1 -0
  219. package/static/chunk-QSJRY3TF.js +1 -0
  220. package/static/chunk-QUUIRSYT.js +1 -0
  221. package/static/chunk-RFH46UW3.js +1 -0
  222. package/static/{chunk-PTGDOWV3.js → chunk-RSXHRKM5.js} +1 -1
  223. package/static/chunk-RV3VZJPZ.js +1 -0
  224. package/static/{chunk-QNJFQVYI.js → chunk-S7HNXVRB.js} +1 -1
  225. package/static/chunk-SBZ572Q4.js +2 -0
  226. package/static/chunk-SJR5R3Y4.js +1 -0
  227. package/static/chunk-SLHTEGRU.js +1 -0
  228. package/static/{chunk-SH5EVL4E.js → chunk-SSFF27P2.js} +1 -1
  229. package/static/chunk-UNCPXHHT.js +1 -0
  230. package/static/chunk-URHTCJ7G.js +1 -0
  231. package/static/chunk-V3LHHZYN.js +1 -0
  232. package/static/{chunk-DJYJ66UF.js → chunk-VJTXJ43D.js} +1 -1
  233. package/static/chunk-VQQKMY2C.js +1 -0
  234. package/static/{chunk-IQOALFYU.js → chunk-WSSU2HXE.js} +1 -1
  235. package/static/chunk-XDZGW64M.js +3 -0
  236. package/static/chunk-XTRDKGKG.js +1 -0
  237. package/static/chunk-YLWTEC3X.js +1 -0
  238. package/static/chunk-Z5J5F5SX.js +1 -0
  239. package/static/chunk-ZIJQRARU.js +1 -0
  240. package/static/index.html +2 -2
  241. package/static/main-4H5BJY3J.js +9 -0
  242. package/static/scripts-WRDOQIU5.js +24 -0
  243. package/static/{styles-A5VYX3CE.css → styles-2C2UNCNB.css} +1 -1
  244. package/server/applications/spaces/interfaces/space-quota.interface.js +0 -10
  245. package/server/applications/spaces/interfaces/space-quota.interface.js.map +0 -1
  246. package/static/chunk-22EANI6R.js +0 -1
  247. package/static/chunk-3GFGJYMK.js +0 -1
  248. package/static/chunk-4YGJGZZZ.js +0 -1
  249. package/static/chunk-5K7HEX3C.js +0 -27
  250. package/static/chunk-5KLMS6A4.js +0 -1
  251. package/static/chunk-ATP3BFHV.js +0 -562
  252. package/static/chunk-BB4G55KE.js +0 -1
  253. package/static/chunk-EWKSX76T.js +0 -1
  254. package/static/chunk-FHLACA7V.js +0 -1
  255. package/static/chunk-GCATNU55.js +0 -1
  256. package/static/chunk-GYODPCIE.js +0 -1
  257. package/static/chunk-HZTFYLM5.js +0 -1
  258. package/static/chunk-JSUKJT6Z.js +0 -1
  259. package/static/chunk-JXZCNFW7.js +0 -1
  260. package/static/chunk-LTGFCQR7.js +0 -1
  261. package/static/chunk-LV3PYKWO.js +0 -1
  262. package/static/chunk-N2WFNW6M.js +0 -7
  263. package/static/chunk-ORMRCEGT.js +0 -1
  264. package/static/chunk-OUTBJSMW.js +0 -1
  265. package/static/chunk-RS2PX32L.js +0 -1
  266. package/static/chunk-RSSWH3S2.js +0 -1
  267. package/static/chunk-RTRJ3KFH.js +0 -1
  268. package/static/chunk-TKTCBDOG.js +0 -1
  269. package/static/chunk-V6K2N46L.js +0 -1
  270. package/static/chunk-XLCCZSQL.js +0 -4
  271. package/static/chunk-YPEH66GG.js +0 -1
  272. package/static/chunk-YPOIUQ57.js +0 -1
  273. package/static/chunk-ZKCFO2OA.js +0 -4
  274. package/static/main-MZ7HWZXO.js +0 -9
  275. package/static/scripts-VZVAP2P4.js +0 -30
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/shares/schemas/share.interface.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 type { shares } from './shares.schema'\n\ntype ShareSchema = typeof shares.$inferSelect\n\nexport class Share implements ShareSchema {\n id: number\n ownerId: number\n parentId: number\n spaceId: number\n spaceRootId: number\n fileId: number\n externalPath: string\n type: number\n alias: string\n name: string\n enabled: boolean\n description: string\n createdAt: Date\n modifiedAt: Date\n disabledAt: Date\n}\n"],"names":["Share"],"mappings":"AAAA;;;;CAIC;;;;+BAMYA;;;eAAAA;;;AAAN,IAAA,AAAMA,QAAN,MAAMA;AAgBb"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/shares/schemas/share.interface.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 type { shares } from './shares.schema'\n\ntype ShareSchema = typeof shares.$inferSelect\n\nexport class Share implements ShareSchema {\n id: number\n ownerId: number\n parentId: number\n spaceId: number\n spaceRootId: number\n fileId: number\n externalPath: string\n type: number\n alias: string\n name: string\n enabled: boolean\n description: string\n storageUsage: number\n storageQuota: number\n storageIndexing: boolean\n createdAt: Date\n modifiedAt: Date\n disabledAt: Date\n}\n"],"names":["Share"],"mappings":"AAAA;;;;CAIC;;;;+BAMYA;;;eAAAA;;;AAAN,IAAA,AAAMA,QAAN,MAAMA;AAmBb"}
@@ -69,6 +69,15 @@ const shares = (0, _mysqlcore.mysqlTable)('shares', {
69
69
  description: (0, _mysqlcore.varchar)('description', {
70
70
  length: 255
71
71
  }),
72
+ storageUsage: (0, _mysqlcore.bigint)('storageUsage', {
73
+ mode: 'number',
74
+ unsigned: true
75
+ }).default(0).notNull(),
76
+ storageQuota: (0, _mysqlcore.bigint)('storageQuota', {
77
+ mode: 'number',
78
+ unsigned: true
79
+ }),
80
+ storageIndexing: (0, _mysqlcore.boolean)('storageIndexing').default(true).notNull(),
72
81
  createdAt: (0, _mysqlcore.datetime)('createdAt', {
73
82
  mode: 'date'
74
83
  }).default((0, _drizzleorm.sql)`CURRENT_TIMESTAMP`).notNull(),
@@ -1 +1 @@
1
- {"version":3,"sources":["../../../../../backend/src/applications/shares/schemas/shares.schema.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 { sql } from 'drizzle-orm'\nimport { AnyMySqlColumn, bigint, boolean, datetime, index, mysqlTable, tinyint, uniqueIndex, varchar } from 'drizzle-orm/mysql-core'\nimport { files } from '../../files/schemas/files.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { users } from '../../users/schemas/users.schema'\n\n/*\n type:\n 0: common\n 1: share link\n ownerId: share owner\n parentId: parent share\n spaceId:\n - used to save the provenance of the space\n spaceRootId:\n - used to save the provenance of the space root (spaceId required)\n - if fileId is not defined, the share becomes a gateway to the space root (avoids to create entry file)\n - if fileId is defined, the spaceId and spaceRootId are used to translate the file location (in combination with file.path)\n fileId is defined if a file is related:\n - file.ownerId : personal space case\n - file.spaceId : space case\n - file.spaceId & file.spaceExternalRootId : space with an external root\n - file.shareExternalId: external path from share\n externalPath: if define the share use an external location\n alias: used to navigate over web & webdav, must be unique\n name: set by user and showed to others\n\n parent: if the share is a child share :\n - parentId is required\n - spaceId & spaceRootId must have the same value as their parents\n - fileId is required when the file is inside the parent share\n - fileId is not required when child share is directly linked to parent share (with a space root or an external path)\n - if the share has an external path : file.shareExternalId must match with the first parent share\n*/\n\nexport const shares = mysqlTable(\n 'shares',\n {\n id: bigint('id', { mode: 'number', unsigned: true }).autoincrement().primaryKey(),\n ownerId: bigint('ownerId', { mode: 'number', unsigned: true }).references(() => users.id, { onDelete: 'cascade' }),\n parentId: bigint('parentId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => shares.id, { onDelete: 'cascade' }),\n spaceId: bigint('spaceId', { mode: 'number', unsigned: true }).references(() => spaces.id, { onDelete: 'cascade' }),\n spaceRootId: bigint('spaceRootId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => spacesRoots.id, { onDelete: 'cascade' }),\n fileId: bigint('fileId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => files.id, { onDelete: 'cascade' }),\n externalPath: varchar('externalPath', { length: 4096 }),\n type: tinyint('type', { unsigned: true }).default(0).notNull(),\n alias: varchar('alias', { length: 255 }).notNull(),\n name: varchar('name', { length: 255 }).notNull(),\n enabled: boolean('enabled').default(true).notNull(),\n description: varchar('description', { length: 255 }),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n modifiedAt: datetime('modifiedAt', { mode: 'date' }).default(sql`CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`),\n disabledAt: datetime('disabledAt', { mode: 'date' })\n },\n (table) => [\n uniqueIndex('alias_idx').on(table.alias),\n index('parent_idx').on(table.parentId),\n index('owner_idx').on(table.ownerId),\n index('space_idx').on(table.spaceId),\n index('space_root_idx').on(table.spaceRootId),\n index('file_idx').on(table.fileId),\n index('type_idx').on(table.type)\n ]\n)\n"],"names":["shares","mysqlTable","id","bigint","mode","unsigned","autoincrement","primaryKey","ownerId","references","users","onDelete","parentId","spaceId","spaces","spaceRootId","spacesRoots","fileId","files","externalPath","varchar","length","type","tinyint","default","notNull","alias","name","enabled","boolean","description","createdAt","datetime","sql","modifiedAt","disabledAt","table","uniqueIndex","on","index"],"mappings":"AAAA;;;;CAIC;;;;+BAsCYA;;;eAAAA;;;4BApCO;2BACwF;6BACtF;mCACM;8BACL;6BACD;AA+Bf,MAAMA,SAASC,IAAAA,qBAAU,EAC9B,UACA;IACEC,IAAIC,IAAAA,iBAAM,EAAC,MAAM;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGC,aAAa,GAAGC,UAAU;IAC/EC,SAASL,IAAAA,iBAAM,EAAC,WAAW;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,UAAU,CAAC,IAAMC,kBAAK,CAACR,EAAE,EAAE;QAAES,UAAU;IAAU;IAChHC,UAAUT,IAAAA,iBAAM,EAAC,YAAY;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,UAAU,CAAC,IAAsBT,OAAOE,EAAE,EAAE;QAAES,UAAU;IAAU;IACnIE,SAASV,IAAAA,iBAAM,EAAC,WAAW;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,UAAU,CAAC,IAAMK,oBAAM,CAACZ,EAAE,EAAE;QAAES,UAAU;IAAU;IACjHI,aAAaZ,IAAAA,iBAAM,EAAC,eAAe;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,UAAU,CAAC,IAAsBO,8BAAW,CAACd,EAAE,EAAE;QAAES,UAAU;IAAU;IAC9IM,QAAQd,IAAAA,iBAAM,EAAC,UAAU;QAAEC,MAAM;QAAUC,UAAU;IAAK,GAAGI,UAAU,CAAC,IAAsBS,kBAAK,CAAChB,EAAE,EAAE;QAAES,UAAU;IAAU;IAC9HQ,cAAcC,IAAAA,kBAAO,EAAC,gBAAgB;QAAEC,QAAQ;IAAK;IACrDC,MAAMC,IAAAA,kBAAO,EAAC,QAAQ;QAAElB,UAAU;IAAK,GAAGmB,OAAO,CAAC,GAAGC,OAAO;IAC5DC,OAAON,IAAAA,kBAAO,EAAC,SAAS;QAAEC,QAAQ;IAAI,GAAGI,OAAO;IAChDE,MAAMP,IAAAA,kBAAO,EAAC,QAAQ;QAAEC,QAAQ;IAAI,GAAGI,OAAO;IAC9CG,SAASC,IAAAA,kBAAO,EAAC,WAAWL,OAAO,CAAC,MAAMC,OAAO;IACjDK,aAAaV,IAAAA,kBAAO,EAAC,eAAe;QAAEC,QAAQ;IAAI;IAClDU,WAAWC,IAAAA,mBAAQ,EAAC,aAAa;QAAE5B,MAAM;IAAO,GAC7CoB,OAAO,CAACS,IAAAA,eAAG,CAAA,CAAC,iBAAiB,CAAC,EAC9BR,OAAO;IACVS,YAAYF,IAAAA,mBAAQ,EAAC,cAAc;QAAE5B,MAAM;IAAO,GAAGoB,OAAO,CAACS,IAAAA,eAAG,CAAA,CAAC,6CAA6C,CAAC;IAC/GE,YAAYH,IAAAA,mBAAQ,EAAC,cAAc;QAAE5B,MAAM;IAAO;AACpD,GACA,CAACgC,QAAU;QACTC,IAAAA,sBAAW,EAAC,aAAaC,EAAE,CAACF,MAAMV,KAAK;QACvCa,IAAAA,gBAAK,EAAC,cAAcD,EAAE,CAACF,MAAMxB,QAAQ;QACrC2B,IAAAA,gBAAK,EAAC,aAAaD,EAAE,CAACF,MAAM5B,OAAO;QACnC+B,IAAAA,gBAAK,EAAC,aAAaD,EAAE,CAACF,MAAMvB,OAAO;QACnC0B,IAAAA,gBAAK,EAAC,kBAAkBD,EAAE,CAACF,MAAMrB,WAAW;QAC5CwB,IAAAA,gBAAK,EAAC,YAAYD,EAAE,CAACF,MAAMnB,MAAM;QACjCsB,IAAAA,gBAAK,EAAC,YAAYD,EAAE,CAACF,MAAMd,IAAI;KAChC"}
1
+ {"version":3,"sources":["../../../../../backend/src/applications/shares/schemas/shares.schema.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 { sql } from 'drizzle-orm'\nimport { AnyMySqlColumn, bigint, boolean, datetime, index, mysqlTable, tinyint, uniqueIndex, varchar } from 'drizzle-orm/mysql-core'\nimport { files } from '../../files/schemas/files.schema'\nimport { spacesRoots } from '../../spaces/schemas/spaces-roots.schema'\nimport { spaces } from '../../spaces/schemas/spaces.schema'\nimport { users } from '../../users/schemas/users.schema'\n\n/*\n type:\n 0: common\n 1: share link\n ownerId: share owner\n parentId: parent share\n spaceId:\n - used to save the provenance of the space\n spaceRootId:\n - used to save the provenance of the space root (spaceId required)\n - if fileId is not defined, the share becomes a gateway to the space root (avoids to create entry file)\n - if fileId is defined, the spaceId and spaceRootId are used to translate the file location (in combination with file.path)\n fileId is defined if a file is related:\n - file.ownerId : personal space case\n - file.spaceId : space case\n - file.spaceId & file.spaceExternalRootId : space with an external root\n - file.shareExternalId: external path from share\n externalPath: if define the share use an external location\n alias: used to navigate over web & webdav, must be unique\n name: set by user and showed to others\n\n parent: if the share is a child share:\n - parentId is required\n - spaceId & spaceRootId must have the same value as their parents\n - fileId is required when the file is inside the parent share\n - fileId is not required when child share is directly linked to parent share (with a space root or an external path)\n - if the share has an external path: file.shareExternalId must match with the first parent share\n\n storageQuota:\n 0 : no storage\n null : unlimited\n other: limited to value\n\n Storage properties are only used for shares that have an external path.\n*/\n\nexport const shares = mysqlTable(\n 'shares',\n {\n id: bigint('id', { mode: 'number', unsigned: true }).autoincrement().primaryKey(),\n ownerId: bigint('ownerId', { mode: 'number', unsigned: true }).references(() => users.id, { onDelete: 'cascade' }),\n parentId: bigint('parentId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => shares.id, { onDelete: 'cascade' }),\n spaceId: bigint('spaceId', { mode: 'number', unsigned: true }).references(() => spaces.id, { onDelete: 'cascade' }),\n spaceRootId: bigint('spaceRootId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => spacesRoots.id, { onDelete: 'cascade' }),\n fileId: bigint('fileId', { mode: 'number', unsigned: true }).references((): AnyMySqlColumn => files.id, { onDelete: 'cascade' }),\n externalPath: varchar('externalPath', { length: 4096 }),\n type: tinyint('type', { unsigned: true }).default(0).notNull(),\n alias: varchar('alias', { length: 255 }).notNull(),\n name: varchar('name', { length: 255 }).notNull(),\n enabled: boolean('enabled').default(true).notNull(),\n description: varchar('description', { length: 255 }),\n storageUsage: bigint('storageUsage', { mode: 'number', unsigned: true }).default(0).notNull(),\n storageQuota: bigint('storageQuota', { mode: 'number', unsigned: true }),\n storageIndexing: boolean('storageIndexing').default(true).notNull(),\n createdAt: datetime('createdAt', { mode: 'date' })\n .default(sql`CURRENT_TIMESTAMP`)\n .notNull(),\n modifiedAt: datetime('modifiedAt', { mode: 'date' }).default(sql`CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP`),\n disabledAt: datetime('disabledAt', { mode: 'date' })\n },\n (table) => [\n uniqueIndex('alias_idx').on(table.alias),\n index('parent_idx').on(table.parentId),\n index('owner_idx').on(table.ownerId),\n index('space_idx').on(table.spaceId),\n index('space_root_idx').on(table.spaceRootId),\n index('file_idx').on(table.fileId),\n index('type_idx').on(table.type)\n ]\n)\n"],"names":["shares","mysqlTable","id","bigint","mode","unsigned","autoincrement","primaryKey","ownerId","references","users","onDelete","parentId","spaceId","spaces","spaceRootId","spacesRoots","fileId","files","externalPath","varchar","length","type","tinyint","default","notNull","alias","name","enabled","boolean","description","storageUsage","storageQuota","storageIndexing","createdAt","datetime","sql","modifiedAt","disabledAt","table","uniqueIndex","on","index"],"mappings":"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"}
@@ -23,6 +23,7 @@ const _links = require("../../links/constants/links");
23
23
  const _linksqueriesservice = require("../../links/services/links-queries.service");
24
24
  const _notifications = require("../../notifications/constants/notifications");
25
25
  const _notificationsmanagerservice = require("../../notifications/services/notifications-manager.service");
26
+ const _cache = require("../../spaces/constants/cache");
26
27
  const _spaces = require("../../spaces/constants/spaces");
27
28
  const _spaceenvmodel = require("../../spaces/models/space-env.model");
28
29
  const _spacesqueriesservice = require("../../spaces/services/spaces-queries.service");
@@ -66,7 +67,7 @@ let SharesManager = class SharesManager {
66
67
  } else if (share.file?.space?.alias) {
67
68
  share.file.ownerId = null;
68
69
  // retrieve space permissions (cached query)
69
- const spacePermissions = await this.spaceQueries.permissions(user.id, share.file.space.alias, share.file.space.root?.alias);
70
+ const spacePermissions = await this.spacesQueries.permissions(user.id, share.file.space.alias, share.file.space.root?.alias);
70
71
  if (!spacePermissions) {
71
72
  this.logger.warn(`${this.setAllowedPermissions.name} - missing space permissions : ${JSON.stringify(share)}`);
72
73
  throw new _common.HttpException('Space not found', _common.HttpStatus.NOT_FOUND);
@@ -106,6 +107,8 @@ let SharesManager = class SharesManager {
106
107
  description: createOrUpdateShareDto.description,
107
108
  externalPath: createOrUpdateShareDto.externalPath,
108
109
  enabled: createOrUpdateShareDto.enabled,
110
+ storageQuota: createOrUpdateShareDto.storageQuota,
111
+ storageIndexing: createOrUpdateShareDto.storageIndexing,
109
112
  disabledAt: createOrUpdateShareDto.enabled ? null : new Date(),
110
113
  type: createOrUpdateShareDto.type || _shares.SHARE_TYPE.COMMON
111
114
  };
@@ -133,9 +136,9 @@ let SharesManager = class SharesManager {
133
136
  ...await (0, _files.getProps)(realPath, createOrUpdateShareDto.file.path),
134
137
  id: createOrUpdateShareDto.file.id
135
138
  };
136
- share.fileId = await this.spaceQueries.getOrCreateUserFile(user.id, fileProps);
139
+ share.fileId = await this.spacesQueries.getOrCreateUserFile(user.id, fileProps);
137
140
  } else if (createOrUpdateShareDto.file.space?.alias) {
138
- /* SPACE CASE */ const spacePermissions = await this.spaceQueries.permissions(user.id, createOrUpdateShareDto.file.space.alias, createOrUpdateShareDto.file.space.root.alias);
141
+ /* SPACE CASE */ const spacePermissions = await this.spacesQueries.permissions(user.id, createOrUpdateShareDto.file.space.alias, createOrUpdateShareDto.file.space.root.alias);
139
142
  if (!spacePermissions) {
140
143
  throw new _common.HttpException('Space not found', _common.HttpStatus.NOT_FOUND);
141
144
  }
@@ -175,7 +178,7 @@ let SharesManager = class SharesManager {
175
178
  id: undefined
176
179
  };
177
180
  // get or create file id
178
- share.fileId = await this.spaceQueries.getOrCreateSpaceFile(createOrUpdateShareDto.file.id, fileProps, space.dbFile);
181
+ share.fileId = await this.spacesQueries.getOrCreateSpaceFile(createOrUpdateShareDto.file.id, fileProps, space.dbFile);
179
182
  }
180
183
  } else {
181
184
  // unexpected case
@@ -190,17 +193,20 @@ let SharesManager = class SharesManager {
190
193
  return this.getShareWithMembers(user, share.id);
191
194
  }
192
195
  async updateShare(user, shareId, createOrUpdateShareDto, asAdmin = false) {
193
- // asAdmin : true if the user is the owner of the parent share or if the share is requested from the administration
196
+ // asAdmin: true if the user is the owner of the parent share or if the share is requested from the administration
194
197
  const share = await this.getShareWithMembers(user, shareId, asAdmin);
195
- // check & update share info
198
+ // check and update share info
196
199
  const shareDiffProps = {
197
200
  modifiedAt: new Date()
198
201
  };
199
- for (const prop of [
202
+ const props = [
200
203
  'name',
201
204
  'description',
202
- 'enabled'
203
- ]){
205
+ 'enabled',
206
+ 'storageQuota',
207
+ 'storageIndexing'
208
+ ];
209
+ for (const prop of props){
204
210
  if (createOrUpdateShareDto[prop] !== share[prop]) {
205
211
  shareDiffProps[prop] = createOrUpdateShareDto[prop];
206
212
  if (prop === 'name') {
@@ -211,9 +217,9 @@ let SharesManager = class SharesManager {
211
217
  }
212
218
  }
213
219
  // update in db
214
- this.sharesQueries.updateShare(shareDiffProps, {
215
- id: shareId
216
- }).catch((e)=>this.logger.error(`${this.updateShare.name} - ${e}`));
220
+ if (!await this.sharesQueries.updateShare(shareId, shareDiffProps)) {
221
+ throw new _common.HttpException('Unable to update share', _common.HttpStatus.INTERNAL_SERVER_ERROR);
222
+ }
217
223
  // check & update members
218
224
  const linkMembers = await this.createOrUpdateLinksAsMembers(user, share, _links.LINK_TYPE.SHARE, createOrUpdateShareDto.links);
219
225
  // intersect share permissions for members
@@ -316,7 +322,7 @@ let SharesManager = class SharesManager {
316
322
  ...await (0, _files.getProps)(pShareEnv.realPath, pShareEnv.dbFile.path),
317
323
  id: undefined
318
324
  };
319
- fileId = await this.spaceQueries.getOrCreateSpaceFile(createOrUpdateShareDto.file.id, fileProps, pShareEnv.dbFile);
325
+ fileId = await this.spacesQueries.getOrCreateSpaceFile(createOrUpdateShareDto.file.id, fileProps, pShareEnv.dbFile);
320
326
  }
321
327
  const share = {
322
328
  name: createOrUpdateShareDto.name,
@@ -627,6 +633,29 @@ let SharesManager = class SharesManager {
627
633
  async deleteLinkMembers(members) {
628
634
  await this.deleteGuestLinks(members);
629
635
  }
636
+ async updateSharesExternalPathQuota(shareId) {
637
+ for (const share of (await this.sharesQueries.sharesQuotaExternalPaths(shareId))){
638
+ if (!await (0, _files.isPathExists)(share.externalPath)) {
639
+ this.logger.warn(`${this.updateSharesExternalPathQuota.name} - *${share.alias}* home path does not exist`);
640
+ continue;
641
+ }
642
+ const [size, errors] = await (0, _files.dirSize)(share.externalPath);
643
+ for (const [path, error] of Object.entries(errors)){
644
+ this.logger.warn(`${this.updateSharesExternalPathQuota.name} - unable to get size for *${share.alias}* on ${path} : ${error}`);
645
+ }
646
+ const shareQuota = {
647
+ storageUsage: size,
648
+ storageQuota: share.storageQuota
649
+ };
650
+ this.sharesQueries.cache.set(`${_cache.CACHE_QUOTA_SHARE_PREFIX}-${share.id}`, shareQuota, _cache.CACHE_QUOTA_TTL).catch((e)=>this.logger.error(`${this.updateSharesExternalPathQuota.name} - ${e}`));
651
+ if (share.storageUsage !== shareQuota.storageUsage) {
652
+ this.logger.log(`${this.updateSharesExternalPathQuota.name} - share *${share.alias}* (${share.id}) : storage usage updated : ${shareQuota.storageUsage}`);
653
+ await this.sharesQueries.updateShare(share.id, {
654
+ storageUsage: shareQuota.storageUsage
655
+ });
656
+ }
657
+ }
658
+ }
630
659
  async updateMembers(user, share, oldMembers, currentMembers) {
631
660
  if (oldMembers.length === 0 && currentMembers.length === 0) {
632
661
  return;
@@ -849,8 +878,8 @@ let SharesManager = class SharesManager {
849
878
  ], null, false);
850
879
  await this.sharesQueries.deleteShare(share.id);
851
880
  this.logger.log(`${this.removeShareFromOwners.name} - share *${share.alias}* (${share.id}) from owner (${share.ownerId}) was removed`);
852
- // clear cache & notify users
853
- if (!fromUserId || fromUserId !== share.ownerId) {
881
+ // clear cache and notify users
882
+ if (share.ownerId && (!fromUserId || fromUserId !== share.ownerId)) {
854
883
  this.clearCachePermissionsAndOrNotify(share, _constants.ACTION.DELETE_PERMANENTLY, [
855
884
  share.ownerId
856
885
  ]).catch((e)=>this.logger.error(`${this.removeShareFromOwners.name} - ${e}`));
@@ -985,11 +1014,11 @@ let SharesManager = class SharesManager {
985
1014
  action: action
986
1015
  }).catch((e)=>this.logger.error(`${this.notifyGuestLink.name} - ${e}`));
987
1016
  }
988
- constructor(contextManager, notificationsManager, sharesQueries, spaceQueries, usersQueries, linksQueries){
1017
+ constructor(contextManager, notificationsManager, sharesQueries, spacesQueries, usersQueries, linksQueries){
989
1018
  this.contextManager = contextManager;
990
1019
  this.notificationsManager = notificationsManager;
991
1020
  this.sharesQueries = sharesQueries;
992
- this.spaceQueries = spaceQueries;
1021
+ this.spacesQueries = spacesQueries;
993
1022
  this.usersQueries = usersQueries;
994
1023
  this.linksQueries = linksQueries;
995
1024
  this.logger = new _common.Logger(SharesManager.name);