@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
package/package.json
CHANGED
|
@@ -1,6 +1,6 @@
|
|
|
1
1
|
{
|
|
2
2
|
"name": "@sync-in/server",
|
|
3
|
-
"version": "1.
|
|
3
|
+
"version": "1.8.1",
|
|
4
4
|
"description": "The secure, open-source platform for file storage, sharing, collaboration, and sync",
|
|
5
5
|
"author": {
|
|
6
6
|
"name": "Johan Legrand",
|
|
@@ -74,52 +74,54 @@
|
|
|
74
74
|
"dependencies": {
|
|
75
75
|
"@fastify/cookie": "11.0.2",
|
|
76
76
|
"@fastify/helmet": "13.0.2",
|
|
77
|
-
"@fastify/multipart": "9.
|
|
77
|
+
"@fastify/multipart": "9.3.0",
|
|
78
78
|
"@fastify/send": "4.1.0",
|
|
79
|
-
"@fastify/static": "8.
|
|
79
|
+
"@fastify/static": "8.3.0",
|
|
80
80
|
"@knaadh/nestjs-drizzle-mysql2": "1.2.0",
|
|
81
81
|
"@lukeed/ms": "2.0.2",
|
|
82
82
|
"@nestjs/axios": "4.0.1",
|
|
83
|
-
"@nestjs/common": "11.1.
|
|
83
|
+
"@nestjs/common": "11.1.8",
|
|
84
84
|
"@nestjs/config": "4.0.2",
|
|
85
|
-
"@nestjs/core": "11.1.
|
|
86
|
-
"@nestjs/jwt": "11.0.
|
|
85
|
+
"@nestjs/core": "11.1.8",
|
|
86
|
+
"@nestjs/jwt": "11.0.1",
|
|
87
87
|
"@nestjs/passport": "11.0.5",
|
|
88
|
-
"@nestjs/platform-fastify": "11.1.
|
|
89
|
-
"@nestjs/platform-socket.io": "11.1.
|
|
88
|
+
"@nestjs/platform-fastify": "11.1.8",
|
|
89
|
+
"@nestjs/platform-socket.io": "11.1.8",
|
|
90
90
|
"@nestjs/schedule": "6.0.1",
|
|
91
|
-
"@nestjs/websockets": "11.1.
|
|
92
|
-
"@socket.io/cluster-adapter": "0.
|
|
91
|
+
"@nestjs/websockets": "11.1.8",
|
|
92
|
+
"@socket.io/cluster-adapter": "0.3.0",
|
|
93
93
|
"@socket.io/redis-adapter": "8.3.0",
|
|
94
|
+
"@types/text-to-svg": "3.1.4",
|
|
94
95
|
"archiver": "7.0.1",
|
|
95
96
|
"bcryptjs": "3.0.2",
|
|
96
|
-
"canvas": "3.2.0",
|
|
97
97
|
"class-transformer": "0.5.1",
|
|
98
98
|
"class-validator": "0.14.2",
|
|
99
99
|
"deepmerge": "4.3.1",
|
|
100
100
|
"drizzle-kit": "0.31.5",
|
|
101
|
-
"drizzle-orm": "0.44.
|
|
101
|
+
"drizzle-orm": "0.44.7",
|
|
102
102
|
"fast-xml-parser": "5.3.0",
|
|
103
103
|
"fs-extra": "11.3.2",
|
|
104
104
|
"html-to-text": "9.0.5",
|
|
105
105
|
"js-yaml": "4.1.0",
|
|
106
106
|
"ldapts": "8.0.9",
|
|
107
107
|
"mime-types": "3.0.1",
|
|
108
|
-
"mysql2": "3.15.
|
|
108
|
+
"mysql2": "3.15.3",
|
|
109
109
|
"nestjs-pino": "4.4.1",
|
|
110
|
-
"nodemailer": "7.0.
|
|
110
|
+
"nodemailer": "7.0.10",
|
|
111
111
|
"passport-http": "0.3.0",
|
|
112
112
|
"passport-jwt": "4.0.1",
|
|
113
113
|
"passport-local": "1.0.0",
|
|
114
114
|
"passport": "0.7.0",
|
|
115
|
-
"
|
|
116
|
-
"pino-pretty": "13.1.1",
|
|
115
|
+
"pino-pretty": "13.1.2",
|
|
117
116
|
"qrcode-generator": "2.0.4",
|
|
118
|
-
"redis": "
|
|
117
|
+
"redis": "5.9.0",
|
|
119
118
|
"sax": "1.4.1",
|
|
119
|
+
"sharp": "0.34.4",
|
|
120
120
|
"socket.io": "4.8.1",
|
|
121
121
|
"tar": "7.5.1",
|
|
122
|
+
"text-to-svg": "3.1.5",
|
|
122
123
|
"time2fa": "1.4.2",
|
|
124
|
+
"unpdf": "1.3.2",
|
|
123
125
|
"yauzl": "3.2.0"
|
|
124
126
|
}
|
|
125
127
|
}
|
package/server/app.bootstrap.js
CHANGED
|
@@ -35,13 +35,16 @@ async function appBootstrap() {
|
|
|
35
35
|
/* APP */ const fastifyAdapter = new _platformfastify.FastifyAdapter({
|
|
36
36
|
logger: false,
|
|
37
37
|
trustProxy: _configenvironment.configuration.server.trustProxy,
|
|
38
|
-
|
|
39
|
-
|
|
38
|
+
routerOptions: {
|
|
39
|
+
ignoreTrailingSlash: true,
|
|
40
|
+
maxParamLength: 256
|
|
41
|
+
},
|
|
40
42
|
bodyLimit: 26214400 /* 25 MB */
|
|
41
43
|
});
|
|
42
44
|
const app = await _core.NestFactory.create(_appmodule.AppModule, fastifyAdapter, {
|
|
43
45
|
bufferLogs: true
|
|
44
46
|
});
|
|
47
|
+
/* NestJS starts listening for shutdown hooks */ app.enableShutdownHooks();
|
|
45
48
|
/* Fastify instance */ const fastifyInstance = fastifyAdapter.getInstance();
|
|
46
49
|
/* LOGGER */ app.useLogger(_configconstants.IS_TEST_ENV ? [
|
|
47
50
|
'fatal'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../backend/src/app.bootstrap.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 fastifyCookie from '@fastify/cookie'\nimport fastifyHelmet from '@fastify/helmet'\nimport multipart from '@fastify/multipart'\nimport { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'\nimport { NestFactory, Reflector } from '@nestjs/core'\nimport { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { FastifyRequest } from 'fastify'\nimport { Logger, LoggerErrorInterceptor } from 'nestjs-pino'\nimport { CONTENT_SECURITY_POLICY } from './app.constants'\nimport { AppModule } from './app.module'\nimport { HTTP_WEBDAV_METHOD } from './applications/applications.constants'\nimport { WEBDAV_NS, WEBDAV_SPACES } from './applications/webdav/constants/routes'\nimport { IS_TEST_ENV, STATIC_PATH } from './configuration/config.constants'\nimport { configuration } from './configuration/config.environment'\nimport { WebSocketAdapter } from './infrastructure/websocket/adapters/web-socket.adapter'\n\nexport async function appBootstrap(): Promise<NestFastifyApplication> {\n /* APP */\n const fastifyAdapter = new FastifyAdapter({\n logger: false,\n trustProxy: configuration.server.trustProxy,\n ignoreTrailingSlash: true,\n
|
|
1
|
+
{"version":3,"sources":["../../backend/src/app.bootstrap.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 fastifyCookie from '@fastify/cookie'\nimport fastifyHelmet from '@fastify/helmet'\nimport multipart from '@fastify/multipart'\nimport { ClassSerializerInterceptor, ValidationPipe } from '@nestjs/common'\nimport { NestFactory, Reflector } from '@nestjs/core'\nimport { FastifyAdapter, NestFastifyApplication } from '@nestjs/platform-fastify'\nimport { FastifyRequest } from 'fastify'\nimport { Logger, LoggerErrorInterceptor } from 'nestjs-pino'\nimport { CONTENT_SECURITY_POLICY } from './app.constants'\nimport { AppModule } from './app.module'\nimport { HTTP_WEBDAV_METHOD } from './applications/applications.constants'\nimport { WEBDAV_NS, WEBDAV_SPACES } from './applications/webdav/constants/routes'\nimport { IS_TEST_ENV, STATIC_PATH } from './configuration/config.constants'\nimport { configuration } from './configuration/config.environment'\nimport { WebSocketAdapter } from './infrastructure/websocket/adapters/web-socket.adapter'\n\nexport async function appBootstrap(): Promise<NestFastifyApplication> {\n /* APP */\n const fastifyAdapter = new FastifyAdapter({\n logger: false,\n trustProxy: configuration.server.trustProxy,\n routerOptions: {\n ignoreTrailingSlash: true,\n maxParamLength: 256\n },\n bodyLimit: 26214400 /* 25 MB */\n })\n const app: NestFastifyApplication = await NestFactory.create<NestFastifyApplication>(AppModule, fastifyAdapter, {\n bufferLogs: true\n })\n\n /* NestJS starts listening for shutdown hooks */\n app.enableShutdownHooks()\n\n /* Fastify instance */\n const fastifyInstance = fastifyAdapter.getInstance()\n\n /* LOGGER */\n app.useLogger(IS_TEST_ENV ? ['fatal'] : app.get(Logger))\n\n /* PARSER */\n // xml body parser is used for webdav methods\n app.useBodyParser(['application/xml', 'text/xml'])\n // add webdav methods\n for (const method of Object.values(HTTP_WEBDAV_METHOD)) {\n fastifyInstance.addHttpMethod(method, { hasBody: true })\n }\n // '*' body parser allow binary data as stream (unlimited body size)\n fastifyInstance.addContentTypeParser('*', { bodyLimit: 0 }, (_req: FastifyRequest, _payload: FastifyRequest['raw'], done) => done(null))\n\n // Joplin clients send incorrect `Content-Type` headers when syncing over WebDAV (issue: https://github.com/laurent22/joplin/issues/122499)\n // This hook intercepts matching requests and sets `application/octet-stream` to ensure compatibility and successful sync.\n // todo: remove it when fixed on Joplin side\n fastifyInstance.addHook('onRequest', async (req, _reply) => {\n if ((req.headers['user-agent'] || '').indexOf('Joplin') !== -1 && req.originalUrl.startsWith(WEBDAV_SPACES[WEBDAV_NS.WEBDAV].route)) {\n req.headers['content-type'] = 'application/octet-stream'\n }\n })\n\n /* INTERCEPTORS */\n app.useGlobalInterceptors(\n new LoggerErrorInterceptor(),\n new ClassSerializerInterceptor(app.get(Reflector), {\n excludePrefixes: ['_']\n })\n )\n /* VALIDATION */\n app.useGlobalPipes(new ValidationPipe({ transform: true, whitelist: true }))\n\n /* STATIC */\n app.useStaticAssets({ root: STATIC_PATH, prefixAvoidTrailingSlash: true })\n\n /* SECURITY */\n await app.register(fastifyHelmet, { contentSecurityPolicy: CONTENT_SECURITY_POLICY(configuration.applications.files.onlyoffice.externalServer) })\n\n /* COOKIES */\n // we use csrf secret to unsign csrf cookie\n await app.register(fastifyCookie, {\n secret: configuration.auth.token.csrf.secret,\n parseOptions: {\n secure: 'auto',\n sameSite: configuration.auth.cookieSameSite,\n httpOnly: true\n }\n })\n\n /* UPLOAD */\n await app.register(multipart, {\n preservePath: true,\n limits: { parts: Infinity, fileSize: configuration.applications.files.maxUploadSize }\n })\n\n /* WEBSOCKET */\n if (!IS_TEST_ENV) {\n const webSocketAdapter = new WebSocketAdapter(app)\n await webSocketAdapter.initAdapter()\n app.useWebSocketAdapter(webSocketAdapter)\n }\n\n return app\n}\n"],"names":["appBootstrap","fastifyAdapter","FastifyAdapter","logger","trustProxy","configuration","server","routerOptions","ignoreTrailingSlash","maxParamLength","bodyLimit","app","NestFactory","create","AppModule","bufferLogs","enableShutdownHooks","fastifyInstance","getInstance","useLogger","IS_TEST_ENV","get","Logger","useBodyParser","method","Object","values","HTTP_WEBDAV_METHOD","addHttpMethod","hasBody","addContentTypeParser","_req","_payload","done","addHook","req","_reply","headers","indexOf","originalUrl","startsWith","WEBDAV_SPACES","WEBDAV_NS","WEBDAV","route","useGlobalInterceptors","LoggerErrorInterceptor","ClassSerializerInterceptor","Reflector","excludePrefixes","useGlobalPipes","ValidationPipe","transform","whitelist","useStaticAssets","root","STATIC_PATH","prefixAvoidTrailingSlash","register","fastifyHelmet","contentSecurityPolicy","CONTENT_SECURITY_POLICY","applications","files","onlyoffice","externalServer","fastifyCookie","secret","auth","token","csrf","parseOptions","secure","sameSite","cookieSameSite","httpOnly","multipart","preservePath","limits","parts","Infinity","fileSize","maxUploadSize","webSocketAdapter","WebSocketAdapter","initAdapter","useWebSocketAdapter"],"mappings":"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"}
|
package/server/app.constants.js
CHANGED
|
@@ -18,12 +18,8 @@ _export(exports, {
|
|
|
18
18
|
},
|
|
19
19
|
get CONTENT_SECURITY_POLICY () {
|
|
20
20
|
return CONTENT_SECURITY_POLICY;
|
|
21
|
-
},
|
|
22
|
-
get SERVER_NAME () {
|
|
23
|
-
return SERVER_NAME;
|
|
24
21
|
}
|
|
25
22
|
});
|
|
26
|
-
const SERVER_NAME = 'Sync-in';
|
|
27
23
|
const CONTENT_SECURITY_POLICY = (onlyOfficeServer)=>({
|
|
28
24
|
useDefaults: false,
|
|
29
25
|
directives: {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../backend/src/app.constants.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\nexport const
|
|
1
|
+
{"version":3,"sources":["../../backend/src/app.constants.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\nexport const CONTENT_SECURITY_POLICY = (onlyOfficeServer: string) => ({\n useDefaults: false,\n directives: {\n defaultSrc: [\"'self'\", onlyOfficeServer || ''],\n scriptSrc: [\"'self'\", \"'unsafe-inline'\", onlyOfficeServer || ''],\n styleSrc: [\"'self'\", \"'unsafe-inline'\"],\n imgSrc: [\"'self'\", 'data:'],\n fontSrc: [\"'self'\"]\n }\n})\n\nexport const CONNECT_ERROR_CODE = new Set(['ECONNREFUSED', 'ETIMEDOUT', 'ENOTFOUND'])\n"],"names":["CONNECT_ERROR_CODE","CONTENT_SECURITY_POLICY","onlyOfficeServer","useDefaults","directives","defaultSrc","scriptSrc","styleSrc","imgSrc","fontSrc","Set"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAaYA;eAAAA;;QAXAC;eAAAA;;;AAAN,MAAMA,0BAA0B,CAACC,mBAA8B,CAAA;QACpEC,aAAa;QACbC,YAAY;YACVC,YAAY;gBAAC;gBAAUH,oBAAoB;aAAG;YAC9CI,WAAW;gBAAC;gBAAU;gBAAmBJ,oBAAoB;aAAG;YAChEK,UAAU;gBAAC;gBAAU;aAAkB;YACvCC,QAAQ;gBAAC;gBAAU;aAAQ;YAC3BC,SAAS;gBAAC;aAAS;QACrB;IACF,CAAA;AAEO,MAAMT,qBAAqB,IAAIU,IAAI;IAAC;IAAgB;IAAa;CAAY"}
|
package/server/app.service.js
CHANGED
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "AppService", {
|
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
16
|
const _clusteradapter = require("@socket.io/cluster-adapter");
|
|
17
17
|
const _nodecluster = /*#__PURE__*/ _interop_require_default(require("node:cluster"));
|
|
18
|
+
const _nodeos = require("node:os");
|
|
18
19
|
const _nodeprocess = /*#__PURE__*/ _interop_require_default(require("node:process"));
|
|
19
20
|
const _configenvironment = require("./configuration/config.environment");
|
|
20
21
|
const _schedulerconstants = require("./infrastructure/scheduler/scheduler.constants");
|
|
@@ -36,21 +37,21 @@ let AppService = class AppService {
|
|
|
36
37
|
// setup connections between the workers
|
|
37
38
|
(0, _clusteradapter.setupPrimary)();
|
|
38
39
|
}
|
|
39
|
-
AppService.logger.log(`
|
|
40
|
-
AppService.logger.log(`Master
|
|
40
|
+
AppService.logger.log(`Workers: ${_configenvironment.configuration.server.workers} / CPU cores: ${(0, _nodeos.cpus)().length}`);
|
|
41
|
+
AppService.logger.log(`[Master:${_nodeprocess.default.pid}] started`);
|
|
41
42
|
for(let i = 0; i < _configenvironment.configuration.server.workers; i++){
|
|
42
43
|
AppService.forkProcess(i === _configenvironment.configuration.server.workers - 1);
|
|
43
44
|
}
|
|
44
45
|
_nodecluster.default.on('exit', (worker, code, signal)=>{
|
|
45
|
-
AppService.logger.log(`Worker
|
|
46
|
+
AppService.logger.log(`[Worker:${worker.process.pid}] (code: ${code}, signal: ${signal}) died.`);
|
|
46
47
|
if (_configenvironment.configuration.server.restartOnFailure) {
|
|
47
48
|
const isScheduler = worker.process.pid === AppService.schedulerPID;
|
|
48
|
-
AppService.logger.log(`
|
|
49
|
+
AppService.logger.log(`[Worker:${worker.process.pid}] restarting ${isScheduler ? `(with Scheduler)` : ''}...`);
|
|
49
50
|
AppService.forkProcess(isScheduler);
|
|
50
51
|
}
|
|
51
52
|
});
|
|
52
53
|
} else {
|
|
53
|
-
AppService.logger.log(`
|
|
54
|
+
AppService.logger.log(`[Worker:${_nodeprocess.default.pid}] started`);
|
|
54
55
|
bootstrap();
|
|
55
56
|
}
|
|
56
57
|
}
|
|
@@ -60,7 +61,7 @@ let AppService = class AppService {
|
|
|
60
61
|
});
|
|
61
62
|
if (isScheduler) {
|
|
62
63
|
AppService.schedulerPID = w.process.pid;
|
|
63
|
-
AppService.logger.log(`
|
|
64
|
+
AppService.logger.log(`[Worker:${w.process.pid}] Scheduler role enabled`);
|
|
64
65
|
}
|
|
65
66
|
}
|
|
66
67
|
};
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../backend/src/app.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Injectable, Logger } from '@nestjs/common'\nimport { setupPrimary } from '@socket.io/cluster-adapter'\nimport cluster, { Worker } from 'node:cluster'\nimport process from 'node:process'\nimport { configuration } from './configuration/config.environment'\nimport { SCHEDULER_ENV, SCHEDULER_STATE } from './infrastructure/scheduler/scheduler.constants'\n\n@Injectable()\nexport class AppService {\n private static readonly logger = new Logger(AppService.name)\n static schedulerPID: number\n\n static clusterize(bootstrap: () => void) {\n if (cluster.isPrimary) {\n if (configuration.websocket.adapter === 'cluster') {\n // setup connections between the workers\n setupPrimary()\n }\n AppService.logger.log(`
|
|
1
|
+
{"version":3,"sources":["../../backend/src/app.service.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Injectable, Logger } from '@nestjs/common'\nimport { setupPrimary } from '@socket.io/cluster-adapter'\nimport cluster, { Worker } from 'node:cluster'\nimport { cpus } from 'node:os'\nimport process from 'node:process'\nimport { configuration } from './configuration/config.environment'\nimport { SCHEDULER_ENV, SCHEDULER_STATE } from './infrastructure/scheduler/scheduler.constants'\n\n@Injectable()\nexport class AppService {\n private static readonly logger = new Logger(AppService.name)\n static schedulerPID: number\n\n static clusterize(bootstrap: () => void) {\n if (cluster.isPrimary) {\n if (configuration.websocket.adapter === 'cluster') {\n // setup connections between the workers\n setupPrimary()\n }\n AppService.logger.log(`Workers: ${configuration.server.workers} / CPU cores: ${cpus().length}`)\n AppService.logger.log(`[Master:${process.pid}] started`)\n for (let i = 0; i < configuration.server.workers; i++) {\n AppService.forkProcess(i === configuration.server.workers - 1)\n }\n cluster.on('exit', (worker: Worker, code: number, signal: string) => {\n AppService.logger.log(`[Worker:${worker.process.pid}] (code: ${code}, signal: ${signal}) died.`)\n if (configuration.server.restartOnFailure) {\n const isScheduler = worker.process.pid === AppService.schedulerPID\n AppService.logger.log(`[Worker:${worker.process.pid}] restarting ${isScheduler ? `(with Scheduler)` : ''}...`)\n AppService.forkProcess(isScheduler)\n }\n })\n } else {\n AppService.logger.log(`[Worker:${process.pid}] started`)\n bootstrap()\n }\n }\n\n static forkProcess(isScheduler: boolean) {\n const w: Worker = cluster.fork({ [SCHEDULER_ENV]: isScheduler ? SCHEDULER_STATE.ENABLED : SCHEDULER_STATE.DISABLED })\n if (isScheduler) {\n AppService.schedulerPID = w.process.pid\n AppService.logger.log(`[Worker:${w.process.pid}] Scheduler role enabled`)\n }\n }\n}\n"],"names":["AppService","clusterize","bootstrap","cluster","isPrimary","configuration","websocket","adapter","setupPrimary","logger","log","server","workers","cpus","length","process","pid","i","forkProcess","on","worker","code","signal","restartOnFailure","isScheduler","schedulerPID","w","fork","SCHEDULER_ENV","SCHEDULER_STATE","ENABLED","DISABLED","Logger","name"],"mappings":"AAAA;;;;CAIC;;;;+BAWYA;;;eAAAA;;;wBATsB;gCACN;oEACG;wBACX;oEACD;mCACU;oCACiB;;;;;;;;;;;;AAGxC,IAAA,AAAMA,aAAN,MAAMA;IAIX,OAAOC,WAAWC,SAAqB,EAAE;QACvC,IAAIC,oBAAO,CAACC,SAAS,EAAE;YACrB,IAAIC,gCAAa,CAACC,SAAS,CAACC,OAAO,KAAK,WAAW;gBACjD,wCAAwC;gBACxCC,IAAAA,4BAAY;YACd;YACAR,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,SAAS,EAAEL,gCAAa,CAACM,MAAM,CAACC,OAAO,CAAC,cAAc,EAAEC,IAAAA,YAAI,IAAGC,MAAM,EAAE;YAC9Fd,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAEK,oBAAO,CAACC,GAAG,CAAC,SAAS,CAAC;YACvD,IAAK,IAAIC,IAAI,GAAGA,IAAIZ,gCAAa,CAACM,MAAM,CAACC,OAAO,EAAEK,IAAK;gBACrDjB,WAAWkB,WAAW,CAACD,MAAMZ,gCAAa,CAACM,MAAM,CAACC,OAAO,GAAG;YAC9D;YACAT,oBAAO,CAACgB,EAAE,CAAC,QAAQ,CAACC,QAAgBC,MAAcC;gBAChDtB,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAEU,OAAOL,OAAO,CAACC,GAAG,CAAC,SAAS,EAAEK,KAAK,UAAU,EAAEC,OAAO,OAAO,CAAC;gBAC/F,IAAIjB,gCAAa,CAACM,MAAM,CAACY,gBAAgB,EAAE;oBACzC,MAAMC,cAAcJ,OAAOL,OAAO,CAACC,GAAG,KAAKhB,WAAWyB,YAAY;oBAClEzB,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAEU,OAAOL,OAAO,CAACC,GAAG,CAAC,aAAa,EAAEQ,cAAc,CAAC,gBAAgB,CAAC,GAAG,GAAG,GAAG,CAAC;oBAC7GxB,WAAWkB,WAAW,CAACM;gBACzB;YACF;QACF,OAAO;YACLxB,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAEK,oBAAO,CAACC,GAAG,CAAC,SAAS,CAAC;YACvDd;QACF;IACF;IAEA,OAAOgB,YAAYM,WAAoB,EAAE;QACvC,MAAME,IAAYvB,oBAAO,CAACwB,IAAI,CAAC;YAAE,CAACC,iCAAa,CAAC,EAAEJ,cAAcK,mCAAe,CAACC,OAAO,GAAGD,mCAAe,CAACE,QAAQ;QAAC;QACnH,IAAIP,aAAa;YACfxB,WAAWyB,YAAY,GAAGC,EAAEX,OAAO,CAACC,GAAG;YACvChB,WAAWS,MAAM,CAACC,GAAG,CAAC,CAAC,QAAQ,EAAEgB,EAAEX,OAAO,CAACC,GAAG,CAAC,wBAAwB,CAAC;QAC1E;IACF;AACF;AApCahB,WACaS,SAAS,IAAIuB,cAAM,CAAChC,WAAWiC,IAAI"}
|
|
@@ -338,6 +338,10 @@ const ONLY_OFFICE_EXTENSIONS = {
|
|
|
338
338
|
]),
|
|
339
339
|
EDITABLE: new Map([
|
|
340
340
|
// WORD
|
|
341
|
+
[
|
|
342
|
+
'doc',
|
|
343
|
+
'word'
|
|
344
|
+
],
|
|
341
345
|
[
|
|
342
346
|
'docm',
|
|
343
347
|
'word'
|
|
@@ -395,6 +399,10 @@ const ONLY_OFFICE_EXTENSIONS = {
|
|
|
395
399
|
'xlsm',
|
|
396
400
|
'cell'
|
|
397
401
|
],
|
|
402
|
+
[
|
|
403
|
+
'xls',
|
|
404
|
+
'cell'
|
|
405
|
+
],
|
|
398
406
|
[
|
|
399
407
|
'xlsx',
|
|
400
408
|
'cell'
|
|
@@ -440,6 +448,10 @@ const ONLY_OFFICE_EXTENSIONS = {
|
|
|
440
448
|
'pptm',
|
|
441
449
|
'slide'
|
|
442
450
|
],
|
|
451
|
+
[
|
|
452
|
+
'ppt',
|
|
453
|
+
'slide'
|
|
454
|
+
],
|
|
443
455
|
[
|
|
444
456
|
'pptx',
|
|
445
457
|
'slide'
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/constants/only-office.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\nexport const ONLY_OFFICE_INTERNAL_URI = '/onlyoffice' // used by nginx as proxy\nexport const ONLY_OFFICE_CONTEXT = 'OnlyOfficeEnvironment'\nexport const ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME = 'token' as const\n\nexport const ONLY_OFFICE_EXTENSIONS = {\n VIEWABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dot', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['fodt', 'word'],\n ['gdoc', 'word'],\n ['htm', 'word'],\n ['html', 'word'],\n ['hwp', 'word'],\n ['hwpx', 'word'],\n ['md', 'word'],\n ['mht', 'word'],\n ['mhtml', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['pages', 'word'],\n ['rtf', 'word'],\n ['stw', 'word'],\n ['sxw', 'word'],\n ['txt', 'word'],\n ['wps', 'word'],\n ['wpt', 'word'],\n ['xml', 'word'],\n ['md', 'word'],\n\n // CELL\n ['csv', 'cell'],\n ['et', 'cell'],\n ['ett', 'cell'],\n ['fods', 'cell'],\n ['gsheet', 'cell'],\n ['numbers', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n ['sxc', 'cell'],\n ['xls', 'cell'],\n ['xlsm', 'cell'],\n ['xlsx', 'cell'],\n ['xlt', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n\n // SLIDE\n ['dps', 'slide'],\n ['dpt', 'slide'],\n ['fodp', 'slide'],\n ['gslide', 'slide'],\n ['key', 'slide'],\n ['odg', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n ['pot', 'slide'],\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['pps', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['ppt', 'slide'],\n ['pptm', 'slide'],\n ['pptx', 'slide'],\n ['sxi', 'slide'],\n\n // PDF\n ['djvu', 'pdf'],\n ['docxf', 'pdf'],\n ['oform', 'pdf'],\n ['oxps', 'pdf'],\n ['pdf', 'pdf'],\n ['xps', 'pdf'],\n\n // DIAGRAM\n ['vsdm', 'diagram'],\n ['vsdx', 'diagram'],\n ['vssm', 'diagram'],\n ['vssx', 'diagram'],\n ['vstm', 'diagram'],\n ['vstx', 'diagram']\n ]),\n\n EDITABLE: new Map([\n // WORD\n ['docm', 'word'],\n ['docx', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['html', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['rtf', 'word'],\n ['txt', 'word'],\n ['md', 'word'],\n\n // CELL\n ['xlsb', 'cell'],\n ['xlsm', 'cell'],\n ['xlsx', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n ['csv', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n\n // SLIDE\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['pptm', 'slide'],\n ['pptx', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n\n // PDF\n ['pdf', 'pdf']\n ])\n}\n\nexport const ONLY_OFFICE_CONVERT_EXTENSIONS = {\n ALLOW_AUTO: new Set(['doc', 'xls', 'ppt']),\n FROM: new Set([\n 'doc',\n 'docm',\n 'docx',\n 'docxf',\n 'dotx',\n 'epub',\n 'fb2',\n 'html',\n 'mhtml',\n 'odt',\n 'ott',\n 'pdf',\n 'rtf',\n 'stw',\n 'sxw',\n 'txt',\n 'wps',\n 'wpt',\n 'xps'\n ]),\n TO: new Set(['docx', 'docxf', 'dotx', 'epub', 'fb2', 'html', 'jpg', 'odt', 'ott', 'pdf', 'png', 'rtf', 'txt'])\n}\n\nexport const ONLY_OFFICE_CONVERT_ERROR = new Map([\n [-9, 'error conversion output format'],\n [-8, 'error document VKey'],\n [-7, 'error document request'],\n [-6, 'error database'],\n [-5, 'incorrect password'],\n [-4, 'download error'],\n [-3, 'convert error'],\n [-2, 'convert error timeout'],\n [-1, 'convert unknown']\n])\n"],"names":["ONLY_OFFICE_CONTEXT","ONLY_OFFICE_CONVERT_ERROR","ONLY_OFFICE_CONVERT_EXTENSIONS","ONLY_OFFICE_EXTENSIONS","ONLY_OFFICE_INTERNAL_URI","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","VIEWABLE","Map","EDITABLE","ALLOW_AUTO","Set","FROM","TO"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAGYA;eAAAA;;
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/constants/only-office.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\nexport const ONLY_OFFICE_INTERNAL_URI = '/onlyoffice' // used by nginx as proxy\nexport const ONLY_OFFICE_CONTEXT = 'OnlyOfficeEnvironment'\nexport const ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME = 'token' as const\n\nexport const ONLY_OFFICE_EXTENSIONS = {\n VIEWABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dot', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['fodt', 'word'],\n ['gdoc', 'word'],\n ['htm', 'word'],\n ['html', 'word'],\n ['hwp', 'word'],\n ['hwpx', 'word'],\n ['md', 'word'],\n ['mht', 'word'],\n ['mhtml', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['pages', 'word'],\n ['rtf', 'word'],\n ['stw', 'word'],\n ['sxw', 'word'],\n ['txt', 'word'],\n ['wps', 'word'],\n ['wpt', 'word'],\n ['xml', 'word'],\n ['md', 'word'],\n\n // CELL\n ['csv', 'cell'],\n ['et', 'cell'],\n ['ett', 'cell'],\n ['fods', 'cell'],\n ['gsheet', 'cell'],\n ['numbers', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n ['sxc', 'cell'],\n ['xls', 'cell'],\n ['xlsm', 'cell'],\n ['xlsx', 'cell'],\n ['xlt', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n\n // SLIDE\n ['dps', 'slide'],\n ['dpt', 'slide'],\n ['fodp', 'slide'],\n ['gslide', 'slide'],\n ['key', 'slide'],\n ['odg', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n ['pot', 'slide'],\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['pps', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['ppt', 'slide'],\n ['pptm', 'slide'],\n ['pptx', 'slide'],\n ['sxi', 'slide'],\n\n // PDF\n ['djvu', 'pdf'],\n ['docxf', 'pdf'],\n ['oform', 'pdf'],\n ['oxps', 'pdf'],\n ['pdf', 'pdf'],\n ['xps', 'pdf'],\n\n // DIAGRAM\n ['vsdm', 'diagram'],\n ['vsdx', 'diagram'],\n ['vssm', 'diagram'],\n ['vssx', 'diagram'],\n ['vstm', 'diagram'],\n ['vstx', 'diagram']\n ]),\n\n EDITABLE: new Map([\n // WORD\n ['doc', 'word'],\n ['docm', 'word'],\n ['docx', 'word'],\n ['dotm', 'word'],\n ['dotx', 'word'],\n ['epub', 'word'],\n ['fb2', 'word'],\n ['html', 'word'],\n ['odt', 'word'],\n ['ott', 'word'],\n ['rtf', 'word'],\n ['txt', 'word'],\n ['md', 'word'],\n\n // CELL\n ['xlsb', 'cell'],\n ['xlsm', 'cell'],\n ['xls', 'cell'],\n ['xlsx', 'cell'],\n ['xltm', 'cell'],\n ['xltx', 'cell'],\n ['csv', 'cell'],\n ['ods', 'cell'],\n ['ots', 'cell'],\n\n // SLIDE\n ['potm', 'slide'],\n ['potx', 'slide'],\n ['ppsm', 'slide'],\n ['ppsx', 'slide'],\n ['pptm', 'slide'],\n ['ppt', 'slide'],\n ['pptx', 'slide'],\n ['odp', 'slide'],\n ['otp', 'slide'],\n\n // PDF\n ['pdf', 'pdf']\n ])\n}\n\nexport const ONLY_OFFICE_CONVERT_EXTENSIONS = {\n ALLOW_AUTO: new Set(['doc', 'xls', 'ppt']),\n FROM: new Set([\n 'doc',\n 'docm',\n 'docx',\n 'docxf',\n 'dotx',\n 'epub',\n 'fb2',\n 'html',\n 'mhtml',\n 'odt',\n 'ott',\n 'pdf',\n 'rtf',\n 'stw',\n 'sxw',\n 'txt',\n 'wps',\n 'wpt',\n 'xps'\n ]),\n TO: new Set(['docx', 'docxf', 'dotx', 'epub', 'fb2', 'html', 'jpg', 'odt', 'ott', 'pdf', 'png', 'rtf', 'txt'])\n}\n\nexport const ONLY_OFFICE_CONVERT_ERROR = new Map([\n [-9, 'error conversion output format'],\n [-8, 'error document VKey'],\n [-7, 'error document request'],\n [-6, 'error database'],\n [-5, 'incorrect password'],\n [-4, 'download error'],\n [-3, 'convert error'],\n [-2, 'convert error timeout'],\n [-1, 'convert unknown']\n])\n"],"names":["ONLY_OFFICE_CONTEXT","ONLY_OFFICE_CONVERT_ERROR","ONLY_OFFICE_CONVERT_EXTENSIONS","ONLY_OFFICE_EXTENSIONS","ONLY_OFFICE_INTERNAL_URI","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","VIEWABLE","Map","EDITABLE","ALLOW_AUTO","Set","FROM","TO"],"mappings":"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"}
|
|
@@ -59,6 +59,7 @@ _ts_decorate([
|
|
|
59
59
|
let FilesConfig = class FilesConfig {
|
|
60
60
|
constructor(){
|
|
61
61
|
this.maxUploadSize = 5368709120; // 5 GB
|
|
62
|
+
this.contentIndexing = true;
|
|
62
63
|
this.showHiddenFiles = false;
|
|
63
64
|
this.onlyoffice = new FilesOnlyOfficeConfig();
|
|
64
65
|
}
|
|
@@ -87,6 +88,10 @@ _ts_decorate([
|
|
|
87
88
|
(0, _classvalidator.IsInt)(),
|
|
88
89
|
_ts_metadata("design:type", Number)
|
|
89
90
|
], FilesConfig.prototype, "maxUploadSize", void 0);
|
|
91
|
+
_ts_decorate([
|
|
92
|
+
(0, _classvalidator.IsBoolean)(),
|
|
93
|
+
_ts_metadata("design:type", Boolean)
|
|
94
|
+
], FilesConfig.prototype, "contentIndexing", void 0);
|
|
90
95
|
_ts_decorate([
|
|
91
96
|
(0, _classvalidator.IsBoolean)(),
|
|
92
97
|
_ts_metadata("design:type", Boolean)
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.config.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Type } from 'class-transformer'\nimport { IsBoolean, IsInt, IsNotEmpty, IsNotEmptyObject, IsOptional, IsString, ValidateIf, ValidateNested } from 'class-validator'\n\nexport class FilesOnlyOfficeConfig {\n @IsBoolean()\n enabled = false\n\n @IsOptional()\n @IsString()\n externalServer: string = null\n\n @ValidateIf((o: FilesOnlyOfficeConfig) => o.enabled)\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsBoolean()\n verifySSL: boolean = false\n}\n\nexport class FilesConfig {\n @IsNotEmpty()\n @IsString()\n dataPath: string\n\n @IsNotEmpty()\n @IsString()\n usersPath: string\n\n @IsNotEmpty()\n @IsString()\n spacesPath: string\n\n @IsNotEmpty()\n @IsString()\n tmpPath: string\n\n @IsInt()\n maxUploadSize: number = 5368709120 // 5 GB\n\n @IsBoolean()\n showHiddenFiles: boolean = false\n\n @IsNotEmptyObject()\n @ValidateNested()\n @Type(() => FilesOnlyOfficeConfig)\n onlyoffice: FilesOnlyOfficeConfig = new FilesOnlyOfficeConfig()\n}\n"],"names":["FilesConfig","FilesOnlyOfficeConfig","enabled","externalServer","verifySSL","o","maxUploadSize","showHiddenFiles","onlyoffice"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAsBYA;eAAAA;;QAjBAC;eAAAA;;;kCAHQ;gCAC4F;;;;;;;;;;AAE1G,IAAA,AAAMA,wBAAN,MAAMA;;aAEXC,UAAU;aAIVC,iBAAyB;aAQzBC,YAAqB;;AACvB;;;;;;;;;;qCAPeC,IAA6BA,EAAEH,OAAO;;;;;;;;;AAS9C,IAAA,AAAMF,cAAN,MAAMA;;aAkBXM,gBAAwB,YAAW,OAAO;aAG1CC,kBAA2B;aAK3BC,aAAoC,
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.config.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Type } from 'class-transformer'\nimport { IsBoolean, IsInt, IsNotEmpty, IsNotEmptyObject, IsOptional, IsString, ValidateIf, ValidateNested } from 'class-validator'\n\nexport class FilesOnlyOfficeConfig {\n @IsBoolean()\n enabled = false\n\n @IsOptional()\n @IsString()\n externalServer: string = null\n\n @ValidateIf((o: FilesOnlyOfficeConfig) => o.enabled)\n @IsString()\n @IsNotEmpty()\n secret: string\n\n @IsBoolean()\n verifySSL: boolean = false\n}\n\nexport class FilesConfig {\n @IsNotEmpty()\n @IsString()\n dataPath: string\n\n @IsNotEmpty()\n @IsString()\n usersPath: string\n\n @IsNotEmpty()\n @IsString()\n spacesPath: string\n\n @IsNotEmpty()\n @IsString()\n tmpPath: string\n\n @IsInt()\n maxUploadSize: number = 5368709120 // 5 GB\n\n @IsBoolean()\n contentIndexing: boolean = true\n\n @IsBoolean()\n showHiddenFiles: boolean = false\n\n @IsNotEmptyObject()\n @ValidateNested()\n @Type(() => FilesOnlyOfficeConfig)\n onlyoffice: FilesOnlyOfficeConfig = new FilesOnlyOfficeConfig()\n}\n"],"names":["FilesConfig","FilesOnlyOfficeConfig","enabled","externalServer","verifySSL","o","maxUploadSize","contentIndexing","showHiddenFiles","onlyoffice"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAsBYA;eAAAA;;QAjBAC;eAAAA;;;kCAHQ;gCAC4F;;;;;;;;;;AAE1G,IAAA,AAAMA,wBAAN,MAAMA;;aAEXC,UAAU;aAIVC,iBAAyB;aAQzBC,YAAqB;;AACvB;;;;;;;;;;qCAPeC,IAA6BA,EAAEH,OAAO;;;;;;;;;AAS9C,IAAA,AAAMF,cAAN,MAAMA;;aAkBXM,gBAAwB,YAAW,OAAO;aAG1CC,kBAA2B;aAG3BC,kBAA2B;aAK3BC,aAAoC,IAAIR;;AAC1C;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;oCAFcA"}
|
|
@@ -14,6 +14,7 @@ Object.defineProperty(exports, "FilesController", {
|
|
|
14
14
|
});
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
16
|
const _fastify = require("fastify");
|
|
17
|
+
const _image = require("../../common/image");
|
|
17
18
|
const _spaceskipguarddecorator = require("../spaces/decorators/space-skip-guard.decorator");
|
|
18
19
|
const _spaceskippermissionsdecorator = require("../spaces/decorators/space-skip-permissions.decorator");
|
|
19
20
|
const _spacedecorator = require("../spaces/decorators/space.decorator");
|
|
@@ -66,8 +67,11 @@ let FilesController = class FilesController {
|
|
|
66
67
|
async delete(user, space) {
|
|
67
68
|
return this.filesMethods.delete(user, space);
|
|
68
69
|
}
|
|
69
|
-
async genThumbnail(space, size = 256) {
|
|
70
|
-
|
|
70
|
+
async genThumbnail(space, size = 256, res) {
|
|
71
|
+
if (size > 1024) size = 1024;
|
|
72
|
+
const thumb = await this.filesMethods.genThumbnail(space, size);
|
|
73
|
+
res.type(_image.webpMimeType);
|
|
74
|
+
return res.send(thumb);
|
|
71
75
|
}
|
|
72
76
|
// TASKS OPERATIONS
|
|
73
77
|
async downloadFromUrlAsTask(user, space, downloadFileDto) {
|
|
@@ -199,11 +203,15 @@ _ts_decorate([
|
|
|
199
203
|
_ts_decorate([
|
|
200
204
|
(0, _common.Get)(`${_routes.FILES_ROUTE.OPERATION}/${_operations.FILE_OPERATION.THUMBNAIL}/*`),
|
|
201
205
|
_ts_param(0, (0, _spacedecorator.GetSpace)()),
|
|
202
|
-
_ts_param(1, (0, _common.Query)('size'
|
|
206
|
+
_ts_param(1, (0, _common.Query)('size', new _common.ParseIntPipe({
|
|
207
|
+
optional: true
|
|
208
|
+
}))),
|
|
209
|
+
_ts_param(2, (0, _common.Res)()),
|
|
203
210
|
_ts_metadata("design:type", Function),
|
|
204
211
|
_ts_metadata("design:paramtypes", [
|
|
205
212
|
typeof _spaceenvmodel.SpaceEnv === "undefined" ? Object : _spaceenvmodel.SpaceEnv,
|
|
206
|
-
|
|
213
|
+
void 0,
|
|
214
|
+
typeof _fastify.FastifyReply === "undefined" ? Object : _fastify.FastifyReply
|
|
207
215
|
]),
|
|
208
216
|
_ts_metadata("design:returntype", Promise)
|
|
209
217
|
], FilesController.prototype, "genThumbnail", null);
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Copy, Delete, Get, Head, Logger, Move, Post, Query, Req, Res, Search, StreamableFile, UseGuards } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async upload(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<void> {\n return this.filesMethods.upload(req, res)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(@GetSpace() space: SpaceEnv, @Query('size') size: number = 256): Promise<StreamableFile> {\n return this.filesMethods.genThumbnail(space, size)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","upload","copy","copyMoveFileDto","move","delete","genThumbnail","size","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport {\n Body,\n Controller,\n Copy,\n Delete,\n Get,\n Head,\n Logger,\n Move,\n ParseIntPipe,\n Post,\n Query,\n Req,\n Res,\n Search,\n StreamableFile,\n UseGuards\n} from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { webpMimeType } from '../../common/image'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { SkipSpacePermissionsCheck } from '../spaces/decorators/space-skip-permissions.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FILES_ROUTE } from './constants/routes'\nimport { CompressFileDto, CopyMoveFileDto, DownloadFileDto, MakeFileDto, SearchFilesDto } from './dto/file-operations.dto'\nimport { FileTask } from './models/file-task'\nimport { FileContent } from './schemas/file-content.interface'\nimport { FileRecent } from './schemas/file-recent.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesRecents } from './services/files-recents.service'\nimport { FilesSearchManager } from './services/files-search-manager.service'\nimport { FilesTasksManager } from './services/files-tasks-manager.service'\n\n@Controller(FILES_ROUTE.BASE)\n@UseGuards(SpaceGuard)\nexport class FilesController {\n private readonly logger = new Logger(FilesController.name)\n\n constructor(\n private readonly filesMethods: FilesMethods,\n private readonly filesTasksManager: FilesTasksManager,\n private readonly filesRecents: FilesRecents,\n private readonly filesSearch: FilesSearchManager\n ) {}\n\n // OPERATIONS\n\n @Head(`${FILES_ROUTE.OPERATION}/*`)\n async head(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/*`)\n async download(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.MAKE}/*`)\n async make(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() makeFileDto: MakeFileDto): Promise<void> {\n return this.filesMethods.make(user, space, makeFileDto)\n }\n\n @Post(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.UPLOAD}/*`)\n async upload(@Req() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<void> {\n return this.filesMethods.upload(req, res)\n }\n\n @Copy(`${FILES_ROUTE.OPERATION}/*`)\n async copy(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.copy(user, space, copyMoveFileDto)\n }\n\n @Move(`${FILES_ROUTE.OPERATION}/*`)\n async move(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Body() copyMoveFileDto: CopyMoveFileDto\n ): Promise<{\n path: string\n name: string\n }> {\n return this.filesMethods.move(user, space, copyMoveFileDto)\n }\n\n @Delete(`${FILES_ROUTE.OPERATION}/*`)\n async delete(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<void> {\n return this.filesMethods.delete(user, space)\n }\n\n @Get(`${FILES_ROUTE.OPERATION}/${FILE_OPERATION.THUMBNAIL}/*`)\n async genThumbnail(\n @GetSpace() space: SpaceEnv,\n @Query('size', new ParseIntPipe({ optional: true })) size = 256,\n @Res() res: FastifyReply\n ): Promise<StreamableFile> {\n if (size > 1024) size = 1024\n const thumb = await this.filesMethods.genThumbnail(space, size)\n res.type(webpMimeType)\n return res.send(thumb)\n }\n\n // TASKS OPERATIONS\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}/*`)\n async downloadFromUrlAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() downloadFileDto: DownloadFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DOWNLOAD, user, space, downloadFileDto, this.filesMethods.downloadFromUrl.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.COMPRESS}/*`)\n @SkipSpacePermissionsCheck()\n // Compression could be used to download files, permission is checked later\n async compressAsTask(@Req() req: FastifySpaceRequest, @Body() compressFileDto: CompressFileDto): Promise<FileTask> {\n if (compressFileDto.compressInDirectory) {\n SpaceGuard.checkPermissions(req, this.logger)\n }\n return this.filesTasksManager.createTask(FILE_OPERATION.COMPRESS, req.user, req.space, compressFileDto, this.filesMethods.compress.name)\n }\n\n @Post(`${FILES_ROUTE.TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}/*`)\n async decompressAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DECOMPRESS, user, space, null, this.filesMethods.decompress.name)\n }\n\n @Copy(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async copyAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.COPY, user, space, copyMoveFileDto, this.filesMethods.copy.name)\n }\n\n @Move(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async moveAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body() copyMoveFileDto: CopyMoveFileDto): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.MOVE, user, space, copyMoveFileDto, this.filesMethods.move.name)\n }\n\n @Delete(`${FILES_ROUTE.TASK_OPERATION}/*`)\n async deleteAsTask(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv): Promise<FileTask> {\n return this.filesTasksManager.createTask(FILE_OPERATION.DELETE, user, space, null, this.filesMethods.delete.name)\n }\n\n // RECENT FILES\n\n @Get(FILES_ROUTE.RECENTS)\n @SkipSpaceGuard()\n getRecents(@GetUser() user: UserModel, @Query('limit') limit: number = 10): Promise<FileRecent[]> {\n return this.filesRecents.getRecents(user, limit)\n }\n\n // SEARCH FILES\n\n @Search(FILES_ROUTE.SEARCH)\n @SkipSpaceGuard()\n search(@GetUser() user: UserModel, @Body() search: SearchFilesDto): Promise<FileContent[]> {\n return this.filesSearch.search(user, search)\n }\n}\n"],"names":["FilesController","head","req","res","filesMethods","headOrGet","download","make","user","space","makeFileDto","upload","copy","copyMoveFileDto","move","delete","genThumbnail","size","thumb","type","webpMimeType","send","downloadFromUrlAsTask","downloadFileDto","filesTasksManager","createTask","FILE_OPERATION","DOWNLOAD","downloadFromUrl","name","compressAsTask","compressFileDto","compressInDirectory","SpaceGuard","checkPermissions","logger","COMPRESS","compress","decompressAsTask","DECOMPRESS","decompress","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","getRecents","limit","filesRecents","search","filesSearch","Logger","FILES_ROUTE","OPERATION","passthrough","MAKE","UPLOAD","THUMBNAIL","ParseIntPipe","optional","TASK_OPERATION","RECENTS","SEARCH","BASE"],"mappings":"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"}
|
|
@@ -39,6 +39,7 @@ describe(_filescontroller.FilesController.name, ()=>{
|
|
|
39
39
|
const fakeRes = {
|
|
40
40
|
header: jest.fn().mockReturnThis(),
|
|
41
41
|
status: jest.fn().mockReturnThis(),
|
|
42
|
+
type: jest.fn().mockReturnThis(),
|
|
42
43
|
send: jest.fn()
|
|
43
44
|
};
|
|
44
45
|
// Mocks
|
|
@@ -164,16 +165,29 @@ describe(_filescontroller.FilesController.name, ()=>{
|
|
|
164
165
|
const stream = {};
|
|
165
166
|
filesMethodsMock.genThumbnail.mockResolvedValue(stream);
|
|
166
167
|
// pass undefined to exercise controller default parameter
|
|
167
|
-
const result = await filesController.genThumbnail(fakeSpace, undefined);
|
|
168
|
+
const result = await filesController.genThumbnail(fakeSpace, undefined, fakeRes);
|
|
168
169
|
expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256);
|
|
169
|
-
expect(
|
|
170
|
+
expect(fakeRes.type).toHaveBeenCalled();
|
|
171
|
+
expect(fakeRes.send).toHaveBeenCalledWith(stream);
|
|
172
|
+
expect(result).toBeUndefined();
|
|
170
173
|
});
|
|
171
174
|
it('genThumbnail() should pass provided size', async ()=>{
|
|
172
175
|
const stream = {};
|
|
173
176
|
filesMethodsMock.genThumbnail.mockResolvedValue(stream);
|
|
174
|
-
const result = await filesController.genThumbnail(fakeSpace, 512);
|
|
177
|
+
const result = await filesController.genThumbnail(fakeSpace, 512, fakeRes);
|
|
175
178
|
expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512);
|
|
176
|
-
expect(
|
|
179
|
+
expect(fakeRes.type).toHaveBeenCalled();
|
|
180
|
+
expect(fakeRes.send).toHaveBeenCalledWith(stream);
|
|
181
|
+
expect(result).toBeUndefined();
|
|
182
|
+
});
|
|
183
|
+
it('genThumbnail() should reduce size larger than 1024', async ()=>{
|
|
184
|
+
const stream = {};
|
|
185
|
+
filesMethodsMock.genThumbnail.mockResolvedValue(stream);
|
|
186
|
+
const result = await filesController.genThumbnail(fakeSpace, 2048, fakeRes);
|
|
187
|
+
expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 1024);
|
|
188
|
+
expect(fakeRes.type).toHaveBeenCalled();
|
|
189
|
+
expect(fakeRes.send).toHaveBeenCalledWith(stream);
|
|
190
|
+
expect(result).toBeUndefined();
|
|
177
191
|
});
|
|
178
192
|
});
|
|
179
193
|
describe('Tasks operations', ()=>{
|