@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.
- package/CHANGELOG.md +173 -58
- package/environment/environment.dist.yaml +6 -3
- package/migrations/0003_giant_luckman.sql +6 -0
- package/migrations/meta/0003_snapshot.json +2463 -0
- package/migrations/meta/_journal.json +7 -0
- package/package.json +19 -17
- package/server/app.bootstrap.js +5 -2
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.constants.js +0 -4
- package/server/app.constants.js.map +1 -1
- package/server/app.service.js +7 -6
- package/server/app.service.js.map +1 -1
- package/server/applications/files/constants/only-office.js +12 -0
- package/server/applications/files/constants/only-office.js.map +1 -1
- package/server/applications/files/files.config.js +5 -0
- package/server/applications/files/files.config.js.map +1 -1
- package/server/applications/files/files.controller.js +12 -4
- package/server/applications/files/files.controller.js.map +1 -1
- package/server/applications/files/files.controller.spec.js +18 -4
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/services/files-content-manager.service.js +6 -6
- package/server/applications/files/services/files-content-manager.service.js.map +1 -1
- package/server/applications/files/services/files-manager.service.js +4 -4
- package/server/applications/files/services/files-manager.service.js.map +1 -1
- package/server/applications/files/services/files-methods.service.js +4 -7
- package/server/applications/files/services/files-methods.service.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +2 -2
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/files/services/files-parser.service.js +6 -3
- package/server/applications/files/services/files-parser.service.js.map +1 -1
- package/server/applications/files/services/files-scheduler.service.js +51 -3
- package/server/applications/files/services/files-scheduler.service.js.map +1 -1
- package/server/applications/files/services/files-search-manager.service.js +4 -0
- package/server/applications/files/services/files-search-manager.service.js.map +1 -1
- package/server/applications/files/utils/doc-textify/adapters/pdf.js +6 -8
- package/server/applications/files/utils/doc-textify/adapters/pdf.js.map +1 -1
- package/server/applications/notifications/i18n/de.js +56 -0
- package/server/applications/notifications/i18n/de.js.map +1 -0
- package/server/applications/notifications/i18n/es.js +52 -0
- package/server/applications/notifications/i18n/es.js.map +1 -0
- package/server/applications/notifications/i18n/hi.js +52 -0
- package/server/applications/notifications/i18n/hi.js.map +1 -0
- package/server/applications/notifications/i18n/index.js +73 -8
- package/server/applications/notifications/i18n/index.js.map +1 -1
- package/server/applications/notifications/i18n/it.js +52 -0
- package/server/applications/notifications/i18n/it.js.map +1 -0
- package/server/applications/notifications/i18n/ja.js +52 -0
- package/server/applications/notifications/i18n/ja.js.map +1 -0
- package/server/applications/notifications/i18n/ko.js +52 -0
- package/server/applications/notifications/i18n/ko.js.map +1 -0
- package/server/applications/notifications/i18n/pl.js +52 -0
- package/server/applications/notifications/i18n/pl.js.map +1 -0
- package/server/applications/notifications/i18n/pt.js +52 -0
- package/server/applications/notifications/i18n/pt.js.map +1 -0
- package/server/applications/notifications/i18n/pt_br.js +52 -0
- package/server/applications/notifications/i18n/pt_br.js.map +1 -0
- package/server/applications/notifications/i18n/ru.js +52 -0
- package/server/applications/notifications/i18n/ru.js.map +1 -0
- package/server/applications/notifications/i18n/tr.js +52 -0
- package/server/applications/notifications/i18n/tr.js.map +1 -0
- package/server/applications/notifications/i18n/zh.js +52 -0
- package/server/applications/notifications/i18n/zh.js.map +1 -0
- package/server/applications/notifications/mails/models.js +6 -7
- package/server/applications/notifications/mails/models.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.js.map +1 -1
- package/server/applications/shares/dto/create-or-update-share.dto.js +11 -0
- package/server/applications/shares/dto/create-or-update-share.dto.js.map +1 -1
- package/server/applications/shares/interfaces/share-props.interface.js.map +1 -1
- package/server/applications/shares/schemas/share.interface.js.map +1 -1
- package/server/applications/shares/schemas/shares.schema.js +9 -0
- package/server/applications/shares/schemas/shares.schema.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.js +46 -17
- package/server/applications/shares/services/shares-manager.service.js.map +1 -1
- package/server/applications/shares/services/shares-queries.service.js +24 -5
- package/server/applications/shares/services/shares-queries.service.js.map +1 -1
- package/server/applications/spaces/constants/cache.js +4 -0
- package/server/applications/spaces/constants/cache.js.map +1 -1
- package/server/applications/spaces/dto/create-or-update-space.dto.js +5 -0
- package/server/applications/spaces/dto/create-or-update-space.dto.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.js +3 -3
- package/server/applications/spaces/guards/space.guard.js.map +1 -1
- package/server/applications/spaces/models/space-props.model.js.map +1 -1
- package/server/applications/spaces/models/space.model.js.map +1 -1
- package/server/applications/spaces/schemas/space.interface.js.map +1 -1
- package/server/applications/spaces/schemas/spaces.schema.js +1 -0
- package/server/applications/spaces/schemas/spaces.schema.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +34 -31
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-queries.service.js +23 -7
- package/server/applications/spaces/services/spaces-queries.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-scheduler.service.js +21 -20
- package/server/applications/spaces/services/spaces-scheduler.service.js.map +1 -1
- package/server/applications/spaces/spaces.controller.js +4 -2
- package/server/applications/spaces/spaces.controller.js.map +1 -1
- package/server/applications/spaces/utils/paths.js +14 -16
- package/server/applications/spaces/utils/paths.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.js +4 -3
- package/server/applications/sync/services/sync-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/sync/sync.controller.js +2 -1
- package/server/applications/sync/sync.controller.js.map +1 -1
- package/server/applications/users/constants/routes.js +5 -0
- package/server/applications/users/constants/routes.js.map +1 -1
- package/server/applications/users/constants/user.js +0 -16
- package/server/applications/users/constants/user.js.map +1 -1
- package/server/applications/users/dto/user-properties.dto.js +10 -0
- package/server/applications/users/dto/user-properties.dto.js.map +1 -1
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/schemas/user.interface.js.map +1 -1
- package/server/applications/users/schemas/users.schema.js +3 -2
- package/server/applications/users/schemas/users.schema.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +1 -0
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +2 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +7 -2
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +1 -0
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-queries.service.js +18 -4
- package/server/applications/users/services/users-queries.service.js.map +1 -1
- package/server/applications/users/users.controller.js +15 -0
- package/server/applications/users/users.controller.js.map +1 -1
- package/server/applications/users/users.gateway.js +6 -0
- package/server/applications/users/users.gateway.js.map +1 -1
- package/server/applications/users/utils/test.js +2 -2
- package/server/applications/users/utils/test.js.map +1 -1
- package/server/applications/webdav/constants/routes.js +2 -2
- package/server/applications/webdav/constants/routes.js.map +1 -1
- package/server/applications/webdav/constants/webdav.js +2 -2
- package/server/applications/webdav/constants/webdav.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.js +2 -2
- package/server/applications/webdav/filters/webdav.filter.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +2 -2
- package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-methods.service.js +3 -2
- package/server/applications/webdav/services/webdav-methods.service.js.map +1 -1
- package/server/applications/webdav/utils/webdav.js +1 -2
- package/server/applications/webdav/utils/webdav.js.map +1 -1
- package/server/authentication/auth.config.js +2 -2
- package/server/authentication/auth.config.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +2 -2
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/common/i18n.js +52 -0
- package/server/common/i18n.js.map +1 -0
- package/server/common/image.js +63 -43
- package/server/common/image.js.map +1 -1
- package/server/common/interfaces.js.map +1 -1
- package/server/common/shared.js +5 -2
- package/server/common/shared.js.map +1 -1
- package/server/configuration/config.validation.js +3 -3
- package/server/configuration/config.validation.js.map +1 -1
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js +8 -6
- package/server/infrastructure/cache/adapters/mysql-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js +22 -17
- package/server/infrastructure/cache/adapters/redis-cache.adapter.js.map +1 -1
- package/server/infrastructure/cache/cache.e2e-spec.js +1 -0
- package/server/infrastructure/cache/cache.e2e-spec.js.map +1 -1
- package/server/infrastructure/cache/cache.module.js +1 -14
- package/server/infrastructure/cache/cache.module.js.map +1 -1
- package/server/infrastructure/cache/services/cache.service.js.map +1 -1
- package/server/infrastructure/database/database.module.js +20 -1
- package/server/infrastructure/database/database.module.js.map +1 -1
- package/server/infrastructure/database/utils.js +48 -0
- package/server/infrastructure/database/utils.js.map +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js +1 -1
- package/server/infrastructure/scheduler/scheduler.module.js.map +1 -1
- package/server/infrastructure/websocket/adapters/cluster.adapter.js +1 -3
- package/server/infrastructure/websocket/adapters/cluster.adapter.js.map +1 -1
- package/static/3rdpartylicenses.txt +137 -163
- package/static/chunk-2KLC4T2Z.js +1 -0
- package/static/chunk-2VMSXRCB.js +12 -0
- package/static/chunk-3GMLWAFZ.js +1 -0
- package/static/chunk-3OHSRRKH.js +4 -0
- package/static/chunk-3R4WKOHQ.js +1 -0
- package/static/{chunk-7ITZXYYJ.js → chunk-3R74L4UU.js} +1 -1
- package/static/chunk-3XVM35O2.js +1 -0
- package/static/chunk-3YVRP3VM.js +2 -0
- package/static/chunk-5NMSIIQB.js +1 -0
- package/static/chunk-5UKZLU5H.js +1 -0
- package/static/chunk-AF24EYXU.js +1 -0
- package/static/chunk-AKQVEHO6.js +2 -0
- package/static/chunk-BCVX464U.js +2 -0
- package/static/chunk-BQV4FRM6.js +1 -0
- package/static/{chunk-EVIE5F2U.js → chunk-CETH7UYS.js} +1 -1
- package/static/chunk-CHJ64RJM.js +1 -0
- package/static/chunk-DIT6W7VM.js +562 -0
- package/static/chunk-DKSEQTMX.js +1 -0
- package/static/chunk-DM4NXKEP.js +1 -0
- package/static/chunk-DPUVSXRB.js +1 -0
- package/static/chunk-DSWEWLXJ.js +1 -0
- package/static/chunk-FJE6BOFL.js +1 -0
- package/static/chunk-FZ3JPGYZ.js +1 -0
- package/static/chunk-IQSKQXC3.js +1 -0
- package/static/chunk-ITUFI2BJ.js +1 -0
- package/static/chunk-JPT5WEAT.js +1 -0
- package/static/chunk-LCTZJ537.js +1 -0
- package/static/chunk-LK2UCQJ6.js +1 -0
- package/static/chunk-LNTUR3GU.js +1 -0
- package/static/chunk-LP5TBXEN.js +7 -0
- package/static/{chunk-IPAC4VAF.js → chunk-LVSNIS5P.js} +1 -1
- package/static/{chunk-SIPE37PA.js → chunk-MTVSJTIW.js} +1 -1
- package/static/chunk-N3U6637P.js +1 -0
- package/static/chunk-NNV4OXSB.js +1 -0
- package/static/chunk-O6FYXVHI.js +1 -0
- package/static/chunk-OOGP4WSH.js +2 -0
- package/static/chunk-PB4AIT7O.js +1 -0
- package/static/chunk-PCWDQPOM.js +2 -0
- package/static/chunk-PNR6M34W.js +1 -0
- package/static/chunk-PVDHBQRM.js +1 -0
- package/static/chunk-Q5KM7LTX.js +1 -0
- package/static/chunk-QHC6ZPQ4.js +1 -0
- package/static/chunk-QMRBZHE4.js +1 -0
- package/static/chunk-QO6BTONN.js +1 -0
- package/static/chunk-QSJRY3TF.js +1 -0
- package/static/chunk-QUUIRSYT.js +1 -0
- package/static/chunk-RFH46UW3.js +1 -0
- package/static/{chunk-PTGDOWV3.js → chunk-RSXHRKM5.js} +1 -1
- package/static/chunk-RV3VZJPZ.js +1 -0
- package/static/{chunk-QNJFQVYI.js → chunk-S7HNXVRB.js} +1 -1
- package/static/chunk-SBZ572Q4.js +2 -0
- package/static/chunk-SJR5R3Y4.js +1 -0
- package/static/chunk-SLHTEGRU.js +1 -0
- package/static/{chunk-SH5EVL4E.js → chunk-SSFF27P2.js} +1 -1
- package/static/chunk-UNCPXHHT.js +1 -0
- package/static/chunk-URHTCJ7G.js +1 -0
- package/static/chunk-V3LHHZYN.js +1 -0
- package/static/{chunk-DJYJ66UF.js → chunk-VJTXJ43D.js} +1 -1
- package/static/chunk-VQQKMY2C.js +1 -0
- package/static/{chunk-IQOALFYU.js → chunk-WSSU2HXE.js} +1 -1
- package/static/chunk-XDZGW64M.js +3 -0
- package/static/chunk-XTRDKGKG.js +1 -0
- package/static/chunk-YLWTEC3X.js +1 -0
- package/static/chunk-Z5J5F5SX.js +1 -0
- package/static/chunk-ZIJQRARU.js +1 -0
- package/static/index.html +2 -2
- package/static/main-4H5BJY3J.js +9 -0
- package/static/scripts-WRDOQIU5.js +24 -0
- package/static/{styles-A5VYX3CE.css → styles-2C2UNCNB.css} +1 -1
- package/server/applications/spaces/interfaces/space-quota.interface.js +0 -10
- package/server/applications/spaces/interfaces/space-quota.interface.js.map +0 -1
- package/static/chunk-22EANI6R.js +0 -1
- package/static/chunk-3GFGJYMK.js +0 -1
- package/static/chunk-4YGJGZZZ.js +0 -1
- package/static/chunk-5K7HEX3C.js +0 -27
- package/static/chunk-5KLMS6A4.js +0 -1
- package/static/chunk-ATP3BFHV.js +0 -562
- package/static/chunk-BB4G55KE.js +0 -1
- package/static/chunk-EWKSX76T.js +0 -1
- package/static/chunk-FHLACA7V.js +0 -1
- package/static/chunk-GCATNU55.js +0 -1
- package/static/chunk-GYODPCIE.js +0 -1
- package/static/chunk-HZTFYLM5.js +0 -1
- package/static/chunk-JSUKJT6Z.js +0 -1
- package/static/chunk-JXZCNFW7.js +0 -1
- package/static/chunk-LTGFCQR7.js +0 -1
- package/static/chunk-LV3PYKWO.js +0 -1
- package/static/chunk-N2WFNW6M.js +0 -7
- package/static/chunk-ORMRCEGT.js +0 -1
- package/static/chunk-OUTBJSMW.js +0 -1
- package/static/chunk-RS2PX32L.js +0 -1
- package/static/chunk-RSSWH3S2.js +0 -1
- package/static/chunk-RTRJ3KFH.js +0 -1
- package/static/chunk-TKTCBDOG.js +0 -1
- package/static/chunk-V6K2N46L.js +0 -1
- package/static/chunk-XLCCZSQL.js +0 -4
- package/static/chunk-YPEH66GG.js +0 -1
- package/static/chunk-YPOIUQ57.js +0 -1
- package/static/chunk-ZKCFO2OA.js +0 -4
- package/static/main-MZ7HWZXO.js +0 -9
- 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;
|
|
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
|
|
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.
|
|
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.
|
|
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.
|
|
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.
|
|
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
|
|
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
|
|
198
|
+
// check and update share info
|
|
196
199
|
const shareDiffProps = {
|
|
197
200
|
modifiedAt: new Date()
|
|
198
201
|
};
|
|
199
|
-
|
|
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(
|
|
215
|
-
|
|
216
|
-
}
|
|
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.
|
|
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
|
|
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,
|
|
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.
|
|
1021
|
+
this.spacesQueries = spacesQueries;
|
|
993
1022
|
this.usersQueries = usersQueries;
|
|
994
1023
|
this.linksQueries = linksQueries;
|
|
995
1024
|
this.logger = new _common.Logger(SharesManager.name);
|