@sync-in/server 1.4.0 → 1.5.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 +26 -0
- package/README.md +2 -1
- package/package.json +5 -5
- 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/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.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/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/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/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-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/infrastructure/context/interceptors/context.interceptor.spec.js +135 -0
- package/server/infrastructure/context/interceptors/context.interceptor.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-N2LYWNTC.js → chunk-2456KVFZ.js} +1 -1
- package/static/{chunk-YCINY2YI.js → chunk-2LVCLKCK.js} +1 -1
- package/static/{chunk-5YKWZT33.js → chunk-2V5S7DWD.js} +1 -1
- package/static/{chunk-3GC2BQZD.js → chunk-44YDXGNZ.js} +1 -1
- package/static/{chunk-W3QXNDI5.js → chunk-4LSJLWYV.js} +1 -1
- package/static/{chunk-T55FAU2O.js → chunk-4UT5VH7R.js} +1 -1
- package/static/{chunk-VMQMD36Z.js → chunk-5GOMMRRE.js} +1 -1
- package/static/{chunk-TXPODW5Q.js → chunk-5J4VRDKB.js} +1 -1
- package/static/{chunk-FQ4AFNGE.js → chunk-6PVKNZ7Q.js} +1 -1
- package/static/{chunk-XE5YHU5J.js → chunk-BIUNUYZ5.js} +1 -1
- package/static/{chunk-X43VWRFP.js → chunk-DFQKHCDR.js} +1 -1
- package/static/{chunk-TDQAEVZN.js → chunk-EE2TDTY4.js} +1 -1
- package/static/{chunk-MOVWEZ7J.js → chunk-ESNDJ5T6.js} +1 -1
- package/static/{chunk-TCFKH6K6.js → chunk-GDKKLLEU.js} +1 -1
- package/static/{chunk-VHYIXL7R.js → chunk-GSR2MCQG.js} +1 -1
- package/static/{chunk-LJIGRUEF.js → chunk-HR7KS5BR.js} +1 -1
- package/static/chunk-HW2H3ISM.js +559 -0
- package/static/{chunk-HZA7R43P.js → chunk-IMB3C547.js} +1 -1
- package/static/{chunk-B2Y2RNFP.js → chunk-J4ALHUDX.js} +1 -1
- package/static/{chunk-PF4K7MVG.js → chunk-KP6LSQTK.js} +1 -1
- package/static/{chunk-C23BPTJZ.js → chunk-LUZCOHFN.js} +1 -1
- package/static/{chunk-GBCYYDCI.js → chunk-MHSCCXVL.js} +1 -1
- package/static/{chunk-PY3BGNJN.js → chunk-OMRQYBXV.js} +1 -1
- package/static/chunk-P7CTJ5BG.js +27 -0
- package/static/{chunk-Y2CDUS4J.js → chunk-P7PX67IR.js} +4 -4
- package/static/{chunk-VMUOUCEI.js → chunk-PPO7DBVO.js} +1 -1
- package/static/{chunk-TTQ37MUV.js → chunk-RSS6GYNE.js} +1 -1
- package/static/{chunk-WWIC7UW3.js → chunk-SLGGINMR.js} +1 -1
- package/static/{chunk-KZQCFEPT.js → chunk-UHD5XD3G.js} +1 -1
- package/static/{chunk-TNW2CGK6.js → chunk-UPYYAJCJ.js} +1 -1
- package/static/{chunk-6F55D74O.js → chunk-VHYPQ3D4.js} +1 -1
- package/static/{chunk-DGVNNICG.js → chunk-YQSDS6BO.js} +1 -1
- package/static/{chunk-MTRNPGS4.js → chunk-ZC5NIT55.js} +1 -1
- package/static/index.html +1 -1
- package/static/main-FYD34UEC.js +7 -0
- package/static/chunk-RSNLYAN6.js +0 -560
- package/static/chunk-WHMS3PJ3.js +0 -24
- package/static/chunk-ZZ3LHYOY.js +0 -1
- package/static/main-7LDKYVXO.js +0 -10
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-clients-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { AuthMethod } from '../../../authentication/models/auth-method'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { SyncClientsManager } from './sync-clients-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\ndescribe(SyncClientsManager.name, () => {\n let service: SyncClientsManager\n\n beforeAll(async () => {\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncClientsManager,\n { provide: Cache, useValue: {} },\n { provide: HttpService, useValue: {} },\n { provide: SyncQueries, useValue: {} },\n { provide: UsersQueries, useValue: {} },\n { provide: AuthManager, useValue: {} },\n {\n provide: AuthMethod,\n useValue: {}\n }\n ]\n }).compile()\n\n service = module.get<SyncClientsManager>(SyncClientsManager)\n })\n\n it('should be defined', () => {\n expect(service).toBeDefined()\n })\n})\n"],"names":["describe","SyncClientsManager","name","service","beforeAll","module","Test","createTestingModule","providers","provide","Cache","useValue","HttpService","SyncQueries","UsersQueries","AuthManager","AuthMethod","compile","get","it","expect","toBeDefined"],"mappings":"AAAA;;;;CAIC;;;;uBAE2B;yBACQ;4BACT;oCACC;8BACN;qCACO;2CACM;oCACP;AAE5BA,SAASC,6CAAkB,CAACC,IAAI,EAAE;IAChC,IAAIC;IAEJC,UAAU;QACR,MAAMC,SAAwB,MAAMC,aAAI,CAACC,mBAAmB,CAAC;YAC3DC,WAAW;gBACTP,6CAAkB;gBAClB;oBAAEQ,SAASC,mBAAK;oBAAEC,UAAU,CAAC;gBAAE;gBAC/B;oBAAEF,SAASG,kBAAW;oBAAED,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASI,+BAAW;oBAAEF,UAAU,CAAC;gBAAE;gBACrC;oBAAEF,SAASK,iCAAY;oBAAEH,UAAU,CAAC;gBAAE;gBACtC;oBAAEF,SAASM,+BAAW;oBAAEJ,UAAU,CAAC;gBAAE;gBACrC;oBACEF,SAASO,sBAAU;oBACnBL,UAAU,CAAC;gBACb;aACD;QACH,GAAGM,OAAO;QAEVd,UAAUE,OAAOa,GAAG,CAAqBjB,6CAAkB;IAC7D;IAEAkB,GAAG,qBAAqB;QACtBC,OAAOjB,SAASkB,WAAW;IAC7B;AACF"}
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/sync/services/sync-clients-manager.service.spec.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { HttpService } from '@nestjs/axios'\nimport { HttpStatus } from '@nestjs/common'\nimport { Test, TestingModule } from '@nestjs/testing'\nimport { FastifyReply } from 'fastify'\nimport crypto from 'node:crypto'\nimport fs from 'node:fs/promises'\nimport { AuthMethod } from '../../../authentication/models/auth-method'\nimport { AuthManager } from '../../../authentication/services/auth-manager.service'\nimport * as commonFunctions from '../../../common/functions'\nimport * as commonShared from '../../../common/shared'\nimport { configuration } from '../../../configuration/config.environment'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { isPathExists } from '../../files/utils/files'\nimport { UsersQueries } from '../../users/services/users-queries.service'\nimport { CLIENT_AUTH_TYPE, CLIENT_TOKEN_EXPIRED_ERROR } from '../constants/auth'\nimport { APP_STORE_DIRNAME, APP_STORE_REPOSITORY } from '../constants/store'\nimport { SYNC_CLIENT_TYPE } from '../constants/sync'\nimport { SyncClientsManager } from './sync-clients-manager.service'\nimport { SyncQueries } from './sync-queries.service'\n\n// Pilotage permission via UserModel\nlet mockHavePermission = true\njest.mock('../../users/models/user.model', () => ({\n UserModel: jest.fn().mockImplementation((props: any) => ({\n ...props,\n havePermission: () => mockHavePermission\n }))\n}))\n\n// Mock ciblé de convertHumanTimeToSeconds\njest.mock('../../../common/functions', () => {\n const actual = jest.requireActual('../../../common/functions')\n return { ...actual, convertHumanTimeToSeconds: jest.fn() }\n})\n\n// Mock currentTimeStamp\njest.mock('../../../common/shared', () => ({ currentTimeStamp: jest.fn() }))\n\n// Mock FS et helper d'existence\njest.mock('node:fs/promises', () => ({ readFile: jest.fn() }))\njest.mock('../../files/utils/files', () => ({ isPathExists: jest.fn() }))\n\ndescribe(SyncClientsManager.name, () => {\n let service: SyncClientsManager\n\n // Mocks\n let http: { axiosRef: jest.Mock }\n let authManager: { setCookies: jest.Mock; getTokens: jest.Mock }\n let authMethod: { validateUser: jest.Mock }\n let usersQueries: { from: jest.Mock; updateUserOrGuest: jest.Mock }\n let syncQueries: {\n getOrCreateClient: jest.Mock\n deleteClient: jest.Mock\n getClient: jest.Mock\n updateClientInfo: jest.Mock\n renewClientTokenAndExpiration: jest.Mock\n getClients: jest.Mock\n }\n let cacheMock: { genSlugKey: jest.Mock; get: jest.Mock; set: jest.Mock; del: jest.Mock }\n\n // Helpers\n const setRepo = (repo: APP_STORE_REPOSITORY) => {\n ;(configuration as any).applications.appStore.repository = repo\n }\n const makeClient = (overrides: any = {}) => ({\n id: 'cid',\n ownerId: 1,\n tokenExpiration: 2000,\n enabled: true,\n info: { type: 'desktop' },\n ...overrides\n })\n const makeUser = (overrides: any = {}) => ({\n id: 1,\n isActive: true,\n login: 'u',\n email: 'u@x',\n firstName: 'U',\n lastName: 'X',\n role: 1,\n permissions: 'desktop',\n ...overrides\n })\n\n beforeAll(async () => {\n http = { axiosRef: jest.fn() }\n authManager = { setCookies: jest.fn(), getTokens: jest.fn() }\n authMethod = { validateUser: jest.fn() }\n usersQueries = { from: jest.fn(), updateUserOrGuest: jest.fn() }\n syncQueries = {\n getOrCreateClient: jest.fn(),\n deleteClient: jest.fn(),\n getClient: jest.fn(),\n updateClientInfo: jest.fn(),\n renewClientTokenAndExpiration: jest.fn(),\n getClients: jest.fn()\n }\n cacheMock = {\n genSlugKey: jest.fn().mockReturnValue('syncclientsmanager:checkappstore'),\n get: jest.fn().mockResolvedValue(undefined),\n set: jest.fn().mockResolvedValue(undefined),\n del: jest.fn().mockResolvedValue(undefined)\n }\n\n const module: TestingModule = await Test.createTestingModule({\n providers: [\n SyncClientsManager,\n { provide: Cache, useValue: cacheMock },\n { provide: HttpService, useValue: http },\n { provide: SyncQueries, useValue: syncQueries },\n { provide: UsersQueries, useValue: usersQueries },\n { provide: AuthManager, useValue: authManager },\n { provide: AuthMethod, useValue: authMethod }\n ]\n }).compile()\n\n module.useLogger(['fatal'])\n service = module.get<SyncClientsManager>(SyncClientsManager)\n ;(service as any).cache = cacheMock\n })\n\n beforeEach(() => {\n jest.restoreAllMocks()\n jest.clearAllMocks()\n mockHavePermission = true\n ;(commonShared.currentTimeStamp as jest.Mock).mockReturnValue(1_000)\n ;(commonFunctions.convertHumanTimeToSeconds as jest.Mock).mockImplementation((v: string | number) => {\n if (v === '90d') return 90 * 24 * 3600\n if (v === '180d') return 180 * 24 * 3600\n if (typeof v === 'number') return v\n return 0\n })\n ;(isPathExists as jest.Mock).mockReset()\n ;(fs.readFile as jest.Mock).mockReset()\n ;(syncQueries.updateClientInfo as jest.Mock).mockResolvedValue(undefined)\n ;(usersQueries.updateUserOrGuest as jest.Mock).mockResolvedValue(undefined)\n ;(service as any).cache = cacheMock\n cacheMock.get.mockResolvedValue(undefined)\n cacheMock.get.mockClear()\n cacheMock.set.mockClear()\n cacheMock.del.mockClear()\n cacheMock.genSlugKey.mockClear()\n setRepo(APP_STORE_REPOSITORY.PUBLIC)\n })\n\n it('should be defined', () => expect(service).toBeDefined())\n\n describe('register', () => {\n const baseDto = { login: 'john', password: 'secret', clientId: 'client-1', info: { type: 'desktop', version: '1.0.0' } }\n\n test.each([\n ['Unauthorized when credentials are invalid', null, HttpStatus.UNAUTHORIZED],\n ['Forbidden when user lacks DESKTOP_APP permission', { id: 10, login: 'john', havePermission: () => false }, HttpStatus.FORBIDDEN]\n ])('should throw %s', async (_label, user, status) => {\n authMethod.validateUser.mockResolvedValue(user)\n await expect(service.register(baseDto as any, '1.2.3.4')).rejects.toMatchObject({ status })\n })\n\n it('should return client token when registration succeeds', async () => {\n authMethod.validateUser.mockResolvedValue({ id: 10, login: 'john', havePermission: () => true })\n syncQueries.getOrCreateClient.mockResolvedValue('token-abc')\n\n const r = await service.register(baseDto as any, '1.2.3.4')\n expect(r).toEqual({ clientToken: 'token-abc' })\n expect(syncQueries.getOrCreateClient).toHaveBeenCalledWith(10, 'client-1', baseDto.info, '1.2.3.4')\n })\n\n it('should throw Internal Server Error when persistence fails', async () => {\n authMethod.validateUser.mockResolvedValue({ id: 10, login: 'john', havePermission: () => true })\n syncQueries.getOrCreateClient.mockRejectedValue(new Error('db error'))\n await expect(service.register(baseDto as any, '1.2.3.4')).rejects.toMatchObject({ status: HttpStatus.INTERNAL_SERVER_ERROR })\n })\n })\n\n describe('unregister', () => {\n it('should delete client without error', async () => {\n syncQueries.deleteClient.mockResolvedValue(undefined)\n await expect(service.unregister({ id: 1, clientId: 'c1' } as any)).resolves.toBeUndefined()\n expect(syncQueries.deleteClient).toHaveBeenCalledWith(1, 'c1')\n })\n it('should throw Internal Server Error when deletion fails', async () => {\n syncQueries.deleteClient.mockRejectedValue(new Error('db error'))\n await expect(service.unregister({ id: 1, clientId: 'c1' } as any)).rejects.toMatchObject({ status: HttpStatus.INTERNAL_SERVER_ERROR })\n })\n })\n\n describe('authenticate', () => {\n const ip = '9.9.9.9'\n const dto = { clientId: 'cid', token: 'ctok' }\n\n it('should forbid when client is unknown', async () => {\n syncQueries.getClient.mockResolvedValue(undefined)\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: 'Client is unknown'\n })\n })\n\n it('should forbid when client is disabled', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient({ enabled: false, tokenExpiration: 5000 }))\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: 'Client is disabled'\n })\n })\n\n it('should forbid when client token is expired', async () => {\n ;(commonShared.currentTimeStamp as jest.Mock).mockReturnValue(1000)\n syncQueries.getClient.mockResolvedValue(makeClient({ tokenExpiration: 1000 }))\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: CLIENT_TOKEN_EXPIRED_ERROR\n })\n })\n\n it('should forbid when owner user does not exist', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient())\n syncQueries.updateClientInfo.mockRejectedValueOnce(new Error('update-fails')) // silence expected\n usersQueries.from.mockResolvedValue(null)\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: 'User does not exist'\n })\n })\n\n it('should forbid when owner account is inactive', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient())\n usersQueries.from.mockResolvedValue(makeUser({ isActive: false }))\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: 'Account suspended or not authorized'\n })\n })\n\n it('should forbid when owner lacks DESKTOP_APP permission', async () => {\n mockHavePermission = false\n syncQueries.getClient.mockResolvedValue(makeClient())\n usersQueries.from.mockResolvedValue(makeUser({ permissions: '', role: 999 }))\n await expect(service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)).rejects.toMatchObject({\n status: HttpStatus.FORBIDDEN,\n response: 'Missing permission'\n })\n })\n\n it('should perform COOKIE authentication and renew client token when needed', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient({ ownerId: 7 }))\n usersQueries.from.mockResolvedValue(makeUser({ id: 7, login: 'john', email: 'john@doe', firstName: 'John', lastName: 'Doe' }))\n usersQueries.updateUserOrGuest.mockRejectedValueOnce(new Error('update-access-fail')) // silence expected\n authManager.setCookies.mockResolvedValue({ access_token: 'a', refresh_token: 'b' })\n jest.spyOn(service, 'renewTokenAndExpiration').mockResolvedValue('new-client-token')\n\n const reply = {} as unknown as FastifyReply\n const r: any = await service.authenticate(CLIENT_AUTH_TYPE.COOKIE, dto as any, ip, reply)\n\n expect(authManager.setCookies).toHaveBeenCalledTimes(1)\n expect(service.renewTokenAndExpiration).toHaveBeenCalledTimes(1)\n expect(r.client_token_update).toBe('new-client-token')\n })\n\n it('should perform TOKEN authentication and not renew when not needed', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient({ ownerId: 8 }))\n usersQueries.from.mockResolvedValue(makeUser({ id: 8, login: 'alice', email: 'alice@doe', firstName: 'Alice' }))\n authManager.getTokens.mockResolvedValue({ access_token: 'x', refresh_token: 'y' })\n jest.spyOn(service, 'renewTokenAndExpiration').mockResolvedValue(undefined)\n\n const r: any = await service.authenticate(CLIENT_AUTH_TYPE.TOKEN, dto as any, ip, {} as FastifyReply)\n expect(authManager.getTokens).toHaveBeenCalledTimes(1)\n expect(r.client_token_update).toBeUndefined()\n })\n\n it('should throw when auth type is unknown (else branch)', async () => {\n syncQueries.getClient.mockResolvedValue(makeClient({ ownerId: 9 }))\n usersQueries.from.mockResolvedValue(makeUser({ id: 9, login: 'bob', email: 'bob@doe', firstName: 'Bob' }))\n jest.spyOn(service, 'renewTokenAndExpiration').mockResolvedValue(undefined)\n await expect(service.authenticate('unknown' as any, { clientId: 'cid', token: 'ctok' } as any, ip, {} as FastifyReply)).rejects.toBeInstanceOf(\n TypeError\n )\n })\n })\n\n describe('getClients', () => {\n it('should proxy to SyncQueries.getClients', async () => {\n const fake = [{ id: 'c1', paths: [] }]\n syncQueries.getClients.mockResolvedValue(fake)\n const r = await service.getClients({ id: 1, clientId: 'c1' } as any)\n expect(r).toBe(fake)\n expect(syncQueries.getClients).toHaveBeenCalledWith({ id: 1, clientId: 'c1' })\n })\n })\n\n describe('renewTokenAndExpiration', () => {\n const owner = { id: 1, login: 'bob' } as any\n\n it('should return undefined when token expiration is far enough', async () => {\n ;(commonShared.currentTimeStamp as jest.Mock).mockReturnValue(1_000)\n ;(commonFunctions.convertHumanTimeToSeconds as jest.Mock).mockImplementation((v: string) => (v === '90d' ? 90 * 24 * 3600 : 0))\n const client = { id: 'cid', tokenExpiration: 1_000 + 90 * 24 * 3600 + 1 } as any\n expect(await service.renewTokenAndExpiration(client, owner)).toBeUndefined()\n })\n\n it('should renew token and return new value when close to expiration', async () => {\n ;(commonShared.currentTimeStamp as jest.Mock).mockReturnValue(1_000)\n ;(commonFunctions.convertHumanTimeToSeconds as jest.Mock).mockImplementation((v: string) =>\n v === '90d' ? 90 * 24 * 3600 : v === '180d' ? 180 * 24 * 3600 : 0\n )\n const client = { id: 'cid', tokenExpiration: 1_000 + 90 * 24 * 3600 - 1 } as any\n syncQueries.renewClientTokenAndExpiration.mockResolvedValue(undefined)\n\n const r = await service.renewTokenAndExpiration(client, owner)\n expect(typeof r).toBe('string')\n expect(r).toBeTruthy()\n expect(syncQueries.renewClientTokenAndExpiration).toHaveBeenCalledWith('cid', r, expect.any(Number))\n })\n\n it('should throw Bad Request when renewal persistence fails', async () => {\n ;(commonShared.currentTimeStamp as jest.Mock).mockReturnValue(1_000)\n const client = { id: 'cid', tokenExpiration: 1_000 } as any\n jest.spyOn(crypto, 'randomUUID').mockReturnValue('uuid-err' as any)\n syncQueries.renewClientTokenAndExpiration.mockRejectedValue(new Error('db fail'))\n await expect(service.renewTokenAndExpiration(client, owner)).rejects.toMatchObject({ status: HttpStatus.BAD_REQUEST })\n })\n })\n\n describe('deleteClient', () => {\n it('should delete client successfully', async () => {\n syncQueries.deleteClient.mockResolvedValue(undefined)\n await expect(service.deleteClient({ id: 5 } as any, 'cid')).resolves.toBeUndefined()\n expect(syncQueries.deleteClient).toHaveBeenCalledWith(5, 'cid')\n })\n it('should throw Internal Server Error when deletion fails', async () => {\n syncQueries.deleteClient.mockRejectedValue(new Error('db error'))\n await expect(service.deleteClient({ id: 5 } as any, 'cid')).rejects.toMatchObject({ status: HttpStatus.INTERNAL_SERVER_ERROR })\n })\n })\n\n describe('checkAppStore', () => {\n it('should return PUBLIC manifest when HTTP fetch succeeds', async () => {\n setRepo(APP_STORE_REPOSITORY.PUBLIC)\n http.axiosRef.mockResolvedValue({ data: { platform: { win: [] } } })\n\n const manifest: any = await service.checkAppStore()\n expect(manifest).toBeTruthy()\n expect(manifest.repository).toBe(APP_STORE_REPOSITORY.PUBLIC)\n expect(http.axiosRef).toHaveBeenCalled()\n })\n\n it('should return null when PUBLIC manifest fetch fails', async () => {\n setRepo(APP_STORE_REPOSITORY.PUBLIC)\n http.axiosRef.mockRejectedValue(new Error('network'))\n expect(await service.checkAppStore()).toBeNull()\n })\n\n it('should return null when LOCAL manifest file does not exist', async () => {\n setRepo(APP_STORE_REPOSITORY.LOCAL)\n ;(isPathExists as jest.Mock).mockResolvedValue(false)\n expect(await service.checkAppStore()).toBeNull()\n })\n\n it('should return LOCAL manifest with rewritten URLs when file is valid', async () => {\n setRepo(APP_STORE_REPOSITORY.LOCAL)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const raw = {\n platform: {\n win: [{ package: 'desktop-win.exe' }, { package: 'cli-win.zip' }],\n linux: [{ package: 'desktop-linux.AppImage' }]\n }\n }\n ;(fs.readFile as jest.Mock).mockResolvedValue(JSON.stringify(raw))\n\n const manifest: any = await service.checkAppStore()\n expect(manifest.repository).toBe(APP_STORE_REPOSITORY.LOCAL)\n expect(manifest.platform.win[0].url.startsWith(APP_STORE_DIRNAME)).toBe(true)\n expect(manifest.platform.win[0].url.endsWith('desktop-win.exe')).toBe(true)\n expect(manifest.platform.win[1].url.startsWith(APP_STORE_DIRNAME)).toBe(true)\n expect(manifest.platform.win[1].url.endsWith('cli-win.zip')).toBe(true)\n expect(manifest.platform.linux[0].url.startsWith(APP_STORE_DIRNAME)).toBe(true)\n expect(manifest.platform.linux[0].url.endsWith('desktop-linux.AppImage')).toBe(true)\n })\n\n it('should return null when LOCAL manifest cannot be parsed', async () => {\n setRepo(APP_STORE_REPOSITORY.LOCAL)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n ;(fs.readFile as jest.Mock).mockRejectedValue(new Error('fs error'))\n expect(await service.checkAppStore()).toBeNull()\n })\n\n it('should rewrite desktop packages under desktop/os when package starts with \"desktop\"', async () => {\n setRepo(APP_STORE_REPOSITORY.LOCAL)\n ;(isPathExists as jest.Mock).mockResolvedValue(true)\n const raw = {\n platform: {\n win: [{ package: `${SYNC_CLIENT_TYPE.DESKTOP}-win.exe` }],\n mac: [{ package: `${SYNC_CLIENT_TYPE.DESKTOP}-mac.dmg` }],\n linux: [{ package: `${SYNC_CLIENT_TYPE.DESKTOP}-linux.AppImage` }]\n }\n }\n ;(fs.readFile as jest.Mock).mockResolvedValue(JSON.stringify(raw))\n\n const manifest: any = await service.checkAppStore()\n expect(manifest).toBeTruthy()\n expect(manifest.repository).toBe(APP_STORE_REPOSITORY.LOCAL)\n expect(manifest.platform.win[0].url).toBe(`${APP_STORE_DIRNAME}/${SYNC_CLIENT_TYPE.DESKTOP}/win/${SYNC_CLIENT_TYPE.DESKTOP}-win.exe`)\n expect(manifest.platform.mac[0].url).toBe(`${APP_STORE_DIRNAME}/${SYNC_CLIENT_TYPE.DESKTOP}/mac/${SYNC_CLIENT_TYPE.DESKTOP}-mac.dmg`)\n expect(manifest.platform.linux[0].url).toBe(`${APP_STORE_DIRNAME}/${SYNC_CLIENT_TYPE.DESKTOP}/linux/${SYNC_CLIENT_TYPE.DESKTOP}-linux.AppImage`)\n })\n })\n})\n"],"names":["mockHavePermission","jest","mock","UserModel","fn","mockImplementation","props","havePermission","actual","requireActual","convertHumanTimeToSeconds","currentTimeStamp","readFile","isPathExists","describe","SyncClientsManager","name","service","http","authManager","authMethod","usersQueries","syncQueries","cacheMock","setRepo","repo","configuration","applications","appStore","repository","makeClient","overrides","id","ownerId","tokenExpiration","enabled","info","type","makeUser","isActive","login","email","firstName","lastName","role","permissions","beforeAll","axiosRef","setCookies","getTokens","validateUser","from","updateUserOrGuest","getOrCreateClient","deleteClient","getClient","updateClientInfo","renewClientTokenAndExpiration","getClients","genSlugKey","mockReturnValue","get","mockResolvedValue","undefined","set","del","module","Test","createTestingModule","providers","provide","Cache","useValue","HttpService","SyncQueries","UsersQueries","AuthManager","AuthMethod","compile","useLogger","cache","beforeEach","restoreAllMocks","clearAllMocks","commonShared","commonFunctions","v","mockReset","fs","mockClear","APP_STORE_REPOSITORY","PUBLIC","it","expect","toBeDefined","baseDto","password","clientId","version","test","each","HttpStatus","UNAUTHORIZED","FORBIDDEN","_label","user","status","register","rejects","toMatchObject","r","toEqual","clientToken","toHaveBeenCalledWith","mockRejectedValue","Error","INTERNAL_SERVER_ERROR","unregister","resolves","toBeUndefined","ip","dto","token","authenticate","CLIENT_AUTH_TYPE","TOKEN","response","CLIENT_TOKEN_EXPIRED_ERROR","mockRejectedValueOnce","access_token","refresh_token","spyOn","reply","COOKIE","toHaveBeenCalledTimes","renewTokenAndExpiration","client_token_update","toBe","toBeInstanceOf","TypeError","fake","paths","owner","client","toBeTruthy","any","Number","crypto","BAD_REQUEST","data","platform","win","manifest","checkAppStore","toHaveBeenCalled","toBeNull","LOCAL","raw","package","linux","JSON","stringify","url","startsWith","APP_STORE_DIRNAME","endsWith","SYNC_CLIENT_TYPE","DESKTOP","mac"],"mappings":"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"}
|