@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
|
@@ -0,0 +1,333 @@
|
|
|
1
|
+
/*
|
|
2
|
+
* Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>
|
|
3
|
+
* This file is part of Sync-in | The open source file sync and share solution
|
|
4
|
+
* See the LICENSE file for licensing details
|
|
5
|
+
*/ "use strict";
|
|
6
|
+
Object.defineProperty(exports, "__esModule", {
|
|
7
|
+
value: true
|
|
8
|
+
});
|
|
9
|
+
const _testing = require("@nestjs/testing");
|
|
10
|
+
const _cacheservice = require("../../../infrastructure/cache/services/cache.service");
|
|
11
|
+
const _constants = require("../../../infrastructure/database/constants");
|
|
12
|
+
const _filesindexermysqlservice = require("./files-indexer-mysql.service");
|
|
13
|
+
describe(_filesindexermysqlservice.FilesIndexerMySQL.name, ()=>{
|
|
14
|
+
let module;
|
|
15
|
+
let filesIndexerMySQL;
|
|
16
|
+
let db;
|
|
17
|
+
let cache;
|
|
18
|
+
beforeAll(async ()=>{
|
|
19
|
+
db = {
|
|
20
|
+
execute: jest.fn()
|
|
21
|
+
};
|
|
22
|
+
cache = {
|
|
23
|
+
genSlugKey: jest.fn(()=>'cache:indexesList:key'),
|
|
24
|
+
get: jest.fn(),
|
|
25
|
+
set: jest.fn().mockResolvedValue(undefined)
|
|
26
|
+
};
|
|
27
|
+
module = await _testing.Test.createTestingModule({
|
|
28
|
+
providers: [
|
|
29
|
+
_filesindexermysqlservice.FilesIndexerMySQL,
|
|
30
|
+
{
|
|
31
|
+
provide: _constants.DB_TOKEN_PROVIDER,
|
|
32
|
+
useValue: db
|
|
33
|
+
},
|
|
34
|
+
{
|
|
35
|
+
provide: _cacheservice.Cache,
|
|
36
|
+
useValue: cache
|
|
37
|
+
}
|
|
38
|
+
]
|
|
39
|
+
}).compile();
|
|
40
|
+
module.useLogger([
|
|
41
|
+
'fatal'
|
|
42
|
+
]);
|
|
43
|
+
filesIndexerMySQL = module.get(_filesindexermysqlservice.FilesIndexerMySQL);
|
|
44
|
+
});
|
|
45
|
+
afterAll(async ()=>{
|
|
46
|
+
await module.close();
|
|
47
|
+
});
|
|
48
|
+
beforeEach(()=>{
|
|
49
|
+
jest.clearAllMocks();
|
|
50
|
+
});
|
|
51
|
+
it('should be defined', ()=>{
|
|
52
|
+
expect(filesIndexerMySQL).toBeDefined();
|
|
53
|
+
});
|
|
54
|
+
describe('indexesList', ()=>{
|
|
55
|
+
it('should list tables starting with prefix', async ()=>{
|
|
56
|
+
// Force a cache hit to avoid decorator calling the original method with a bad `this`
|
|
57
|
+
cache.get.mockResolvedValueOnce([
|
|
58
|
+
'files_content_u_1',
|
|
59
|
+
'files_content_s_2'
|
|
60
|
+
]);
|
|
61
|
+
const res = await filesIndexerMySQL.indexesList();
|
|
62
|
+
expect(res).toEqual([
|
|
63
|
+
'files_content_u_1',
|
|
64
|
+
'files_content_s_2'
|
|
65
|
+
]);
|
|
66
|
+
expect(cache.genSlugKey).toHaveBeenCalled();
|
|
67
|
+
expect(cache.get).toHaveBeenCalled();
|
|
68
|
+
// DB should not be called on cache hit
|
|
69
|
+
expect(db.execute).not.toHaveBeenCalled();
|
|
70
|
+
});
|
|
71
|
+
});
|
|
72
|
+
describe('getIndexName', ()=>{
|
|
73
|
+
it('should build table name with prefix', ()=>{
|
|
74
|
+
expect(filesIndexerMySQL.getIndexName('u_123')).toBe('files_content_u_123');
|
|
75
|
+
});
|
|
76
|
+
});
|
|
77
|
+
describe('existingIndexes', ()=>{
|
|
78
|
+
it('should filter suffixes to existing tables', async ()=>{
|
|
79
|
+
db.execute.mockResolvedValueOnce([
|
|
80
|
+
[
|
|
81
|
+
{
|
|
82
|
+
t: 'files_content_u_1'
|
|
83
|
+
},
|
|
84
|
+
{
|
|
85
|
+
t: 'files_content_s_2'
|
|
86
|
+
}
|
|
87
|
+
]
|
|
88
|
+
]);
|
|
89
|
+
const res = await filesIndexerMySQL.existingIndexes([
|
|
90
|
+
'u_1',
|
|
91
|
+
's_3',
|
|
92
|
+
's_2'
|
|
93
|
+
]);
|
|
94
|
+
expect(res.sort()).toEqual([
|
|
95
|
+
'files_content_s_2',
|
|
96
|
+
'files_content_u_1'
|
|
97
|
+
].sort());
|
|
98
|
+
});
|
|
99
|
+
});
|
|
100
|
+
describe('createIndex', ()=>{
|
|
101
|
+
it('should return true when creation succeeds', async ()=>{
|
|
102
|
+
db.execute.mockResolvedValueOnce([
|
|
103
|
+
{}
|
|
104
|
+
]);
|
|
105
|
+
await expect(filesIndexerMySQL.createIndex('files_content_u_1')).resolves.toBe(true);
|
|
106
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
107
|
+
});
|
|
108
|
+
it('should return false when creation fails', async ()=>{
|
|
109
|
+
db.execute.mockRejectedValueOnce(new Error('boom'));
|
|
110
|
+
await expect(filesIndexerMySQL.createIndex('files_content_u_1')).resolves.toBe(false);
|
|
111
|
+
});
|
|
112
|
+
});
|
|
113
|
+
describe('dropIndex', ()=>{
|
|
114
|
+
it('should return true when drop succeeds', async ()=>{
|
|
115
|
+
db.execute.mockResolvedValueOnce([
|
|
116
|
+
{}
|
|
117
|
+
]);
|
|
118
|
+
await expect(filesIndexerMySQL.dropIndex('files_content_u_1')).resolves.toBe(true);
|
|
119
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
120
|
+
});
|
|
121
|
+
it('should return false when drop fails', async ()=>{
|
|
122
|
+
db.execute.mockRejectedValueOnce(new Error('boom'));
|
|
123
|
+
await expect(filesIndexerMySQL.dropIndex('files_content_u_1')).resolves.toBe(false);
|
|
124
|
+
});
|
|
125
|
+
});
|
|
126
|
+
describe('insertRecord', ()=>{
|
|
127
|
+
it('should insert or update a record without throwing', async ()=>{
|
|
128
|
+
db.execute.mockResolvedValueOnce([
|
|
129
|
+
{}
|
|
130
|
+
]);
|
|
131
|
+
await expect(filesIndexerMySQL.insertRecord('files_content_u_1', {
|
|
132
|
+
id: 42,
|
|
133
|
+
path: '/docs',
|
|
134
|
+
name: 'file.txt',
|
|
135
|
+
mime: 'text/plain',
|
|
136
|
+
size: 12,
|
|
137
|
+
mtime: 1730000000000,
|
|
138
|
+
content: 'hello world'
|
|
139
|
+
})).resolves.toBeUndefined();
|
|
140
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
141
|
+
});
|
|
142
|
+
it('should catch and log errors', async ()=>{
|
|
143
|
+
db.execute.mockRejectedValueOnce(new Error('insert failed'));
|
|
144
|
+
await expect(filesIndexerMySQL.insertRecord('files_content_u_1', {
|
|
145
|
+
id: 1,
|
|
146
|
+
path: '/',
|
|
147
|
+
name: 'a',
|
|
148
|
+
mime: 'text/plain',
|
|
149
|
+
size: 1,
|
|
150
|
+
mtime: Date.now(),
|
|
151
|
+
content: 'x'
|
|
152
|
+
})).resolves.toBeUndefined();
|
|
153
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
154
|
+
});
|
|
155
|
+
});
|
|
156
|
+
describe('getRecordStats', ()=>{
|
|
157
|
+
it('should return a map of id to basic stats without path filter', async ()=>{
|
|
158
|
+
db.execute.mockResolvedValueOnce([
|
|
159
|
+
[
|
|
160
|
+
{
|
|
161
|
+
id: 1,
|
|
162
|
+
path: '/a',
|
|
163
|
+
name: 'a.txt',
|
|
164
|
+
size: 10
|
|
165
|
+
},
|
|
166
|
+
{
|
|
167
|
+
id: 2,
|
|
168
|
+
path: '/b',
|
|
169
|
+
name: 'b.txt',
|
|
170
|
+
size: 20
|
|
171
|
+
}
|
|
172
|
+
]
|
|
173
|
+
]);
|
|
174
|
+
const map = await filesIndexerMySQL.getRecordStats('files_content_u_1');
|
|
175
|
+
expect(map.get(1)).toEqual({
|
|
176
|
+
path: '/a',
|
|
177
|
+
name: 'a.txt',
|
|
178
|
+
size: 10
|
|
179
|
+
});
|
|
180
|
+
expect(map.get(2)).toEqual({
|
|
181
|
+
path: '/b',
|
|
182
|
+
name: 'b.txt',
|
|
183
|
+
size: 20
|
|
184
|
+
});
|
|
185
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
186
|
+
});
|
|
187
|
+
it('should append WHERE clause when path filter is provided', async ()=>{
|
|
188
|
+
db.execute.mockResolvedValueOnce([
|
|
189
|
+
[
|
|
190
|
+
{
|
|
191
|
+
id: 3,
|
|
192
|
+
path: '/docs',
|
|
193
|
+
name: 'c.txt',
|
|
194
|
+
size: 30
|
|
195
|
+
}
|
|
196
|
+
]
|
|
197
|
+
]);
|
|
198
|
+
const map = await filesIndexerMySQL.getRecordStats('files_content_u_1', '/docs');
|
|
199
|
+
expect(map.get(3)).toEqual({
|
|
200
|
+
path: '/docs',
|
|
201
|
+
name: 'c.txt',
|
|
202
|
+
size: 30
|
|
203
|
+
});
|
|
204
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
205
|
+
});
|
|
206
|
+
});
|
|
207
|
+
describe('deleteRecords', ()=>{
|
|
208
|
+
it('should delete ids and warn if affectedRows mismatch', async ()=>{
|
|
209
|
+
db.execute.mockResolvedValueOnce([
|
|
210
|
+
{
|
|
211
|
+
affectedRows: 1
|
|
212
|
+
}
|
|
213
|
+
]); // ask delete 2 but only 1 deleted
|
|
214
|
+
await filesIndexerMySQL.deleteRecords('files_content_u_1', [
|
|
215
|
+
1,
|
|
216
|
+
2
|
|
217
|
+
]);
|
|
218
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
219
|
+
});
|
|
220
|
+
it('should not warn when all requested ids are deleted', async ()=>{
|
|
221
|
+
const warnSpy = jest.spyOn(filesIndexerMySQL['logger'], 'warn').mockImplementation(()=>undefined);
|
|
222
|
+
db.execute.mockResolvedValueOnce([
|
|
223
|
+
{
|
|
224
|
+
affectedRows: 2
|
|
225
|
+
}
|
|
226
|
+
]);
|
|
227
|
+
await filesIndexerMySQL.deleteRecords('files_content_u_1', [
|
|
228
|
+
1,
|
|
229
|
+
2
|
|
230
|
+
]);
|
|
231
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
232
|
+
expect(warnSpy).not.toHaveBeenCalled();
|
|
233
|
+
warnSpy.mockRestore();
|
|
234
|
+
});
|
|
235
|
+
it('should catch errors', async ()=>{
|
|
236
|
+
db.execute.mockRejectedValueOnce(new Error('delete failed'));
|
|
237
|
+
await filesIndexerMySQL.deleteRecords('files_content_u_1', [
|
|
238
|
+
1
|
|
239
|
+
]);
|
|
240
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
241
|
+
});
|
|
242
|
+
});
|
|
243
|
+
describe('searchRecords', ()=>{
|
|
244
|
+
it('should return empty array when no terms', async ()=>{
|
|
245
|
+
const res = await filesIndexerMySQL.searchRecords([
|
|
246
|
+
'files_content_u_1'
|
|
247
|
+
], ' ', 10);
|
|
248
|
+
expect(res).toEqual([]);
|
|
249
|
+
expect(db.execute).toHaveBeenCalledTimes(0);
|
|
250
|
+
});
|
|
251
|
+
it('should return empty array when DB returns no records', async ()=>{
|
|
252
|
+
db.execute.mockResolvedValueOnce([
|
|
253
|
+
[]
|
|
254
|
+
]);
|
|
255
|
+
const res = await filesIndexerMySQL.searchRecords([
|
|
256
|
+
'files_content_u_1'
|
|
257
|
+
], 'foo', 10);
|
|
258
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
259
|
+
expect(res).toEqual([]);
|
|
260
|
+
});
|
|
261
|
+
it('should search across tables, sort by score, and highlight matches', async ()=>{
|
|
262
|
+
// fabricate records returned by DB. Only first array (rows) is used.
|
|
263
|
+
const rows = [
|
|
264
|
+
{
|
|
265
|
+
id: 1,
|
|
266
|
+
path: '/docs',
|
|
267
|
+
name: 'alpha.txt',
|
|
268
|
+
mime: 'text/plain',
|
|
269
|
+
mtime: 1730000000000,
|
|
270
|
+
content: 'Alpha foo bar. Something about Foo again; BAR appears too.',
|
|
271
|
+
score: 10
|
|
272
|
+
},
|
|
273
|
+
{
|
|
274
|
+
id: 2,
|
|
275
|
+
path: '/docs',
|
|
276
|
+
name: 'beta.txt',
|
|
277
|
+
mime: 'text/plain',
|
|
278
|
+
mtime: 1730000000001,
|
|
279
|
+
content: 'Nothing to see here except foo once.',
|
|
280
|
+
score: 5
|
|
281
|
+
}
|
|
282
|
+
];
|
|
283
|
+
db.execute.mockResolvedValueOnce([
|
|
284
|
+
rows
|
|
285
|
+
]);
|
|
286
|
+
const res = await filesIndexerMySQL.searchRecords([
|
|
287
|
+
'files_content_u_1',
|
|
288
|
+
'files_content_s_2'
|
|
289
|
+
], 'foo bar', 10);
|
|
290
|
+
expect(db.execute).toHaveBeenCalledTimes(1);
|
|
291
|
+
expect(res.length).toBe(2);
|
|
292
|
+
// content must be cleared
|
|
293
|
+
expect(res[0].content).toBeUndefined();
|
|
294
|
+
expect(Array.isArray(res[0].matches)).toBe(true);
|
|
295
|
+
expect(res[0].matches.length).toBeGreaterThan(0);
|
|
296
|
+
// highlighted with <mark> tags
|
|
297
|
+
expect(res[0].matches.join(' ')).toMatch(/<mark>foo<\/mark>|<mark>bar<\/mark>/i);
|
|
298
|
+
});
|
|
299
|
+
});
|
|
300
|
+
describe('cleanIndexes', ()=>{
|
|
301
|
+
it('should drop tables that are not in provided suffixes', async ()=>{
|
|
302
|
+
// existing tables
|
|
303
|
+
db.execute.mockResolvedValueOnce([
|
|
304
|
+
[
|
|
305
|
+
{
|
|
306
|
+
t: 'files_content_u_1'
|
|
307
|
+
},
|
|
308
|
+
{
|
|
309
|
+
t: 'files_content_u_2'
|
|
310
|
+
},
|
|
311
|
+
{
|
|
312
|
+
t: 'files_content_s_1'
|
|
313
|
+
}
|
|
314
|
+
]
|
|
315
|
+
]);
|
|
316
|
+
// each drop returns something
|
|
317
|
+
db.execute.mockResolvedValue([
|
|
318
|
+
{}
|
|
319
|
+
]);
|
|
320
|
+
await filesIndexerMySQL.cleanIndexes([
|
|
321
|
+
'u_1'
|
|
322
|
+
]); // keep only files_content_u_1; drop the others
|
|
323
|
+
// 1 call for indexesList + 2 drops expected
|
|
324
|
+
expect(db.execute).toHaveBeenCalledTimes(3);
|
|
325
|
+
});
|
|
326
|
+
it('should do nothing when no suffixes provided', async ()=>{
|
|
327
|
+
await filesIndexerMySQL.cleanIndexes([]);
|
|
328
|
+
expect(db.execute).toHaveBeenCalledTimes(0);
|
|
329
|
+
});
|
|
330
|
+
});
|
|
331
|
+
});
|
|
332
|
+
|
|
333
|
+
//# sourceMappingURL=files-indexer-mysql.service.spec.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/adapters/files-indexer-mysql.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 { Test, TestingModule } from '@nestjs/testing'\nimport { Cache } from '../../../infrastructure/cache/services/cache.service'\nimport { DB_TOKEN_PROVIDER } from '../../../infrastructure/database/constants'\nimport { FilesIndexerMySQL } from './files-indexer-mysql.service'\n\ndescribe(FilesIndexerMySQL.name, () => {\n let module: TestingModule\n let filesIndexerMySQL: FilesIndexerMySQL\n let db: { execute: jest.Mock }\n let cache: { genSlugKey: jest.Mock; get: jest.Mock; set: jest.Mock }\n\n beforeAll(async () => {\n db = { execute: jest.fn() }\n cache = {\n genSlugKey: jest.fn(() => 'cache:indexesList:key'),\n get: jest.fn(),\n set: jest.fn().mockResolvedValue(undefined)\n }\n\n module = await Test.createTestingModule({\n providers: [FilesIndexerMySQL, { provide: DB_TOKEN_PROVIDER, useValue: db }, { provide: Cache, useValue: cache }]\n }).compile()\n\n module.useLogger(['fatal'])\n filesIndexerMySQL = module.get<FilesIndexerMySQL>(FilesIndexerMySQL)\n })\n\n afterAll(async () => {\n await module.close()\n })\n\n beforeEach(() => {\n jest.clearAllMocks()\n })\n\n it('should be defined', () => {\n expect(filesIndexerMySQL).toBeDefined()\n })\n\n describe('indexesList', () => {\n it('should list tables starting with prefix', async () => {\n // Force a cache hit to avoid decorator calling the original method with a bad `this`\n cache.get.mockResolvedValueOnce(['files_content_u_1', 'files_content_s_2'])\n\n const res = await filesIndexerMySQL.indexesList()\n expect(res).toEqual(['files_content_u_1', 'files_content_s_2'])\n expect(cache.genSlugKey).toHaveBeenCalled()\n expect(cache.get).toHaveBeenCalled()\n // DB should not be called on cache hit\n expect(db.execute).not.toHaveBeenCalled()\n })\n })\n\n describe('getIndexName', () => {\n it('should build table name with prefix', () => {\n expect(filesIndexerMySQL.getIndexName('u_123')).toBe('files_content_u_123')\n })\n })\n\n describe('existingIndexes', () => {\n it('should filter suffixes to existing tables', async () => {\n db.execute.mockResolvedValueOnce([[{ t: 'files_content_u_1' }, { t: 'files_content_s_2' }]])\n const res = await filesIndexerMySQL.existingIndexes(['u_1', 's_3', 's_2'])\n expect(res.sort()).toEqual(['files_content_s_2', 'files_content_u_1'].sort())\n })\n })\n\n describe('createIndex', () => {\n it('should return true when creation succeeds', async () => {\n db.execute.mockResolvedValueOnce([{}])\n await expect(filesIndexerMySQL.createIndex('files_content_u_1')).resolves.toBe(true)\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n\n it('should return false when creation fails', async () => {\n db.execute.mockRejectedValueOnce(new Error('boom'))\n await expect(filesIndexerMySQL.createIndex('files_content_u_1')).resolves.toBe(false)\n })\n })\n\n describe('dropIndex', () => {\n it('should return true when drop succeeds', async () => {\n db.execute.mockResolvedValueOnce([{}])\n await expect(filesIndexerMySQL.dropIndex('files_content_u_1')).resolves.toBe(true)\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n\n it('should return false when drop fails', async () => {\n db.execute.mockRejectedValueOnce(new Error('boom'))\n await expect(filesIndexerMySQL.dropIndex('files_content_u_1')).resolves.toBe(false)\n })\n })\n\n describe('insertRecord', () => {\n it('should insert or update a record without throwing', async () => {\n db.execute.mockResolvedValueOnce([{}])\n await expect(\n filesIndexerMySQL.insertRecord('files_content_u_1', {\n id: 42,\n path: '/docs',\n name: 'file.txt',\n mime: 'text/plain',\n size: 12,\n mtime: 1730000000000,\n content: 'hello world'\n })\n ).resolves.toBeUndefined()\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n\n it('should catch and log errors', async () => {\n db.execute.mockRejectedValueOnce(new Error('insert failed'))\n await expect(\n filesIndexerMySQL.insertRecord('files_content_u_1', {\n id: 1,\n path: '/',\n name: 'a',\n mime: 'text/plain',\n size: 1,\n mtime: Date.now(),\n content: 'x'\n })\n ).resolves.toBeUndefined()\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n })\n\n describe('getRecordStats', () => {\n it('should return a map of id to basic stats without path filter', async () => {\n db.execute.mockResolvedValueOnce([\n [\n { id: 1, path: '/a', name: 'a.txt', size: 10 },\n { id: 2, path: '/b', name: 'b.txt', size: 20 }\n ]\n ])\n\n const map = await filesIndexerMySQL.getRecordStats('files_content_u_1')\n expect(map.get(1)).toEqual({ path: '/a', name: 'a.txt', size: 10 })\n expect(map.get(2)).toEqual({ path: '/b', name: 'b.txt', size: 20 })\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n\n it('should append WHERE clause when path filter is provided', async () => {\n db.execute.mockResolvedValueOnce([[{ id: 3, path: '/docs', name: 'c.txt', size: 30 }]])\n\n const map = await filesIndexerMySQL.getRecordStats('files_content_u_1', '/docs')\n expect(map.get(3)).toEqual({ path: '/docs', name: 'c.txt', size: 30 })\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n })\n\n describe('deleteRecords', () => {\n it('should delete ids and warn if affectedRows mismatch', async () => {\n db.execute.mockResolvedValueOnce([{ affectedRows: 1 }]) // ask delete 2 but only 1 deleted\n await filesIndexerMySQL.deleteRecords('files_content_u_1', [1, 2])\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n\n it('should not warn when all requested ids are deleted', async () => {\n const warnSpy = jest.spyOn(filesIndexerMySQL['logger'], 'warn').mockImplementation(() => undefined)\n db.execute.mockResolvedValueOnce([{ affectedRows: 2 }])\n\n await filesIndexerMySQL.deleteRecords('files_content_u_1', [1, 2])\n\n expect(db.execute).toHaveBeenCalledTimes(1)\n expect(warnSpy).not.toHaveBeenCalled()\n warnSpy.mockRestore()\n })\n\n it('should catch errors', async () => {\n db.execute.mockRejectedValueOnce(new Error('delete failed'))\n await filesIndexerMySQL.deleteRecords('files_content_u_1', [1])\n expect(db.execute).toHaveBeenCalledTimes(1)\n })\n })\n\n describe('searchRecords', () => {\n it('should return empty array when no terms', async () => {\n const res = await filesIndexerMySQL.searchRecords(['files_content_u_1'], ' ', 10)\n expect(res).toEqual([])\n expect(db.execute).toHaveBeenCalledTimes(0)\n })\n\n it('should return empty array when DB returns no records', async () => {\n db.execute.mockResolvedValueOnce([[]])\n\n const res = await filesIndexerMySQL.searchRecords(['files_content_u_1'], 'foo', 10)\n\n expect(db.execute).toHaveBeenCalledTimes(1)\n expect(res).toEqual([])\n })\n\n it('should search across tables, sort by score, and highlight matches', async () => {\n // fabricate records returned by DB. Only first array (rows) is used.\n const rows = [\n {\n id: 1,\n path: '/docs',\n name: 'alpha.txt',\n mime: 'text/plain',\n mtime: 1730000000000,\n content: 'Alpha foo bar. Something about Foo again; BAR appears too.',\n score: 10\n },\n {\n id: 2,\n path: '/docs',\n name: 'beta.txt',\n mime: 'text/plain',\n mtime: 1730000000001,\n content: 'Nothing to see here except foo once.',\n score: 5\n }\n ]\n db.execute.mockResolvedValueOnce([rows])\n\n const res = await filesIndexerMySQL.searchRecords(['files_content_u_1', 'files_content_s_2'], 'foo bar', 10)\n\n expect(db.execute).toHaveBeenCalledTimes(1)\n expect(res.length).toBe(2)\n // content must be cleared\n expect(res[0].content).toBeUndefined()\n expect(Array.isArray(res[0].matches)).toBe(true)\n expect(res[0].matches!.length).toBeGreaterThan(0)\n // highlighted with <mark> tags\n expect(res[0].matches!.join(' ')).toMatch(/<mark>foo<\\/mark>|<mark>bar<\\/mark>/i)\n })\n })\n\n describe('cleanIndexes', () => {\n it('should drop tables that are not in provided suffixes', async () => {\n // existing tables\n db.execute.mockResolvedValueOnce([[{ t: 'files_content_u_1' }, { t: 'files_content_u_2' }, { t: 'files_content_s_1' }]])\n // each drop returns something\n db.execute.mockResolvedValue([{}])\n\n await filesIndexerMySQL.cleanIndexes(['u_1']) // keep only files_content_u_1; drop the others\n\n // 1 call for indexesList + 2 drops expected\n expect(db.execute).toHaveBeenCalledTimes(3)\n })\n\n it('should do nothing when no suffixes provided', async () => {\n await filesIndexerMySQL.cleanIndexes([])\n expect(db.execute).toHaveBeenCalledTimes(0)\n })\n })\n})\n"],"names":["describe","FilesIndexerMySQL","name","module","filesIndexerMySQL","db","cache","beforeAll","execute","jest","fn","genSlugKey","get","set","mockResolvedValue","undefined","Test","createTestingModule","providers","provide","DB_TOKEN_PROVIDER","useValue","Cache","compile","useLogger","afterAll","close","beforeEach","clearAllMocks","it","expect","toBeDefined","mockResolvedValueOnce","res","indexesList","toEqual","toHaveBeenCalled","not","getIndexName","toBe","t","existingIndexes","sort","createIndex","resolves","toHaveBeenCalledTimes","mockRejectedValueOnce","Error","dropIndex","insertRecord","id","path","mime","size","mtime","content","toBeUndefined","Date","now","map","getRecordStats","affectedRows","deleteRecords","warnSpy","spyOn","mockImplementation","mockRestore","searchRecords","rows","score","length","Array","isArray","matches","toBeGreaterThan","join","toMatch","cleanIndexes"],"mappings":"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"}
|
|
@@ -25,6 +25,9 @@ _export(exports, {
|
|
|
25
25
|
get API_FILES_ONLY_OFFICE_SETTINGS () {
|
|
26
26
|
return API_FILES_ONLY_OFFICE_SETTINGS;
|
|
27
27
|
},
|
|
28
|
+
get API_FILES_ONLY_OFFICE_STATUS () {
|
|
29
|
+
return API_FILES_ONLY_OFFICE_STATUS;
|
|
30
|
+
},
|
|
28
31
|
get API_FILES_OPERATION () {
|
|
29
32
|
return API_FILES_OPERATION;
|
|
30
33
|
},
|
|
@@ -78,7 +81,8 @@ const FILES_ROUTE = {
|
|
|
78
81
|
ONLY_OFFICE: 'onlyoffice',
|
|
79
82
|
ONLY_OFFICE_SETTINGS: 'settings',
|
|
80
83
|
ONLY_OFFICE_DOCUMENT: 'document',
|
|
81
|
-
ONLY_OFFICE_CALLBACK: 'callback'
|
|
84
|
+
ONLY_OFFICE_CALLBACK: 'callback',
|
|
85
|
+
ONLY_OFFICE_STATUS: 'status'
|
|
82
86
|
};
|
|
83
87
|
const API_FILES_OPERATION = `${FILES_ROUTE.BASE}/${FILES_ROUTE.OPERATION}`;
|
|
84
88
|
const API_FILES_OPERATION_THUMBNAIL = `${API_FILES_OPERATION}/${_operations.FILE_OPERATION.THUMBNAIL}`;
|
|
@@ -96,5 +100,6 @@ const API_FILES_ONLY_OFFICE = `${FILES_ROUTE.BASE}/${FILES_ROUTE.ONLY_OFFICE}`;
|
|
|
96
100
|
const API_FILES_ONLY_OFFICE_SETTINGS = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_SETTINGS}`;
|
|
97
101
|
const API_FILES_ONLY_OFFICE_DOCUMENT = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}`;
|
|
98
102
|
const API_FILES_ONLY_OFFICE_CALLBACK = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_CALLBACK}`;
|
|
103
|
+
const API_FILES_ONLY_OFFICE_STATUS = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_STATUS}`;
|
|
99
104
|
|
|
100
105
|
//# sourceMappingURL=routes.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../../backend/src/applications/files/constants/routes.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 { SPACES_ROUTE } from '../../spaces/constants/routes'\nimport { FILE_OPERATION } from './operations'\n\nexport const FILES_ROUTE = {\n BASE: SPACES_ROUTE.BASE,\n OPERATION: 'operation',\n TASK_OPERATION: 'task/operation',\n TASKS: 'tasks',\n TASKS_DOWNLOAD: 'download',\n RECENTS: 'recents',\n SEARCH: 'search',\n ONLY_OFFICE: 'onlyoffice',\n ONLY_OFFICE_SETTINGS: 'settings',\n ONLY_OFFICE_DOCUMENT: 'document',\n ONLY_OFFICE_CALLBACK: 'callback'\n} as const\n\nexport const API_FILES_OPERATION = `${FILES_ROUTE.BASE}/${FILES_ROUTE.OPERATION}`\nexport const API_FILES_OPERATION_THUMBNAIL = `${API_FILES_OPERATION}/${FILE_OPERATION.THUMBNAIL}`\nexport const API_FILES_OPERATION_MAKE = `${API_FILES_OPERATION}/${FILE_OPERATION.MAKE}`\nexport const API_FILES_OPERATION_UPLOAD = `${API_FILES_OPERATION}/${FILE_OPERATION.UPLOAD}`\nexport const API_FILES_TASK_OPERATION = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASK_OPERATION}`\nexport const API_FILES_TASK_OPERATION_DOWNLOAD = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}`\nexport const API_FILES_TASK_OPERATION_COMPRESS = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.COMPRESS}`\nexport const API_FILES_TASK_OPERATION_DECOMPRESS = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}`\nexport const API_FILES_TASKS = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASKS}`\nexport const API_FILES_TASKS_DOWNLOAD = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASKS}/${FILES_ROUTE.TASKS_DOWNLOAD}`\nexport const API_FILES_RECENTS = `${FILES_ROUTE.BASE}/${FILES_ROUTE.RECENTS}`\nexport const API_FILES_SEARCH = `${FILES_ROUTE.BASE}/${FILES_ROUTE.SEARCH}`\nexport const API_FILES_ONLY_OFFICE = `${FILES_ROUTE.BASE}/${FILES_ROUTE.ONLY_OFFICE}`\nexport const API_FILES_ONLY_OFFICE_SETTINGS = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_SETTINGS}`\nexport const API_FILES_ONLY_OFFICE_DOCUMENT = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}`\nexport const API_FILES_ONLY_OFFICE_CALLBACK = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_CALLBACK}`\n"],"names":["API_FILES_ONLY_OFFICE","API_FILES_ONLY_OFFICE_CALLBACK","API_FILES_ONLY_OFFICE_DOCUMENT","API_FILES_ONLY_OFFICE_SETTINGS","API_FILES_OPERATION","API_FILES_OPERATION_MAKE","API_FILES_OPERATION_THUMBNAIL","API_FILES_OPERATION_UPLOAD","API_FILES_RECENTS","API_FILES_SEARCH","API_FILES_TASKS","API_FILES_TASKS_DOWNLOAD","API_FILES_TASK_OPERATION","API_FILES_TASK_OPERATION_COMPRESS","API_FILES_TASK_OPERATION_DECOMPRESS","API_FILES_TASK_OPERATION_DOWNLOAD","FILES_ROUTE","BASE","SPACES_ROUTE","OPERATION","TASK_OPERATION","TASKS","TASKS_DOWNLOAD","RECENTS","SEARCH","ONLY_OFFICE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","ONLY_OFFICE_CALLBACK","FILE_OPERATION","THUMBNAIL","MAKE","UPLOAD","DOWNLOAD","COMPRESS","DECOMPRESS"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;
|
|
1
|
+
{"version":3,"sources":["../../../../../backend/src/applications/files/constants/routes.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 { SPACES_ROUTE } from '../../spaces/constants/routes'\nimport { FILE_OPERATION } from './operations'\n\nexport const FILES_ROUTE = {\n BASE: SPACES_ROUTE.BASE,\n OPERATION: 'operation',\n TASK_OPERATION: 'task/operation',\n TASKS: 'tasks',\n TASKS_DOWNLOAD: 'download',\n RECENTS: 'recents',\n SEARCH: 'search',\n ONLY_OFFICE: 'onlyoffice',\n ONLY_OFFICE_SETTINGS: 'settings',\n ONLY_OFFICE_DOCUMENT: 'document',\n ONLY_OFFICE_CALLBACK: 'callback',\n ONLY_OFFICE_STATUS: 'status'\n} as const\n\nexport const API_FILES_OPERATION = `${FILES_ROUTE.BASE}/${FILES_ROUTE.OPERATION}`\nexport const API_FILES_OPERATION_THUMBNAIL = `${API_FILES_OPERATION}/${FILE_OPERATION.THUMBNAIL}`\nexport const API_FILES_OPERATION_MAKE = `${API_FILES_OPERATION}/${FILE_OPERATION.MAKE}`\nexport const API_FILES_OPERATION_UPLOAD = `${API_FILES_OPERATION}/${FILE_OPERATION.UPLOAD}`\nexport const API_FILES_TASK_OPERATION = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASK_OPERATION}`\nexport const API_FILES_TASK_OPERATION_DOWNLOAD = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.DOWNLOAD}`\nexport const API_FILES_TASK_OPERATION_COMPRESS = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.COMPRESS}`\nexport const API_FILES_TASK_OPERATION_DECOMPRESS = `${API_FILES_TASK_OPERATION}/${FILE_OPERATION.DECOMPRESS}`\nexport const API_FILES_TASKS = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASKS}`\nexport const API_FILES_TASKS_DOWNLOAD = `${FILES_ROUTE.BASE}/${FILES_ROUTE.TASKS}/${FILES_ROUTE.TASKS_DOWNLOAD}`\nexport const API_FILES_RECENTS = `${FILES_ROUTE.BASE}/${FILES_ROUTE.RECENTS}`\nexport const API_FILES_SEARCH = `${FILES_ROUTE.BASE}/${FILES_ROUTE.SEARCH}`\nexport const API_FILES_ONLY_OFFICE = `${FILES_ROUTE.BASE}/${FILES_ROUTE.ONLY_OFFICE}`\nexport const API_FILES_ONLY_OFFICE_SETTINGS = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_SETTINGS}`\nexport const API_FILES_ONLY_OFFICE_DOCUMENT = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}`\nexport const API_FILES_ONLY_OFFICE_CALLBACK = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_CALLBACK}`\nexport const API_FILES_ONLY_OFFICE_STATUS = `${API_FILES_ONLY_OFFICE}/${FILES_ROUTE.ONLY_OFFICE_STATUS}`\n"],"names":["API_FILES_ONLY_OFFICE","API_FILES_ONLY_OFFICE_CALLBACK","API_FILES_ONLY_OFFICE_DOCUMENT","API_FILES_ONLY_OFFICE_SETTINGS","API_FILES_ONLY_OFFICE_STATUS","API_FILES_OPERATION","API_FILES_OPERATION_MAKE","API_FILES_OPERATION_THUMBNAIL","API_FILES_OPERATION_UPLOAD","API_FILES_RECENTS","API_FILES_SEARCH","API_FILES_TASKS","API_FILES_TASKS_DOWNLOAD","API_FILES_TASK_OPERATION","API_FILES_TASK_OPERATION_COMPRESS","API_FILES_TASK_OPERATION_DECOMPRESS","API_FILES_TASK_OPERATION_DOWNLOAD","FILES_ROUTE","BASE","SPACES_ROUTE","OPERATION","TASK_OPERATION","TASKS","TASKS_DOWNLOAD","RECENTS","SEARCH","ONLY_OFFICE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","ONLY_OFFICE_CALLBACK","ONLY_OFFICE_STATUS","FILE_OPERATION","THUMBNAIL","MAKE","UPLOAD","DOWNLOAD","COMPRESS","DECOMPRESS"],"mappings":"AAAA;;;;CAIC;;;;;;;;;;;QAgCYA;eAAAA;;QAGAC;eAAAA;;QADAC;eAAAA;;QADAC;eAAAA;;QAGAC;eAAAA;;QAhBAC;eAAAA;;QAEAC;eAAAA;;QADAC;eAAAA;;QAEAC;eAAAA;;QAOAC;eAAAA;;QACAC;eAAAA;;QAHAC;eAAAA;;QACAC;eAAAA;;QALAC;eAAAA;;QAEAC;eAAAA;;QACAC;eAAAA;;QAFAC;eAAAA;;QApBAC;eAAAA;;;wBAHgB;4BACE;AAExB,MAAMA,cAAc;IACzBC,MAAMC,oBAAY,CAACD,IAAI;IACvBE,WAAW;IACXC,gBAAgB;IAChBC,OAAO;IACPC,gBAAgB;IAChBC,SAAS;IACTC,QAAQ;IACRC,aAAa;IACbC,sBAAsB;IACtBC,sBAAsB;IACtBC,sBAAsB;IACtBC,oBAAoB;AACtB;AAEO,MAAMzB,sBAAsB,GAAGY,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYG,SAAS,EAAE;AAC1E,MAAMb,gCAAgC,GAAGF,oBAAoB,CAAC,EAAE0B,0BAAc,CAACC,SAAS,EAAE;AAC1F,MAAM1B,2BAA2B,GAAGD,oBAAoB,CAAC,EAAE0B,0BAAc,CAACE,IAAI,EAAE;AAChF,MAAMzB,6BAA6B,GAAGH,oBAAoB,CAAC,EAAE0B,0BAAc,CAACG,MAAM,EAAE;AACpF,MAAMrB,2BAA2B,GAAGI,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYI,cAAc,EAAE;AACpF,MAAML,oCAAoC,GAAGH,yBAAyB,CAAC,EAAEkB,0BAAc,CAACI,QAAQ,EAAE;AAClG,MAAMrB,oCAAoC,GAAGD,yBAAyB,CAAC,EAAEkB,0BAAc,CAACK,QAAQ,EAAE;AAClG,MAAMrB,sCAAsC,GAAGF,yBAAyB,CAAC,EAAEkB,0BAAc,CAACM,UAAU,EAAE;AACtG,MAAM1B,kBAAkB,GAAGM,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYK,KAAK,EAAE;AAClE,MAAMV,2BAA2B,GAAGK,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYK,KAAK,CAAC,CAAC,EAAEL,YAAYM,cAAc,EAAE;AACzG,MAAMd,oBAAoB,GAAGQ,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYO,OAAO,EAAE;AACtE,MAAMd,mBAAmB,GAAGO,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYQ,MAAM,EAAE;AACpE,MAAMzB,wBAAwB,GAAGiB,YAAYC,IAAI,CAAC,CAAC,EAAED,YAAYS,WAAW,EAAE;AAC9E,MAAMvB,iCAAiC,GAAGH,sBAAsB,CAAC,EAAEiB,YAAYU,oBAAoB,EAAE;AACrG,MAAMzB,iCAAiC,GAAGF,sBAAsB,CAAC,EAAEiB,YAAYW,oBAAoB,EAAE;AACrG,MAAM3B,iCAAiC,GAAGD,sBAAsB,CAAC,EAAEiB,YAAYY,oBAAoB,EAAE;AACrG,MAAMzB,+BAA+B,GAAGJ,sBAAsB,CAAC,EAAEiB,YAAYa,kBAAkB,EAAE"}
|
|
@@ -15,6 +15,7 @@ Object.defineProperty(exports, "FilesOnlyOfficeController", {
|
|
|
15
15
|
const _common = require("@nestjs/common");
|
|
16
16
|
const _fastify = require("fastify");
|
|
17
17
|
const _contextinterceptor = require("../../infrastructure/context/interceptors/context.interceptor");
|
|
18
|
+
const _spaceskipguarddecorator = require("../spaces/decorators/space-skip-guard.decorator");
|
|
18
19
|
const _spacedecorator = require("../spaces/decorators/space.decorator");
|
|
19
20
|
const _spacerequestinterface = require("../spaces/interfaces/space-request.interface");
|
|
20
21
|
const _spaceenvmodel = require("../spaces/models/space-env.model");
|
|
@@ -48,6 +49,9 @@ let FilesOnlyOfficeController = class FilesOnlyOfficeController {
|
|
|
48
49
|
onlyOfficeCallBack(user, space, token, fileId) {
|
|
49
50
|
return this.filesOnlyOfficeManager.callBack(user, space, token, fileId);
|
|
50
51
|
}
|
|
52
|
+
onlyOfficeStatus() {
|
|
53
|
+
return this.filesOnlyOfficeManager.getStatus();
|
|
54
|
+
}
|
|
51
55
|
constructor(filesOnlyOfficeManager, filesMethods){
|
|
52
56
|
this.filesOnlyOfficeManager = filesOnlyOfficeManager;
|
|
53
57
|
this.filesMethods = filesMethods;
|
|
@@ -98,6 +102,13 @@ _ts_decorate([
|
|
|
98
102
|
]),
|
|
99
103
|
_ts_metadata("design:returntype", void 0)
|
|
100
104
|
], FilesOnlyOfficeController.prototype, "onlyOfficeCallBack", null);
|
|
105
|
+
_ts_decorate([
|
|
106
|
+
(0, _common.Get)(_routes.FILES_ROUTE.ONLY_OFFICE_STATUS),
|
|
107
|
+
(0, _spaceskipguarddecorator.SkipSpaceGuard)(),
|
|
108
|
+
_ts_metadata("design:type", Function),
|
|
109
|
+
_ts_metadata("design:paramtypes", []),
|
|
110
|
+
_ts_metadata("design:returntype", Object)
|
|
111
|
+
], FilesOnlyOfficeController.prototype, "onlyOfficeStatus", null);
|
|
101
112
|
FilesOnlyOfficeController = _ts_decorate([
|
|
102
113
|
(0, _common.Controller)(_routes.API_FILES_ONLY_OFFICE),
|
|
103
114
|
(0, _onlyofficeenvironmentdecorator.OnlyOfficeEnvironment)(),
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Get, HttpCode, HttpStatus, Post, Query, Request, Res, StreamableFile, UseInterceptors } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { API_FILES_ONLY_OFFICE, FILES_ROUTE } from './constants/routes'\nimport { OnlyOfficeEnvironment } from './decorators/only-office-environment.decorator'\nimport { OnlyOfficeReqConfig } from './interfaces/only-office-config.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\n@Controller(API_FILES_ONLY_OFFICE)\n@OnlyOfficeEnvironment()\nexport class FilesOnlyOfficeController {\n constructor(\n private readonly filesOnlyOfficeManager: FilesOnlyOfficeManager,\n private readonly filesMethods: FilesMethods\n ) {}\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_SETTINGS}/*`)\n @UseInterceptors(ContextInterceptor)\n onlyOfficeSettings(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('mode') mode: 'view' | 'edit' = 'view',\n @Request() req: FastifySpaceRequest\n ): Promise<OnlyOfficeReqConfig> {\n return this.filesOnlyOfficeManager.getSettings(user, space, mode, req)\n }\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}/*`)\n onlyOfficeDocument(@Request() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.ONLY_OFFICE_CALLBACK}/*`)\n @HttpCode(HttpStatus.OK)\n onlyOfficeCallBack(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body('token') token: string, @Query('fid') fileId: string) {\n return this.filesOnlyOfficeManager.callBack(user, space, token, fileId)\n }\n}\n"],"names":["FilesOnlyOfficeController","onlyOfficeSettings","user","space","mode","req","filesOnlyOfficeManager","getSettings","onlyOfficeDocument","res","filesMethods","headOrGet","onlyOfficeCallBack","token","fileId","callBack","FILES_ROUTE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","passthrough","ONLY_OFFICE_CALLBACK","OK"],"mappings":"AAAA;;;;CAIC;;;;+
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.controller.ts"],"sourcesContent":["/*\n * Copyright (C) 2012-2025 Johan Legrand <johan.legrand@sync-in.com>\n * This file is part of Sync-in | The open source file sync and share solution\n * See the LICENSE file for licensing details\n */\n\nimport { Body, Controller, Get, HttpCode, HttpStatus, Post, Query, Request, Res, StreamableFile, UseInterceptors } from '@nestjs/common'\nimport { FastifyReply } from 'fastify'\nimport { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { SkipSpaceGuard } from '../spaces/decorators/space-skip-guard.decorator'\nimport { GetSpace } from '../spaces/decorators/space.decorator'\nimport { FastifySpaceRequest } from '../spaces/interfaces/space-request.interface'\nimport { SpaceEnv } from '../spaces/models/space-env.model'\nimport { GetUser } from '../users/decorators/user.decorator'\nimport { UserModel } from '../users/models/user.model'\nimport { API_FILES_ONLY_OFFICE, FILES_ROUTE } from './constants/routes'\nimport { OnlyOfficeEnvironment } from './decorators/only-office-environment.decorator'\nimport { OnlyOfficeReqConfig } from './interfaces/only-office-config.interface'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\n@Controller(API_FILES_ONLY_OFFICE)\n@OnlyOfficeEnvironment()\nexport class FilesOnlyOfficeController {\n constructor(\n private readonly filesOnlyOfficeManager: FilesOnlyOfficeManager,\n private readonly filesMethods: FilesMethods\n ) {}\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_SETTINGS}/*`)\n @UseInterceptors(ContextInterceptor)\n onlyOfficeSettings(\n @GetUser() user: UserModel,\n @GetSpace() space: SpaceEnv,\n @Query('mode') mode: 'view' | 'edit' = 'view',\n @Request() req: FastifySpaceRequest\n ): Promise<OnlyOfficeReqConfig> {\n return this.filesOnlyOfficeManager.getSettings(user, space, mode, req)\n }\n\n @Get(`${FILES_ROUTE.ONLY_OFFICE_DOCUMENT}/*`)\n onlyOfficeDocument(@Request() req: FastifySpaceRequest, @Res({ passthrough: true }) res: FastifyReply): Promise<StreamableFile> {\n return this.filesMethods.headOrGet(req, res)\n }\n\n @Post(`${FILES_ROUTE.ONLY_OFFICE_CALLBACK}/*`)\n @HttpCode(HttpStatus.OK)\n onlyOfficeCallBack(@GetUser() user: UserModel, @GetSpace() space: SpaceEnv, @Body('token') token: string, @Query('fid') fileId: string) {\n return this.filesOnlyOfficeManager.callBack(user, space, token, fileId)\n }\n\n @Get(FILES_ROUTE.ONLY_OFFICE_STATUS)\n @SkipSpaceGuard()\n onlyOfficeStatus(): { enabled: boolean } {\n return this.filesOnlyOfficeManager.getStatus()\n }\n}\n"],"names":["FilesOnlyOfficeController","onlyOfficeSettings","user","space","mode","req","filesOnlyOfficeManager","getSettings","onlyOfficeDocument","res","filesMethods","headOrGet","onlyOfficeCallBack","token","fileId","callBack","onlyOfficeStatus","getStatus","FILES_ROUTE","ONLY_OFFICE_SETTINGS","ONLY_OFFICE_DOCUMENT","passthrough","ONLY_OFFICE_CALLBACK","OK","ONLY_OFFICE_STATUS"],"mappings":"AAAA;;;;CAIC;;;;+BAmBYA;;;eAAAA;;;wBAjB2G;yBAC3F;oCACM;yCACJ;gCACN;uCACW;+BACX;+BACD;2BACE;wBACyB;gDACb;qCAET;+CACU;;;;;;;;;;;;;;;AAIhC,IAAA,AAAMA,4BAAN,MAAMA;IAQXC,mBACE,AAAWC,IAAe,EAC1B,AAAYC,KAAe,EAC3B,AAAeC,OAAwB,MAAM,EAC7C,AAAWC,GAAwB,EACL;QAC9B,OAAO,IAAI,CAACC,sBAAsB,CAACC,WAAW,CAACL,MAAMC,OAAOC,MAAMC;IACpE;IAGAG,mBAAmB,AAAWH,GAAwB,EAAE,AAA4BI,GAAiB,EAA2B;QAC9H,OAAO,IAAI,CAACC,YAAY,CAACC,SAAS,CAACN,KAAKI;IAC1C;IAIAG,mBAAmB,AAAWV,IAAe,EAAE,AAAYC,KAAe,EAAE,AAAeU,KAAa,EAAE,AAAcC,MAAc,EAAE;QACtI,OAAO,IAAI,CAACR,sBAAsB,CAACS,QAAQ,CAACb,MAAMC,OAAOU,OAAOC;IAClE;IAIAE,mBAAyC;QACvC,OAAO,IAAI,CAACV,sBAAsB,CAACW,SAAS;IAC9C;IA/BA,YACE,AAAiBX,sBAA8C,EAC/D,AAAiBI,YAA0B,CAC3C;aAFiBJ,yBAAAA;aACAI,eAAAA;IAChB;AA6BL;;wBA3BUQ,mBAAW,CAACC,oBAAoB,CAAC,EAAE;;;;;;;;;;;;;;;;wBAWnCD,mBAAW,CAACE,oBAAoB,CAAC,EAAE;;;QACoBC,aAAa;;;;;;;;;;yBAInEH,mBAAW,CAACI,oBAAoB,CAAC,EAAE;6CACvBC;;;;;;;;;;;;;;;yCAKJC"}
|
|
@@ -15,7 +15,15 @@ const _filesmethodsservice = require("./services/files-methods.service");
|
|
|
15
15
|
const _filesonlyofficemanagerservice = require("./services/files-only-office-manager.service");
|
|
16
16
|
describe(_filesonlyofficecontroller.FilesOnlyOfficeController.name, ()=>{
|
|
17
17
|
let controller;
|
|
18
|
-
|
|
18
|
+
const filesOnlyOfficeManagerMock = {
|
|
19
|
+
getSettings: jest.fn(),
|
|
20
|
+
callBack: jest.fn()
|
|
21
|
+
};
|
|
22
|
+
const filesMethodsMock = {
|
|
23
|
+
headOrGet: jest.fn()
|
|
24
|
+
};
|
|
25
|
+
beforeEach(async ()=>{
|
|
26
|
+
jest.clearAllMocks();
|
|
19
27
|
const module = await _testing.Test.createTestingModule({
|
|
20
28
|
controllers: [
|
|
21
29
|
_filesonlyofficecontroller.FilesOnlyOfficeController
|
|
@@ -23,11 +31,11 @@ describe(_filesonlyofficecontroller.FilesOnlyOfficeController.name, ()=>{
|
|
|
23
31
|
providers: [
|
|
24
32
|
{
|
|
25
33
|
provide: _filesonlyofficemanagerservice.FilesOnlyOfficeManager,
|
|
26
|
-
useValue:
|
|
34
|
+
useValue: filesOnlyOfficeManagerMock
|
|
27
35
|
},
|
|
28
36
|
{
|
|
29
37
|
provide: _filesmethodsservice.FilesMethods,
|
|
30
|
-
useValue:
|
|
38
|
+
useValue: filesMethodsMock
|
|
31
39
|
},
|
|
32
40
|
{
|
|
33
41
|
provide: _spacesmanagerservice.SpacesManager,
|
|
@@ -42,6 +50,92 @@ describe(_filesonlyofficecontroller.FilesOnlyOfficeController.name, ()=>{
|
|
|
42
50
|
it('should be defined', ()=>{
|
|
43
51
|
expect(controller).toBeDefined();
|
|
44
52
|
});
|
|
53
|
+
describe('onlyOfficeSettings', ()=>{
|
|
54
|
+
it('should call manager with default mode "view" when mode is undefined', async ()=>{
|
|
55
|
+
const user = {
|
|
56
|
+
id: 1
|
|
57
|
+
};
|
|
58
|
+
const space = {
|
|
59
|
+
id: 'space-1'
|
|
60
|
+
};
|
|
61
|
+
const req = {
|
|
62
|
+
headers: {},
|
|
63
|
+
params: {},
|
|
64
|
+
query: {}
|
|
65
|
+
};
|
|
66
|
+
const expected = {
|
|
67
|
+
config: 'ok',
|
|
68
|
+
mode: 'view'
|
|
69
|
+
};
|
|
70
|
+
filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected);
|
|
71
|
+
const result = await controller.onlyOfficeSettings(user, space, undefined, req);
|
|
72
|
+
expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledTimes(1);
|
|
73
|
+
expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'view', req);
|
|
74
|
+
expect(result).toBe(expected);
|
|
75
|
+
});
|
|
76
|
+
it('should pass provided mode to manager', async ()=>{
|
|
77
|
+
const user = {
|
|
78
|
+
id: 2
|
|
79
|
+
};
|
|
80
|
+
const space = {
|
|
81
|
+
id: 'space-2'
|
|
82
|
+
};
|
|
83
|
+
const req = {
|
|
84
|
+
headers: {
|
|
85
|
+
'x-test': '1'
|
|
86
|
+
}
|
|
87
|
+
};
|
|
88
|
+
const expected = {
|
|
89
|
+
config: 'ok',
|
|
90
|
+
mode: 'edit'
|
|
91
|
+
};
|
|
92
|
+
filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected);
|
|
93
|
+
const result = await controller.onlyOfficeSettings(user, space, 'edit', req);
|
|
94
|
+
expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'edit', req);
|
|
95
|
+
expect(result).toBe(expected);
|
|
96
|
+
});
|
|
97
|
+
});
|
|
98
|
+
describe('onlyOfficeDocument', ()=>{
|
|
99
|
+
it('should delegate to filesMethods.headOrGet with req and res', async ()=>{
|
|
100
|
+
const req = {
|
|
101
|
+
params: {
|
|
102
|
+
'*': 'path/to/file'
|
|
103
|
+
}
|
|
104
|
+
};
|
|
105
|
+
const res = {
|
|
106
|
+
header: jest.fn(),
|
|
107
|
+
status: jest.fn().mockReturnThis()
|
|
108
|
+
};
|
|
109
|
+
const stream = {
|
|
110
|
+
readable: true
|
|
111
|
+
};
|
|
112
|
+
filesMethodsMock.headOrGet.mockResolvedValue(stream);
|
|
113
|
+
const result = await controller.onlyOfficeDocument(req, res);
|
|
114
|
+
expect(filesMethodsMock.headOrGet).toHaveBeenCalledTimes(1);
|
|
115
|
+
expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(req, res);
|
|
116
|
+
expect(result).toBe(stream);
|
|
117
|
+
});
|
|
118
|
+
});
|
|
119
|
+
describe('onlyOfficeCallBack', ()=>{
|
|
120
|
+
it('should call manager.callBack with user, space, token and fileId (fid)', async ()=>{
|
|
121
|
+
const user = {
|
|
122
|
+
id: 3
|
|
123
|
+
};
|
|
124
|
+
const space = {
|
|
125
|
+
id: 'space-3'
|
|
126
|
+
};
|
|
127
|
+
const token = 'jwt-token';
|
|
128
|
+
const fileId = 'file-123';
|
|
129
|
+
const expected = {
|
|
130
|
+
ok: true
|
|
131
|
+
};
|
|
132
|
+
filesOnlyOfficeManagerMock.callBack.mockResolvedValue(expected);
|
|
133
|
+
const result = await controller.onlyOfficeCallBack(user, space, token, fileId);
|
|
134
|
+
expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledTimes(1);
|
|
135
|
+
expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledWith(user, space, token, fileId);
|
|
136
|
+
expect(result).toBe(expected);
|
|
137
|
+
});
|
|
138
|
+
});
|
|
45
139
|
});
|
|
46
140
|
|
|
47
141
|
//# sourceMappingURL=files-only-office.controller.spec.js.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.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 { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { FilesOnlyOfficeController } from './files-only-office.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\ndescribe(FilesOnlyOfficeController.name, () => {\n let controller: FilesOnlyOfficeController\n\n
|
|
1
|
+
{"version":3,"sources":["../../../../backend/src/applications/files/files-only-office.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 { ContextInterceptor } from '../../infrastructure/context/interceptors/context.interceptor'\nimport { ContextManager } from '../../infrastructure/context/services/context-manager.service'\nimport { SpacesManager } from '../spaces/services/spaces-manager.service'\nimport { FilesOnlyOfficeController } from './files-only-office.controller'\nimport { FilesMethods } from './services/files-methods.service'\nimport { FilesOnlyOfficeManager } from './services/files-only-office-manager.service'\n\ndescribe(FilesOnlyOfficeController.name, () => {\n let controller: FilesOnlyOfficeController\n\n const filesOnlyOfficeManagerMock = {\n getSettings: jest.fn(),\n callBack: jest.fn()\n }\n\n const filesMethodsMock = {\n headOrGet: jest.fn()\n }\n\n beforeEach(async () => {\n jest.clearAllMocks()\n const module: TestingModule = await Test.createTestingModule({\n controllers: [FilesOnlyOfficeController],\n providers: [\n { provide: FilesOnlyOfficeManager, useValue: filesOnlyOfficeManagerMock },\n { provide: FilesMethods, useValue: filesMethodsMock },\n { provide: SpacesManager, useValue: {} },\n ContextManager,\n ContextInterceptor\n ]\n }).compile()\n\n controller = module.get<FilesOnlyOfficeController>(FilesOnlyOfficeController)\n })\n\n it('should be defined', () => {\n expect(controller).toBeDefined()\n })\n\n describe('onlyOfficeSettings', () => {\n it('should call manager with default mode \"view\" when mode is undefined', async () => {\n const user: any = { id: 1 }\n const space: any = { id: 'space-1' }\n const req: any = { headers: {}, params: {}, query: {} }\n const expected = { config: 'ok', mode: 'view' }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, undefined as any, req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'view', req)\n expect(result).toBe(expected)\n })\n\n it('should pass provided mode to manager', async () => {\n const user: any = { id: 2 }\n const space: any = { id: 'space-2' }\n const req: any = { headers: { 'x-test': '1' } }\n const expected = { config: 'ok', mode: 'edit' }\n filesOnlyOfficeManagerMock.getSettings.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeSettings(user, space, 'edit', req)\n\n expect(filesOnlyOfficeManagerMock.getSettings).toHaveBeenCalledWith(user, space, 'edit', req)\n expect(result).toBe(expected)\n })\n })\n\n describe('onlyOfficeDocument', () => {\n it('should delegate to filesMethods.headOrGet with req and res', async () => {\n const req: any = { params: { '*': 'path/to/file' } }\n const res: any = { header: jest.fn(), status: jest.fn().mockReturnThis() }\n const stream: any = { readable: true }\n filesMethodsMock.headOrGet.mockResolvedValue(stream)\n\n const result = await controller.onlyOfficeDocument(req, res)\n\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledTimes(1)\n expect(filesMethodsMock.headOrGet).toHaveBeenCalledWith(req, res)\n expect(result).toBe(stream)\n })\n })\n\n describe('onlyOfficeCallBack', () => {\n it('should call manager.callBack with user, space, token and fileId (fid)', async () => {\n const user: any = { id: 3 }\n const space: any = { id: 'space-3' }\n const token = 'jwt-token'\n const fileId = 'file-123'\n const expected = { ok: true }\n filesOnlyOfficeManagerMock.callBack.mockResolvedValue(expected)\n\n const result = await controller.onlyOfficeCallBack(user, space, token, fileId)\n\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledTimes(1)\n expect(filesOnlyOfficeManagerMock.callBack).toHaveBeenCalledWith(user, space, token, fileId)\n expect(result).toBe(expected)\n })\n })\n})\n"],"names":["describe","FilesOnlyOfficeController","name","controller","filesOnlyOfficeManagerMock","getSettings","jest","fn","callBack","filesMethodsMock","headOrGet","beforeEach","clearAllMocks","module","Test","createTestingModule","controllers","providers","provide","FilesOnlyOfficeManager","useValue","FilesMethods","SpacesManager","ContextManager","ContextInterceptor","compile","get","it","expect","toBeDefined","user","id","space","req","headers","params","query","expected","config","mode","mockResolvedValue","result","onlyOfficeSettings","undefined","toHaveBeenCalledTimes","toHaveBeenCalledWith","toBe","res","header","status","mockReturnThis","stream","readable","onlyOfficeDocument","token","fileId","ok","onlyOfficeCallBack"],"mappings":"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"}
|