@internxt/cli 1.2.2 → 1.3.1

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (92) hide show
  1. package/.env +3 -1
  2. package/README.md +405 -26
  3. package/dist/commands/config.js +1 -1
  4. package/dist/commands/create-folder.js +1 -1
  5. package/dist/commands/list.js +1 -2
  6. package/dist/commands/{move.d.ts → move-file.d.ts} +5 -4
  7. package/dist/commands/move-file.js +84 -0
  8. package/dist/commands/move-folder.d.ts +19 -0
  9. package/dist/commands/move-folder.js +84 -0
  10. package/dist/commands/rename.d.ts +18 -0
  11. package/dist/commands/{move.js → rename.js} +29 -29
  12. package/dist/commands/trash-clear.d.ts +15 -0
  13. package/dist/commands/trash-clear.js +64 -0
  14. package/dist/commands/trash-list.d.ts +20 -0
  15. package/dist/commands/trash-list.js +95 -0
  16. package/dist/commands/trash-restore-file.d.ts +19 -0
  17. package/dist/commands/trash-restore-file.js +87 -0
  18. package/dist/commands/trash-restore-folder.d.ts +19 -0
  19. package/dist/commands/trash-restore-folder.js +87 -0
  20. package/dist/commands/webdav-config.d.ts +17 -0
  21. package/dist/commands/webdav-config.js +91 -0
  22. package/dist/commands/webdav.d.ts +1 -1
  23. package/dist/commands/webdav.js +5 -2
  24. package/dist/database/migrations/20241018114828-add-parent-column.d.ts +1 -0
  25. package/dist/database/migrations/20241018114828-add-parent-column.js +24 -0
  26. package/dist/hooks/prerun/auth_check.js +2 -1
  27. package/dist/services/analytics.service.d.ts +9 -6
  28. package/dist/services/analytics.service.js +2 -35
  29. package/dist/services/config.service.d.ts +6 -1
  30. package/dist/services/config.service.js +24 -0
  31. package/dist/services/crypto.service.js +9 -1
  32. package/dist/services/database/drive-database-manager.service.d.ts +10 -7
  33. package/dist/services/database/drive-database-manager.service.js +34 -24
  34. package/dist/services/database/drive-file/drive-file.attributes.d.ts +1 -0
  35. package/dist/services/database/drive-file/drive-file.domain.d.ts +4 -1
  36. package/dist/services/database/drive-file/drive-file.domain.js +21 -1
  37. package/dist/services/database/drive-file/drive-file.model.d.ts +1 -0
  38. package/dist/services/database/drive-file/drive-file.model.js +4 -0
  39. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +1 -0
  40. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +4 -1
  41. package/dist/services/database/drive-folder/drive-folder.domain.js +18 -1
  42. package/dist/services/database/drive-folder/drive-folder.model.d.ts +1 -0
  43. package/dist/services/database/drive-folder/drive-folder.model.js +5 -0
  44. package/dist/services/drive/drive-file.service.d.ts +5 -0
  45. package/dist/services/drive/drive-file.service.js +10 -0
  46. package/dist/services/drive/drive-folder.service.d.ts +7 -2
  47. package/dist/services/drive/drive-folder.service.js +16 -0
  48. package/dist/services/drive/trash.service.d.ts +7 -0
  49. package/dist/services/drive/trash.service.js +30 -0
  50. package/dist/services/network/upload.service.js +5 -1
  51. package/dist/services/sdk-manager.service.d.ts +1 -2
  52. package/dist/services/sdk-manager.service.js +0 -5
  53. package/dist/services/usage.service.d.ts +2 -1
  54. package/dist/services/usage.service.js +3 -7
  55. package/dist/services/validation.service.d.ts +2 -0
  56. package/dist/services/validation.service.js +6 -0
  57. package/dist/types/command.types.d.ts +16 -0
  58. package/dist/types/command.types.js +29 -1
  59. package/dist/types/config.types.d.ts +0 -1
  60. package/dist/types/drive.types.d.ts +2 -1
  61. package/dist/types/network.types.d.ts +5 -0
  62. package/dist/types/webdav.types.d.ts +1 -0
  63. package/dist/utils/cli.utils.d.ts +1 -1
  64. package/dist/utils/drive.utils.js +3 -1
  65. package/dist/utils/network.utils.d.ts +3 -9
  66. package/dist/utils/network.utils.js +21 -7
  67. package/dist/utils/webdav.utils.d.ts +16 -2
  68. package/dist/utils/webdav.utils.js +70 -19
  69. package/dist/utils/xml.utils.d.ts +1 -0
  70. package/dist/utils/xml.utils.js +3 -0
  71. package/dist/webdav/handlers/DELETE.handler.d.ts +5 -1
  72. package/dist/webdav/handlers/DELETE.handler.js +15 -12
  73. package/dist/webdav/handlers/GET.handler.d.ts +1 -2
  74. package/dist/webdav/handlers/GET.handler.js +10 -13
  75. package/dist/webdav/handlers/HEAD.handler.d.ts +1 -1
  76. package/dist/webdav/handlers/HEAD.handler.js +2 -2
  77. package/dist/webdav/handlers/MKCOL.handler.d.ts +1 -1
  78. package/dist/webdav/handlers/MKCOL.handler.js +15 -16
  79. package/dist/webdav/handlers/MOVE.handler.d.ts +11 -1
  80. package/dist/webdav/handlers/MOVE.handler.js +73 -2
  81. package/dist/webdav/handlers/OPTIONS.handler.d.ts +1 -1
  82. package/dist/webdav/handlers/OPTIONS.handler.js +2 -2
  83. package/dist/webdav/handlers/PROPFIND.handler.d.ts +11 -12
  84. package/dist/webdav/handlers/PROPFIND.handler.js +62 -76
  85. package/dist/webdav/handlers/PUT.handler.d.ts +5 -8
  86. package/dist/webdav/handlers/PUT.handler.js +34 -18
  87. package/dist/webdav/middewares/request-logger.middleware.js +1 -1
  88. package/dist/webdav/webdav-server.d.ts +14 -14
  89. package/dist/webdav/webdav-server.js +31 -14
  90. package/oclif.manifest.json +441 -8
  91. package/package.json +22 -26
  92. package/scripts/add-cert.sh +19 -5
@@ -43,6 +43,10 @@ __decorate([
43
43
  (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.INTEGER),
44
44
  __metadata("design:type", Number)
45
45
  ], DriveFileModel.prototype, "folderId", void 0);
46
+ __decorate([
47
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.UUIDV4),
48
+ __metadata("design:type", String)
49
+ ], DriveFileModel.prototype, "folderUuid", void 0);
46
50
  __decorate([
47
51
  (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.STRING(24)),
48
52
  __metadata("design:type", String)
@@ -5,6 +5,7 @@ export interface DriveFolderAttributes {
5
5
  status: 'EXISTS' | 'TRASHED';
6
6
  relativePath: string;
7
7
  parentId: number | null;
8
+ parentUuid: string | null;
8
9
  createdAt: Date;
9
10
  updatedAt: Date;
10
11
  }
@@ -1,3 +1,4 @@
1
+ import { DriveFolderItem } from '../../../types/drive.types';
1
2
  import { DriveFolderAttributes } from './drive-folder.attributes';
2
3
  export declare class DriveFolder implements DriveFolderAttributes {
3
4
  id: number;
@@ -5,10 +6,12 @@ export declare class DriveFolder implements DriveFolderAttributes {
5
6
  uuid: string;
6
7
  relativePath: string;
7
8
  parentId: number | null;
9
+ parentUuid: string | null;
8
10
  createdAt: Date;
9
11
  updatedAt: Date;
10
12
  status: DriveFolderAttributes['status'];
11
- constructor({ id, name, uuid, relativePath, parentId, createdAt, updatedAt, status }: DriveFolderAttributes);
13
+ constructor({ id, name, uuid, relativePath, parentId, parentUuid, createdAt, updatedAt, status, }: DriveFolderAttributes);
12
14
  static build(folder: DriveFolderAttributes): DriveFolder;
13
15
  toJSON(): DriveFolderAttributes;
16
+ toItem(): DriveFolderItem;
14
17
  }
@@ -7,15 +7,17 @@ class DriveFolder {
7
7
  uuid;
8
8
  relativePath;
9
9
  parentId;
10
+ parentUuid;
10
11
  createdAt;
11
12
  updatedAt;
12
13
  status;
13
- constructor({ id, name, uuid, relativePath, parentId, createdAt, updatedAt, status }) {
14
+ constructor({ id, name, uuid, relativePath, parentId, parentUuid, createdAt, updatedAt, status, }) {
14
15
  this.id = id;
15
16
  this.name = name;
16
17
  this.uuid = uuid;
17
18
  this.relativePath = relativePath;
18
19
  this.parentId = parentId;
20
+ this.parentUuid = parentUuid;
19
21
  this.createdAt = createdAt;
20
22
  this.updatedAt = updatedAt;
21
23
  this.status = status;
@@ -31,9 +33,24 @@ class DriveFolder {
31
33
  status: this.status,
32
34
  relativePath: this.relativePath,
33
35
  parentId: this.parentId,
36
+ parentUuid: this.parentUuid,
34
37
  createdAt: this.createdAt,
35
38
  updatedAt: this.updatedAt,
36
39
  };
37
40
  }
41
+ toItem() {
42
+ return {
43
+ id: this.id,
44
+ name: this.name,
45
+ uuid: this.uuid,
46
+ status: this.status,
47
+ parentId: this.parentId,
48
+ parentUuid: this.parentUuid,
49
+ createdAt: this.createdAt,
50
+ updatedAt: this.updatedAt,
51
+ encryptedName: '',
52
+ bucket: null,
53
+ };
54
+ }
38
55
  }
39
56
  exports.DriveFolder = DriveFolder;
@@ -7,6 +7,7 @@ export declare class DriveFolderModel extends Model implements DriveFolderAttrib
7
7
  uuid: string;
8
8
  relativePath: string;
9
9
  parentId: number | null;
10
+ parentUuid: string | null;
10
11
  createdAt: Date;
11
12
  updatedAt: Date;
12
13
  }
@@ -43,6 +43,11 @@ __decorate([
43
43
  (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.INTEGER),
44
44
  __metadata("design:type", Object)
45
45
  ], DriveFolderModel.prototype, "parentId", void 0);
46
+ __decorate([
47
+ sequelize_typescript_1.AllowNull,
48
+ (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.UUIDV4),
49
+ __metadata("design:type", Object)
50
+ ], DriveFolderModel.prototype, "parentUuid", void 0);
46
51
  __decorate([
47
52
  (0, sequelize_typescript_1.Column)(sequelize_typescript_1.DataType.DATE),
48
53
  __metadata("design:type", Date)
@@ -12,4 +12,9 @@ export declare class DriveFileService {
12
12
  }) => Promise<DriveFileItem>;
13
13
  getFileMetadata: (uuid: string) => Promise<DriveFileItem>;
14
14
  moveFile: (payload: StorageTypes.MoveFileUuidPayload) => Promise<StorageTypes.FileMeta>;
15
+ renameFile: (fileUuid: string, payload: {
16
+ plainName?: string;
17
+ type?: string | null;
18
+ }) => Promise<void>;
19
+ getFileMetadataByPath: (path: string) => Promise<DriveFileItem>;
15
20
  }
@@ -35,6 +35,7 @@ class DriveFileService {
35
35
  type: payload.type,
36
36
  status: driveFile.status,
37
37
  folderId: driveFile.folderId,
38
+ folderUuid: driveFile.folderUuid,
38
39
  };
39
40
  };
40
41
  getFileMetadata = async (uuid) => {
@@ -47,5 +48,14 @@ class DriveFileService {
47
48
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
48
49
  return storageClient.moveFileByUuid(payload);
49
50
  };
51
+ renameFile = (fileUuid, payload) => {
52
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
53
+ return storageClient.updateFileMetaByUUID(fileUuid, payload);
54
+ };
55
+ getFileMetadataByPath = async (path) => {
56
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
57
+ const fileMetadata = await storageClient.getFileByPath(encodeURIComponent(path));
58
+ return drive_utils_1.DriveUtils.driveFileMetaToItem(fileMetadata);
59
+ };
50
60
  }
51
61
  exports.DriveFileService = DriveFileService;
@@ -10,11 +10,16 @@ export declare class DriveFolderService {
10
10
  folders: FetchPaginatedFolder[];
11
11
  files: FetchPaginatedFile[];
12
12
  }>;
13
- private getAllSubfolders;
14
- private getAllSubfiles;
13
+ private readonly getAllSubfolders;
14
+ private readonly getAllSubfiles;
15
15
  moveFolder: (payload: StorageTypes.MoveFolderUuidPayload) => Promise<StorageTypes.FolderMeta>;
16
16
  createFolder(payload: {
17
17
  folderName: string;
18
18
  parentFolderId: number;
19
19
  }): [Promise<StorageTypes.CreateFolderResponse>, RequestCanceler];
20
+ renameFolder: (payload: {
21
+ folderUuid: string;
22
+ name: string;
23
+ }) => Promise<void>;
24
+ getFolderMetadataByPath: (path: string) => Promise<DriveFolderItem>;
20
25
  }
@@ -52,5 +52,21 @@ class DriveFolderService {
52
52
  parentFolderId: payload.parentFolderId,
53
53
  });
54
54
  }
55
+ renameFolder = (payload) => {
56
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
57
+ return storageClient.updateFolderNameWithUUID(payload);
58
+ };
59
+ getFolderMetadataByPath = async (path) => {
60
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
61
+ const folderMeta = await storageClient.getFolderByPath(encodeURIComponent(path));
62
+ return drive_utils_1.DriveUtils.driveFolderMetaToItem({
63
+ ...folderMeta,
64
+ createdAt: folderMeta.createdAt ?? folderMeta.created_at,
65
+ updatedAt: folderMeta.updatedAt ?? folderMeta.updated_at,
66
+ plainName: folderMeta.plainName ?? folderMeta.plain_name,
67
+ parentId: folderMeta.parentId ?? folderMeta.parent_id,
68
+ parentUuid: folderMeta.parentUuid ?? folderMeta.parent_uuid,
69
+ });
70
+ };
55
71
  }
56
72
  exports.DriveFolderService = DriveFolderService;
@@ -2,4 +2,11 @@ import { StorageTypes } from '@internxt/sdk/dist/drive';
2
2
  export declare class TrashService {
3
3
  static readonly instance: TrashService;
4
4
  trashItems: (payload: StorageTypes.AddItemsToTrashPayload) => Promise<void>;
5
+ clearTrash: () => Promise<void>;
6
+ getTrashFolderContent: () => Promise<{
7
+ folders: StorageTypes.FetchPaginatedFolder[];
8
+ files: StorageTypes.FetchPaginatedFile[];
9
+ }>;
10
+ private getAllTrashSubfolders;
11
+ private getAllTrashSubfiles;
5
12
  }
@@ -8,5 +8,35 @@ class TrashService {
8
8
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage(true);
9
9
  return storageClient.addItemsToTrash(payload);
10
10
  };
11
+ clearTrash = () => {
12
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
13
+ return storageClient.clearTrash();
14
+ };
15
+ getTrashFolderContent = async () => {
16
+ const storageClient = sdk_manager_service_1.SdkManager.instance.getTrash();
17
+ const folders = await this.getAllTrashSubfolders(storageClient, 0);
18
+ const files = await this.getAllTrashSubfiles(storageClient, 0);
19
+ return { folders, files };
20
+ };
21
+ getAllTrashSubfolders = async (storageClient, offset) => {
22
+ const folderContentPromise = storageClient.getTrashedFilesPaginated(50, offset, 'folders', true);
23
+ const { result: folders } = (await folderContentPromise);
24
+ if (folders.length > 0) {
25
+ return folders.concat(await this.getAllTrashSubfolders(storageClient, offset + folders.length));
26
+ }
27
+ else {
28
+ return folders;
29
+ }
30
+ };
31
+ getAllTrashSubfiles = async (storageClient, offset) => {
32
+ const folderContentPromise = storageClient.getTrashedFilesPaginated(50, offset, 'files', true);
33
+ const { result: folders } = (await folderContentPromise);
34
+ if (folders.length > 0) {
35
+ return folders.concat(await this.getAllTrashSubfiles(storageClient, offset + folders.length));
36
+ }
37
+ else {
38
+ return folders;
39
+ }
40
+ };
11
41
  }
12
42
  exports.TrashService = TrashService;
@@ -8,7 +8,11 @@ const node_fetch_1 = __importDefault(require("node-fetch"));
8
8
  class UploadService {
9
9
  static instance = new UploadService();
10
10
  async uploadFile(url, from, options) {
11
- const response = await (0, node_fetch_1.default)(url, { method: 'PUT', body: from, signal: options.abortController?.signal });
11
+ const response = await (0, node_fetch_1.default)(url, {
12
+ method: 'PUT',
13
+ body: from,
14
+ signal: options.abortController?.signal,
15
+ });
12
16
  const etag = response.headers.get('etag');
13
17
  options.progressCallback(1);
14
18
  if (!etag) {
@@ -1,4 +1,4 @@
1
- import { Auth, Drive, photos, Network as NetworkModule } from '@internxt/sdk';
1
+ import { Auth, Drive, Network as NetworkModule } from '@internxt/sdk';
2
2
  import { ApiSecurity, AppDetails } from '@internxt/sdk/dist/shared';
3
3
  export type SdkManagerApiSecurity = ApiSecurity & {
4
4
  newToken: string;
@@ -19,7 +19,6 @@ export declare class SdkManager {
19
19
  getReferrals(): Drive.Referrals;
20
20
  getStorage(useNewApi?: boolean): Drive.Storage;
21
21
  getTrash(): Drive.Trash;
22
- getPhotos(): photos.Photos;
23
22
  getShare(): Drive.Share;
24
23
  getNetwork(credentials: {
25
24
  user: string;
@@ -79,11 +79,6 @@ class SdkManager {
79
79
  token: newToken,
80
80
  });
81
81
  }
82
- getPhotos() {
83
- const PHOTOS_API_URL = config_service_1.ConfigService.instance.get('PHOTOS_API_URL');
84
- const newToken = SdkManager.getApiSecurity().newToken;
85
- return new sdk_1.photos.Photos(PHOTOS_API_URL, newToken);
86
- }
87
82
  getShare() {
88
83
  const DRIVE_NEW_API_URL = config_service_1.ConfigService.instance.get('DRIVE_NEW_API_URL');
89
84
  const newToken = SdkManager.getApiSecurity().newToken;
@@ -1,6 +1,7 @@
1
+ import { UsageResponse } from '@internxt/sdk/dist/drive/storage/types';
1
2
  export declare class UsageService {
2
3
  static readonly instance: UsageService;
3
4
  static readonly INFINITE_LIMIT: number;
4
- fetchTotalUsage: () => Promise<number>;
5
+ fetchUsage: () => Promise<UsageResponse>;
5
6
  fetchSpaceLimit: () => Promise<number>;
6
7
  }
@@ -5,14 +5,10 @@ const sdk_manager_service_1 = require("./sdk-manager.service");
5
5
  class UsageService {
6
6
  static instance = new UsageService();
7
7
  static INFINITE_LIMIT = 99 * Math.pow(1024, 4);
8
- fetchTotalUsage = async () => {
8
+ fetchUsage = async () => {
9
9
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
10
- const photosClient = sdk_manager_service_1.SdkManager.instance.getPhotos();
11
- const [driveUsage, { usage: photosUsage }] = await Promise.all([
12
- storageClient.spaceUsage(),
13
- photosClient.photos.getUsage(),
14
- ]);
15
- return driveUsage.total + photosUsage;
10
+ const driveUsage = await storageClient.spaceUsage();
11
+ return driveUsage;
16
12
  };
17
13
  fetchSpaceLimit = async () => {
18
14
  const storageClient = sdk_manager_service_1.SdkManager.instance.getStorage();
@@ -4,4 +4,6 @@ export declare class ValidationService {
4
4
  validate2FA: (code: string) => boolean;
5
5
  validateMnemonic: (mnemonic: string) => boolean;
6
6
  validateUUIDv4: (uuid: string) => boolean;
7
+ validateYesOrNoString: (message: string) => boolean;
8
+ validateTCPIntegerPort: (port: string) => boolean;
7
9
  }
@@ -17,5 +17,11 @@ class ValidationService {
17
17
  validateUUIDv4 = (uuid) => {
18
18
  return /^[0-9A-F]{8}-[0-9A-F]{4}-4[0-9A-F]{3}-[89AB][0-9A-F]{3}-[0-9A-F]{12}$/i.test(uuid);
19
19
  };
20
+ validateYesOrNoString = (message) => {
21
+ return message.length > 0 && /^(yes|no|y|n)$/i.test(message.toLowerCase().trim());
22
+ };
23
+ validateTCPIntegerPort = (port) => {
24
+ return /^\d+$/.test(port) && Number(port) >= 1 && Number(port) <= 65535;
25
+ };
20
26
  }
21
27
  exports.ValidationService = ValidationService;
@@ -8,6 +8,10 @@ export interface LoginCredentials {
8
8
  export interface CLICredentials extends LoginCredentials {
9
9
  root_folder_uuid: string;
10
10
  }
11
+ export interface WebdavConfig {
12
+ port: string;
13
+ protocol: 'http' | 'https';
14
+ }
11
15
  export declare class NotValidEmailError extends Error {
12
16
  constructor();
13
17
  }
@@ -20,6 +24,9 @@ export declare class NotValidTwoFactorCodeError extends Error {
20
24
  export declare class NotValidFolderUuidError extends Error {
21
25
  constructor();
22
26
  }
27
+ export declare class NotValidFileUuidError extends Error {
28
+ constructor();
29
+ }
23
30
  export declare class NotValidItemUuidError extends Error {
24
31
  constructor();
25
32
  }
@@ -32,6 +39,15 @@ export declare class NoRootFolderIdFoundError extends Error {
32
39
  export declare class MissingCredentialsError extends Error {
33
40
  constructor();
34
41
  }
42
+ export declare class NotValidYesOrNoError extends Error {
43
+ constructor();
44
+ }
45
+ export declare class EmptyItemNameError extends Error {
46
+ constructor();
47
+ }
48
+ export declare class NotValidPortError extends Error {
49
+ constructor();
50
+ }
35
51
  export type PaginatedItem = {
36
52
  plainName: string;
37
53
  uuid: string;
@@ -1,6 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.MissingCredentialsError = exports.NoRootFolderIdFoundError = exports.ItemNotFoundError = exports.NotValidItemUuidError = exports.NotValidFolderUuidError = exports.NotValidTwoFactorCodeError = exports.EmptyPasswordError = exports.NotValidEmailError = void 0;
3
+ exports.NotValidPortError = exports.EmptyItemNameError = exports.NotValidYesOrNoError = exports.MissingCredentialsError = exports.NoRootFolderIdFoundError = exports.ItemNotFoundError = exports.NotValidItemUuidError = exports.NotValidFileUuidError = exports.NotValidFolderUuidError = exports.NotValidTwoFactorCodeError = exports.EmptyPasswordError = exports.NotValidEmailError = void 0;
4
4
  class NotValidEmailError extends Error {
5
5
  constructor() {
6
6
  super('Email is not valid');
@@ -29,6 +29,13 @@ class NotValidFolderUuidError extends Error {
29
29
  }
30
30
  }
31
31
  exports.NotValidFolderUuidError = NotValidFolderUuidError;
32
+ class NotValidFileUuidError extends Error {
33
+ constructor() {
34
+ super('File UUID is not valid (it must be a valid v4 UUID)');
35
+ Object.setPrototypeOf(this, NotValidFileUuidError.prototype);
36
+ }
37
+ }
38
+ exports.NotValidFileUuidError = NotValidFileUuidError;
32
39
  class NotValidItemUuidError extends Error {
33
40
  constructor() {
34
41
  super('Item UUID is not valid (it must be a valid v4 UUID)');
@@ -57,3 +64,24 @@ class MissingCredentialsError extends Error {
57
64
  }
58
65
  }
59
66
  exports.MissingCredentialsError = MissingCredentialsError;
67
+ class NotValidYesOrNoError extends Error {
68
+ constructor() {
69
+ super('Only yes or not -> ["yes", "no", "y", "n"] options are valid');
70
+ Object.setPrototypeOf(this, NotValidYesOrNoError.prototype);
71
+ }
72
+ }
73
+ exports.NotValidYesOrNoError = NotValidYesOrNoError;
74
+ class EmptyItemNameError extends Error {
75
+ constructor() {
76
+ super('Item name can not be empty');
77
+ Object.setPrototypeOf(this, EmptyPasswordError.prototype);
78
+ }
79
+ }
80
+ exports.EmptyItemNameError = EmptyItemNameError;
81
+ class NotValidPortError extends Error {
82
+ constructor() {
83
+ super('Port should be a number between 1 and 65535');
84
+ Object.setPrototypeOf(this, NotValidPortError.prototype);
85
+ }
86
+ }
87
+ exports.NotValidPortError = NotValidPortError;
@@ -9,7 +9,6 @@ export interface ConfigKeys {
9
9
  readonly APP_MAGIC_IV: string;
10
10
  readonly APP_MAGIC_SALT: string;
11
11
  readonly NETWORK_URL: string;
12
- readonly WEBDAV_SERVER_PORT: string;
13
12
  readonly RUDDERSTACK_WRITE_KEY: string;
14
13
  readonly RUDDERSTACK_DATAPLANE_URL: string;
15
14
  }
@@ -1,5 +1,5 @@
1
1
  import { DriveFileData, DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
2
- export type DriveFileItem = Pick<DriveFileData, 'name' | 'bucket' | 'fileId' | 'id' | 'uuid' | 'folderId' | 'status'> & {
2
+ export type DriveFileItem = Pick<DriveFileData, 'name' | 'bucket' | 'fileId' | 'id' | 'uuid' | 'folderId' | 'status' | 'folderUuid'> & {
3
3
  encryptedName: string;
4
4
  size: number;
5
5
  createdAt: Date;
@@ -12,4 +12,5 @@ export type DriveFolderItem = Pick<DriveFolderData, 'name' | 'bucket' | 'id' | '
12
12
  createdAt: Date;
13
13
  updatedAt: Date;
14
14
  status: 'EXISTS' | 'TRASHED';
15
+ parentUuid: string | null;
15
16
  };
@@ -1,3 +1,4 @@
1
+ /// <reference types="node" />
1
2
  export interface NetworkCredentials {
2
3
  user: string;
3
4
  pass: string;
@@ -9,3 +10,7 @@ export interface NetworkOperationBaseOptions {
9
10
  }
10
11
  export type UploadOptions = NetworkOperationBaseOptions;
11
12
  export type DownloadOptions = NetworkOperationBaseOptions;
13
+ export interface SelfsignedCert {
14
+ cert: string | Buffer;
15
+ key: string | Buffer;
16
+ }
@@ -12,4 +12,5 @@ export type WebDavRequestedResource = {
12
12
  url: string;
13
13
  name: string;
14
14
  path: ParsedPath;
15
+ parentPath: string;
15
16
  };
@@ -26,7 +26,7 @@ export declare class CLIUtils {
26
26
  static readonly prompt: (prompt: {
27
27
  message: string;
28
28
  options?: ux.IPromptOptions;
29
- error: Error;
29
+ error?: Error;
30
30
  }, validate?: ((value: string) => boolean) | undefined) => Promise<string>;
31
31
  static readonly parseEmpty: (input: string) => Promise<string>;
32
32
  }
@@ -6,7 +6,8 @@ class DriveUtils {
6
6
  return {
7
7
  uuid: fileMeta.uuid ?? '',
8
8
  status: fileMeta.status,
9
- folderId: fileMeta.folder_id,
9
+ folderId: fileMeta.folderId ?? fileMeta.folder_id,
10
+ folderUuid: fileMeta.folderUuid,
10
11
  size: fileMeta.size,
11
12
  encryptedName: fileMeta.name,
12
13
  name: fileMeta.plainName ?? fileMeta.name,
@@ -27,6 +28,7 @@ class DriveUtils {
27
28
  name: folderMeta.plainName ?? folderMeta.name,
28
29
  encryptedName: folderMeta.name,
29
30
  parentId: folderMeta.parentId,
31
+ parentUuid: folderMeta.parentUuid,
30
32
  createdAt: new Date(folderMeta.createdAt),
31
33
  updatedAt: new Date(folderMeta.updatedAt),
32
34
  };
@@ -1,5 +1,4 @@
1
- /// <reference types="node" />
2
- import { NetworkCredentials } from '../types/network.types';
1
+ import { NetworkCredentials, SelfsignedCert } from '../types/network.types';
3
2
  import selfsigned from 'selfsigned';
4
3
  export declare class NetworkUtils {
5
4
  static getAuthFromCredentials(creds: NetworkCredentials): {
@@ -10,13 +9,8 @@ export declare class NetworkUtils {
10
9
  cert: string;
11
10
  privateKey: string;
12
11
  };
13
- static getWebdavSSLCerts(): {
14
- cert: string;
15
- key: string;
16
- } | {
17
- cert: Buffer;
18
- key: Buffer;
19
- };
12
+ static generateNewSelfsignedCerts(): SelfsignedCert;
13
+ static getWebdavSSLCerts(): SelfsignedCert;
20
14
  static saveWebdavSSLCerts(pems: selfsigned.GenerateResult): void;
21
15
  static generateSelfSignedSSLCerts(): selfsigned.GenerateResult;
22
16
  }
@@ -20,20 +20,34 @@ class NetworkUtils {
20
20
  cert: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'cert.crt'),
21
21
  privateKey: node_path_1.default.join(config_service_1.ConfigService.WEBDAV_SSL_CERTS_DIR, 'priv.key'),
22
22
  };
23
+ static generateNewSelfsignedCerts() {
24
+ const newCerts = this.generateSelfSignedSSLCerts();
25
+ this.saveWebdavSSLCerts(newCerts);
26
+ return {
27
+ cert: newCerts.cert,
28
+ key: newCerts.private,
29
+ };
30
+ }
23
31
  static getWebdavSSLCerts() {
24
32
  if (!(0, node_fs_1.existsSync)(this.WEBDAV_SSL_CERTS_PATH.cert) || !(0, node_fs_1.existsSync)(this.WEBDAV_SSL_CERTS_PATH.privateKey)) {
25
- const newCerts = this.generateSelfSignedSSLCerts();
26
- this.saveWebdavSSLCerts(newCerts);
27
- return {
28
- cert: newCerts.cert,
29
- key: newCerts.private,
30
- };
33
+ return this.generateNewSelfsignedCerts();
31
34
  }
32
35
  else {
33
- return {
36
+ let selfsignedCert = {
34
37
  cert: (0, node_fs_1.readFileSync)(this.WEBDAV_SSL_CERTS_PATH.cert),
35
38
  key: (0, node_fs_1.readFileSync)(this.WEBDAV_SSL_CERTS_PATH.privateKey),
36
39
  };
40
+ const { validTo } = new node_crypto_1.X509Certificate(selfsignedCert.cert);
41
+ const dateToday = new Date();
42
+ const dateValid = new Date(validTo);
43
+ if (dateToday > dateValid) {
44
+ const newCerts = this.generateNewSelfsignedCerts();
45
+ selfsignedCert = {
46
+ cert: newCerts.cert,
47
+ key: newCerts.key,
48
+ };
49
+ }
50
+ return selfsignedCert;
37
51
  }
38
52
  }
39
53
  static saveWebdavSSLCerts(pems) {
@@ -1,8 +1,22 @@
1
1
  import { Request } from 'express';
2
2
  import { WebDavRequestedResource } from '../types/webdav.types';
3
+ import { DriveFile } from '../services/database/drive-file/drive-file.domain';
4
+ import { DriveFolder } from '../services/database/drive-folder/drive-folder.domain';
3
5
  import { DriveDatabaseManager } from '../services/database/drive-database-manager.service';
6
+ import { DriveFolderService } from '../services/drive/drive-folder.service';
7
+ import { DriveFileService } from '../services/drive/drive-file.service';
8
+ import { DriveFileItem, DriveFolderItem } from '../types/drive.types';
4
9
  export declare class WebDavUtils {
5
10
  static joinURL(...pathComponents: string[]): string;
6
- static getParentPath(fromPath: string): string;
7
- static getRequestedResource(req: Request, driveDatabaseManager: DriveDatabaseManager): Promise<WebDavRequestedResource>;
11
+ static removeHostFromURL(completeURL: string): string;
12
+ static getRequestedResource(urlObject: string | Request): Promise<WebDavRequestedResource>;
13
+ static getDatabaseItemFromResource(resource: WebDavRequestedResource, driveDatabaseManager: DriveDatabaseManager): Promise<DriveFileItem | DriveFolderItem | null>;
14
+ static setDatabaseItem(type: 'file' | 'folder', driveItem: DriveFileItem | DriveFolderItem, driveDatabaseManager: DriveDatabaseManager, relativePath: string): Promise<DriveFolder | DriveFile | undefined>;
15
+ static getDriveItemFromResource(resource: WebDavRequestedResource, driveFolderService?: DriveFolderService, driveFileService?: DriveFileService): Promise<DriveFileItem | DriveFolderItem | undefined>;
16
+ static getAndSearchItemFromResource({ resource, driveDatabaseManager, driveFolderService, driveFileService, }: {
17
+ resource: WebDavRequestedResource;
18
+ driveDatabaseManager: DriveDatabaseManager;
19
+ driveFolderService?: DriveFolderService;
20
+ driveFileService?: DriveFileService;
21
+ }): Promise<DriveFileItem | DriveFolderItem>;
8
22
  }