@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.
Files changed (74) hide show
  1. package/README.md +32 -32
  2. package/dist/commands/login-legacy.js +2 -0
  3. package/dist/commands/login.js +2 -0
  4. package/dist/commands/upload-file.js +25 -36
  5. package/dist/services/auth.service.js +10 -1
  6. package/dist/services/cache.service.d.ts +13 -0
  7. package/dist/services/cache.service.js +36 -0
  8. package/dist/services/config.service.js +19 -3
  9. package/dist/services/database/database.service.d.ts +1 -1
  10. package/dist/services/database/database.service.js +6 -5
  11. package/dist/services/database/drive-item/drive-item.attributes.d.ts +7 -0
  12. package/dist/services/database/drive-item/drive-item.domain.d.ts +10 -0
  13. package/dist/services/database/drive-item/drive-item.domain.js +27 -0
  14. package/dist/services/database/drive-item/drive-item.model.d.ts +8 -0
  15. package/dist/services/database/{drive-folder/drive-folder.model.js → drive-item/drive-item.model.js} +11 -23
  16. package/dist/services/database/drive-item/drive-item.repository.d.ts +12 -0
  17. package/dist/services/database/drive-item/drive-item.repository.js +88 -0
  18. package/dist/services/drive/drive-file.service.d.ts +2 -3
  19. package/dist/services/drive/drive-file.service.js +9 -34
  20. package/dist/services/drive/drive-folder.service.d.ts +1 -3
  21. package/dist/services/drive/drive-folder.service.js +9 -87
  22. package/dist/services/drive/drive-item.service.d.ts +8 -0
  23. package/dist/services/drive/drive-item.service.js +98 -0
  24. package/dist/services/network/network-facade.service.d.ts +7 -2
  25. package/dist/services/network/network-facade.service.js +11 -25
  26. package/dist/services/network/upload/upload-file.service.js +7 -8
  27. package/dist/services/thumbnail.service.js +7 -9
  28. package/dist/services/usage.service.d.ts +2 -0
  29. package/dist/services/usage.service.js +18 -0
  30. package/dist/utils/cli.utils.d.ts +3 -2
  31. package/dist/utils/cli.utils.js +22 -18
  32. package/dist/utils/format.utils.js +3 -2
  33. package/dist/utils/upload.utils.d.ts +19 -0
  34. package/dist/utils/upload.utils.js +40 -0
  35. package/dist/utils/webdav.utils.d.ts +4 -1
  36. package/dist/utils/webdav.utils.js +33 -18
  37. package/dist/utils/xml.utils.d.ts +1 -1
  38. package/dist/utils/xml.utils.js +5 -1
  39. package/dist/webdav/handlers/DELETE.handler.js +3 -17
  40. package/dist/webdav/handlers/LOCK.handler.d.ts +5 -0
  41. package/dist/webdav/handlers/LOCK.handler.js +50 -0
  42. package/dist/webdav/handlers/MKCOL.handler.js +15 -3
  43. package/dist/webdav/handlers/MOVE.handler.js +11 -0
  44. package/dist/webdav/handlers/OPTIONS.handler.js +4 -4
  45. package/dist/webdav/handlers/PROPFIND.handler.js +30 -9
  46. package/dist/webdav/handlers/PUT.handler.js +59 -59
  47. package/dist/webdav/handlers/UNLOCK.handler.d.ts +5 -0
  48. package/dist/webdav/handlers/UNLOCK.handler.js +12 -0
  49. package/dist/webdav/middewares/auth.middleware.js +9 -2
  50. package/dist/webdav/middewares/errors.middleware.js +2 -0
  51. package/dist/webdav/middewares/request-logger.middleware.js +10 -6
  52. package/dist/webdav/middewares/webdav-auth.middleware.js +0 -3
  53. package/dist/webdav/webdav-server.js +4 -0
  54. package/oclif.manifest.json +1 -1
  55. package/package.json +47 -46
  56. package/dist/services/database/drive-file/drive-file.attributes.d.ts +0 -14
  57. package/dist/services/database/drive-file/drive-file.domain.d.ts +0 -20
  58. package/dist/services/database/drive-file/drive-file.domain.js +0 -68
  59. package/dist/services/database/drive-file/drive-file.model.d.ts +0 -15
  60. package/dist/services/database/drive-file/drive-file.model.js +0 -67
  61. package/dist/services/database/drive-file/drive-file.repository.d.ts +0 -11
  62. package/dist/services/database/drive-file/drive-file.repository.js +0 -63
  63. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +0 -10
  64. package/dist/services/database/drive-folder/drive-folder.attributes.js +0 -2
  65. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +0 -16
  66. package/dist/services/database/drive-folder/drive-folder.domain.js +0 -53
  67. package/dist/services/database/drive-folder/drive-folder.model.d.ts +0 -11
  68. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +0 -13
  69. package/dist/services/database/drive-folder/drive-folder.repository.js +0 -99
  70. package/dist/types/fast-xml-parser.types.d.ts +0 -59
  71. package/dist/types/fast-xml-parser.types.js +0 -2
  72. package/dist/utils/database.utils.d.ts +0 -11
  73. package/dist/utils/database.utils.js +0 -26
  74. /package/dist/services/database/{drive-file/drive-file.attributes.js → drive-item/drive-item.attributes.js} +0 -0
@@ -0,0 +1,8 @@
1
+ import { DriveItemAttributes } from './drive-item.attributes';
2
+ export declare class DriveItemModel implements DriveItemAttributes {
3
+ uuid: string;
4
+ path: string;
5
+ type: 'file' | 'folder';
6
+ createdAt: Date;
7
+ updatedAt: Date;
8
+ }
@@ -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.DriveFolderModel = void 0;
12
+ exports.DriveItemModel = void 0;
13
13
  const typeorm_1 = require("typeorm");
14
- let DriveFolderModel = class DriveFolderModel {
14
+ let DriveItemModel = class DriveItemModel {
15
15
  };
16
- exports.DriveFolderModel = DriveFolderModel;
16
+ exports.DriveItemModel = DriveItemModel;
17
17
  __decorate([
18
18
  (0, typeorm_1.PrimaryColumn)({ nullable: false, type: 'varchar' }),
19
19
  __metadata("design:type", String)
20
- ], DriveFolderModel.prototype, "uuid", void 0);
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
- ], DriveFolderModel.prototype, "name", void 0);
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
- ], DriveFolderModel.prototype, "status", void 0);
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
- ], DriveFolderModel.prototype, "creationTime", void 0);
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
- ], DriveFolderModel.prototype, "modificationTime", void 0);
49
- exports.DriveFolderModel = DriveFolderModel = __decorate([
50
- (0, typeorm_1.Entity)('drive_folder')
51
- ], DriveFolderModel);
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
- await drive_file_repository_1.FileRepository.instance.createOrUpdate([driveFileItem]);
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
- await drive_folder_repository_1.FolderRepository.instance.createOrUpdate([folderItem]);
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,12 +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 { ActionState } from '@internxt/inxt-js/build/api';
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: Readable, size: number, bucketId: string, finishedCallback: (err: Error | null, res: string | null) => void, progressCallback: (progress: number) => void) => ActionState;
12
+ uploadFile: ({ from, size, bucketId, progressCallback, abortSignal, }: {
13
+ from: Readable;
14
+ size: number;
15
+ bucketId: string;
16
+ progressCallback: (progress: number) => void;
17
+ abortSignal?: AbortSignal;
18
+ }) => Promise<string>;
14
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 inxt_js_1 = require("@internxt/inxt-js");
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 TWENTY_GIGABYTES = 20 * 1024 * 1024 * 1024;
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 inxt_js_1.Environment.utils.generateFileKey(mnemonic, bucketId, index);
58
+ return (0, crypto_1.GenerateFileKey)(mnemonic, bucketId, index);
59
59
  },
60
60
  randomBytes: node_crypto_1.randomBytes,
61
61
  };
@@ -99,28 +99,14 @@ class NetworkFacade {
99
99
  };
100
100
  return [downloadOperation(), abortable];
101
101
  };
102
- uploadFile = (from, size, bucketId, finishedCallback, progressCallback) => {
103
- if (size > TWENTY_GIGABYTES) {
104
- throw new Error('File is too big (more than 20 GB)');
105
- }
106
- const minimumMultipartThreshold = 100 * 1024 * 1024;
107
- const useMultipart = size > minimumMultipartThreshold;
108
- if (useMultipart) {
109
- return this.environment.uploadMultipartFile(bucketId, {
110
- source: from,
111
- fileSize: size,
112
- finishedCallback,
113
- progressCallback,
114
- });
115
- }
116
- else {
117
- return this.environment.upload(bucketId, {
118
- source: from,
119
- fileSize: size,
120
- finishedCallback,
121
- progressCallback,
122
- });
123
- }
102
+ uploadFile = async ({ from, size, bucketId, progressCallback, abortSignal, }) => {
103
+ await upload_utils_1.UploadUtils.checkUploadSizeLimits(size);
104
+ return this.environment.upload(bucketId, {
105
+ source: from,
106
+ fileSize: size,
107
+ progressCallback,
108
+ abortSignal,
109
+ });
124
110
  };
125
111
  }
126
112
  exports.NetworkFacade = NetworkFacade;
@@ -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, }) => {
@@ -63,13 +64,11 @@ class UploadFileService {
63
64
  });
64
65
  const uploadTimer = cli_utils_1.CLIUtils.timer();
65
66
  thumbnailStream = bufferStream;
66
- fileId = await new Promise((resolve, reject) => {
67
- network.uploadFile(fileStream, fileSize, bucket, (err, res) => {
68
- if (err) {
69
- return reject(err);
70
- }
71
- resolve(res);
72
- }, () => { });
67
+ fileId = await network.uploadFile({
68
+ from: fileStream,
69
+ size: fileSize,
70
+ bucketId: bucket,
71
+ progressCallback: () => { },
73
72
  });
74
73
  timings.networkUpload = uploadTimer.stop();
75
74
  }
@@ -101,7 +100,7 @@ class UploadFileService {
101
100
  if (debugMode) {
102
101
  const totalTime = Object.values(timings).reduce((sum, time) => sum + time, 0);
103
102
  const throughputMBps = cli_utils_1.CLIUtils.calculateThroughputMBps(stats.size, timings.networkUpload);
104
- cli_utils_1.CLIUtils.success(reporter, `Uploaded '${file.name}' (${cli_utils_1.CLIUtils.formatBytesToString(stats.size)})`);
103
+ cli_utils_1.CLIUtils.success(reporter, `Uploaded '${file.name}' (${format_utils_1.FormatUtils.humanFileSize(stats.size)})`);
105
104
  cli_utils_1.CLIUtils.log(reporter, 'Timing breakdown:\n' +
106
105
  `Network upload: ${cli_utils_1.CLIUtils.formatDuration(timings.networkUpload)}` +
107
106
  ` (${throughputMBps.toFixed(2)} MB/s)\n` +