@internxt/cli 1.6.4 → 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 +31 -31
- package/dist/commands/login-legacy.js +2 -0
- package/dist/commands/login.js +2 -0
- package/dist/commands/upload-file.js +15 -26
- 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 +1 -3
- package/dist/services/network/network-facade.service.js +5 -8
- package/dist/services/network/upload/upload-file.service.js +2 -1
- package/dist/services/thumbnail.service.js +2 -2
- 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 -2
- package/dist/utils/webdav.utils.js +14 -18
- package/dist/utils/xml.utils.js +5 -1
- package/dist/webdav/handlers/DELETE.handler.js +2 -0
- 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 +44 -40
- 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/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
package/dist/services/database/{drive-folder/drive-folder.model.js → drive-item/drive-item.model.js}
RENAMED
|
@@ -9,43 +9,31 @@ var __metadata = (this && this.__metadata) || function (k, v) {
|
|
|
9
9
|
if (typeof Reflect === "object" && typeof Reflect.metadata === "function") return Reflect.metadata(k, v);
|
|
10
10
|
};
|
|
11
11
|
Object.defineProperty(exports, "__esModule", { value: true });
|
|
12
|
-
exports.
|
|
12
|
+
exports.DriveItemModel = void 0;
|
|
13
13
|
const typeorm_1 = require("typeorm");
|
|
14
|
-
let
|
|
14
|
+
let DriveItemModel = class DriveItemModel {
|
|
15
15
|
};
|
|
16
|
-
exports.
|
|
16
|
+
exports.DriveItemModel = DriveItemModel;
|
|
17
17
|
__decorate([
|
|
18
18
|
(0, typeorm_1.PrimaryColumn)({ nullable: false, type: 'varchar' }),
|
|
19
19
|
__metadata("design:type", String)
|
|
20
|
-
],
|
|
20
|
+
], DriveItemModel.prototype, "uuid", void 0);
|
|
21
21
|
__decorate([
|
|
22
22
|
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
23
23
|
__metadata("design:type", String)
|
|
24
|
-
],
|
|
24
|
+
], DriveItemModel.prototype, "path", void 0);
|
|
25
25
|
__decorate([
|
|
26
26
|
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
27
27
|
__metadata("design:type", String)
|
|
28
|
-
],
|
|
29
|
-
__decorate([
|
|
30
|
-
(0, typeorm_1.Column)({ nullable: true, type: 'varchar' }),
|
|
31
|
-
__metadata("design:type", Object)
|
|
32
|
-
], DriveFolderModel.prototype, "parentUuid", void 0);
|
|
33
|
-
__decorate([
|
|
34
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
35
|
-
__metadata("design:type", Date)
|
|
36
|
-
], DriveFolderModel.prototype, "createdAt", void 0);
|
|
37
|
-
__decorate([
|
|
38
|
-
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
39
|
-
__metadata("design:type", Date)
|
|
40
|
-
], DriveFolderModel.prototype, "updatedAt", void 0);
|
|
28
|
+
], DriveItemModel.prototype, "type", void 0);
|
|
41
29
|
__decorate([
|
|
42
30
|
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
43
31
|
__metadata("design:type", Date)
|
|
44
|
-
],
|
|
32
|
+
], DriveItemModel.prototype, "createdAt", void 0);
|
|
45
33
|
__decorate([
|
|
46
34
|
(0, typeorm_1.Column)({ nullable: false, type: 'varchar' }),
|
|
47
35
|
__metadata("design:type", Date)
|
|
48
|
-
],
|
|
49
|
-
exports.
|
|
50
|
-
(0, typeorm_1.Entity)('
|
|
51
|
-
],
|
|
36
|
+
], DriveItemModel.prototype, "updatedAt", void 0);
|
|
37
|
+
exports.DriveItemModel = DriveItemModel = __decorate([
|
|
38
|
+
(0, typeorm_1.Entity)('drive_item')
|
|
39
|
+
], DriveItemModel);
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import { DriveItemBD } from './drive-item.domain';
|
|
2
|
+
import { DriveItemModel } from './drive-item.model';
|
|
3
|
+
export declare class DriveItemRepository {
|
|
4
|
+
static readonly instance: DriveItemRepository;
|
|
5
|
+
private readonly repository;
|
|
6
|
+
createOrUpdate: (items: DriveItemModel[]) => Promise<DriveItemBD[] | undefined>;
|
|
7
|
+
updateByUuid: (uuid: string, update: Partial<DriveItemModel>) => Promise<import("typeorm").UpdateResult | undefined>;
|
|
8
|
+
delete: (uuids: string[]) => Promise<import("typeorm").DeleteResult | undefined>;
|
|
9
|
+
getByUuid: (uuid: string) => Promise<DriveItemBD | undefined>;
|
|
10
|
+
getByPath: (path: string) => Promise<DriveItemBD | undefined>;
|
|
11
|
+
getAll: () => Promise<DriveItemBD[]>;
|
|
12
|
+
}
|
|
@@ -0,0 +1,88 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DriveItemRepository = void 0;
|
|
4
|
+
const errors_utils_1 = require("../../../utils/errors.utils");
|
|
5
|
+
const database_service_1 = require("../database.service");
|
|
6
|
+
const drive_item_domain_1 = require("./drive-item.domain");
|
|
7
|
+
const drive_item_model_1 = require("./drive-item.model");
|
|
8
|
+
class DriveItemRepository {
|
|
9
|
+
static instance = new DriveItemRepository();
|
|
10
|
+
repository = database_service_1.DatabaseService.instance.dataSource.getRepository(drive_item_model_1.DriveItemModel);
|
|
11
|
+
createOrUpdate = async (items) => {
|
|
12
|
+
try {
|
|
13
|
+
const uuids = items.map((i) => i.uuid);
|
|
14
|
+
const paths = items.map((i) => i.path);
|
|
15
|
+
const existing = await this.repository
|
|
16
|
+
.createQueryBuilder('item')
|
|
17
|
+
.where('item.uuid IN (:...uuids)', { uuids })
|
|
18
|
+
.orWhere('item.path IN (:...paths)', { paths })
|
|
19
|
+
.getMany();
|
|
20
|
+
const existingByUuid = new Map(existing.map((e) => [e.uuid, e]));
|
|
21
|
+
const existingByPath = new Map(existing.map((e) => [e.path, e]));
|
|
22
|
+
for (const item of items) {
|
|
23
|
+
const match = existingByUuid.get(item.uuid) ?? existingByPath.get(item.path);
|
|
24
|
+
if (match) {
|
|
25
|
+
await this.repository.update(match.uuid, item);
|
|
26
|
+
}
|
|
27
|
+
else {
|
|
28
|
+
await this.repository.insert(item);
|
|
29
|
+
}
|
|
30
|
+
}
|
|
31
|
+
return items.map((item) => new drive_item_domain_1.DriveItemBD(item));
|
|
32
|
+
}
|
|
33
|
+
catch (error) {
|
|
34
|
+
errors_utils_1.ErrorUtils.report(error, { createOrUpdate: items });
|
|
35
|
+
}
|
|
36
|
+
};
|
|
37
|
+
updateByUuid = async (uuid, update) => {
|
|
38
|
+
try {
|
|
39
|
+
return await this.repository.update({ uuid }, update);
|
|
40
|
+
}
|
|
41
|
+
catch (error) {
|
|
42
|
+
errors_utils_1.ErrorUtils.report(error, { updateByUuid: uuid });
|
|
43
|
+
}
|
|
44
|
+
};
|
|
45
|
+
delete = async (uuids) => {
|
|
46
|
+
try {
|
|
47
|
+
return await this.repository.delete(uuids);
|
|
48
|
+
}
|
|
49
|
+
catch (error) {
|
|
50
|
+
errors_utils_1.ErrorUtils.report(error, { delete: uuids });
|
|
51
|
+
}
|
|
52
|
+
};
|
|
53
|
+
getByUuid = async (uuid) => {
|
|
54
|
+
try {
|
|
55
|
+
const item = await this.repository.findOneBy({ uuid });
|
|
56
|
+
if (!item) {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
return new drive_item_domain_1.DriveItemBD(item);
|
|
60
|
+
}
|
|
61
|
+
catch (error) {
|
|
62
|
+
errors_utils_1.ErrorUtils.report(error, { getByUuid: uuid });
|
|
63
|
+
}
|
|
64
|
+
};
|
|
65
|
+
getByPath = async (path) => {
|
|
66
|
+
try {
|
|
67
|
+
const item = await this.repository.findOneBy({ path });
|
|
68
|
+
if (!item) {
|
|
69
|
+
return;
|
|
70
|
+
}
|
|
71
|
+
return new drive_item_domain_1.DriveItemBD(item);
|
|
72
|
+
}
|
|
73
|
+
catch (error) {
|
|
74
|
+
errors_utils_1.ErrorUtils.report(error, { getByPath: path });
|
|
75
|
+
}
|
|
76
|
+
};
|
|
77
|
+
getAll = async () => {
|
|
78
|
+
try {
|
|
79
|
+
const items = await this.repository.find();
|
|
80
|
+
return items.map((item) => new drive_item_domain_1.DriveItemBD(item));
|
|
81
|
+
}
|
|
82
|
+
catch (error) {
|
|
83
|
+
errors_utils_1.ErrorUtils.report(error, { getAll: true });
|
|
84
|
+
return [];
|
|
85
|
+
}
|
|
86
|
+
};
|
|
87
|
+
}
|
|
88
|
+
exports.DriveItemRepository = DriveItemRepository;
|
|
@@ -3,14 +3,13 @@ import { DriveFileItem } from '../../types/drive.types';
|
|
|
3
3
|
export declare class DriveFileService {
|
|
4
4
|
static readonly instance: DriveFileService;
|
|
5
5
|
createFile: (payload: StorageTypes.FileEntryByUuid) => Promise<DriveFileItem>;
|
|
6
|
-
private createDriveFileEntry;
|
|
6
|
+
private readonly createDriveFileEntry;
|
|
7
7
|
getFileMetadata: (uuid: string) => Promise<DriveFileItem>;
|
|
8
|
+
getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
|
|
8
9
|
moveFile: (uuid: string, payload: StorageTypes.MoveFileUuidPayload) => Promise<StorageTypes.FileMeta>;
|
|
9
10
|
renameFile: (fileUuid: string, payload: {
|
|
10
11
|
plainName?: string;
|
|
11
12
|
type?: string | null;
|
|
12
13
|
}) => Promise<void>;
|
|
13
|
-
getByParentUuidAndName: (parentUuid: string, name: string, type: string | null) => Promise<DriveFileItem>;
|
|
14
|
-
getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
|
|
15
14
|
createThumbnail: (payload: StorageTypes.CreateThumbnailEntryPayload) => Promise<StorageTypes.Thumbnail>;
|
|
16
15
|
}
|
|
@@ -5,11 +5,7 @@ const drive_1 = require("@internxt/sdk/dist/drive");
|
|
|
5
5
|
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
6
6
|
const drive_utils_1 = require("../../utils/drive.utils");
|
|
7
7
|
const auth_service_1 = require("../auth.service");
|
|
8
|
-
const drive_file_repository_1 = require("../database/drive-file/drive-file.repository");
|
|
9
|
-
const drive_folder_service_1 = require("./drive-folder.service");
|
|
10
8
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
11
|
-
const path_utils_1 = require("../../utils/path.utils");
|
|
12
|
-
const logger_utils_1 = require("../../utils/logger.utils");
|
|
13
9
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
14
10
|
class DriveFileService {
|
|
15
11
|
static instance = new DriveFileService();
|
|
@@ -30,7 +26,6 @@ class DriveFileService {
|
|
|
30
26
|
creationTime: new Date(driveFile.creationTime ?? driveFile.createdAt),
|
|
31
27
|
modificationTime: new Date(driveFile.modificationTime ?? driveFile.updatedAt),
|
|
32
28
|
};
|
|
33
|
-
await drive_file_repository_1.FileRepository.instance.createOrUpdate([driveFileItem]);
|
|
34
29
|
return driveFileItem;
|
|
35
30
|
};
|
|
36
31
|
createDriveFileEntry = async (payload) => {
|
|
@@ -61,45 +56,25 @@ class DriveFileService {
|
|
|
61
56
|
throw new errors_utils_1.NotFoundError(`File with uuid ${uuid} not found`);
|
|
62
57
|
}
|
|
63
58
|
const driveFileItem = drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
64
|
-
|
|
59
|
+
return driveFileItem;
|
|
60
|
+
};
|
|
61
|
+
getFileMetadataByPath = async (path) => {
|
|
62
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
63
|
+
const fileMetadata = await storageClient.getFileByPath(path);
|
|
64
|
+
if (fileMetadata?.status !== types_1.FileStatus.EXISTS) {
|
|
65
|
+
throw new errors_utils_1.NotFoundError(`File with path ${path} not found`);
|
|
66
|
+
}
|
|
67
|
+
const driveFileItem = drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
|
|
65
68
|
return driveFileItem;
|
|
66
69
|
};
|
|
67
70
|
moveFile = async (uuid, payload) => {
|
|
68
71
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
69
72
|
const fileMeta = await storageClient.moveFileByUuid(uuid, payload);
|
|
70
|
-
const driveFileItem = drive_utils_1.DriveUtils.driveFileMetaToItem(fileMeta);
|
|
71
|
-
await drive_file_repository_1.FileRepository.instance.createOrUpdate([driveFileItem]);
|
|
72
73
|
return fileMeta;
|
|
73
74
|
};
|
|
74
75
|
renameFile = async (fileUuid, payload) => {
|
|
75
76
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
76
77
|
await storageClient.updateFileMetaByUUID(fileUuid, payload);
|
|
77
|
-
await drive_file_repository_1.FileRepository.instance.updateByUuid(fileUuid, { name: payload.plainName, type: payload.type });
|
|
78
|
-
};
|
|
79
|
-
getByParentUuidAndName = async (parentUuid, name, type) => {
|
|
80
|
-
const subFiles = await drive_folder_service_1.DriveFolderService.instance.getFolderSubfiles(parentUuid);
|
|
81
|
-
const fileMeta = subFiles.find((file) => (file.plainName === name || file.name === name) && (file.type ?? null) === type);
|
|
82
|
-
if (fileMeta?.status !== types_1.FileStatus.EXISTS) {
|
|
83
|
-
throw new errors_utils_1.NotFoundError('File not found');
|
|
84
|
-
}
|
|
85
|
-
return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMeta);
|
|
86
|
-
};
|
|
87
|
-
getFileMetadataByPath = async (path) => {
|
|
88
|
-
const { fileName, fileType, folderPath } = path_utils_1.PathUtils.getPathFileData(path);
|
|
89
|
-
const parentFolder = await drive_folder_service_1.DriveFolderService.instance.getFolderMetadataByPath(folderPath);
|
|
90
|
-
const localFileDB = await drive_file_repository_1.FileRepository.instance.getByParentUuidNameAndType(parentFolder.uuid, fileName, fileType);
|
|
91
|
-
if (localFileDB) {
|
|
92
|
-
try {
|
|
93
|
-
const file = await this.getFileMetadata(localFileDB.uuid);
|
|
94
|
-
if (file) {
|
|
95
|
-
return file;
|
|
96
|
-
}
|
|
97
|
-
}
|
|
98
|
-
catch {
|
|
99
|
-
logger_utils_1.logger.error('File not found when getting file by path on local DB', { path });
|
|
100
|
-
}
|
|
101
|
-
}
|
|
102
|
-
return this.getByParentUuidAndName(parentFolder.uuid, fileName, fileType);
|
|
103
78
|
};
|
|
104
79
|
createThumbnail = (payload) => {
|
|
105
80
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
@@ -6,6 +6,7 @@ export declare class DriveFolderService {
|
|
|
6
6
|
static readonly instance: DriveFolderService;
|
|
7
7
|
getFolderMetaByUuid: (uuid: string) => Promise<DriveFolderItem>;
|
|
8
8
|
getFolderMetaById: (id: number) => Promise<DriveFolderItem>;
|
|
9
|
+
getFolderMetaByPath: (path: string) => Promise<DriveFolderItem>;
|
|
9
10
|
getFolderContent: (folderUuid: string) => Promise<{
|
|
10
11
|
folders: {
|
|
11
12
|
type: string;
|
|
@@ -58,7 +59,4 @@ export declare class DriveFolderService {
|
|
|
58
59
|
folderUuid: string;
|
|
59
60
|
name: string;
|
|
60
61
|
}) => Promise<void>;
|
|
61
|
-
getByParentUuidAndName: (parentUuid: string, name: string) => Promise<DriveFolderItem>;
|
|
62
|
-
getByPath: (path: string, parentUuid: string) => Promise<DriveFolderItem>;
|
|
63
|
-
getFolderMetadataByPath: (path: string) => Promise<DriveFolderItem>;
|
|
64
62
|
}
|
|
@@ -5,13 +5,7 @@ const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
|
5
5
|
const sdk_manager_service_1 = require("../sdk-manager.service");
|
|
6
6
|
const drive_utils_1 = require("../../utils/drive.utils");
|
|
7
7
|
const auth_service_1 = require("../auth.service");
|
|
8
|
-
const drive_folder_repository_1 = require("../database/drive-folder/drive-folder.repository");
|
|
9
|
-
const drive_folder_domain_1 = require("../database/drive-folder/drive-folder.domain");
|
|
10
|
-
const drive_file_repository_1 = require("../database/drive-file/drive-file.repository");
|
|
11
|
-
const drive_file_domain_1 = require("../database/drive-file/drive-file.domain");
|
|
12
8
|
const errors_utils_1 = require("../../utils/errors.utils");
|
|
13
|
-
const database_utils_1 = require("../../utils/database.utils");
|
|
14
|
-
const logger_utils_1 = require("../../utils/logger.utils");
|
|
15
9
|
class DriveFolderService {
|
|
16
10
|
static instance = new DriveFolderService();
|
|
17
11
|
getFolderMetaByUuid = async (uuid) => {
|
|
@@ -21,14 +15,21 @@ class DriveFolderService {
|
|
|
21
15
|
if (folderItem?.status !== types_1.FileStatus.EXISTS) {
|
|
22
16
|
throw new errors_utils_1.NotFoundError(`Folder with uuid ${uuid} not found`);
|
|
23
17
|
}
|
|
24
|
-
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
|
|
25
18
|
return folderItem;
|
|
26
19
|
};
|
|
27
20
|
getFolderMetaById = async (id) => {
|
|
28
21
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
29
22
|
const folderMeta = await storageClient.getFolderMetaById(id);
|
|
30
23
|
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
31
|
-
|
|
24
|
+
return folderItem;
|
|
25
|
+
};
|
|
26
|
+
getFolderMetaByPath = async (path) => {
|
|
27
|
+
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
28
|
+
const folderMeta = await storageClient.getFolderByPath(path);
|
|
29
|
+
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
30
|
+
if (folderItem.status !== types_1.FileStatus.EXISTS) {
|
|
31
|
+
throw new errors_utils_1.NotFoundError(`Folder with uuid ${folderItem.uuid} not found at path: ${path}`);
|
|
32
|
+
}
|
|
32
33
|
return folderItem;
|
|
33
34
|
};
|
|
34
35
|
getFolderContent = async (folderUuid) => {
|
|
@@ -61,16 +62,6 @@ class DriveFolderService {
|
|
|
61
62
|
folders = (await personalFolderContentPromise).folders;
|
|
62
63
|
}
|
|
63
64
|
folders = folders.filter((folder) => folder.status === types_1.FileStatus.EXISTS);
|
|
64
|
-
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate(folders.map((folder) => new drive_folder_domain_1.DriveFolder({
|
|
65
|
-
uuid: folder.uuid,
|
|
66
|
-
name: folder.plainName,
|
|
67
|
-
parentUuid: folder.parentUuid,
|
|
68
|
-
status: types_1.FileStatus.EXISTS,
|
|
69
|
-
createdAt: new Date(folder.createdAt),
|
|
70
|
-
updatedAt: new Date(folder.updatedAt),
|
|
71
|
-
creationTime: new Date(folder.creationTime ?? folder.createdAt),
|
|
72
|
-
modificationTime: new Date(folder.modificationTime ?? folder.updatedAt),
|
|
73
|
-
})));
|
|
74
65
|
if (folders.length > 0) {
|
|
75
66
|
return folders.concat(await this.getAllSubfolders(currentWorkspace, folderUuid, offset + folders.length));
|
|
76
67
|
}
|
|
@@ -92,21 +83,6 @@ class DriveFolderService {
|
|
|
92
83
|
}
|
|
93
84
|
files = files.filter((file) => file.status === types_1.FileStatus.EXISTS);
|
|
94
85
|
if (files.length > 0) {
|
|
95
|
-
await drive_file_repository_1.FileRepository.instance.deleteByParentUuid(folderUuid);
|
|
96
|
-
await drive_file_repository_1.FileRepository.instance.createOrUpdate(files.map((file) => new drive_file_domain_1.DriveFile({
|
|
97
|
-
uuid: file.uuid,
|
|
98
|
-
name: file.plainName,
|
|
99
|
-
type: file.type,
|
|
100
|
-
folderUuid: file.folderUuid,
|
|
101
|
-
status: types_1.FileStatus.EXISTS,
|
|
102
|
-
bucket: file.bucket,
|
|
103
|
-
size: Number(file.size ?? 0),
|
|
104
|
-
fileId: file.fileId,
|
|
105
|
-
createdAt: new Date(file.createdAt),
|
|
106
|
-
updatedAt: new Date(file.updatedAt),
|
|
107
|
-
creationTime: new Date(file.creationTime ?? file.createdAt),
|
|
108
|
-
modificationTime: new Date(file.modificationTime ?? file.updatedAt),
|
|
109
|
-
})));
|
|
110
86
|
return files.concat(await this.getAllSubfiles(currentWorkspace, folderUuid, offset + files.length));
|
|
111
87
|
}
|
|
112
88
|
else {
|
|
@@ -116,8 +92,6 @@ class DriveFolderService {
|
|
|
116
92
|
moveFolder = async (uuid, payload) => {
|
|
117
93
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
118
94
|
const folderMeta = await storageClient.moveFolderByUuid(uuid, payload);
|
|
119
|
-
const folderItem = drive_utils_1.DriveUtils.driveFolderMetaToItem(folderMeta);
|
|
120
|
-
await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
|
|
121
95
|
return folderMeta;
|
|
122
96
|
};
|
|
123
97
|
createFolder = async (payload) => {
|
|
@@ -138,58 +112,6 @@ class DriveFolderService {
|
|
|
138
112
|
renameFolder = async (payload) => {
|
|
139
113
|
const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
|
|
140
114
|
await storageClient.updateFolderNameWithUUID(payload);
|
|
141
|
-
await drive_folder_repository_1.FolderRepository.instance.updateByUuid(payload.folderUuid, { name: payload.name });
|
|
142
|
-
};
|
|
143
|
-
getByParentUuidAndName = async (parentUuid, name) => {
|
|
144
|
-
const subFolders = await this.getFolderSubfolders(parentUuid);
|
|
145
|
-
const folderMeta = subFolders.find((folder) => folder.plainName === name || folder.name === name);
|
|
146
|
-
if (folderMeta?.status !== types_1.FileStatus.EXISTS) {
|
|
147
|
-
throw new errors_utils_1.NotFoundError('Folder not found');
|
|
148
|
-
}
|
|
149
|
-
return {
|
|
150
|
-
itemType: 'folder',
|
|
151
|
-
name: folderMeta.plainName,
|
|
152
|
-
uuid: folderMeta.uuid,
|
|
153
|
-
parentUuid: folderMeta.parentUuid,
|
|
154
|
-
status: types_1.FileStatus.EXISTS,
|
|
155
|
-
createdAt: new Date(folderMeta.createdAt),
|
|
156
|
-
updatedAt: new Date(folderMeta.updatedAt),
|
|
157
|
-
creationTime: new Date(folderMeta.creationTime),
|
|
158
|
-
modificationTime: new Date(folderMeta.modificationTime),
|
|
159
|
-
bucket: folderMeta.bucket,
|
|
160
|
-
};
|
|
161
|
-
};
|
|
162
|
-
getByPath = async (path, parentUuid) => {
|
|
163
|
-
const onFound = async (uuid) => {
|
|
164
|
-
const folder = await this.getFolderMetaByUuid(uuid);
|
|
165
|
-
return folder;
|
|
166
|
-
};
|
|
167
|
-
const folder = await database_utils_1.DatabaseUtils.getFolderByPathGeneric({
|
|
168
|
-
path,
|
|
169
|
-
parentUuid,
|
|
170
|
-
onFound,
|
|
171
|
-
getByParentAndName: this.getByParentUuidAndName.bind(this),
|
|
172
|
-
});
|
|
173
|
-
if (!folder) {
|
|
174
|
-
throw new errors_utils_1.NotFoundError('Folder not found');
|
|
175
|
-
}
|
|
176
|
-
return folder;
|
|
177
|
-
};
|
|
178
|
-
getFolderMetadataByPath = async (path) => {
|
|
179
|
-
const rootFolderUuid = await auth_service_1.AuthService.instance.getCurrentRootFolder();
|
|
180
|
-
const localFolderDB = await drive_folder_repository_1.FolderRepository.instance.getByPath(path, rootFolderUuid);
|
|
181
|
-
if (localFolderDB) {
|
|
182
|
-
try {
|
|
183
|
-
const folder = await this.getFolderMetaByUuid(localFolderDB.uuid);
|
|
184
|
-
if (folder) {
|
|
185
|
-
return folder;
|
|
186
|
-
}
|
|
187
|
-
}
|
|
188
|
-
catch {
|
|
189
|
-
logger_utils_1.logger.error('Folder not found when getting folder by path on local DB', { path, rootFolderUuid });
|
|
190
|
-
}
|
|
191
|
-
}
|
|
192
|
-
return this.getByPath(path, rootFolderUuid);
|
|
193
115
|
};
|
|
194
116
|
}
|
|
195
117
|
exports.DriveFolderService = DriveFolderService;
|
|
@@ -0,0 +1,8 @@
|
|
|
1
|
+
import { DriveFileItem, DriveFolderItem } from '../../types/drive.types';
|
|
2
|
+
export declare class DriveItemService {
|
|
3
|
+
static readonly instance: DriveItemService;
|
|
4
|
+
private readonly tryGetFileByUuid;
|
|
5
|
+
private readonly tryGetFolderByUuid;
|
|
6
|
+
getFileByPath: (path: string) => Promise<DriveFileItem>;
|
|
7
|
+
getFolderByPath: (path: string) => Promise<DriveFolderItem>;
|
|
8
|
+
}
|
|
@@ -0,0 +1,98 @@
|
|
|
1
|
+
"use strict";
|
|
2
|
+
Object.defineProperty(exports, "__esModule", { value: true });
|
|
3
|
+
exports.DriveItemService = void 0;
|
|
4
|
+
const drive_item_repository_1 = require("../database/drive-item/drive-item.repository");
|
|
5
|
+
const errors_utils_1 = require("../../utils/errors.utils");
|
|
6
|
+
const logger_utils_1 = require("../../utils/logger.utils");
|
|
7
|
+
const drive_file_service_1 = require("./drive-file.service");
|
|
8
|
+
const drive_folder_service_1 = require("./drive-folder.service");
|
|
9
|
+
class DriveItemService {
|
|
10
|
+
static instance = new DriveItemService();
|
|
11
|
+
tryGetFileByUuid = async (cached, path) => {
|
|
12
|
+
try {
|
|
13
|
+
const item = await drive_file_service_1.DriveFileService.instance.getFileMetadata(cached.uuid);
|
|
14
|
+
await drive_item_repository_1.DriveItemRepository.instance.createOrUpdate([
|
|
15
|
+
{
|
|
16
|
+
uuid: cached.uuid,
|
|
17
|
+
path,
|
|
18
|
+
type: 'file',
|
|
19
|
+
createdAt: cached.createdAt,
|
|
20
|
+
updatedAt: new Date(),
|
|
21
|
+
},
|
|
22
|
+
]);
|
|
23
|
+
return item;
|
|
24
|
+
}
|
|
25
|
+
catch {
|
|
26
|
+
logger_utils_1.logger.warn('File metadata by uuid failed, falling back to path lookup', { path, uuid: cached.uuid });
|
|
27
|
+
await drive_item_repository_1.DriveItemRepository.instance.delete([cached.uuid]);
|
|
28
|
+
}
|
|
29
|
+
};
|
|
30
|
+
tryGetFolderByUuid = async (cached, path) => {
|
|
31
|
+
try {
|
|
32
|
+
const item = await drive_folder_service_1.DriveFolderService.instance.getFolderMetaByUuid(cached.uuid);
|
|
33
|
+
await drive_item_repository_1.DriveItemRepository.instance.createOrUpdate([
|
|
34
|
+
{
|
|
35
|
+
uuid: cached.uuid,
|
|
36
|
+
path,
|
|
37
|
+
type: 'folder',
|
|
38
|
+
createdAt: cached.createdAt,
|
|
39
|
+
updatedAt: new Date(),
|
|
40
|
+
},
|
|
41
|
+
]);
|
|
42
|
+
return item;
|
|
43
|
+
}
|
|
44
|
+
catch {
|
|
45
|
+
logger_utils_1.logger.warn('Folder metadata by uuid failed, falling back to path lookup', { path, uuid: cached.uuid });
|
|
46
|
+
await drive_item_repository_1.DriveItemRepository.instance.delete([cached.uuid]);
|
|
47
|
+
}
|
|
48
|
+
};
|
|
49
|
+
getFileByPath = async (path) => {
|
|
50
|
+
const cached = await drive_item_repository_1.DriveItemRepository.instance.getByPath(path);
|
|
51
|
+
if (cached) {
|
|
52
|
+
const item = await this.tryGetFileByUuid(cached, path);
|
|
53
|
+
if (item)
|
|
54
|
+
return item;
|
|
55
|
+
}
|
|
56
|
+
try {
|
|
57
|
+
const item = await drive_file_service_1.DriveFileService.instance.getFileMetadataByPath(path);
|
|
58
|
+
await drive_item_repository_1.DriveItemRepository.instance.createOrUpdate([
|
|
59
|
+
{
|
|
60
|
+
uuid: item.uuid,
|
|
61
|
+
path,
|
|
62
|
+
type: 'file',
|
|
63
|
+
createdAt: new Date(),
|
|
64
|
+
updatedAt: new Date(),
|
|
65
|
+
},
|
|
66
|
+
]);
|
|
67
|
+
return item;
|
|
68
|
+
}
|
|
69
|
+
catch {
|
|
70
|
+
throw new errors_utils_1.NotFoundError(`File not found at path: ${path}`);
|
|
71
|
+
}
|
|
72
|
+
};
|
|
73
|
+
getFolderByPath = async (path) => {
|
|
74
|
+
const cached = await drive_item_repository_1.DriveItemRepository.instance.getByPath(path);
|
|
75
|
+
if (cached) {
|
|
76
|
+
const item = await this.tryGetFolderByUuid(cached, path);
|
|
77
|
+
if (item)
|
|
78
|
+
return item;
|
|
79
|
+
}
|
|
80
|
+
try {
|
|
81
|
+
const item = await drive_folder_service_1.DriveFolderService.instance.getFolderMetaByPath(path);
|
|
82
|
+
await drive_item_repository_1.DriveItemRepository.instance.createOrUpdate([
|
|
83
|
+
{
|
|
84
|
+
uuid: item.uuid,
|
|
85
|
+
path,
|
|
86
|
+
type: 'folder',
|
|
87
|
+
createdAt: new Date(),
|
|
88
|
+
updatedAt: new Date(),
|
|
89
|
+
},
|
|
90
|
+
]);
|
|
91
|
+
return item;
|
|
92
|
+
}
|
|
93
|
+
catch {
|
|
94
|
+
throw new errors_utils_1.NotFoundError(`Folder not found at path: ${path}`);
|
|
95
|
+
}
|
|
96
|
+
};
|
|
97
|
+
}
|
|
98
|
+
exports.DriveItemService = DriveItemService;
|
|
@@ -3,19 +3,17 @@ import { Environment } from '@internxt/inxt-js';
|
|
|
3
3
|
import { Readable } from 'node:stream';
|
|
4
4
|
import { DownloadOptions } from '../../types/network.types';
|
|
5
5
|
import { RangeOptions } from '../../utils/network.utils';
|
|
6
|
-
import { EncryptProgressCallback } from '@internxt/inxt-js/build/lib/core';
|
|
7
6
|
export declare class NetworkFacade {
|
|
8
7
|
private readonly network;
|
|
9
8
|
private readonly environment;
|
|
10
9
|
private readonly cryptoLib;
|
|
11
10
|
constructor(network: Network.Network, environment: Environment);
|
|
12
11
|
downloadToStream: (bucketId: string, mnemonic: string, fileId: string, size: number, to: WritableStream, rangeOptions?: RangeOptions, options?: DownloadOptions) => Promise<[Promise<void>, AbortController]>;
|
|
13
|
-
uploadFile: ({ from, size, bucketId, progressCallback, abortSignal,
|
|
12
|
+
uploadFile: ({ from, size, bucketId, progressCallback, abortSignal, }: {
|
|
14
13
|
from: Readable;
|
|
15
14
|
size: number;
|
|
16
15
|
bucketId: string;
|
|
17
16
|
progressCallback: (progress: number) => void;
|
|
18
17
|
abortSignal?: AbortSignal;
|
|
19
|
-
encryptProgressCallback?: EncryptProgressCallback;
|
|
20
18
|
}) => Promise<string>;
|
|
21
19
|
}
|
|
@@ -36,12 +36,12 @@ Object.defineProperty(exports, "__esModule", { value: true });
|
|
|
36
36
|
exports.NetworkFacade = void 0;
|
|
37
37
|
const sdk_1 = require("@internxt/sdk");
|
|
38
38
|
const NetworkDownload = __importStar(require("@internxt/sdk/dist/network/download"));
|
|
39
|
-
const
|
|
39
|
+
const crypto_1 = require("@internxt/inxt-js/build/lib/utils/crypto");
|
|
40
40
|
const node_crypto_1 = require("node:crypto");
|
|
41
41
|
const crypto_service_1 = require("../crypto.service");
|
|
42
42
|
const download_service_1 = require("./download.service");
|
|
43
43
|
const validation_service_1 = require("../validation.service");
|
|
44
|
-
const
|
|
44
|
+
const upload_utils_1 = require("../../utils/upload.utils");
|
|
45
45
|
class NetworkFacade {
|
|
46
46
|
network;
|
|
47
47
|
environment;
|
|
@@ -55,7 +55,7 @@ class NetworkFacade {
|
|
|
55
55
|
return validation_service_1.ValidationService.instance.validateMnemonic(mnemonic);
|
|
56
56
|
},
|
|
57
57
|
generateFileKey: (mnemonic, bucketId, index) => {
|
|
58
|
-
return
|
|
58
|
+
return (0, crypto_1.GenerateFileKey)(mnemonic, bucketId, index);
|
|
59
59
|
},
|
|
60
60
|
randomBytes: node_crypto_1.randomBytes,
|
|
61
61
|
};
|
|
@@ -99,16 +99,13 @@ class NetworkFacade {
|
|
|
99
99
|
};
|
|
100
100
|
return [downloadOperation(), abortable];
|
|
101
101
|
};
|
|
102
|
-
uploadFile = ({ from, size, bucketId, progressCallback, abortSignal,
|
|
103
|
-
|
|
104
|
-
throw new Error('File is too big (more than 40 GB)');
|
|
105
|
-
}
|
|
102
|
+
uploadFile = async ({ from, size, bucketId, progressCallback, abortSignal, }) => {
|
|
103
|
+
await upload_utils_1.UploadUtils.checkUploadSizeLimits(size);
|
|
106
104
|
return this.environment.upload(bucketId, {
|
|
107
105
|
source: from,
|
|
108
106
|
fileSize: size,
|
|
109
107
|
progressCallback,
|
|
110
108
|
abortSignal,
|
|
111
|
-
encryptProgressCallback,
|
|
112
109
|
});
|
|
113
110
|
};
|
|
114
111
|
}
|
|
@@ -10,6 +10,7 @@ const promises_1 = require("node:fs/promises");
|
|
|
10
10
|
const types_1 = require("@internxt/sdk/dist/drive/storage/types");
|
|
11
11
|
const cli_utils_1 = require("../../../utils/cli.utils");
|
|
12
12
|
const thumbnail_service_1 = require("../../thumbnail.service");
|
|
13
|
+
const format_utils_1 = require("../../../utils/format.utils");
|
|
13
14
|
class UploadFileService {
|
|
14
15
|
static instance = new UploadFileService();
|
|
15
16
|
uploadFilesConcurrently = async ({ network, filesToUpload, folderMap, bucket, destinationFolderUuid, currentProgress, emitProgress, debugMode, reporter, }) => {
|
|
@@ -99,7 +100,7 @@ class UploadFileService {
|
|
|
99
100
|
if (debugMode) {
|
|
100
101
|
const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
|
|
101
102
|
const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(stats.size, timings.networkUpload);
|
|
102
|
-
cli_utils_1.CLIUtils.success(reporter, `Uploaded '${file.name}' (${
|
|
103
|
+
cli_utils_1.CLIUtils.success(reporter, `Uploaded '${file.name}' (${format_utils_1.FormatUtils.humanFileSize(stats.size)})`);
|
|
103
104
|
cli_utils_1.CLIUtils.log(reporter, 'Timing breakdown:\n' +
|
|
104
105
|
`Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)}` +
|
|
105
106
|
` (${throughputMBps.toFixed(2)} MB/s)\n` +
|
|
@@ -53,7 +53,7 @@ class ThumbnailService {
|
|
|
53
53
|
getThumbnailFromImageBuffer = async (buffer) => {
|
|
54
54
|
const sharp = await getSharp();
|
|
55
55
|
if (sharp) {
|
|
56
|
-
return sharp(buffer, {
|
|
56
|
+
return sharp(buffer, { failOn: 'none' })
|
|
57
57
|
.resize({
|
|
58
58
|
height: thumbnail_utils_1.ThumbnailConfig.MaxHeight,
|
|
59
59
|
width: thumbnail_utils_1.ThumbnailConfig.MaxWidth,
|
|
@@ -68,7 +68,7 @@ class ThumbnailService {
|
|
|
68
68
|
tryUploadThumbnail = async ({ bufferStream, fileType, bucket, fileUuid, networkFacade, size, }) => {
|
|
69
69
|
try {
|
|
70
70
|
const thumbnailBuffer = bufferStream?.getBuffer();
|
|
71
|
-
if (thumbnailBuffer) {
|
|
71
|
+
if (thumbnailBuffer && size > 0) {
|
|
72
72
|
await async_utils_1.AsyncUtils.withTimeout(ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, bucket, fileUuid, networkFacade, size), ThumbnailService.MAX_THUMBNAIL_TIMEOUT, 'Thumbnail upload timeout');
|
|
73
73
|
}
|
|
74
74
|
}
|
|
@@ -1,6 +1,8 @@
|
|
|
1
|
+
import { StorageTypes } from '@internxt/sdk/dist/drive/storage';
|
|
1
2
|
export declare class UsageService {
|
|
2
3
|
static readonly instance: UsageService;
|
|
3
4
|
static readonly INFINITE_LIMIT: number;
|
|
4
5
|
fetchUsage: () => Promise<number>;
|
|
5
6
|
fetchSpaceLimit: () => Promise<number>;
|
|
7
|
+
fetchLimits: () => Promise<StorageTypes.FileLimitsResponse>;
|
|
6
8
|
}
|