@sync-in/server 1.3.9 → 1.5.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/CHANGELOG.md +34 -0
- package/README.md +5 -3
- package/environment/environment.dist.yaml +2 -0
- package/package.json +6 -6
- package/server/app.bootstrap.js +9 -0
- package/server/app.bootstrap.js.map +1 -1
- package/server/app.service.spec.js +44 -19
- package/server/app.service.spec.js.map +1 -1
- package/server/applications/comments/comments.controller.spec.js +103 -4
- package/server/applications/comments/comments.controller.spec.js.map +1 -1
- package/server/applications/comments/services/comments-manager.service.spec.js +409 -9
- package/server/applications/comments/services/comments-manager.service.spec.js.map +1 -1
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js +333 -0
- package/server/applications/files/adapters/files-indexer-mysql.service.spec.js.map +1 -0
- package/server/applications/files/constants/files.js +0 -23
- package/server/applications/files/constants/files.js.map +1 -1
- package/server/applications/files/constants/only-office.js +8 -0
- package/server/applications/files/constants/only-office.js.map +1 -1
- package/server/applications/files/constants/routes.js +6 -1
- package/server/applications/files/constants/routes.js.map +1 -1
- package/server/applications/files/files-only-office.controller.js +11 -0
- package/server/applications/files/files-only-office.controller.js.map +1 -1
- package/server/applications/files/files-only-office.controller.spec.js +97 -3
- package/server/applications/files/files-only-office.controller.spec.js.map +1 -1
- package/server/applications/files/files-tasks.controller.spec.js +91 -1
- package/server/applications/files/files-tasks.controller.spec.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.spec.js +268 -46
- package/server/applications/files/files.controller.spec.js.map +1 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js +77 -1
- package/server/applications/files/guards/files-only-office.guard.spec.js.map +1 -1
- package/server/applications/files/guards/files-only-office.strategy.js +0 -1
- package/server/applications/files/guards/files-only-office.strategy.js.map +1 -1
- package/server/applications/files/services/files-only-office-manager.service.js +5 -0
- package/server/applications/files/services/files-only-office-manager.service.js.map +1 -1
- package/server/applications/links/links.controller.spec.js +91 -58
- package/server/applications/links/links.controller.spec.js.map +1 -1
- package/server/applications/links/services/links-manager.service.js +4 -6
- package/server/applications/links/services/links-manager.service.js.map +1 -1
- package/server/applications/links/services/links-manager.service.spec.js +378 -14
- package/server/applications/links/services/links-manager.service.spec.js.map +1 -1
- package/server/applications/links/services/links-queries.service.js +1 -1
- package/server/applications/links/services/links-queries.service.js.map +1 -1
- package/server/applications/notifications/notifications.controller.spec.js +56 -1
- package/server/applications/notifications/notifications.controller.spec.js.map +1 -1
- package/server/applications/notifications/services/notifications-manager.service.spec.js +461 -5
- package/server/applications/notifications/services/notifications-manager.service.spec.js.map +1 -1
- package/server/applications/shares/services/shares-manager.service.spec.js +590 -14
- package/server/applications/shares/services/shares-manager.service.spec.js.map +1 -1
- package/server/applications/spaces/guards/space.guard.spec.js +153 -18
- package/server/applications/spaces/guards/space.guard.spec.js.map +1 -1
- package/server/applications/spaces/services/spaces-browser.service.js +7 -7
- package/server/applications/spaces/services/spaces-browser.service.js.map +1 -1
- package/server/applications/spaces/services/spaces-manager.service.js +17 -17
- package/server/applications/spaces/services/spaces-manager.service.js.map +1 -1
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js +120 -0
- package/server/applications/sync/interceptors/sync-diff-gzip-body.interceptor.spec.js.map +1 -0
- package/server/applications/sync/services/sync-clients-manager.service.spec.js +548 -8
- package/server/applications/sync/services/sync-clients-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-manager.service.spec.js +837 -5
- package/server/applications/sync/services/sync-manager.service.spec.js.map +1 -1
- package/server/applications/sync/services/sync-paths-manager.service.spec.js +900 -7
- package/server/applications/sync/services/sync-paths-manager.service.spec.js.map +1 -1
- package/server/applications/sync/utils/routes.js +1 -1
- package/server/applications/sync/utils/routes.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.js +4 -4
- package/server/applications/users/guards/permissions.guard.js.map +1 -1
- package/server/applications/users/guards/permissions.guard.spec.js +6 -6
- package/server/applications/users/guards/permissions.guard.spec.js.map +1 -1
- package/server/applications/users/guards/roles.guard.js +1 -1
- package/server/applications/users/guards/roles.guard.js.map +1 -1
- package/server/applications/users/models/user.model.js +1 -1
- package/server/applications/users/models/user.model.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.js +22 -24
- package/server/applications/users/services/admin-users-manager.service.js.map +1 -1
- package/server/applications/users/services/admin-users-manager.service.spec.js +763 -17
- package/server/applications/users/services/admin-users-manager.service.spec.js.map +1 -1
- package/server/applications/users/services/users-manager.service.js +1 -1
- package/server/applications/users/services/users-manager.service.js.map +1 -1
- package/server/applications/users/services/users-manager.service.spec.js +938 -49
- package/server/applications/users/services/users-manager.service.spec.js.map +1 -1
- package/server/applications/webdav/decorators/if-header.decorator.js +4 -1
- package/server/applications/webdav/decorators/if-header.decorator.js.map +1 -1
- package/server/applications/webdav/filters/webdav.filter.spec.js +77 -0
- package/server/applications/webdav/filters/webdav.filter.spec.js.map +1 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.js +3 -7
- package/server/applications/webdav/guards/webdav-protocol.guard.js.map +1 -1
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js +580 -0
- package/server/applications/webdav/guards/webdav-protocol.guard.spec.js.map +1 -0
- package/server/applications/webdav/services/webdav-methods.service.spec.js +1582 -3
- package/server/applications/webdav/services/webdav-methods.service.spec.js.map +1 -1
- package/server/applications/webdav/services/webdav-spaces.service.spec.js +390 -2
- package/server/applications/webdav/services/webdav-spaces.service.spec.js.map +1 -1
- package/server/applications/webdav/webdav.controller.js +2 -2
- package/server/applications/webdav/webdav.controller.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.js.map +1 -1
- package/server/authentication/guards/auth-basic.guard.spec.js +38 -2
- package/server/authentication/guards/auth-basic.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-basic.strategy.js +0 -1
- package/server/authentication/guards/auth-basic.strategy.js.map +1 -1
- package/server/authentication/guards/auth-digest.guard.js +1 -2
- package/server/authentication/guards/auth-digest.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.js.map +1 -1
- package/server/authentication/guards/auth-local.guard.spec.js +7 -5
- package/server/authentication/guards/auth-local.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-local.strategy.js +0 -1
- package/server/authentication/guards/auth-local.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-access.guard.spec.js +30 -0
- package/server/authentication/guards/auth-token-access.guard.spec.js.map +1 -1
- package/server/authentication/guards/auth-token-access.strategy.js +0 -1
- package/server/authentication/guards/auth-token-access.strategy.js.map +1 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js +0 -1
- package/server/authentication/guards/auth-token-refresh.strategy.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js +8 -6
- package/server/authentication/services/auth-methods/auth-method-database.service.spec.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js +2 -2
- package/server/authentication/services/auth-methods/auth-method-ldap.service.js.map +1 -1
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js +500 -5
- package/server/authentication/services/auth-methods/auth-method-ldap.service.spec.js.map +1 -1
- package/server/configuration/config.loader.js +0 -3
- package/server/configuration/config.loader.js.map +1 -1
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
- package/server/infrastructure/context/interceptors/context.interceptor.spec.js.map +1 -0
- package/server/infrastructure/context/services/context-manager.service.spec.js +98 -0
- package/server/infrastructure/context/services/context-manager.service.spec.js.map +1 -0
- package/server/infrastructure/database/constants.js +0 -1
- package/server/infrastructure/database/constants.js.map +1 -1
- package/server/infrastructure/database/scripts/seed/usersgroups.js +3 -3
- package/server/infrastructure/database/scripts/seed/usersgroups.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.js +20 -19
- package/server/infrastructure/mailer/mailer.service.js.map +1 -1
- package/server/infrastructure/mailer/mailer.service.spec.js +176 -0
- package/server/infrastructure/mailer/mailer.service.spec.js.map +1 -0
- package/static/3rdpartylicenses.txt +26 -26
- package/static/assets/pdfjs/build/pdf.mjs +1177 -255
- package/static/assets/pdfjs/build/pdf.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.sandbox.mjs +25 -2
- package/static/assets/pdfjs/build/pdf.sandbox.mjs.map +1 -1
- package/static/assets/pdfjs/build/pdf.worker.mjs +140 -16
- package/static/assets/pdfjs/build/pdf.worker.mjs.map +1 -1
- package/static/assets/pdfjs/version +1 -1
- package/static/assets/pdfjs/web/debugger.css +31 -0
- package/static/assets/pdfjs/web/debugger.mjs +144 -2
- package/static/assets/pdfjs/web/images/comment-editButton.svg +6 -1
- package/static/assets/pdfjs/web/locale/ach/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/af/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/an/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ast/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/az/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/be/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/bg/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/bn/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/bo/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/br/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/brx/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/bs/viewer.ftl +22 -0
- package/static/assets/pdfjs/web/locale/ca/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/cak/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/ckb/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/cs/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/cy/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/da/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/de/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/dsb/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/el/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-CA/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-GB/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/en-US/viewer.ftl +25 -0
- package/static/assets/pdfjs/web/locale/eo/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-AR/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-CL/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/es-MX/viewer.ftl +0 -6
- package/static/assets/pdfjs/web/locale/et/viewer.ftl +0 -57
- package/static/assets/pdfjs/web/locale/fa/viewer.ftl +0 -37
- package/static/assets/pdfjs/web/locale/ff/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/fi/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/fr/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/fy-NL/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/ga-IE/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/gd/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/gl/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/gn/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/gu-IN/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/he/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hi-IN/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/hsb/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hu/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/hy-AM/viewer.ftl +0 -49
- package/static/assets/pdfjs/web/locale/hye/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/ia/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/is/viewer.ftl +0 -3
- package/static/assets/pdfjs/web/locale/it/viewer.ftl +31 -0
- package/static/assets/pdfjs/web/locale/ja/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/ka/viewer.ftl +48 -10
- package/static/assets/pdfjs/web/locale/kab/viewer.ftl +5 -0
- package/static/assets/pdfjs/web/locale/kk/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/km/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/kn/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/ko/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/lij/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/lo/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/lt/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/ltg/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/lv/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/meh/viewer.ftl +0 -75
- package/static/assets/pdfjs/web/locale/mk/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ml/viewer.ftl +0 -3
- package/static/assets/pdfjs/web/locale/mr/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ms/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/my/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/nb-NO/viewer.ftl +44 -6
- package/static/assets/pdfjs/web/locale/ne-NP/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/nl/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/nn-NO/viewer.ftl +45 -1
- package/static/assets/pdfjs/web/locale/oc/viewer.ftl +0 -31
- package/static/assets/pdfjs/web/locale/pa-IN/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/pl/viewer.ftl +39 -1
- package/static/assets/pdfjs/web/locale/pt-BR/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/ro/viewer.ftl +355 -1
- package/static/assets/pdfjs/web/locale/ru/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/sat/viewer.ftl +0 -54
- package/static/assets/pdfjs/web/locale/sc/viewer.ftl +0 -38
- package/static/assets/pdfjs/web/locale/scn/viewer.ftl +0 -92
- package/static/assets/pdfjs/web/locale/sco/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/si/viewer.ftl +0 -51
- package/static/assets/pdfjs/web/locale/sk/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/skr/viewer.ftl +0 -27
- package/static/assets/pdfjs/web/locale/sl/viewer.ftl +8 -0
- package/static/assets/pdfjs/web/locale/son/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/sr/viewer.ftl +0 -33
- package/static/assets/pdfjs/web/locale/sv-SE/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/szl/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/ta/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/te/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/tg/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/tl/viewer.ftl +0 -63
- package/static/assets/pdfjs/web/locale/tr/viewer.ftl +40 -2
- package/static/assets/pdfjs/web/locale/trs/viewer.ftl +0 -72
- package/static/assets/pdfjs/web/locale/ur/viewer.ftl +0 -60
- package/static/assets/pdfjs/web/locale/uz/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/vi/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/wo/viewer.ftl +0 -77
- package/static/assets/pdfjs/web/locale/xh/viewer.ftl +0 -71
- package/static/assets/pdfjs/web/locale/zh-CN/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/locale/zh-TW/viewer.ftl +38 -0
- package/static/assets/pdfjs/web/viewer.css +649 -120
- package/static/assets/pdfjs/web/viewer.html +19 -0
- package/static/assets/pdfjs/web/viewer.mjs +489 -38
- package/static/assets/pdfjs/web/viewer.mjs.map +1 -1
- package/static/chunk-22EANI6R.js +1 -0
- package/static/{chunk-KFM544CA.js → chunk-2UWN7IQF.js} +1 -1
- package/static/{chunk-N3T57OCA.js → chunk-2VSPDSJS.js} +1 -1
- package/static/{chunk-HUWQHCUX.js → chunk-34UZ7SYI.js} +1 -1
- package/static/{chunk-MWFRZBJD.js → chunk-45UQJGGY.js} +1 -1
- package/static/{chunk-LYTD6AJE.js → chunk-5TEXH3LJ.js} +1 -1
- package/static/{chunk-4KESSWTF.js → chunk-66FMKVJX.js} +1 -1
- package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
- package/static/chunk-CK4BY2NX.js +27 -0
- package/static/{chunk-QTW62OKJ.js → chunk-CSBDAY77.js} +1 -1
- package/static/{chunk-XUZSYWRF.js → chunk-CXXPLBDZ.js} +1 -1
- package/static/{chunk-ZTXJC5IC.js → chunk-EILQG525.js} +1 -1
- package/static/{chunk-FJFNDK67.js → chunk-ENWABUR4.js} +1 -1
- package/static/{chunk-WL65GYD5.js → chunk-FR4AOLYL.js} +4 -4
- package/static/chunk-HW2H3ISM.js +559 -0
- package/static/{chunk-BW5PQAKK.js → chunk-HYMDGBZL.js} +1 -1
- package/static/{chunk-WLPYIJFI.js → chunk-IML5UYQG.js} +1 -1
- package/static/{chunk-Z5X7LVMZ.js → chunk-IPSMJHMQ.js} +1 -1
- package/static/{chunk-3S4WNZ2T.js → chunk-JVCWYSNP.js} +1 -1
- package/static/{chunk-CLSVDV7J.js → chunk-KGPCIUD2.js} +1 -1
- package/static/{chunk-O4AQBQBF.js → chunk-KQZJSEM3.js} +1 -1
- package/static/{chunk-MK7WZG3F.js → chunk-NPEMJJIU.js} +1 -1
- package/static/{chunk-4TEHM3AS.js → chunk-OEFBC4GG.js} +1 -1
- package/static/{chunk-O67RFAWU.js → chunk-P734A3XZ.js} +1 -1
- package/static/{chunk-SRLMFJ7C.js → chunk-RASR4CK6.js} +1 -1
- package/static/{chunk-S5WXHO6D.js → chunk-RFMOUC22.js} +1 -1
- package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
- package/static/{chunk-3FX6ISDY.js → chunk-SBOQGGZX.js} +1 -1
- package/static/{chunk-NV2MEIWP.js → chunk-SJAFPXQV.js} +1 -1
- package/static/{chunk-PYSFXLMV.js → chunk-XTYGMF2V.js} +1 -1
- package/static/{chunk-ZFKCGL6X.js → chunk-YCWMV2YR.js} +1 -1
- package/static/{chunk-LB7B5RIV.js → chunk-YGD22MWQ.js} +1 -1
- package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
- package/static/{chunk-SKDQM65G.js → chunk-ZVY37DKS.js} +1 -1
- package/static/index.html +2 -2
- package/static/main-N5CZRHAO.js +7 -0
- package/static/styles-FYUSO6OJ.css +1 -0
- package/static/chunk-AY2GOSJ2.js +0 -24
- package/static/chunk-RSNLYAN6.js +0 -560
- package/static/chunk-ZZ3LHYOY.js +0 -1
- package/static/main-RREKR34B.js +0 -10
- package/static/styles-3DONJ2Z4.css +0 -1
|
@@ -6,79 +6,301 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", {
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
|
-
const _axios = require("@nestjs/axios");
|
|
10
9
|
const _testing = require("@nestjs/testing");
|
|
11
|
-
const _cacheservice = require("../../infrastructure/cache/services/cache.service");
|
|
12
|
-
const _contextmanagerservice = require("../../infrastructure/context/services/context-manager.service");
|
|
13
|
-
const _constants = require("../../infrastructure/database/constants");
|
|
14
|
-
const _linksqueriesservice = require("../links/services/links-queries.service");
|
|
15
|
-
const _notificationsmanagerservice = require("../notifications/services/notifications-manager.service");
|
|
16
|
-
const _sharesmanagerservice = require("../shares/services/shares-manager.service");
|
|
17
|
-
const _sharesqueriesservice = require("../shares/services/shares-queries.service");
|
|
18
10
|
const _spaceguard = require("../spaces/guards/space.guard");
|
|
19
|
-
const
|
|
20
|
-
const _spacesqueriesservice = require("../spaces/services/spaces-queries.service");
|
|
21
|
-
const _usersqueriesservice = require("../users/services/users-queries.service");
|
|
11
|
+
const _operations = require("./constants/operations");
|
|
22
12
|
const _filescontroller = require("./files.controller");
|
|
23
|
-
const _filesindexer = require("./models/files-indexer");
|
|
24
|
-
const _fileslockmanagerservice = require("./services/files-lock-manager.service");
|
|
25
|
-
const _filesmanagerservice = require("./services/files-manager.service");
|
|
26
13
|
const _filesmethodsservice = require("./services/files-methods.service");
|
|
27
|
-
const _filesparserservice = require("./services/files-parser.service");
|
|
28
|
-
const _filesqueriesservice = require("./services/files-queries.service");
|
|
29
14
|
const _filesrecentsservice = require("./services/files-recents.service");
|
|
30
15
|
const _filessearchmanagerservice = require("./services/files-search-manager.service");
|
|
31
16
|
const _filestasksmanagerservice = require("./services/files-tasks-manager.service");
|
|
32
17
|
describe(_filescontroller.FilesController.name, ()=>{
|
|
33
18
|
let filesController;
|
|
19
|
+
// Reusable fakes
|
|
20
|
+
const fakeUser = {
|
|
21
|
+
id: 1,
|
|
22
|
+
login: 'john',
|
|
23
|
+
role: 1
|
|
24
|
+
};
|
|
25
|
+
const fakeSpace = {
|
|
26
|
+
id: 42,
|
|
27
|
+
key: 'space-key',
|
|
28
|
+
url: '/space/a',
|
|
29
|
+
realPath: '/data/space/a',
|
|
30
|
+
realBasePath: '/data/space'
|
|
31
|
+
};
|
|
32
|
+
const fakeReq = {
|
|
33
|
+
user: fakeUser,
|
|
34
|
+
space: fakeSpace,
|
|
35
|
+
headers: {},
|
|
36
|
+
method: 'GET',
|
|
37
|
+
ip: '127.0.0.1'
|
|
38
|
+
};
|
|
39
|
+
const fakeRes = {
|
|
40
|
+
header: jest.fn().mockReturnThis(),
|
|
41
|
+
status: jest.fn().mockReturnThis(),
|
|
42
|
+
send: jest.fn()
|
|
43
|
+
};
|
|
44
|
+
// Mocks
|
|
45
|
+
const filesMethodsMock = {
|
|
46
|
+
headOrGet: jest.fn(),
|
|
47
|
+
make: jest.fn(),
|
|
48
|
+
upload: jest.fn(),
|
|
49
|
+
copy: jest.fn(),
|
|
50
|
+
move: jest.fn(),
|
|
51
|
+
delete: jest.fn(),
|
|
52
|
+
genThumbnail: jest.fn(),
|
|
53
|
+
downloadFromUrl: jest.fn(),
|
|
54
|
+
compress: jest.fn(),
|
|
55
|
+
decompress: jest.fn()
|
|
56
|
+
};
|
|
57
|
+
const filesTasksManagerMock = {
|
|
58
|
+
createTask: jest.fn()
|
|
59
|
+
};
|
|
60
|
+
const filesRecentsMock = {
|
|
61
|
+
getRecents: jest.fn()
|
|
62
|
+
};
|
|
63
|
+
const filesSearchMock = {
|
|
64
|
+
search: jest.fn()
|
|
65
|
+
};
|
|
34
66
|
beforeAll(async ()=>{
|
|
35
|
-
const
|
|
36
|
-
imports: [
|
|
37
|
-
_axios.HttpModule
|
|
38
|
-
],
|
|
67
|
+
const testingModuleBuilder = _testing.Test.createTestingModule({
|
|
39
68
|
controllers: [
|
|
40
69
|
_filescontroller.FilesController
|
|
41
70
|
],
|
|
42
71
|
providers: [
|
|
43
72
|
{
|
|
44
|
-
provide:
|
|
45
|
-
useValue:
|
|
73
|
+
provide: _filesmethodsservice.FilesMethods,
|
|
74
|
+
useValue: filesMethodsMock
|
|
46
75
|
},
|
|
47
76
|
{
|
|
48
|
-
provide:
|
|
49
|
-
useValue:
|
|
77
|
+
provide: _filestasksmanagerservice.FilesTasksManager,
|
|
78
|
+
useValue: filesTasksManagerMock
|
|
50
79
|
},
|
|
51
80
|
{
|
|
52
|
-
provide:
|
|
53
|
-
useValue:
|
|
81
|
+
provide: _filesrecentsservice.FilesRecents,
|
|
82
|
+
useValue: filesRecentsMock
|
|
54
83
|
},
|
|
55
84
|
{
|
|
56
|
-
provide:
|
|
57
|
-
useValue:
|
|
58
|
-
}
|
|
59
|
-
_contextmanagerservice.ContextManager,
|
|
60
|
-
_spaceguard.SpaceGuard,
|
|
61
|
-
_spacesmanagerservice.SpacesManager,
|
|
62
|
-
_filesmethodsservice.FilesMethods,
|
|
63
|
-
_filesmanagerservice.FilesManager,
|
|
64
|
-
_filestasksmanagerservice.FilesTasksManager,
|
|
65
|
-
_fileslockmanagerservice.FilesLockManager,
|
|
66
|
-
_filesqueriesservice.FilesQueries,
|
|
67
|
-
_spacesqueriesservice.SpacesQueries,
|
|
68
|
-
_sharesmanagerservice.SharesManager,
|
|
69
|
-
_linksqueriesservice.LinksQueries,
|
|
70
|
-
_sharesqueriesservice.SharesQueries,
|
|
71
|
-
_usersqueriesservice.UsersQueries,
|
|
72
|
-
_filesrecentsservice.FilesRecents,
|
|
73
|
-
_filessearchmanagerservice.FilesSearchManager,
|
|
74
|
-
_filesparserservice.FilesParser
|
|
85
|
+
provide: _filessearchmanagerservice.FilesSearchManager,
|
|
86
|
+
useValue: filesSearchMock
|
|
87
|
+
}
|
|
75
88
|
]
|
|
76
|
-
})
|
|
89
|
+
});
|
|
90
|
+
// IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies
|
|
91
|
+
testingModuleBuilder.overrideGuard(_spaceguard.SpaceGuard).useValue({
|
|
92
|
+
canActivate: jest.fn().mockReturnValue(true)
|
|
93
|
+
});
|
|
94
|
+
const module = await testingModuleBuilder.compile();
|
|
77
95
|
filesController = module.get(_filescontroller.FilesController);
|
|
78
96
|
});
|
|
79
97
|
it('should be defined', ()=>{
|
|
80
98
|
expect(filesController).toBeDefined();
|
|
81
99
|
});
|
|
100
|
+
describe('Operations', ()=>{
|
|
101
|
+
beforeEach(()=>{
|
|
102
|
+
jest.clearAllMocks();
|
|
103
|
+
});
|
|
104
|
+
it('head() should delegate to filesMethods.headOrGet(req, res) and return its result', async ()=>{
|
|
105
|
+
const stream = {};
|
|
106
|
+
filesMethodsMock.headOrGet.mockResolvedValue(stream);
|
|
107
|
+
const result = await filesController.head(fakeReq, fakeRes);
|
|
108
|
+
expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes);
|
|
109
|
+
expect(result).toBe(stream);
|
|
110
|
+
});
|
|
111
|
+
it('download() should delegate to filesMethods.headOrGet(req, res) and return its result', async ()=>{
|
|
112
|
+
const stream = {};
|
|
113
|
+
filesMethodsMock.headOrGet.mockResolvedValue(stream);
|
|
114
|
+
const result = await filesController.download(fakeReq, fakeRes);
|
|
115
|
+
expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes);
|
|
116
|
+
expect(result).toBe(stream);
|
|
117
|
+
});
|
|
118
|
+
it('make() should call filesMethods.make(user, space, dto)', async ()=>{
|
|
119
|
+
const dto = {
|
|
120
|
+
path: '/a',
|
|
121
|
+
name: 'b',
|
|
122
|
+
type: 'directory'
|
|
123
|
+
};
|
|
124
|
+
await filesController.make(fakeUser, fakeSpace, dto);
|
|
125
|
+
expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto);
|
|
126
|
+
});
|
|
127
|
+
it('upload() should call filesMethods.upload(req, res)', async ()=>{
|
|
128
|
+
await filesController.upload(fakeReq, fakeRes);
|
|
129
|
+
expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq, fakeRes);
|
|
130
|
+
});
|
|
131
|
+
it('copy() should call filesMethods.copy(user, space, dto) and return its result', async ()=>{
|
|
132
|
+
const dto = {
|
|
133
|
+
dstDirectory: '/dst',
|
|
134
|
+
dstName: 'b'
|
|
135
|
+
};
|
|
136
|
+
const expected = {
|
|
137
|
+
path: '/dst',
|
|
138
|
+
name: 'b'
|
|
139
|
+
};
|
|
140
|
+
filesMethodsMock.copy.mockResolvedValue(expected);
|
|
141
|
+
const result = await filesController.copy(fakeUser, fakeSpace, dto);
|
|
142
|
+
expect(filesMethodsMock.copy).toHaveBeenCalledWith(fakeUser, fakeSpace, dto);
|
|
143
|
+
expect(result).toEqual(expected);
|
|
144
|
+
});
|
|
145
|
+
it('move() should call filesMethods.move(user, space, dto) and return its result', async ()=>{
|
|
146
|
+
const dto = {
|
|
147
|
+
dstDirectory: '/dst',
|
|
148
|
+
dstName: 'c'
|
|
149
|
+
};
|
|
150
|
+
const expected = {
|
|
151
|
+
path: '/dst',
|
|
152
|
+
name: 'c'
|
|
153
|
+
};
|
|
154
|
+
filesMethodsMock.move.mockResolvedValue(expected);
|
|
155
|
+
const result = await filesController.move(fakeUser, fakeSpace, dto);
|
|
156
|
+
expect(filesMethodsMock.move).toHaveBeenCalledWith(fakeUser, fakeSpace, dto);
|
|
157
|
+
expect(result).toEqual(expected);
|
|
158
|
+
});
|
|
159
|
+
it('delete() should call filesMethods.delete(user, space)', async ()=>{
|
|
160
|
+
await filesController.delete(fakeUser, fakeSpace);
|
|
161
|
+
expect(filesMethodsMock.delete).toHaveBeenCalledWith(fakeUser, fakeSpace);
|
|
162
|
+
});
|
|
163
|
+
it('genThumbnail() should default size to 256 when not provided', async ()=>{
|
|
164
|
+
const stream = {};
|
|
165
|
+
filesMethodsMock.genThumbnail.mockResolvedValue(stream);
|
|
166
|
+
// pass undefined to exercise controller default parameter
|
|
167
|
+
const result = await filesController.genThumbnail(fakeSpace, undefined);
|
|
168
|
+
expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256);
|
|
169
|
+
expect(result).toBe(stream);
|
|
170
|
+
});
|
|
171
|
+
it('genThumbnail() should pass provided size', async ()=>{
|
|
172
|
+
const stream = {};
|
|
173
|
+
filesMethodsMock.genThumbnail.mockResolvedValue(stream);
|
|
174
|
+
const result = await filesController.genThumbnail(fakeSpace, 512);
|
|
175
|
+
expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512);
|
|
176
|
+
expect(result).toBe(stream);
|
|
177
|
+
});
|
|
178
|
+
});
|
|
179
|
+
describe('Tasks operations', ()=>{
|
|
180
|
+
beforeEach(()=>{
|
|
181
|
+
jest.clearAllMocks();
|
|
182
|
+
});
|
|
183
|
+
it('downloadFromUrlAsTask() should create DOWNLOAD task using method name "downloadFromUrl"', async ()=>{
|
|
184
|
+
const dto = {
|
|
185
|
+
url: 'http://x',
|
|
186
|
+
to: '/a'
|
|
187
|
+
};
|
|
188
|
+
const task = {
|
|
189
|
+
id: 1
|
|
190
|
+
};
|
|
191
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
192
|
+
const result = await filesController.downloadFromUrlAsTask(fakeUser, fakeSpace, dto);
|
|
193
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.DOWNLOAD, fakeUser, fakeSpace, dto, filesMethodsMock.downloadFromUrl.name);
|
|
194
|
+
expect(result).toBe(task);
|
|
195
|
+
});
|
|
196
|
+
it('compressAsTask() should call SpaceGuard.checkPermissions when compressInDirectory is true', async ()=>{
|
|
197
|
+
const dto = {
|
|
198
|
+
compressInDirectory: true
|
|
199
|
+
};
|
|
200
|
+
const spy = jest.spyOn(_spaceguard.SpaceGuard, 'checkPermissions').mockImplementation(()=>undefined);
|
|
201
|
+
filesTasksManagerMock.createTask.mockResolvedValue({});
|
|
202
|
+
await filesController.compressAsTask(fakeReq, dto);
|
|
203
|
+
expect(spy).toHaveBeenCalled();
|
|
204
|
+
spy.mockRestore();
|
|
205
|
+
});
|
|
206
|
+
it('compressAsTask() should create COMPRESS task with req.user and req.space and method name "compress"', async ()=>{
|
|
207
|
+
const dto = {
|
|
208
|
+
compressInDirectory: false
|
|
209
|
+
};
|
|
210
|
+
const task = {
|
|
211
|
+
id: 2
|
|
212
|
+
};
|
|
213
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
214
|
+
const result = await filesController.compressAsTask(fakeReq, dto);
|
|
215
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.COMPRESS, fakeReq.user, fakeReq.space, dto, filesMethodsMock.compress.name);
|
|
216
|
+
expect(result).toBe(task);
|
|
217
|
+
});
|
|
218
|
+
it('decompressAsTask() should create DECOMPRESS task with null dto and method name "decompress"', async ()=>{
|
|
219
|
+
const task = {
|
|
220
|
+
id: 3
|
|
221
|
+
};
|
|
222
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
223
|
+
const result = await filesController.decompressAsTask(fakeUser, fakeSpace);
|
|
224
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.DECOMPRESS, fakeUser, fakeSpace, null, filesMethodsMock.decompress.name);
|
|
225
|
+
expect(result).toBe(task);
|
|
226
|
+
});
|
|
227
|
+
it('copyAsTask() should create COPY task with method name "copy"', async ()=>{
|
|
228
|
+
const dto = {
|
|
229
|
+
from: '/a',
|
|
230
|
+
to: '/b'
|
|
231
|
+
};
|
|
232
|
+
const task = {
|
|
233
|
+
id: 4
|
|
234
|
+
};
|
|
235
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
236
|
+
const result = await filesController.copyAsTask(fakeUser, fakeSpace, dto);
|
|
237
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.COPY, fakeUser, fakeSpace, dto, filesMethodsMock.copy.name);
|
|
238
|
+
expect(result).toBe(task);
|
|
239
|
+
});
|
|
240
|
+
it('moveAsTask() should create MOVE task with method name "move"', async ()=>{
|
|
241
|
+
const dto = {
|
|
242
|
+
from: '/a',
|
|
243
|
+
to: '/c'
|
|
244
|
+
};
|
|
245
|
+
const task = {
|
|
246
|
+
id: 5
|
|
247
|
+
};
|
|
248
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
249
|
+
const result = await filesController.moveAsTask(fakeUser, fakeSpace, dto);
|
|
250
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.MOVE, fakeUser, fakeSpace, dto, filesMethodsMock.move.name);
|
|
251
|
+
expect(result).toBe(task);
|
|
252
|
+
});
|
|
253
|
+
it('deleteAsTask() should create DELETE task with null dto and method name "delete"', async ()=>{
|
|
254
|
+
const task = {
|
|
255
|
+
id: 6
|
|
256
|
+
};
|
|
257
|
+
filesTasksManagerMock.createTask.mockResolvedValue(task);
|
|
258
|
+
const result = await filesController.deleteAsTask(fakeUser, fakeSpace);
|
|
259
|
+
expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(_operations.FILE_OPERATION.DELETE, fakeUser, fakeSpace, null, filesMethodsMock.delete.name);
|
|
260
|
+
expect(result).toBe(task);
|
|
261
|
+
});
|
|
262
|
+
});
|
|
263
|
+
describe('Recents & Search', ()=>{
|
|
264
|
+
beforeEach(()=>{
|
|
265
|
+
jest.clearAllMocks();
|
|
266
|
+
});
|
|
267
|
+
it('getRecents() should use limit=10 by default', async ()=>{
|
|
268
|
+
const recents = [
|
|
269
|
+
{
|
|
270
|
+
path: '/a'
|
|
271
|
+
}
|
|
272
|
+
];
|
|
273
|
+
filesRecentsMock.getRecents.mockResolvedValue(recents);
|
|
274
|
+
const result = await filesController.getRecents(fakeUser, undefined);
|
|
275
|
+
expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 10);
|
|
276
|
+
expect(result).toBe(recents);
|
|
277
|
+
});
|
|
278
|
+
it('getRecents() should forward provided limit', async ()=>{
|
|
279
|
+
const recents = [
|
|
280
|
+
{
|
|
281
|
+
path: '/b'
|
|
282
|
+
}
|
|
283
|
+
];
|
|
284
|
+
filesRecentsMock.getRecents.mockResolvedValue(recents);
|
|
285
|
+
const result = await filesController.getRecents(fakeUser, 5);
|
|
286
|
+
expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 5);
|
|
287
|
+
expect(result).toBe(recents);
|
|
288
|
+
});
|
|
289
|
+
it('search() should delegate to filesSearch.search(user, dto)', async ()=>{
|
|
290
|
+
const dto = {
|
|
291
|
+
query: 'test'
|
|
292
|
+
};
|
|
293
|
+
const items = [
|
|
294
|
+
{
|
|
295
|
+
name: 'file'
|
|
296
|
+
}
|
|
297
|
+
];
|
|
298
|
+
filesSearchMock.search.mockResolvedValue(items);
|
|
299
|
+
const result = await filesController.search(fakeUser, dto);
|
|
300
|
+
expect(filesSearchMock.search).toHaveBeenCalledWith(fakeUser, dto);
|
|
301
|
+
expect(result).toBe(items);
|
|
302
|
+
});
|
|
303
|
+
});
|
|
82
304
|
});
|
|
83
305
|
|
|
84
306
|
//# sourceMappingURL=files.controller.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpModule } from '@nestjs/axios'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../infrastructure/cache/services/cache.service'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { DB_TOKEN_PROVIDER } from '../../infrastructure/database/constants'\nimport { LinksQueries } from '../links/services/links-queries.service'\nimport { NotificationsManager } from '../notifications/services/notifications-manager.service'\nimport { SharesManager } from '../shares/services/shares-manager.service'\nimport { SharesQueries } from '../shares/services/shares-queries.service'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { SpacesQueries } from '../spaces/services/spaces-queries.service'\nimport { UsersQueries } from '../users/services/users-queries.service'\nimport { FilesController } from './files.controller'\nimport { FilesIndexer } from './models/files-indexer'\nimport { FilesLockManager } from './services/files-lock-manager.service'\nimport { FilesManager } from './services/files-manager.service'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesParser } from './services/files-parser.service'\nimport { FilesQueries } from './services/files-queries.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\ndescribe(FilesController.name, () => {\n let filesController: FilesController\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n imports: [HttpModule],\n controllers: [FilesController],\n providers: [\n { provide: DB_TOKEN_PROVIDER, useValue: {} },\n {\n provide: Cache,\n useValue: {}\n },\n {\n provide: NotificationsManager,\n useValue: {}\n },\n {\n provide: FilesIndexer,\n useValue: {}\n },\n ContextManager,\n SpaceGuard,\n SpacesManager,\n FilesMethods,\n FilesManager,\n FilesTasksManager,\n FilesLockManager,\n FilesQueries,\n SpacesQueries,\n SharesManager,\n LinksQueries,\n SharesQueries,\n UsersQueries,\n FilesRecents,\n FilesSearchManager,\n FilesParser\n ]\n }).compile()\n\n filesController = module.get<FilesController>(FilesController)\n })\n\n it('should be defined', () => {\n expect(filesController).toBeDefined()\n })\n})\n"],"names":["describe","FilesController","name","filesController","beforeAll","module","Test","createTestingModule","imports","HttpModule","controllers","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","NotificationsManager","FilesIndexer","ContextManager","SpaceGuard","SpacesManager","FilesMethods","FilesManager","FilesTasksManager","FilesLockManager","FilesQueries","SpacesQueries","SharesManager","LinksQueries","SharesQueries","UsersQueries","FilesRecents","FilesSearchManager","FilesParser","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;uBAE0B;yBACS;8BACd;uCACS;2BACG;qCACL;6CACQ;sCACP;sCACA;4BACH;sCACG;sCACA;qCACD;iCACG;8BACH;yCACI;qCACJ;qCACA;oCACD;qCACC;qCACA;2CACM;0CACD;AAElCA,SAASC,gCAAe,CAACC,IAAI,EAAE;IAC7B,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,SAAS;gBAACC,iBAAU;aAAC;YACrBC,aAAa;gBAACT,gCAAe;aAAC;YAC9BU,WAAW;gBACT;oBAAEC,SAASC,4BAAiB;oBAAEC,UAAU,CAAC;gBAAE;gBAC3C;oBACEF,SAASG,mBAAK;oBACdD,UAAU,CAAC;gBACb;gBACA;oBACEF,SAASI,iDAAoB;oBAC7BF,UAAU,CAAC;gBACb;gBACA;oBACEF,SAASK,0BAAY;oBACrBH,UAAU,CAAC;gBACb;gBACAI,qCAAc;gBACdC,sBAAU;gBACVC,mCAAa;gBACbC,iCAAY;gBACZC,iCAAY;gBACZC,2CAAiB;gBACjBC,yCAAgB;gBAChBC,iCAAY;gBACZC,mCAAa;gBACbC,mCAAa;gBACbC,iCAAY;gBACZC,mCAAa;gBACbC,iCAAY;gBACZC,iCAAY;gBACZC,6CAAkB;gBAClBC,+BAAW;aACZ;QACH,GAAGC,OAAO;QAEV/B,kBAAkBE,OAAO8B,GAAG,CAAkBlC,gCAAe;IAC/D;IAEAmC,GAAG,qBAAqB;QACtBC,OAAOlC,iBAAiBmC,WAAW;IACrC;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files.controller.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { SpaceGuard } from '../spaces/guards/space.guard'\nimport { FILE_OPERATION } from './constants/operations'\nimport { FilesController } from './files.controller'\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\ndescribe(FilesController.name, () => {\n let filesController: FilesController\n\n // Reusable fakes\n const fakeUser: any = { id: 1, login: 'john', role: 1 }\n const fakeSpace: any = { id: 42, key: 'space-key', url: '/space/a', realPath: '/data/space/a', realBasePath: '/data/space' }\n const fakeReq: any = { user: fakeUser, space: fakeSpace, headers: {}, method: 'GET', ip: '127.0.0.1' }\n const fakeRes: any = { header: jest.fn().mockReturnThis(), status: jest.fn().mockReturnThis(), send: jest.fn() }\n\n // Mocks\n const filesMethodsMock = {\n headOrGet: jest.fn(),\n make: jest.fn(),\n upload: jest.fn(),\n copy: jest.fn(),\n move: jest.fn(),\n delete: jest.fn(),\n genThumbnail: jest.fn(),\n downloadFromUrl: jest.fn(),\n compress: jest.fn(),\n decompress: jest.fn()\n }\n\n const filesTasksManagerMock = {\n createTask: jest.fn()\n }\n\n const filesRecentsMock = {\n getRecents: jest.fn()\n }\n\n const filesSearchMock = {\n search: jest.fn()\n }\n\n beforeAll(async () => {\n const testingModuleBuilder = Test.createTestingModule({\n controllers: [FilesController],\n providers: [\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: FilesTasksManager, useValue: filesTasksManagerMock },\n { provide: FilesRecents, useValue: filesRecentsMock },\n { provide: FilesSearchManager, useValue: filesSearchMock }\n ]\n })\n // IMPORTANT: override the guard referenced by @UseGuards to avoid resolving its dependencies\n testingModuleBuilder.overrideGuard(SpaceGuard).useValue({ canActivate: jest.fn().mockReturnValue(true) })\n\n const module: TestingModule = await testingModuleBuilder.compile()\n\n filesController = module.get<FilesController>(FilesController)\n })\n\n it('should be defined', () => {\n expect(filesController).toBeDefined()\n })\n\n describe('Operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('head() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.head(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('download() should delegate to filesMethods.headOrGet(req, res) and return its result', async () => {\n const stream = {} as any\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await filesController.download(fakeReq, fakeRes)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(fakeReq, fakeRes)\n expect(result).toBe(stream)\n })\n\n it('make() should call filesMethods.make(user, space, dto)', async () => {\n const dto = { path: '/a', name: 'b', type: 'directory' } as any\n\n await filesController.make(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.make).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n })\n\n it('upload() should call filesMethods.upload(req, res)', async () => {\n await filesController.upload(fakeReq, fakeRes)\n\n expect(filesMethodsMock.upload).toHaveBeenCalledWith(fakeReq, fakeRes)\n })\n\n it('copy() should call filesMethods.copy(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'b' } as any\n const expected = { path: '/dst', name: 'b' }\n filesMethodsMock.copy.mockResolvedValue(expected)\n\n const result = await filesController.copy(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.copy).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('move() should call filesMethods.move(user, space, dto) and return its result', async () => {\n const dto = { dstDirectory: '/dst', dstName: 'c' } as any\n const expected = { path: '/dst', name: 'c' }\n filesMethodsMock.move.mockResolvedValue(expected)\n\n const result = await filesController.move(fakeUser, fakeSpace, dto)\n\n expect(filesMethodsMock.move).toHaveBeenCalledWith(fakeUser, fakeSpace, dto)\n expect(result).toEqual(expected)\n })\n\n it('delete() should call filesMethods.delete(user, space)', async () => {\n await filesController.delete(fakeUser, fakeSpace)\n\n expect(filesMethodsMock.delete).toHaveBeenCalledWith(fakeUser, fakeSpace)\n })\n\n it('genThumbnail() should default size to 256 when not provided', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n // pass undefined to exercise controller default parameter\n const result = await filesController.genThumbnail(fakeSpace, undefined as unknown as number)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 256)\n expect(result).toBe(stream)\n })\n\n it('genThumbnail() should pass provided size', async () => {\n const stream = {} as any\n filesMethodsMock.genThumbnail.mockResolvedValue(stream)\n\n const result = await filesController.genThumbnail(fakeSpace, 512)\n\n expect(filesMethodsMock.genThumbnail).toHaveBeenCalledWith(fakeSpace, 512)\n expect(result).toBe(stream)\n })\n })\n\n describe('Tasks operations', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('downloadFromUrlAsTask() should create DOWNLOAD task using method name \"downloadFromUrl\"', async () => {\n const dto = { url: 'http://x', to: '/a' } as any\n const task = { id: 1 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.downloadFromUrlAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DOWNLOAD,\n fakeUser,\n fakeSpace,\n dto,\n filesMethodsMock.downloadFromUrl.name\n )\n expect(result).toBe(task)\n })\n\n it('compressAsTask() should call SpaceGuard.checkPermissions when compressInDirectory is true', async () => {\n const dto = { compressInDirectory: true } as any\n const spy = jest.spyOn(SpaceGuard as any, 'checkPermissions').mockImplementation(() => undefined)\n\n filesTasksManagerMock.createTask.mockResolvedValue({} as any)\n await filesController.compressAsTask(fakeReq, dto)\n\n expect(spy).toHaveBeenCalled()\n spy.mockRestore()\n })\n\n it('compressAsTask() should create COMPRESS task with req.user and req.space and method name \"compress\"', async () => {\n const dto = { compressInDirectory: false } as any\n const task = { id: 2 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.compressAsTask(fakeReq, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.COMPRESS,\n fakeReq.user,\n fakeReq.space,\n dto,\n filesMethodsMock.compress.name\n )\n expect(result).toBe(task)\n })\n\n it('decompressAsTask() should create DECOMPRESS task with null dto and method name \"decompress\"', async () => {\n const task = { id: 3 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.decompressAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(\n FILE_OPERATION.DECOMPRESS,\n fakeUser,\n fakeSpace,\n null,\n filesMethodsMock.decompress.name\n )\n expect(result).toBe(task)\n })\n\n it('copyAsTask() should create COPY task with method name \"copy\"', async () => {\n const dto = { from: '/a', to: '/b' } as any\n const task = { id: 4 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.copyAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.COPY, fakeUser, fakeSpace, dto, filesMethodsMock.copy.name)\n expect(result).toBe(task)\n })\n\n it('moveAsTask() should create MOVE task with method name \"move\"', async () => {\n const dto = { from: '/a', to: '/c' } as any\n const task = { id: 5 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.moveAsTask(fakeUser, fakeSpace, dto)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.MOVE, fakeUser, fakeSpace, dto, filesMethodsMock.move.name)\n expect(result).toBe(task)\n })\n\n it('deleteAsTask() should create DELETE task with null dto and method name \"delete\"', async () => {\n const task = { id: 6 } as any\n filesTasksManagerMock.createTask.mockResolvedValue(task)\n\n const result = await filesController.deleteAsTask(fakeUser, fakeSpace)\n\n expect(filesTasksManagerMock.createTask).toHaveBeenCalledWith(FILE_OPERATION.DELETE, fakeUser, fakeSpace, null, filesMethodsMock.delete.name)\n expect(result).toBe(task)\n })\n })\n\n describe('Recents & Search', () => {\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('getRecents() should use limit=10 by default', async () => {\n const recents = [{ path: '/a' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, undefined as unknown as number)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 10)\n expect(result).toBe(recents)\n })\n\n it('getRecents() should forward provided limit', async () => {\n const recents = [{ path: '/b' }] as any\n filesRecentsMock.getRecents.mockResolvedValue(recents)\n\n const result = await filesController.getRecents(fakeUser, 5)\n\n expect(filesRecentsMock.getRecents).toHaveBeenCalledWith(fakeUser, 5)\n expect(result).toBe(recents)\n })\n\n it('search() should delegate to filesSearch.search(user, dto)', async () => {\n const dto = { query: 'test' } as any\n const items = [{ name: 'file' }] as any\n filesSearchMock.search.mockResolvedValue(items)\n\n const result = await filesController.search(fakeUser, dto)\n\n expect(filesSearchMock.search).toHaveBeenCalledWith(fakeUser, dto)\n expect(result).toBe(items)\n })\n })\n})\n"],"names":["describe","FilesController","name","filesController","fakeUser","id","login","role","fakeSpace","key","url","realPath","realBasePath","fakeReq","user","space","headers","method","ip","fakeRes","header","jest","fn","mockReturnThis","status","send","filesMethodsMock","headOrGet","make","upload","copy","move","delete","genThumbnail","downloadFromUrl","compress","decompress","filesTasksManagerMock","createTask","filesRecentsMock","getRecents","filesSearchMock","search","beforeAll","testingModuleBuilder","Test","createTestingModule","controllers","providers","provide","FilesMethods","useValue","FilesTasksManager","FilesRecents","FilesSearchManager","overrideGuard","SpaceGuard","canActivate","mockReturnValue","module","compile","get","it","expect","toBeDefined","beforeEach","clearAllMocks","stream","mockResolvedValue","result","head","toHaveBeenCalledWith","toBe","download","dto","path","type","dstDirectory","dstName","expected","toEqual","undefined","to","task","downloadFromUrlAsTask","FILE_OPERATION","DOWNLOAD","compressInDirectory","spy","spyOn","mockImplementation","compressAsTask","toHaveBeenCalled","mockRestore","COMPRESS","decompressAsTask","DECOMPRESS","from","copyAsTask","COPY","moveAsTask","MOVE","deleteAsTask","DELETE","recents","query","items"],"mappings":"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"}
|
|
@@ -6,10 +6,86 @@
|
|
|
6
6
|
Object.defineProperty(exports, "__esModule", {
|
|
7
7
|
value: true
|
|
8
8
|
});
|
|
9
|
+
const _tsjest = require("@golevelup/ts-jest");
|
|
10
|
+
const _jwt = require("@nestjs/jwt");
|
|
11
|
+
const _testing = require("@nestjs/testing");
|
|
12
|
+
const _nestjspino = require("nestjs-pino");
|
|
13
|
+
const _configenvironment = require("../../../configuration/config.environment");
|
|
14
|
+
const _onlyoffice = require("../constants/only-office");
|
|
15
|
+
const _routes = require("../constants/routes");
|
|
9
16
|
const _filesonlyofficeguard = require("./files-only-office.guard");
|
|
17
|
+
const _filesonlyofficestrategy = require("./files-only-office.strategy");
|
|
10
18
|
describe(_filesonlyofficeguard.FilesOnlyOfficeGuard.name, ()=>{
|
|
19
|
+
let jwtService;
|
|
20
|
+
let filesOnlyOfficeGuard;
|
|
21
|
+
let context;
|
|
22
|
+
let accessToken;
|
|
23
|
+
beforeAll(async ()=>{
|
|
24
|
+
const module = await _testing.Test.createTestingModule({
|
|
25
|
+
imports: [
|
|
26
|
+
_jwt.JwtModule.register({
|
|
27
|
+
global: true
|
|
28
|
+
})
|
|
29
|
+
],
|
|
30
|
+
providers: [
|
|
31
|
+
_filesonlyofficeguard.FilesOnlyOfficeGuard,
|
|
32
|
+
_filesonlyofficestrategy.FilesOnlyOfficeStrategy,
|
|
33
|
+
{
|
|
34
|
+
provide: _nestjspino.PinoLogger,
|
|
35
|
+
useValue: {
|
|
36
|
+
assign: ()=>undefined
|
|
37
|
+
}
|
|
38
|
+
}
|
|
39
|
+
]
|
|
40
|
+
}).compile();
|
|
41
|
+
jwtService = module.get(_jwt.JwtService);
|
|
42
|
+
filesOnlyOfficeGuard = module.get(_filesonlyofficeguard.FilesOnlyOfficeGuard);
|
|
43
|
+
context = (0, _tsjest.createMock)();
|
|
44
|
+
accessToken = await jwtService.signAsync({
|
|
45
|
+
identity: {
|
|
46
|
+
id: 1,
|
|
47
|
+
login: 'foo'
|
|
48
|
+
}
|
|
49
|
+
}, {
|
|
50
|
+
secret: _configenvironment.configuration.auth.token.access.secret,
|
|
51
|
+
expiresIn: 30
|
|
52
|
+
});
|
|
53
|
+
});
|
|
11
54
|
it('should be defined', ()=>{
|
|
12
|
-
expect(
|
|
55
|
+
expect(jwtService).toBeDefined();
|
|
56
|
+
expect(filesOnlyOfficeGuard).toBeDefined();
|
|
57
|
+
expect(accessToken).toBeDefined();
|
|
58
|
+
});
|
|
59
|
+
it('should not pass if enabled (or not) without a valid token', async ()=>{
|
|
60
|
+
_configenvironment.configuration.applications.files.onlyoffice.enabled = false;
|
|
61
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
62
|
+
url: `${_routes.API_FILES_ONLY_OFFICE_CALLBACK}`,
|
|
63
|
+
raw: {
|
|
64
|
+
user: ''
|
|
65
|
+
}
|
|
66
|
+
});
|
|
67
|
+
expect(()=>filesOnlyOfficeGuard.canActivate(context)).toThrow(/feature not enabled/i);
|
|
68
|
+
_configenvironment.configuration.applications.files.onlyoffice.enabled = true;
|
|
69
|
+
await expect(filesOnlyOfficeGuard.canActivate(context)).rejects.toThrow('Unauthorized');
|
|
70
|
+
});
|
|
71
|
+
it('should pass if enabled (or not) with a valid token', async ()=>{
|
|
72
|
+
_configenvironment.configuration.applications.files.onlyoffice.enabled = false;
|
|
73
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
74
|
+
url: `${_routes.API_FILES_ONLY_OFFICE_CALLBACK}?${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${accessToken}`,
|
|
75
|
+
raw: {
|
|
76
|
+
user: ''
|
|
77
|
+
}
|
|
78
|
+
});
|
|
79
|
+
expect(()=>filesOnlyOfficeGuard.canActivate(context)).toThrow(/feature not enabled/i);
|
|
80
|
+
_configenvironment.configuration.applications.files.onlyoffice.enabled = true;
|
|
81
|
+
expect(await filesOnlyOfficeGuard.canActivate(context)).toBe(true);
|
|
82
|
+
context.switchToHttp().getRequest.mockReturnValue({
|
|
83
|
+
url: `${_routes.API_FILES_ONLY_OFFICE_CALLBACK}?${_onlyoffice.ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=unvalidToken`,
|
|
84
|
+
raw: {
|
|
85
|
+
user: ''
|
|
86
|
+
}
|
|
87
|
+
});
|
|
88
|
+
await expect(filesOnlyOfficeGuard.canActivate(context)).rejects.toThrow('Unauthorized');
|
|
13
89
|
});
|
|
14
90
|
});
|
|
15
91
|
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { FilesOnlyOfficeGuard } from './files-only-office.guard'\n\ndescribe(FilesOnlyOfficeGuard.name, () => {\n it('should be defined', () => {\n expect(
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.guard.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { createMock, DeepMocked } from '@golevelup/ts-jest'\nimport { ExecutionContext } from '@nestjs/common'\nimport { JwtModule, JwtService } from '@nestjs/jwt'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { PinoLogger } from 'nestjs-pino'\nimport { JwtPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { configuration } from '../../../configuration/config.environment'\nimport { ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME } from '../constants/only-office'\nimport { API_FILES_ONLY_OFFICE_CALLBACK } from '../constants/routes'\nimport { FilesOnlyOfficeGuard } from './files-only-office.guard'\nimport { FilesOnlyOfficeStrategy } from './files-only-office.strategy'\n\ndescribe(FilesOnlyOfficeGuard.name, () => {\n let jwtService: JwtService\n let filesOnlyOfficeGuard: FilesOnlyOfficeGuard\n let context: DeepMocked<ExecutionContext>\n let accessToken: string\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n imports: [JwtModule.register({ global: true })],\n providers: [\n FilesOnlyOfficeGuard,\n FilesOnlyOfficeStrategy,\n {\n provide: PinoLogger,\n useValue: {\n assign: () => undefined\n }\n }\n ]\n }).compile()\n\n jwtService = module.get<JwtService>(JwtService)\n filesOnlyOfficeGuard = module.get<FilesOnlyOfficeGuard>(FilesOnlyOfficeGuard)\n context = createMock<ExecutionContext>()\n accessToken = await jwtService.signAsync({ identity: { id: 1, login: 'foo' } } as JwtPayload, {\n secret: configuration.auth.token.access.secret,\n expiresIn: 30\n })\n })\n\n it('should be defined', () => {\n expect(jwtService).toBeDefined()\n expect(filesOnlyOfficeGuard).toBeDefined()\n expect(accessToken).toBeDefined()\n })\n\n it('should not pass if enabled (or not) without a valid token', async () => {\n configuration.applications.files.onlyoffice.enabled = false\n context.switchToHttp().getRequest.mockReturnValue({\n url: `${API_FILES_ONLY_OFFICE_CALLBACK}`,\n raw: { user: '' }\n })\n expect(() => filesOnlyOfficeGuard.canActivate(context)).toThrow(/feature not enabled/i)\n configuration.applications.files.onlyoffice.enabled = true\n await expect(filesOnlyOfficeGuard.canActivate(context)).rejects.toThrow('Unauthorized')\n })\n\n it('should pass if enabled (or not) with a valid token', async () => {\n configuration.applications.files.onlyoffice.enabled = false\n context.switchToHttp().getRequest.mockReturnValue({\n url: `${API_FILES_ONLY_OFFICE_CALLBACK}?${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=${accessToken}`,\n raw: { user: '' }\n })\n expect(() => filesOnlyOfficeGuard.canActivate(context)).toThrow(/feature not enabled/i)\n configuration.applications.files.onlyoffice.enabled = true\n expect(await filesOnlyOfficeGuard.canActivate(context)).toBe(true)\n context.switchToHttp().getRequest.mockReturnValue({\n url: `${API_FILES_ONLY_OFFICE_CALLBACK}?${ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME}=unvalidToken`,\n raw: { user: '' }\n })\n await expect(filesOnlyOfficeGuard.canActivate(context)).rejects.toThrow('Unauthorized')\n })\n})\n"],"names":["describe","FilesOnlyOfficeGuard","name","jwtService","filesOnlyOfficeGuard","context","accessToken","beforeAll","module","Test","createTestingModule","imports","JwtModule","register","global","providers","FilesOnlyOfficeStrategy","provide","PinoLogger","useValue","assign","undefined","compile","get","JwtService","createMock","signAsync","identity","id","login","secret","configuration","auth","token","access","expiresIn","it","expect","toBeDefined","applications","files","onlyoffice","enabled","switchToHttp","getRequest","mockReturnValue","url","API_FILES_ONLY_OFFICE_CALLBACK","raw","user","canActivate","toThrow","rejects","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","toBe"],"mappings":"AAAA;;;;CAIC;;;;wBAEsC;qBAED;yBACF;4BACT;mCAEG;4BACqB;wBACJ;sCACV;yCACG;AAExCA,SAASC,0CAAoB,CAACC,IAAI,EAAE;IAClC,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IACJ,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,SAAS;gBAACC,cAAS,CAACC,QAAQ,CAAC;oBAAEC,QAAQ;gBAAK;aAAG;YAC/CC,WAAW;gBACTd,0CAAoB;gBACpBe,gDAAuB;gBACvB;oBACEC,SAASC,sBAAU;oBACnBC,UAAU;wBACRC,QAAQ,IAAMC;oBAChB;gBACF;aACD;QACH,GAAGC,OAAO;QAEVnB,aAAaK,OAAOe,GAAG,CAAaC,eAAU;QAC9CpB,uBAAuBI,OAAOe,GAAG,CAAuBtB,0CAAoB;QAC5EI,UAAUoB,IAAAA,kBAAU;QACpBnB,cAAc,MAAMH,WAAWuB,SAAS,CAAC;YAAEC,UAAU;gBAAEC,IAAI;gBAAGC,OAAO;YAAM;QAAE,GAAiB;YAC5FC,QAAQC,gCAAa,CAACC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACJ,MAAM;YAC9CK,WAAW;QACb;IACF;IAEAC,GAAG,qBAAqB;QACtBC,OAAOlC,YAAYmC,WAAW;QAC9BD,OAAOjC,sBAAsBkC,WAAW;QACxCD,OAAO/B,aAAagC,WAAW;IACjC;IAEAF,GAAG,6DAA6D;QAC9DL,gCAAa,CAACQ,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;QACtDrC,QAAQsC,YAAY,GAAGC,UAAU,CAACC,eAAe,CAAC;YAChDC,KAAK,GAAGC,sCAA8B,EAAE;YACxCC,KAAK;gBAAEC,MAAM;YAAG;QAClB;QACAZ,OAAO,IAAMjC,qBAAqB8C,WAAW,CAAC7C,UAAU8C,OAAO,CAAC;QAChEpB,gCAAa,CAACQ,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;QACtD,MAAML,OAAOjC,qBAAqB8C,WAAW,CAAC7C,UAAU+C,OAAO,CAACD,OAAO,CAAC;IAC1E;IAEAf,GAAG,sDAAsD;QACvDL,gCAAa,CAACQ,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;QACtDrC,QAAQsC,YAAY,GAAGC,UAAU,CAACC,eAAe,CAAC;YAChDC,KAAK,GAAGC,sCAA8B,CAAC,CAAC,EAAEM,8CAAkC,CAAC,CAAC,EAAE/C,aAAa;YAC7F0C,KAAK;gBAAEC,MAAM;YAAG;QAClB;QACAZ,OAAO,IAAMjC,qBAAqB8C,WAAW,CAAC7C,UAAU8C,OAAO,CAAC;QAChEpB,gCAAa,CAACQ,YAAY,CAACC,KAAK,CAACC,UAAU,CAACC,OAAO,GAAG;QACtDL,OAAO,MAAMjC,qBAAqB8C,WAAW,CAAC7C,UAAUiD,IAAI,CAAC;QAC7DjD,QAAQsC,YAAY,GAAGC,UAAU,CAACC,eAAe,CAAC;YAChDC,KAAK,GAAGC,sCAA8B,CAAC,CAAC,EAAEM,8CAAkC,CAAC,aAAa,CAAC;YAC3FL,KAAK;gBAAEC,MAAM;YAAG;QAClB;QACA,MAAMZ,OAAOjC,qBAAqB8C,WAAW,CAAC7C,UAAU+C,OAAO,CAACD,OAAO,CAAC;IAC1E;AACF"}
|
|
@@ -30,7 +30,6 @@ function _ts_metadata(k, v) {
|
|
|
30
30
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
31
31
|
}
|
|
32
32
|
let FilesOnlyOfficeStrategy = class FilesOnlyOfficeStrategy extends (0, _passport.PassportStrategy)(_passportjwt.Strategy, 'filesOnlyOfficeToken') {
|
|
33
|
-
// not declared properly: https://github.com/nestjs/passport/issues/929
|
|
34
33
|
validate(jwtPayload) {
|
|
35
34
|
this.logger.assign({
|
|
36
35
|
user: jwtPayload.identity.login
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.strategy.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 } from '@nestjs/common'\nimport { PassportStrategy } from '@nestjs/passport'\nimport { PinoLogger } from 'nestjs-pino'\nimport { ExtractJwt, Strategy } from 'passport-jwt'\nimport { AuthTokenAccessStrategy } from '../../../authentication/guards/auth-token-access.strategy'\nimport { JwtPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { configuration } from '../../../configuration/config.environment'\nimport { UserModel } from '../../users/models/user.model'\nimport { ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME } from '../constants/only-office'\n\n@Injectable()\nexport class FilesOnlyOfficeStrategy extends PassportStrategy(Strategy, 'filesOnlyOfficeToken') {\n constructor(private readonly logger: PinoLogger) {\n super({\n jwtFromRequest: ExtractJwt.fromExtractors([\n AuthTokenAccessStrategy.extractJWTFromCookie,\n ExtractJwt.fromUrlQueryParameter(ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME)\n ]),\n secretOrKey: configuration.auth.token.access.secret,\n ignoreExpiration: false,\n passReqToCallback: false\n })\n }\n\n
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/guards/files-only-office.strategy.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 } from '@nestjs/common'\nimport { AbstractStrategy, PassportStrategy } from '@nestjs/passport'\nimport { PinoLogger } from 'nestjs-pino'\nimport { ExtractJwt, Strategy } from 'passport-jwt'\nimport { AuthTokenAccessStrategy } from '../../../authentication/guards/auth-token-access.strategy'\nimport { JwtPayload } from '../../../authentication/interfaces/jwt-payload.interface'\nimport { configuration } from '../../../configuration/config.environment'\nimport { UserModel } from '../../users/models/user.model'\nimport { ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME } from '../constants/only-office'\n\n@Injectable()\nexport class FilesOnlyOfficeStrategy extends PassportStrategy(Strategy, 'filesOnlyOfficeToken') implements AbstractStrategy {\n constructor(private readonly logger: PinoLogger) {\n super({\n jwtFromRequest: ExtractJwt.fromExtractors([\n AuthTokenAccessStrategy.extractJWTFromCookie,\n ExtractJwt.fromUrlQueryParameter(ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME)\n ]),\n secretOrKey: configuration.auth.token.access.secret,\n ignoreExpiration: false,\n passReqToCallback: false\n })\n }\n\n validate(jwtPayload: JwtPayload): UserModel {\n this.logger.assign({ user: jwtPayload.identity.login })\n return new UserModel(jwtPayload.identity)\n }\n}\n"],"names":["FilesOnlyOfficeStrategy","PassportStrategy","Strategy","validate","jwtPayload","logger","assign","user","identity","login","UserModel","jwtFromRequest","ExtractJwt","fromExtractors","AuthTokenAccessStrategy","extractJWTFromCookie","fromUrlQueryParameter","ONLY_OFFICE_TOKEN_QUERY_PARAM_NAME","secretOrKey","configuration","auth","token","access","secret","ignoreExpiration","passReqToCallback"],"mappings":"AAAA;;;;CAIC;;;;+BAaYA;;;eAAAA;;;wBAXc;0BACwB;4BACxB;6BACU;yCACG;mCAEV;2BACJ;4BACyB;;;;;;;;;;AAG5C,IAAA,AAAMA,0BAAN,MAAMA,gCAAgCC,IAAAA,0BAAgB,EAACC,qBAAQ,EAAE;IAatEC,SAASC,UAAsB,EAAa;QAC1C,IAAI,CAACC,MAAM,CAACC,MAAM,CAAC;YAAEC,MAAMH,WAAWI,QAAQ,CAACC,KAAK;QAAC;QACrD,OAAO,IAAIC,oBAAS,CAACN,WAAWI,QAAQ;IAC1C;IAfA,YAAY,AAAiBH,MAAkB,CAAE;QAC/C,KAAK,CAAC;YACJM,gBAAgBC,uBAAU,CAACC,cAAc,CAAC;gBACxCC,gDAAuB,CAACC,oBAAoB;gBAC5CH,uBAAU,CAACI,qBAAqB,CAACC,8CAAkC;aACpE;YACDC,aAAaC,gCAAa,CAACC,IAAI,CAACC,KAAK,CAACC,MAAM,CAACC,MAAM;YACnDC,kBAAkB;YAClBC,mBAAmB;QACrB,SAT2BpB,SAAAA;IAU7B;AAMF"}
|
|
@@ -50,6 +50,11 @@ function _ts_metadata(k, v) {
|
|
|
50
50
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
51
51
|
}
|
|
52
52
|
let FilesOnlyOfficeManager = class FilesOnlyOfficeManager {
|
|
53
|
+
getStatus() {
|
|
54
|
+
return {
|
|
55
|
+
enabled: _configenvironment.configuration.applications.files.onlyoffice.enabled
|
|
56
|
+
};
|
|
57
|
+
}
|
|
53
58
|
async getSettings(user, space, mode, req) {
|
|
54
59
|
if (!await (0, _files.isPathExists)(space.realPath)) {
|
|
55
60
|
throw new _common.HttpException('Document not found', _common.HttpStatus.NOT_FOUND);
|