@internxt/cli 1.6.3 → 1.6.5
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/README.md +32 -32
- package/dist/commands/login-legacy.js +2 -0
- package/dist/commands/login.js +2 -0
- package/dist/commands/upload-file.js +25 -36
- package/dist/services/auth.service.js +10 -1
- package/dist/services/cache.service.d.ts +13 -0
- package/dist/services/cache.service.js +36 -0
- package/dist/services/config.service.js +19 -3
- package/dist/services/database/database.service.d.ts +1 -1
- package/dist/services/database/database.service.js +6 -5
- package/dist/services/database/drive-item/drive-item.attributes.d.ts +7 -0
- package/dist/services/database/drive-item/drive-item.domain.d.ts +10 -0
- package/dist/services/database/drive-item/drive-item.domain.js +27 -0
- package/dist/services/database/drive-item/drive-item.model.d.ts +8 -0
- package/dist/services/database/{drive-folder/drive-folder.model.js → drive-item/drive-item.model.js} +11 -23
- package/dist/services/database/drive-item/drive-item.repository.d.ts +12 -0
- package/dist/services/database/drive-item/drive-item.repository.js +88 -0
- package/dist/services/drive/drive-file.service.d.ts +2 -3
- package/dist/services/drive/drive-file.service.js +9 -34
- package/dist/services/drive/drive-folder.service.d.ts +1 -3
- package/dist/services/drive/drive-folder.service.js +9 -87
- package/dist/services/drive/drive-item.service.d.ts +8 -0
- package/dist/services/drive/drive-item.service.js +98 -0
- package/dist/services/network/network-facade.service.d.ts +7 -2
- package/dist/services/network/network-facade.service.js +11 -25
- package/dist/services/network/upload/upload-file.service.js +7 -8
- package/dist/services/thumbnail.service.js +7 -9
- package/dist/services/usage.service.d.ts +2 -0
- package/dist/services/usage.service.js +18 -0
- package/dist/utils/cli.utils.d.ts +3 -2
- package/dist/utils/cli.utils.js +22 -18
- package/dist/utils/format.utils.js +3 -2
- package/dist/utils/upload.utils.d.ts +19 -0
- package/dist/utils/upload.utils.js +40 -0
- package/dist/utils/webdav.utils.d.ts +4 -1
- package/dist/utils/webdav.utils.js +33 -18
- package/dist/utils/xml.utils.d.ts +1 -1
- package/dist/utils/xml.utils.js +5 -1
- package/dist/webdav/handlers/DELETE.handler.js +3 -17
- package/dist/webdav/handlers/LOCK.handler.d.ts +5 -0
- package/dist/webdav/handlers/LOCK.handler.js +50 -0
- package/dist/webdav/handlers/MKCOL.handler.js +15 -3
- package/dist/webdav/handlers/MOVE.handler.js +11 -0
- package/dist/webdav/handlers/OPTIONS.handler.js +4 -4
- package/dist/webdav/handlers/PROPFIND.handler.js +30 -9
- package/dist/webdav/handlers/PUT.handler.js +59 -59
- package/dist/webdav/handlers/UNLOCK.handler.d.ts +5 -0
- package/dist/webdav/handlers/UNLOCK.handler.js +12 -0
- package/dist/webdav/middewares/auth.middleware.js +9 -2
- package/dist/webdav/middewares/errors.middleware.js +2 -0
- package/dist/webdav/middewares/request-logger.middleware.js +10 -6
- package/dist/webdav/middewares/webdav-auth.middleware.js +0 -3
- package/dist/webdav/webdav-server.js +4 -0
- package/oclif.manifest.json +1 -1
- package/package.json +47 -46
- package/dist/services/database/drive-file/drive-file.attributes.d.ts +0 -14
- package/dist/services/database/drive-file/drive-file.domain.d.ts +0 -20
- package/dist/services/database/drive-file/drive-file.domain.js +0 -68
- package/dist/services/database/drive-file/drive-file.model.d.ts +0 -15
- package/dist/services/database/drive-file/drive-file.model.js +0 -67
- package/dist/services/database/drive-file/drive-file.repository.d.ts +0 -11
- package/dist/services/database/drive-file/drive-file.repository.js +0 -63
- package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +0 -10
- package/dist/services/database/drive-folder/drive-folder.attributes.js +0 -2
- package/dist/services/database/drive-folder/drive-folder.domain.d.ts +0 -16
- package/dist/services/database/drive-folder/drive-folder.domain.js +0 -53
- package/dist/services/database/drive-folder/drive-folder.model.d.ts +0 -11
- package/dist/services/database/drive-folder/drive-folder.repository.d.ts +0 -13
- package/dist/services/database/drive-folder/drive-folder.repository.js +0 -99
- package/dist/types/fast-xml-parser.types.d.ts +0 -59
- package/dist/types/fast-xml-parser.types.js +0 -2
- package/dist/utils/database.utils.d.ts +0 -11
- package/dist/utils/database.utils.js +0 -26
- /package/dist/services/database/{drive-file/drive-file.attributes.js → drive-item/drive-item.attributes.js} +0 -0
|
@@ -2,31 +2,27 @@
|
|
|
2
2
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
3
|
exports.PUTRequestHandler = void 0;
|
|
4
4
|
const drive_file_service_1 = require("../../services/drive/drive-file.service");
|
|
5
|
+
const drive_item_repository_1 = require("../../services/database/drive-item/drive-item.repository");
|
|
5
6
|
const auth_service_1 = require("../../services/auth.service");
|
|
6
7
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
7
8
|
const webdav_utils_1 = require("../../utils/webdav.utils");
|
|
8
9
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
9
|
-
const trash_service_1 = require("../../services/drive/trash.service");
|
|
10
10
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
11
11
|
const cli_utils_1 = require("../../utils/cli.utils");
|
|
12
|
-
const stream_utils_1 = require("../../utils/stream.utils");
|
|
13
12
|
const webdav_folder_service_1 = require("../../services/webdav/webdav-folder.service");
|
|
14
|
-
const async_utils_1 = require("../../utils/async.utils");
|
|
15
|
-
const thumbnail_utils_1 = require("../../utils/thumbnail.utils");
|
|
16
13
|
const thumbnail_service_1 = require("../../services/thumbnail.service");
|
|
14
|
+
const format_utils_1 = require("../../utils/format.utils");
|
|
15
|
+
const upload_utils_1 = require("../../utils/upload.utils");
|
|
17
16
|
class PUTRequestHandler {
|
|
18
17
|
handle = async (req, res) => {
|
|
19
18
|
let contentLength = Number(req.headers['content-length']);
|
|
20
19
|
if (!contentLength || Number.isNaN(contentLength) || contentLength <= 0) {
|
|
21
20
|
contentLength = 0;
|
|
22
21
|
}
|
|
22
|
+
await upload_utils_1.UploadUtils.checkUploadSizeLimits(contentLength);
|
|
23
23
|
const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
|
|
24
|
-
const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
25
|
-
if (driveFileItem?.itemType === 'folder') {
|
|
26
|
-
throw new errors_utils_1.NotFoundError('Folders cannot be created with PUT. Use MKCOL instead.');
|
|
27
|
-
}
|
|
28
24
|
logger_utils_1.webdavLogger.info(`[PUT] Request received for file at ${resource.url}`);
|
|
29
|
-
logger_utils_1.webdavLogger.info(`[PUT] Uploading '${resource.name}' (${
|
|
25
|
+
logger_utils_1.webdavLogger.info(`[PUT] Uploading '${resource.name}' (${format_utils_1.FormatUtils.humanFileSize(contentLength)}) to '${resource.parentPath}'`);
|
|
30
26
|
const timings = {
|
|
31
27
|
networkUpload: 0,
|
|
32
28
|
driveUpload: 0,
|
|
@@ -34,25 +30,25 @@ class PUTRequestHandler {
|
|
|
34
30
|
};
|
|
35
31
|
const parentDriveFolderItem = (await webdav_folder_service_1.WebDavFolderService.instance.getDriveFolderItemFromPath(resource.parentPath)) ??
|
|
36
32
|
(await webdav_folder_service_1.WebDavFolderService.instance.createParentPathOrThrow(resource.parentPath));
|
|
37
|
-
|
|
38
|
-
|
|
39
|
-
|
|
40
|
-
|
|
41
|
-
|
|
42
|
-
|
|
33
|
+
let isReplacement = false;
|
|
34
|
+
const driveFileItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
|
|
35
|
+
if (driveFileItem && driveFileItem.status === 'EXISTS') {
|
|
36
|
+
if (driveFileItem.itemType === 'folder') {
|
|
37
|
+
logger_utils_1.webdavLogger.info('[PUT] ❌ A folder exists on the cloud with the same name.');
|
|
38
|
+
throw new errors_utils_1.ConflictError('A folder exists on the cloud with the same name');
|
|
39
|
+
}
|
|
40
|
+
isReplacement = true;
|
|
41
|
+
logger_utils_1.webdavLogger.info(`[PUT] File '${resource.name}' already exists in '${resource.path.dir}', it will be replaced...`);
|
|
42
|
+
try {
|
|
43
|
+
await webdav_utils_1.WebDavUtils.deleteOrTrashItem(driveFileItem);
|
|
44
|
+
await drive_item_repository_1.DriveItemRepository.instance.delete([driveFileItem.uuid]);
|
|
45
|
+
}
|
|
46
|
+
catch {
|
|
43
47
|
}
|
|
44
|
-
}
|
|
45
|
-
catch {
|
|
46
48
|
}
|
|
47
49
|
const { user } = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
48
50
|
const fileType = resource.path.ext.replace('.', '');
|
|
49
|
-
|
|
50
|
-
let fileStream = req;
|
|
51
|
-
const isThumbnailable = thumbnail_utils_1.ThumbnailUtils.isFileThumbnailable(fileType);
|
|
52
|
-
if (isThumbnailable) {
|
|
53
|
-
bufferStream = new stream_utils_1.BufferStream();
|
|
54
|
-
fileStream = req.pipe(bufferStream);
|
|
55
|
-
}
|
|
51
|
+
const { fileStream, thumbnailStream } = upload_utils_1.UploadUtils.prepareUploadStreams(req, fileType);
|
|
56
52
|
const { networkFacade, bucket } = await cli_utils_1.CLIUtils.prepareNetwork(user);
|
|
57
53
|
let fileId;
|
|
58
54
|
if (contentLength > 0) {
|
|
@@ -63,21 +59,20 @@ class PUTRequestHandler {
|
|
|
63
59
|
}
|
|
64
60
|
};
|
|
65
61
|
const networkUploadTimer = cli_utils_1.CLIUtils.timer();
|
|
66
|
-
|
|
67
|
-
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
|
|
72
|
-
|
|
73
|
-
|
|
74
|
-
|
|
75
|
-
|
|
76
|
-
|
|
77
|
-
|
|
78
|
-
|
|
79
|
-
|
|
80
|
-
});
|
|
62
|
+
const abortable = new AbortController();
|
|
63
|
+
fileId = await networkFacade.uploadFile({
|
|
64
|
+
from: fileStream,
|
|
65
|
+
size: contentLength,
|
|
66
|
+
bucketId: bucket,
|
|
67
|
+
progressCallback,
|
|
68
|
+
abortSignal: abortable.signal,
|
|
69
|
+
});
|
|
70
|
+
res.on('close', async () => {
|
|
71
|
+
aborted = true;
|
|
72
|
+
if (!uploaded) {
|
|
73
|
+
logger_utils_1.webdavLogger.info('[PUT] ❌ HTTP Client has been disconnected, res has been closed.');
|
|
74
|
+
abortable.abort();
|
|
75
|
+
}
|
|
81
76
|
});
|
|
82
77
|
uploaded = true;
|
|
83
78
|
timings.networkUpload = networkUploadTimer.stop();
|
|
@@ -94,28 +89,33 @@ class PUTRequestHandler {
|
|
|
94
89
|
encryptVersion: types_1.EncryptionVersion.Aes03,
|
|
95
90
|
});
|
|
96
91
|
timings.driveUpload = driveTimer.stop();
|
|
92
|
+
await drive_item_repository_1.DriveItemRepository.instance.createOrUpdate([
|
|
93
|
+
{
|
|
94
|
+
uuid: file.uuid,
|
|
95
|
+
path: resource.url,
|
|
96
|
+
type: 'file',
|
|
97
|
+
createdAt: file.createdAt,
|
|
98
|
+
updatedAt: new Date(),
|
|
99
|
+
},
|
|
100
|
+
]);
|
|
97
101
|
const thumbnailTimer = cli_utils_1.CLIUtils.timer();
|
|
98
|
-
|
|
99
|
-
|
|
100
|
-
|
|
101
|
-
|
|
102
|
-
|
|
103
|
-
|
|
104
|
-
|
|
105
|
-
|
|
106
|
-
});
|
|
107
|
-
}
|
|
102
|
+
await thumbnail_service_1.ThumbnailService.instance.tryUploadThumbnail({
|
|
103
|
+
fileUuid: file.uuid,
|
|
104
|
+
bufferStream: thumbnailStream,
|
|
105
|
+
fileType,
|
|
106
|
+
bucket,
|
|
107
|
+
networkFacade,
|
|
108
|
+
size: contentLength,
|
|
109
|
+
});
|
|
108
110
|
timings.thumbnailUpload = thumbnailTimer.stop();
|
|
109
|
-
const totalTime =
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
`
|
|
116
|
-
|
|
117
|
-
logger_utils_1.webdavLogger.info(`[PUT] [RESPONSE-201] ${resource.url} - Returning 201 Created after ${cli_utils_1.CLIUtils.formatDuration(totalTime)}`);
|
|
118
|
-
res.status(201).send();
|
|
111
|
+
const { totalTime, timingBreakdown } = upload_utils_1.UploadUtils.getTimings(contentLength, timings);
|
|
112
|
+
logger_utils_1.webdavLogger.info(`[PUT] ✅ File uploaded in ${cli_utils_1.CLIUtils.formatDuration(totalTime)} to Internxt Drive\n` +
|
|
113
|
+
'[PUT] Timing breakdown:\n' +
|
|
114
|
+
timingBreakdown);
|
|
115
|
+
const statusCode = isReplacement ? 204 : 201;
|
|
116
|
+
logger_utils_1.webdavLogger.info(`[PUT] [RESPONSE-${statusCode}] ${resource.url} - Returning ${statusCode} ` +
|
|
117
|
+
`after ${cli_utils_1.CLIUtils.formatDuration(totalTime)}`);
|
|
118
|
+
res.status(statusCode).send();
|
|
119
119
|
};
|
|
120
120
|
}
|
|
121
121
|
exports.PUTRequestHandler = PUTRequestHandler;
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.UNLOCKRequestHandler = void 0;
|
|
4
|
+
const logger_utils_1 = require("../../utils/logger.utils");
|
|
5
|
+
class UNLOCKRequestHandler {
|
|
6
|
+
handle = async (req, res) => {
|
|
7
|
+
const lockToken = req.headers['lock-token'] ?? 'unknown';
|
|
8
|
+
logger_utils_1.webdavLogger.info(`[UNLOCK] Released lock ${lockToken} for ${req.url}`);
|
|
9
|
+
res.status(204).send();
|
|
10
|
+
};
|
|
11
|
+
}
|
|
12
|
+
exports.UNLOCKRequestHandler = UNLOCKRequestHandler;
|
|
@@ -3,6 +3,7 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.AuthMiddleware = void 0;
|
|
4
4
|
const sdk_manager_service_1 = require("../../services/sdk-manager.service");
|
|
5
5
|
const auth_service_1 = require("../../services/auth.service");
|
|
6
|
+
const cache_service_1 = require("../../services/cache.service");
|
|
6
7
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
7
8
|
const xml_utils_1 = require("../../utils/xml.utils");
|
|
8
9
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
@@ -10,8 +11,14 @@ const AuthMiddleware = () => {
|
|
|
10
11
|
return (_, res, next) => {
|
|
11
12
|
(async () => {
|
|
12
13
|
try {
|
|
13
|
-
const
|
|
14
|
-
|
|
14
|
+
const cached = cache_service_1.CacheService.instance.get(cache_service_1.CacheService.AUTH_CACHE_KEY);
|
|
15
|
+
if (cached) {
|
|
16
|
+
sdk_manager_service_1.SdkManager.init({ token: cached.token, workspaceToken: cached.workspace?.workspaceCredentials?.token });
|
|
17
|
+
next();
|
|
18
|
+
return;
|
|
19
|
+
}
|
|
20
|
+
const authDetails = await auth_service_1.AuthService.instance.getAuthDetails();
|
|
21
|
+
cache_service_1.CacheService.instance.set(cache_service_1.CacheService.AUTH_CACHE_KEY, authDetails);
|
|
15
22
|
next();
|
|
16
23
|
}
|
|
17
24
|
catch (error) {
|
|
@@ -19,6 +19,8 @@ const ErrorHandlingMiddleware = (err, req, res, _) => {
|
|
|
19
19
|
if ('statusCode' in err && !Number.isNaN(err.statusCode)) {
|
|
20
20
|
statusCode = err.statusCode;
|
|
21
21
|
}
|
|
22
|
+
res.set('Content-Type', 'application/xml; charset="utf-8"');
|
|
22
23
|
res.status(statusCode).send(errorBodyXML);
|
|
24
|
+
req.destroy();
|
|
23
25
|
};
|
|
24
26
|
exports.ErrorHandlingMiddleware = ErrorHandlingMiddleware;
|
|
@@ -3,16 +3,20 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
3
3
|
exports.RequestLoggerMiddleware = void 0;
|
|
4
4
|
const logger_utils_1 = require("../../utils/logger.utils");
|
|
5
5
|
const RequestLoggerMiddleware = (config) => {
|
|
6
|
-
return (req,
|
|
6
|
+
return (req, res, next) => {
|
|
7
7
|
if (!config.enable)
|
|
8
8
|
return next();
|
|
9
9
|
if (config.methods && !config.methods.includes(req.method))
|
|
10
10
|
return next();
|
|
11
|
-
|
|
12
|
-
|
|
13
|
-
|
|
14
|
-
|
|
15
|
-
|
|
11
|
+
const start = Date.now();
|
|
12
|
+
const contentLength = req.headers['content-length'] ?? '0';
|
|
13
|
+
logger_utils_1.webdavLogger.info(`[${req.method}] ${req.url} - Start (${contentLength}B)`);
|
|
14
|
+
const originalEnd = res.end.bind(res);
|
|
15
|
+
res.end = function (...args) {
|
|
16
|
+
const duration = Date.now() - start;
|
|
17
|
+
logger_utils_1.webdavLogger.info(`[${req.method}] ${req.url} - ${res.statusCode} (${duration}ms)`);
|
|
18
|
+
return originalEnd(...args);
|
|
19
|
+
};
|
|
16
20
|
next();
|
|
17
21
|
};
|
|
18
22
|
};
|
|
@@ -24,12 +24,10 @@ const WebDAVAuthMiddleware = (configs) => {
|
|
|
24
24
|
}
|
|
25
25
|
else {
|
|
26
26
|
next();
|
|
27
|
-
return;
|
|
28
27
|
}
|
|
29
28
|
}
|
|
30
29
|
else {
|
|
31
30
|
next();
|
|
32
|
-
return;
|
|
33
31
|
}
|
|
34
32
|
})();
|
|
35
33
|
};
|
|
@@ -40,5 +38,4 @@ const sendUnauthorizedError = (res, message) => {
|
|
|
40
38
|
[xml_utils_1.XMLUtils.addDefaultNamespace('responsedescription')]: message,
|
|
41
39
|
}, {}, 'error');
|
|
42
40
|
res.status(401).send(errorBodyXML);
|
|
43
|
-
return;
|
|
44
41
|
};
|
|
@@ -25,6 +25,8 @@ const DELETE_handler_1 = require("./handlers/DELETE.handler");
|
|
|
25
25
|
const PROPPATCH_handler_1 = require("./handlers/PROPPATCH.handler");
|
|
26
26
|
const MOVE_handler_1 = require("./handlers/MOVE.handler");
|
|
27
27
|
const COPY_handler_1 = require("./handlers/COPY.handler");
|
|
28
|
+
const LOCK_handler_1 = require("./handlers/LOCK.handler");
|
|
29
|
+
const UNLOCK_handler_1 = require("./handlers/UNLOCK.handler");
|
|
28
30
|
const mkcol_middleware_1 = require("./middewares/mkcol.middleware");
|
|
29
31
|
const webdav_auth_middleware_1 = require("./middewares/webdav-auth.middleware");
|
|
30
32
|
class WebDavServer {
|
|
@@ -51,6 +53,8 @@ class WebDavServer {
|
|
|
51
53
|
this.app.options(serverListenPath, (0, express_async_handler_1.default)(new OPTIONS_handler_1.OPTIONSRequestHandler().handle));
|
|
52
54
|
this.app.propfind(serverListenPath, (0, express_async_handler_1.default)(new PROPFIND_handler_1.PROPFINDRequestHandler().handle));
|
|
53
55
|
this.app.put(serverListenPath, (0, express_async_handler_1.default)(new PUT_handler_1.PUTRequestHandler().handle));
|
|
56
|
+
this.app.lock(serverListenPath, (0, express_async_handler_1.default)(new LOCK_handler_1.LOCKRequestHandler().handle));
|
|
57
|
+
this.app.unlock(serverListenPath, (0, express_async_handler_1.default)(new UNLOCK_handler_1.UNLOCKRequestHandler().handle));
|
|
54
58
|
this.app.mkcol(serverListenPath, (0, express_async_handler_1.default)(new MKCOL_handler_1.MKCOLRequestHandler().handle));
|
|
55
59
|
this.app.delete(serverListenPath, (0, express_async_handler_1.default)(new DELETE_handler_1.DELETERequestHandler().handle));
|
|
56
60
|
this.app.proppatch(serverListenPath, (0, express_async_handler_1.default)(new PROPPATCH_handler_1.PROPPATCHRequestHandler().handle));
|
package/oclif.manifest.json
CHANGED
package/package.json
CHANGED
|
@@ -1,17 +1,17 @@
|
|
|
1
1
|
{
|
|
2
2
|
"author": "Internxt <hello@internxt.com>",
|
|
3
|
-
"version": "1.6.
|
|
3
|
+
"version": "1.6.5",
|
|
4
4
|
"description": "Internxt CLI to manage your encrypted storage",
|
|
5
5
|
"scripts": {
|
|
6
|
-
"build": "
|
|
6
|
+
"build": "npm run clean && tsc",
|
|
7
7
|
"clean": "rimraf dist coverage tsconfig.tsbuildinfo oclif.manifest.json",
|
|
8
8
|
"lint": "eslint .",
|
|
9
9
|
"format": "prettier --write **/*.{js,jsx,tsx,ts}",
|
|
10
10
|
"postpack": "rimraf oclif.manifest.json",
|
|
11
|
-
"posttest": "
|
|
12
|
-
"prepack": "
|
|
11
|
+
"posttest": "npm run lint",
|
|
12
|
+
"prepack": "npm run build && oclif manifest && oclif readme",
|
|
13
13
|
"prepare": "husky || true",
|
|
14
|
-
"test": "
|
|
14
|
+
"test": "npm run test:unit",
|
|
15
15
|
"test:unit": "vitest run --coverage",
|
|
16
16
|
"test:watch": "vitest watch",
|
|
17
17
|
"dev:webdav": "nodemon -e ts --exec ts-node src/webdav/index.ts",
|
|
@@ -37,63 +37,64 @@
|
|
|
37
37
|
],
|
|
38
38
|
"dependencies": {
|
|
39
39
|
"@dashlane/pqc-kem-kyber512-node": "1.0.0",
|
|
40
|
-
"@inquirer/prompts": "8.
|
|
41
|
-
"@internxt/inxt-js": "2.
|
|
42
|
-
"@internxt/lib": "1.4.
|
|
43
|
-
"@internxt/sdk": "1.
|
|
44
|
-
"@oclif/core": "4.
|
|
45
|
-
"@oclif/plugin-autocomplete": "3.2.
|
|
46
|
-
"axios": "1.
|
|
47
|
-
"better-sqlite3": "12.
|
|
40
|
+
"@inquirer/prompts": "8.5.2",
|
|
41
|
+
"@internxt/inxt-js": "3.2.2",
|
|
42
|
+
"@internxt/lib": "1.4.2",
|
|
43
|
+
"@internxt/sdk": "1.17.5",
|
|
44
|
+
"@oclif/core": "4.11.6",
|
|
45
|
+
"@oclif/plugin-autocomplete": "3.2.50",
|
|
46
|
+
"axios": "1.18.0",
|
|
47
|
+
"better-sqlite3": "12.11.1",
|
|
48
48
|
"bip39": "3.1.0",
|
|
49
|
-
"body-parser": "2.
|
|
49
|
+
"body-parser": "2.3.0",
|
|
50
50
|
"cli-progress": "3.12.0",
|
|
51
|
-
"dayjs": "1.11.
|
|
52
|
-
"dotenv": "17.
|
|
51
|
+
"dayjs": "1.11.21",
|
|
52
|
+
"dotenv": "17.4.2",
|
|
53
53
|
"express": "5.2.1",
|
|
54
54
|
"express-async-handler": "1.2.0",
|
|
55
|
-
"fast-xml-
|
|
55
|
+
"fast-xml-builder": "1.2.0",
|
|
56
|
+
"fast-xml-parser": "5.9.0",
|
|
56
57
|
"hash-wasm": "4.12.0",
|
|
57
58
|
"mime-types": "3.0.2",
|
|
58
59
|
"open": "11.0.0",
|
|
59
|
-
"openpgp": "6.3.
|
|
60
|
-
"otpauth": "9.5.
|
|
61
|
-
"pm2": "
|
|
60
|
+
"openpgp": "6.3.1",
|
|
61
|
+
"otpauth": "9.5.1",
|
|
62
|
+
"pm2": "7.0.1",
|
|
62
63
|
"range-parser": "1.2.1",
|
|
63
64
|
"selfsigned": "5.5.0",
|
|
64
65
|
"tty-table": "5.0.0",
|
|
65
|
-
"typeorm": "0.
|
|
66
|
+
"typeorm": "1.0.0",
|
|
66
67
|
"winston": "3.19.0"
|
|
67
68
|
},
|
|
68
69
|
"devDependencies": {
|
|
69
|
-
"@internxt/eslint-config-internxt": "2.0
|
|
70
|
-
"@internxt/prettier-config": "
|
|
71
|
-
"@openpgp/web-stream-tools": "0.3.
|
|
72
|
-
"@types/cli-progress": "3.11.6",
|
|
73
|
-
"@types/express": "5.0.6",
|
|
74
|
-
"@types/mime-types": "3.0.1",
|
|
75
|
-
"@types/node": "25.
|
|
76
|
-
"@types/range-parser": "1.2.7",
|
|
77
|
-
"@vitest/coverage-istanbul": "4.
|
|
78
|
-
"@vitest/spy": "4.
|
|
79
|
-
"eslint": "
|
|
80
|
-
"husky": "9.1.7",
|
|
81
|
-
"lint-staged": "
|
|
82
|
-
"nodemon": "3.1.14",
|
|
83
|
-
"oclif": "4.
|
|
84
|
-
"prettier": "3.8.
|
|
85
|
-
"rimraf": "6.1.3",
|
|
86
|
-
"sql.js": "1.14.1",
|
|
87
|
-
"ts-node": "10.9.2",
|
|
88
|
-
"typescript": "
|
|
89
|
-
"vitest": "4.
|
|
90
|
-
"vitest-mock-express": "2.2.0"
|
|
70
|
+
"@internxt/eslint-config-internxt": "^2.1.0",
|
|
71
|
+
"@internxt/prettier-config": "^2.0.1",
|
|
72
|
+
"@openpgp/web-stream-tools": "^0.3.1",
|
|
73
|
+
"@types/cli-progress": "^3.11.6",
|
|
74
|
+
"@types/express": "^5.0.6",
|
|
75
|
+
"@types/mime-types": "^3.0.1",
|
|
76
|
+
"@types/node": "^25.9.3",
|
|
77
|
+
"@types/range-parser": "^1.2.7",
|
|
78
|
+
"@vitest/coverage-istanbul": "^4.1.9",
|
|
79
|
+
"@vitest/spy": "^4.1.9",
|
|
80
|
+
"eslint": "^10.5.0",
|
|
81
|
+
"husky": "^9.1.7",
|
|
82
|
+
"lint-staged": "^17.0.7",
|
|
83
|
+
"nodemon": "^3.1.14",
|
|
84
|
+
"oclif": "^4.23.16",
|
|
85
|
+
"prettier": "^3.8.4",
|
|
86
|
+
"rimraf": "^6.1.3",
|
|
87
|
+
"sql.js": "^1.14.1",
|
|
88
|
+
"ts-node": "^10.9.2",
|
|
89
|
+
"typescript": "^6.0.3",
|
|
90
|
+
"vitest": "^4.1.9",
|
|
91
|
+
"vitest-mock-express": "^2.2.0"
|
|
91
92
|
},
|
|
92
93
|
"optionalDependencies": {
|
|
93
|
-
"sharp": "0.
|
|
94
|
+
"sharp": "0.35.1"
|
|
94
95
|
},
|
|
95
96
|
"engines": {
|
|
96
|
-
"node": "
|
|
97
|
+
"node": "^22.13.0 || >=24.11.0"
|
|
97
98
|
},
|
|
98
99
|
"bin": {
|
|
99
100
|
"internxt": "./bin/run.js"
|
|
@@ -115,7 +116,7 @@
|
|
|
115
116
|
}
|
|
116
117
|
},
|
|
117
118
|
"lint-staged": {
|
|
118
|
-
"*.{js,jsx,tsx,ts}": [
|
|
119
|
+
"*.{js,jsx,tsx,ts,cjs,mjs}": [
|
|
119
120
|
"prettier --write"
|
|
120
121
|
]
|
|
121
122
|
}
|
|
@@ -1,14 +0,0 @@
|
|
|
1
|
-
export interface DriveFileAttributes {
|
|
2
|
-
uuid: string;
|
|
3
|
-
name: string;
|
|
4
|
-
type: string | null;
|
|
5
|
-
fileId: string | null;
|
|
6
|
-
folderUuid: string;
|
|
7
|
-
bucket: string;
|
|
8
|
-
createdAt: Date;
|
|
9
|
-
updatedAt: Date;
|
|
10
|
-
size: number;
|
|
11
|
-
status: 'EXISTS' | 'TRASHED' | 'DELETED';
|
|
12
|
-
creationTime: Date;
|
|
13
|
-
modificationTime: Date;
|
|
14
|
-
}
|
|
@@ -1,20 +0,0 @@
|
|
|
1
|
-
import { DriveFileItem } from '../../../types/drive.types';
|
|
2
|
-
import { DriveFileAttributes } from './drive-file.attributes';
|
|
3
|
-
export declare class DriveFile implements DriveFileAttributes {
|
|
4
|
-
name: string;
|
|
5
|
-
type: string | null;
|
|
6
|
-
uuid: string;
|
|
7
|
-
fileId: string | null;
|
|
8
|
-
folderUuid: string;
|
|
9
|
-
bucket: string;
|
|
10
|
-
createdAt: Date;
|
|
11
|
-
updatedAt: Date;
|
|
12
|
-
size: number;
|
|
13
|
-
status: 'EXISTS' | 'TRASHED' | 'DELETED';
|
|
14
|
-
creationTime: Date;
|
|
15
|
-
modificationTime: Date;
|
|
16
|
-
constructor({ name, type, uuid, fileId, folderUuid, bucket, createdAt, updatedAt, size, status, creationTime, modificationTime, }: DriveFileAttributes);
|
|
17
|
-
static build(file: DriveFileAttributes): DriveFile;
|
|
18
|
-
toJSON(): DriveFileAttributes;
|
|
19
|
-
toItem(): DriveFileItem;
|
|
20
|
-
}
|
|
@@ -1,68 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
-
exports.DriveFile = void 0;
|
|
4
|
-
class DriveFile {
|
|
5
|
-
name;
|
|
6
|
-
type;
|
|
7
|
-
uuid;
|
|
8
|
-
fileId;
|
|
9
|
-
folderUuid;
|
|
10
|
-
bucket;
|
|
11
|
-
createdAt;
|
|
12
|
-
updatedAt;
|
|
13
|
-
size;
|
|
14
|
-
status;
|
|
15
|
-
creationTime;
|
|
16
|
-
modificationTime;
|
|
17
|
-
constructor({ name, type, uuid, fileId, folderUuid, bucket, createdAt, updatedAt, size, status, creationTime, modificationTime, }) {
|
|
18
|
-
this.name = name;
|
|
19
|
-
this.type = type;
|
|
20
|
-
this.uuid = uuid;
|
|
21
|
-
this.fileId = fileId;
|
|
22
|
-
this.folderUuid = folderUuid;
|
|
23
|
-
this.bucket = bucket;
|
|
24
|
-
this.createdAt = createdAt;
|
|
25
|
-
this.updatedAt = updatedAt;
|
|
26
|
-
this.size = size;
|
|
27
|
-
this.status = status;
|
|
28
|
-
this.creationTime = creationTime;
|
|
29
|
-
this.modificationTime = modificationTime;
|
|
30
|
-
}
|
|
31
|
-
static build(file) {
|
|
32
|
-
return new DriveFile(file);
|
|
33
|
-
}
|
|
34
|
-
toJSON() {
|
|
35
|
-
return {
|
|
36
|
-
name: this.name,
|
|
37
|
-
type: this.type,
|
|
38
|
-
uuid: this.uuid,
|
|
39
|
-
fileId: this.fileId,
|
|
40
|
-
folderUuid: this.folderUuid,
|
|
41
|
-
bucket: this.bucket,
|
|
42
|
-
createdAt: this.createdAt,
|
|
43
|
-
updatedAt: this.updatedAt,
|
|
44
|
-
size: this.size,
|
|
45
|
-
status: this.status,
|
|
46
|
-
creationTime: this.creationTime,
|
|
47
|
-
modificationTime: this.modificationTime,
|
|
48
|
-
};
|
|
49
|
-
}
|
|
50
|
-
toItem() {
|
|
51
|
-
return {
|
|
52
|
-
itemType: 'file',
|
|
53
|
-
name: this.name,
|
|
54
|
-
type: this.type,
|
|
55
|
-
uuid: this.uuid,
|
|
56
|
-
fileId: this.fileId,
|
|
57
|
-
folderUuid: this.folderUuid,
|
|
58
|
-
bucket: this.bucket,
|
|
59
|
-
createdAt: this.createdAt,
|
|
60
|
-
updatedAt: this.updatedAt,
|
|
61
|
-
size: this.size,
|
|
62
|
-
status: this.status,
|
|
63
|
-
creationTime: this.creationTime,
|
|
64
|
-
modificationTime: this.modificationTime,
|
|
65
|
-
};
|
|
66
|
-
}
|
|
67
|
-
}
|
|
68
|
-
exports.DriveFile = DriveFile;
|
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { DriveFileAttributes } from './drive-file.attributes';
|
|
2
|
-
export declare class DriveFileModel implements DriveFileAttributes {
|
|
3
|
-
uuid: string;
|
|
4
|
-
name: string;
|
|
5
|
-
type: string | null;
|
|
6
|
-
fileId: string | null;
|
|
7
|
-
folderUuid: string;
|
|
8
|
-
bucket: string;
|
|
9
|
-
createdAt: Date;
|
|
10
|
-
updatedAt: Date;
|
|
11
|
-
size: number;
|
|
12
|
-
status: 'EXISTS' | 'TRASHED' | 'DELETED';
|
|
13
|
-
creationTime: Date;
|
|
14
|
-
modificationTime: Date;
|
|
15
|
-
}
|
|
@@ -1,67 +0,0 @@
|
|
|
1
|
-
"use strict";
|
|
2
|
-
var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) {
|
|
3
|
-
var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d;
|
|
4
|
-
if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc);
|
|
5
|
-
else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r;
|
|
6
|
-
return c > 3 && r && Object.defineProperty(target, key, r), r;
|
|
7
|
-
};
|
|
8
|
-
var __metadata = (this && this.__metadata) || function (k, v) {
|
|
9
|
-
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
|
-
};
|
|
11
|
-
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.DriveFileModel = void 0;
|
|
13
|
-
const typeorm_1 = require("typeorm");
|
|
14
|
-
let DriveFileModel = class DriveFileModel {
|
|
15
|
-
};
|
|
16
|
-
exports.DriveFileModel = DriveFileModel;
|
|
17
|
-
__decorate([
|
|
18
|
-
(0, typeorm_1.PrimaryColumn)({ nullable: false, type: 'varchar' }),
|
|
19
|
-
__metadata("design:type", String)
|
|
20
|
-
], DriveFileModel.prototype, "uuid", void 0);
|
|
21
|
-
__decorate([
|
|
22
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
23
|
-
__metadata("design:type", String)
|
|
24
|
-
], DriveFileModel.prototype, "name", void 0);
|
|
25
|
-
__decorate([
|
|
26
|
-
(0, typeorm_1.Column)({ nullable: true, type: 'varchar' }),
|
|
27
|
-
__metadata("design:type", Object)
|
|
28
|
-
], DriveFileModel.prototype, "type", void 0);
|
|
29
|
-
__decorate([
|
|
30
|
-
(0, typeorm_1.Column)({ nullable: true, type: 'varchar' }),
|
|
31
|
-
__metadata("design:type", Object)
|
|
32
|
-
], DriveFileModel.prototype, "fileId", void 0);
|
|
33
|
-
__decorate([
|
|
34
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
35
|
-
__metadata("design:type", String)
|
|
36
|
-
], DriveFileModel.prototype, "folderUuid", void 0);
|
|
37
|
-
__decorate([
|
|
38
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
39
|
-
__metadata("design:type", String)
|
|
40
|
-
], DriveFileModel.prototype, "bucket", void 0);
|
|
41
|
-
__decorate([
|
|
42
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
43
|
-
__metadata("design:type", Date)
|
|
44
|
-
], DriveFileModel.prototype, "createdAt", void 0);
|
|
45
|
-
__decorate([
|
|
46
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
47
|
-
__metadata("design:type", Date)
|
|
48
|
-
], DriveFileModel.prototype, "updatedAt", void 0);
|
|
49
|
-
__decorate([
|
|
50
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'bigint' }),
|
|
51
|
-
__metadata("design:type", Number)
|
|
52
|
-
], DriveFileModel.prototype, "size", void 0);
|
|
53
|
-
__decorate([
|
|
54
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
55
|
-
__metadata("design:type", String)
|
|
56
|
-
], DriveFileModel.prototype, "status", void 0);
|
|
57
|
-
__decorate([
|
|
58
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
59
|
-
__metadata("design:type", Date)
|
|
60
|
-
], DriveFileModel.prototype, "creationTime", void 0);
|
|
61
|
-
__decorate([
|
|
62
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
63
|
-
__metadata("design:type", Date)
|
|
64
|
-
], DriveFileModel.prototype, "modificationTime", void 0);
|
|
65
|
-
exports.DriveFileModel = DriveFileModel = __decorate([
|
|
66
|
-
(0, typeorm_1.Entity)('drive_file')
|
|
67
|
-
], DriveFileModel);
|
|
@@ -1,11 +0,0 @@
|
|
|
1
|
-
import { DriveFile } from './drive-file.domain';
|
|
2
|
-
import { DriveFileModel } from './drive-file.model';
|
|
3
|
-
export declare class FileRepository {
|
|
4
|
-
static readonly instance: FileRepository;
|
|
5
|
-
private readonly fileRepository;
|
|
6
|
-
createOrUpdate: (files: DriveFileModel[]) => Promise<DriveFile[] | undefined>;
|
|
7
|
-
updateByUuid: (uuid: string, update: Partial<DriveFileModel>) => Promise<import("typeorm").UpdateResult | undefined>;
|
|
8
|
-
delete: (uuids: string[]) => Promise<import("typeorm").DeleteResult | undefined>;
|
|
9
|
-
deleteByParentUuid: (parentUuid: string) => Promise<import("typeorm").DeleteResult | undefined>;
|
|
10
|
-
getByParentUuidNameAndType: (parentUuid: string, name: string, type: string | null) => Promise<DriveFile | undefined>;
|
|
11
|
-
}
|