@internxt/cli 1.6.2 → 1.6.4

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 (153) hide show
  1. package/README.md +411 -72
  2. package/dist/commands/add-cert.d.ts +1 -1
  3. package/dist/commands/add-cert.js +1 -1
  4. package/dist/commands/config.d.ts +7 -1
  5. package/dist/commands/config.js +36 -5
  6. package/dist/commands/create-folder.d.ts +2 -1
  7. package/dist/commands/create-folder.js +10 -7
  8. package/dist/commands/delete-permanently-file.d.ts +1 -0
  9. package/dist/commands/delete-permanently-folder.d.ts +1 -0
  10. package/dist/commands/download-file.d.ts +1 -0
  11. package/dist/commands/download-file.js +4 -2
  12. package/dist/commands/list.d.ts +1 -0
  13. package/dist/commands/list.js +2 -4
  14. package/dist/commands/login-legacy.d.ts +1 -0
  15. package/dist/commands/move-file.d.ts +1 -1
  16. package/dist/commands/move-file.js +7 -21
  17. package/dist/commands/move-folder.d.ts +1 -1
  18. package/dist/commands/move-folder.js +7 -21
  19. package/dist/commands/rename-file.d.ts +1 -0
  20. package/dist/commands/rename-folder.d.ts +1 -0
  21. package/dist/commands/trash-clear.d.ts +1 -0
  22. package/dist/commands/trash-file.d.ts +1 -0
  23. package/dist/commands/trash-folder.d.ts +1 -0
  24. package/dist/commands/trash-restore-file.d.ts +1 -1
  25. package/dist/commands/trash-restore-file.js +7 -21
  26. package/dist/commands/trash-restore-folder.d.ts +1 -1
  27. package/dist/commands/trash-restore-folder.js +7 -21
  28. package/dist/commands/upload-file.d.ts +4 -5
  29. package/dist/commands/upload-file.js +42 -31
  30. package/dist/commands/upload-folder.d.ts +1 -0
  31. package/dist/commands/upload-folder.js +11 -6
  32. package/dist/commands/webdav-config.d.ts +19 -1
  33. package/dist/commands/webdav-config.js +81 -3
  34. package/dist/commands/webdav.d.ts +1 -1
  35. package/dist/commands/webdav.js +10 -5
  36. package/dist/commands/whoami.js +2 -1
  37. package/dist/commands/workspaces-list.d.ts +20 -0
  38. package/dist/commands/workspaces-list.js +67 -0
  39. package/dist/commands/workspaces-unset.d.ts +23 -0
  40. package/dist/commands/workspaces-unset.js +45 -0
  41. package/dist/commands/workspaces-use.d.ts +27 -0
  42. package/dist/commands/workspaces-use.js +113 -0
  43. package/dist/constants/configs.d.ts +2 -1
  44. package/dist/constants/configs.js +4 -3
  45. package/dist/hooks/prerun/auth_check.js +13 -4
  46. package/dist/services/auth.service.d.ts +5 -2
  47. package/dist/services/auth.service.js +69 -12
  48. package/dist/services/config.service.d.ts +1 -1
  49. package/dist/services/config.service.js +12 -4
  50. package/dist/services/crypto.service.d.ts +5 -0
  51. package/dist/services/crypto.service.js +43 -0
  52. package/dist/services/database/database.service.d.ts +9 -0
  53. package/dist/services/database/database.service.js +39 -0
  54. package/dist/services/database/drive-file/drive-file.attributes.d.ts +3 -6
  55. package/dist/services/database/drive-file/drive-file.domain.d.ts +3 -6
  56. package/dist/services/database/drive-file/drive-file.domain.js +1 -12
  57. package/dist/services/database/drive-file/drive-file.model.d.ts +15 -0
  58. package/dist/services/database/drive-file/drive-file.model.js +67 -0
  59. package/dist/services/database/drive-file/drive-file.repository.d.ts +11 -0
  60. package/dist/services/database/drive-file/drive-file.repository.js +63 -0
  61. package/dist/services/database/drive-folder/drive-folder.attributes.d.ts +3 -4
  62. package/dist/services/database/drive-folder/drive-folder.domain.d.ts +4 -5
  63. package/dist/services/database/drive-folder/drive-folder.domain.js +11 -15
  64. package/dist/services/database/drive-folder/drive-folder.model.d.ts +11 -0
  65. package/dist/services/database/drive-folder/drive-folder.model.js +51 -0
  66. package/dist/services/database/drive-folder/drive-folder.repository.d.ts +13 -0
  67. package/dist/services/database/drive-folder/drive-folder.repository.js +99 -0
  68. package/dist/services/drive/drive-file.service.d.ts +2 -0
  69. package/dist/services/drive/drive-file.service.js +71 -15
  70. package/dist/services/drive/drive-folder.service.d.ts +6 -1
  71. package/dist/services/drive/drive-folder.service.js +157 -31
  72. package/dist/services/drive/trash.service.d.ts +3 -0
  73. package/dist/services/drive/trash.service.js +52 -16
  74. package/dist/services/drive/workspace.service.d.ts +7 -0
  75. package/dist/services/drive/workspace.service.js +30 -0
  76. package/dist/services/keys.service.d.ts +7 -0
  77. package/dist/services/keys.service.js +55 -0
  78. package/dist/services/local-filesystem/local-filesystem.service.d.ts +2 -2
  79. package/dist/services/local-filesystem/local-filesystem.service.js +4 -4
  80. package/dist/services/network/download.service.d.ts +2 -2
  81. package/dist/services/network/download.service.js +2 -2
  82. package/dist/services/network/network-facade.service.d.ts +11 -8
  83. package/dist/services/network/network-facade.service.js +19 -32
  84. package/dist/services/network/upload/upload-facade.service.d.ts +1 -1
  85. package/dist/services/network/upload/upload-facade.service.js +14 -7
  86. package/dist/services/network/upload/upload-file.service.d.ts +3 -3
  87. package/dist/services/network/upload/upload-file.service.js +38 -30
  88. package/dist/services/network/upload/upload-folder.service.d.ts +2 -2
  89. package/dist/services/network/upload/upload-folder.service.js +15 -10
  90. package/dist/services/network/upload/upload.types.d.ts +11 -0
  91. package/dist/services/sdk-manager.service.d.ts +9 -7
  92. package/dist/services/sdk-manager.service.js +27 -13
  93. package/dist/services/thumbnail.service.d.ts +19 -1
  94. package/dist/services/thumbnail.service.js +34 -9
  95. package/dist/services/universal-link.service.d.ts +3 -1
  96. package/dist/services/universal-link.service.js +15 -3
  97. package/dist/services/usage.service.d.ts +1 -2
  98. package/dist/services/usage.service.js +1 -1
  99. package/dist/services/validation.service.js +14 -4
  100. package/dist/{webdav/services → services/webdav}/webdav-folder.service.d.ts +1 -7
  101. package/dist/{webdav/services → services/webdav}/webdav-folder.service.js +6 -10
  102. package/dist/types/command.types.d.ts +44 -1
  103. package/dist/types/command.types.js +29 -1
  104. package/dist/types/config.types.d.ts +1 -0
  105. package/dist/types/drive.types.d.ts +7 -6
  106. package/dist/types/network.types.d.ts +6 -0
  107. package/dist/utils/async.utils.d.ts +2 -1
  108. package/dist/utils/async.utils.js +13 -2
  109. package/dist/utils/cli.utils.d.ts +20 -15
  110. package/dist/utils/cli.utils.js +48 -18
  111. package/dist/utils/crypto.utils.d.ts +3 -1
  112. package/dist/utils/crypto.utils.js +15 -2
  113. package/dist/utils/database.utils.d.ts +11 -0
  114. package/dist/utils/database.utils.js +26 -0
  115. package/dist/utils/drive.utils.js +7 -10
  116. package/dist/utils/errors.utils.d.ts +4 -4
  117. package/dist/utils/errors.utils.js +16 -19
  118. package/dist/utils/format.utils.d.ts +1 -0
  119. package/dist/utils/format.utils.js +3 -0
  120. package/dist/utils/inquirer.utils.js +10 -1
  121. package/dist/utils/path.utils.d.ts +7 -0
  122. package/dist/utils/path.utils.js +18 -0
  123. package/dist/utils/thumbnail.utils.d.ts +6 -20
  124. package/dist/utils/thumbnail.utils.js +16 -41
  125. package/dist/utils/webdav.utils.d.ts +5 -20
  126. package/dist/utils/webdav.utils.js +31 -14
  127. package/dist/utils/xml.utils.d.ts +1 -1
  128. package/dist/webdav/handlers/DELETE.handler.d.ts +0 -9
  129. package/dist/webdav/handlers/DELETE.handler.js +2 -16
  130. package/dist/webdav/handlers/GET.handler.d.ts +0 -13
  131. package/dist/webdav/handlers/GET.handler.js +6 -11
  132. package/dist/webdav/handlers/HEAD.handler.d.ts +0 -5
  133. package/dist/webdav/handlers/HEAD.handler.js +11 -23
  134. package/dist/webdav/handlers/MKCOL.handler.d.ts +0 -7
  135. package/dist/webdav/handlers/MKCOL.handler.js +5 -12
  136. package/dist/webdav/handlers/MOVE.handler.d.ts +0 -9
  137. package/dist/webdav/handlers/MOVE.handler.js +10 -16
  138. package/dist/webdav/handlers/PROPFIND.handler.d.ts +0 -7
  139. package/dist/webdav/handlers/PROPFIND.handler.js +7 -19
  140. package/dist/webdav/handlers/PUT.handler.d.ts +0 -15
  141. package/dist/webdav/handlers/PUT.handler.js +37 -43
  142. package/dist/webdav/index.js +6 -8
  143. package/dist/webdav/middewares/auth.middleware.d.ts +1 -2
  144. package/dist/webdav/middewares/auth.middleware.js +5 -4
  145. package/dist/webdav/middewares/errors.middleware.js +2 -2
  146. package/dist/webdav/middewares/webdav-auth.middleware.d.ts +3 -0
  147. package/dist/webdav/middewares/webdav-auth.middleware.js +44 -0
  148. package/dist/webdav/webdav-server.d.ts +3 -16
  149. package/dist/webdav/webdav-server.js +29 -87
  150. package/oclif.manifest.json +429 -6
  151. package/package.json +27 -22
  152. package/dist/types/fast-xml-parser.types.d.ts +0 -59
  153. package/dist/types/fast-xml-parser.types.js +0 -2
@@ -0,0 +1,11 @@
1
+ export declare class DatabaseUtils {
2
+ static readonly CREATE_BATCH_SIZE = 100;
3
+ static readonly getFolderByPathGeneric: <T>({ path, parentUuid, onFound, getByParentAndName, }: {
4
+ path: string;
5
+ parentUuid: string;
6
+ onFound: (uuid: string) => Promise<T>;
7
+ getByParentAndName: (parentUuid: string, name: string) => Promise<{
8
+ uuid: string;
9
+ } | null | undefined>;
10
+ }) => Promise<T | undefined>;
11
+ }
@@ -0,0 +1,26 @@
1
+ "use strict";
2
+ Object.defineProperty(exports, "__esModule", { value: true });
3
+ exports.DatabaseUtils = void 0;
4
+ class DatabaseUtils {
5
+ static CREATE_BATCH_SIZE = 100;
6
+ static getFolderByPathGeneric = async ({ path, parentUuid, onFound, getByParentAndName, }) => {
7
+ path = path.replace(/^\//, '').replace(/\/$/, '');
8
+ if (path.trim().length === 0) {
9
+ return onFound(parentUuid);
10
+ }
11
+ const slashIndex = path.indexOf('/');
12
+ const currentFolder = slashIndex === -1 ? path : path.substring(0, slashIndex);
13
+ const nextPath = slashIndex === -1 ? '' : path.substring(slashIndex + 1);
14
+ const folder = await getByParentAndName(parentUuid, currentFolder);
15
+ if (!folder) {
16
+ return;
17
+ }
18
+ return this.getFolderByPathGeneric({
19
+ path: nextPath,
20
+ parentUuid: folder.uuid,
21
+ onFound,
22
+ getByParentAndName,
23
+ });
24
+ };
25
+ }
26
+ exports.DatabaseUtils = DatabaseUtils;
@@ -1,13 +1,13 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.DriveUtils = void 0;
4
+ const types_1 = require("@internxt/sdk/dist/drive/storage/types");
4
5
  class DriveUtils {
5
6
  static driveFileMetaToItem(fileMeta) {
6
7
  return {
7
8
  itemType: 'file',
8
9
  uuid: fileMeta.uuid ?? '',
9
10
  status: fileMeta.status,
10
- folderId: fileMeta.folderId,
11
11
  folderUuid: fileMeta.folderUuid,
12
12
  size: Number(fileMeta.size),
13
13
  name: fileMeta.plainName ?? fileMeta.name,
@@ -17,7 +17,6 @@ class DriveUtils {
17
17
  creationTime: new Date(fileMeta.creationTime ?? fileMeta.createdAt),
18
18
  modificationTime: new Date(fileMeta.modificationTime ?? fileMeta.updatedAt),
19
19
  fileId: fileMeta.fileId,
20
- id: fileMeta.id,
21
20
  type: fileMeta.type,
22
21
  };
23
22
  }
@@ -25,30 +24,28 @@ class DriveUtils {
25
24
  return {
26
25
  itemType: 'folder',
27
26
  uuid: folderMeta.uuid,
28
- id: folderMeta.id,
29
27
  bucket: folderMeta.bucket,
30
- status: folderMeta.deleted || folderMeta.removed ? 'TRASHED' : 'EXISTS',
28
+ status: folderMeta.deleted || folderMeta.removed ? types_1.FileStatus.TRASHED : types_1.FileStatus.EXISTS,
31
29
  name: folderMeta.plainName ?? folderMeta.name,
32
- encryptedName: folderMeta.name,
33
- parentId: folderMeta.parentId,
34
30
  parentUuid: folderMeta.parentUuid,
35
31
  createdAt: new Date(folderMeta.createdAt),
36
32
  updatedAt: new Date(folderMeta.updatedAt),
33
+ creationTime: new Date(folderMeta.creation_time),
34
+ modificationTime: new Date(folderMeta.creation_time),
37
35
  };
38
36
  }
39
37
  static createFolderResponseToItem(folderResponse) {
40
38
  return {
41
39
  itemType: 'folder',
42
40
  uuid: folderResponse.uuid,
43
- id: folderResponse.id,
44
41
  bucket: folderResponse.bucket,
45
- status: folderResponse.deleted || folderResponse.removed ? 'TRASHED' : 'EXISTS',
42
+ status: folderResponse.deleted || folderResponse.removed ? types_1.FileStatus.TRASHED : types_1.FileStatus.EXISTS,
46
43
  name: folderResponse.plainName ?? folderResponse.name,
47
- encryptedName: folderResponse.name,
48
- parentId: folderResponse.parentId,
49
44
  parentUuid: folderResponse.parentUuid,
50
45
  createdAt: new Date(folderResponse.createdAt),
51
46
  updatedAt: new Date(folderResponse.updatedAt),
47
+ creationTime: new Date(folderResponse.creationTime),
48
+ modificationTime: new Date(folderResponse.modificationTime),
52
49
  };
53
50
  }
54
51
  }
@@ -1,8 +1,8 @@
1
- export declare function isError(error: unknown): error is Error;
2
- export declare function isAlreadyExistsError(error: unknown): error is Error;
3
- export declare function isFileNotFoundError(error: unknown): error is NodeJS.ErrnoException;
4
1
  export declare class ErrorUtils {
5
- static report(error: unknown, props?: Record<string, unknown>): void;
2
+ static readonly isError: (error: unknown) => error is Error;
3
+ static readonly report: (error: unknown, props?: Record<string, unknown>) => void;
4
+ static readonly isAlreadyExistsError: (error: unknown) => error is Error;
5
+ static readonly isFileNotFoundError: (error: unknown) => error is NodeJS.ErrnoException;
6
6
  }
7
7
  export declare class ConflictError extends Error {
8
8
  statusCode: number;
@@ -1,32 +1,29 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.NotImplementedError = exports.MethodNotAllowed = exports.UnsupportedMediaTypeError = exports.BadRequestError = exports.NotFoundError = exports.ConflictError = exports.ErrorUtils = void 0;
4
- exports.isError = isError;
5
- exports.isAlreadyExistsError = isAlreadyExistsError;
6
- exports.isFileNotFoundError = isFileNotFoundError;
7
4
  const logger_utils_1 = require("./logger.utils");
8
- function isError(error) {
9
- return typeof Error.isError === 'function'
10
- ? Error.isError(error)
11
- : error instanceof Error ||
12
- (typeof error === 'object' && error !== null && 'message' in error && ('stack' in error || 'name' in error));
13
- }
14
- function isAlreadyExistsError(error) {
15
- return ((isError(error) && error.message.includes('already exists')) ||
16
- (typeof error === 'object' && error !== null && 'status' in error && error.status === 409));
17
- }
18
- function isFileNotFoundError(error) {
19
- return isError(error) && 'code' in error && error.code === 'ENOENT';
20
- }
21
5
  class ErrorUtils {
22
- static report(error, props = {}) {
23
- if (isError(error)) {
6
+ static isError = (error) => {
7
+ return typeof Error.isError === 'function'
8
+ ? Error.isError(error)
9
+ : error instanceof Error ||
10
+ (typeof error === 'object' && error !== null && 'message' in error && ('stack' in error || 'name' in error));
11
+ };
12
+ static report = (error, props = {}) => {
13
+ if (this.isError(error)) {
24
14
  logger_utils_1.logger.error(`[REPORTED_ERROR]: ${error.message}\nProperties => ${JSON.stringify(props, null, 2)}\nStack => ${error.stack}`);
25
15
  }
26
16
  else {
27
17
  logger_utils_1.logger.error(`[REPORTED_ERROR]: ${JSON.stringify(error)}\nProperties => ${JSON.stringify(props, null, 2)}\n`);
28
18
  }
29
- }
19
+ };
20
+ static isAlreadyExistsError = (error) => {
21
+ return ((this.isError(error) && error.message.includes('already exists')) ||
22
+ (typeof error === 'object' && error !== null && 'status' in error && error.status === 409));
23
+ };
24
+ static isFileNotFoundError = (error) => {
25
+ return this.isError(error) && 'code' in error && error.code === 'ENOENT';
26
+ };
30
27
  }
31
28
  exports.ErrorUtils = ErrorUtils;
32
29
  class ConflictError extends Error {
@@ -3,4 +3,5 @@ export declare class FormatUtils {
3
3
  static readonly formatDate: (date: string | Date) => string;
4
4
  static readonly formatDateForWebDav: (date: string | Date) => string;
5
5
  static readonly formatLimit: (limit: number) => string;
6
+ static readonly capitalizeFirstLetter: (string: string) => string;
6
7
  }
@@ -26,5 +26,8 @@ class FormatUtils {
26
26
  }
27
27
  return result;
28
28
  };
29
+ static capitalizeFirstLetter = (string) => {
30
+ return string.charAt(0).toUpperCase() + string.slice(1);
31
+ };
29
32
  }
30
33
  exports.FormatUtils = FormatUtils;
@@ -15,7 +15,16 @@ class InquirerUtils {
15
15
  const confirmation = await (0, prompts_1.confirm)({ message, default: options.confirm?.default || false });
16
16
  return confirmation ? 'y' : 'n';
17
17
  }
18
- case 'input': {
18
+ case 'list':
19
+ if (!options.choices)
20
+ throw new Error('Missing choices');
21
+ return (0, prompts_1.select)({
22
+ message,
23
+ choices: options.choices.values,
24
+ default: options.choices.values[options.choices.default ?? 0],
25
+ });
26
+ case 'input':
27
+ default: {
19
28
  return (0, prompts_1.input)({ message });
20
29
  }
21
30
  }
@@ -0,0 +1,7 @@
1
+ export declare class PathUtils {
2
+ static getPathFileData(filePath: string): {
3
+ folderPath: string;
4
+ fileName: string;
5
+ fileType: string | null;
6
+ };
7
+ }
@@ -0,0 +1,18 @@
1
+ "use strict";
2
+ var __importDefault = (this && this.__importDefault) || function (mod) {
3
+ return (mod && mod.__esModule) ? mod : { "default": mod };
4
+ };
5
+ Object.defineProperty(exports, "__esModule", { value: true });
6
+ exports.PathUtils = void 0;
7
+ const node_path_1 = __importDefault(require("node:path"));
8
+ class PathUtils {
9
+ static getPathFileData(filePath) {
10
+ const folderPath = node_path_1.default.dirname(filePath);
11
+ const fileExt = node_path_1.default.extname(filePath);
12
+ const fileName = node_path_1.default.basename(filePath, fileExt);
13
+ const fileExtWithoutDot = fileExt.replace('.', '').trim();
14
+ const fileType = fileExtWithoutDot.length > 0 ? fileExtWithoutDot : null;
15
+ return { folderPath, fileName, fileType };
16
+ }
17
+ }
18
+ exports.PathUtils = PathUtils;
@@ -1,26 +1,12 @@
1
- import { Readable } from 'node:stream';
2
- import { NetworkFacade } from '../services/network/network-facade.service';
3
- import { BufferStream } from './stream.utils';
4
1
  export declare const ThumbnailConfig: {
5
2
  readonly MaxWidth: 300;
6
3
  readonly MaxHeight: 300;
7
4
  readonly Quality: 100;
8
5
  readonly Type: "png";
9
6
  };
10
- export declare const isFileThumbnailable: (fileType: string) => boolean;
11
- export declare const isPDFThumbnailable: (fileType: string) => boolean;
12
- export declare const isImageThumbnailable: (fileType: string) => boolean;
13
- export declare const tryUploadThumbnail: ({ bufferStream, fileType, userBucket, fileUuid, networkFacade, }: {
14
- bufferStream?: BufferStream;
15
- fileType: string;
16
- userBucket: string;
17
- fileUuid: string;
18
- networkFacade: NetworkFacade;
19
- }) => Promise<void>;
20
- export declare const createFileStreamWithBuffer: ({ path, fileType, }: {
21
- path: string;
22
- fileType: string;
23
- }) => {
24
- bufferStream?: BufferStream;
25
- fileStream: Readable;
26
- };
7
+ export declare class ThumbnailUtils {
8
+ static readonly MAX_IMAGE_THUMBNAILABLE_SIZE_IN_MB: number;
9
+ static readonly isFileThumbnailable: (fileType: string) => boolean;
10
+ static readonly isPDFThumbnailable: (fileType: string) => boolean;
11
+ static readonly isImageThumbnailable: (fileType: string, size: number) => boolean;
12
+ }
@@ -1,10 +1,6 @@
1
1
  "use strict";
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
- exports.createFileStreamWithBuffer = exports.tryUploadThumbnail = exports.isImageThumbnailable = exports.isPDFThumbnailable = exports.isFileThumbnailable = exports.ThumbnailConfig = void 0;
4
- const thumbnail_service_1 = require("../services/thumbnail.service");
5
- const errors_utils_1 = require("./errors.utils");
6
- const stream_utils_1 = require("./stream.utils");
7
- const node_fs_1 = require("node:fs");
3
+ exports.ThumbnailUtils = exports.ThumbnailConfig = void 0;
8
4
  exports.ThumbnailConfig = {
9
5
  MaxWidth: 300,
10
6
  MaxHeight: 300,
@@ -34,39 +30,18 @@ const thumbnailableImageExtension = new Set([
34
30
  ]);
35
31
  const thumbnailablePdfExtension = new Set(pdfExtensions['pdf']);
36
32
  const thumbnailableExtension = new Set(thumbnailableImageExtension);
37
- const isFileThumbnailable = (fileType) => {
38
- return fileType.trim().length > 0 && thumbnailableExtension.has(fileType.trim().toLowerCase());
39
- };
40
- exports.isFileThumbnailable = isFileThumbnailable;
41
- const isPDFThumbnailable = (fileType) => {
42
- return fileType.trim().length > 0 && thumbnailablePdfExtension.has(fileType.trim().toLowerCase());
43
- };
44
- exports.isPDFThumbnailable = isPDFThumbnailable;
45
- const isImageThumbnailable = (fileType) => {
46
- return fileType.trim().length > 0 && thumbnailableImageExtension.has(fileType.trim().toLowerCase());
47
- };
48
- exports.isImageThumbnailable = isImageThumbnailable;
49
- const tryUploadThumbnail = async ({ bufferStream, fileType, userBucket, fileUuid, networkFacade, }) => {
50
- try {
51
- const thumbnailBuffer = bufferStream?.getBuffer();
52
- if (thumbnailBuffer) {
53
- await thumbnail_service_1.ThumbnailService.instance.uploadThumbnail(thumbnailBuffer, fileType, userBucket, fileUuid, networkFacade);
54
- }
55
- }
56
- catch (error) {
57
- errors_utils_1.ErrorUtils.report(error);
58
- }
59
- };
60
- exports.tryUploadThumbnail = tryUploadThumbnail;
61
- const createFileStreamWithBuffer = ({ path, fileType, }) => {
62
- const readable = (0, node_fs_1.createReadStream)(path);
63
- if ((0, exports.isFileThumbnailable)(fileType)) {
64
- const bufferStream = new stream_utils_1.BufferStream();
65
- return {
66
- bufferStream,
67
- fileStream: readable.pipe(bufferStream),
68
- };
69
- }
70
- return { fileStream: readable };
71
- };
72
- exports.createFileStreamWithBuffer = createFileStreamWithBuffer;
33
+ class ThumbnailUtils {
34
+ static MAX_IMAGE_THUMBNAILABLE_SIZE_IN_MB = 500 * 1024 * 1024;
35
+ static isFileThumbnailable = (fileType) => {
36
+ return fileType.trim().length > 0 && thumbnailableExtension.has(fileType.trim().toLowerCase());
37
+ };
38
+ static isPDFThumbnailable = (fileType) => {
39
+ return fileType.trim().length > 0 && thumbnailablePdfExtension.has(fileType.trim().toLowerCase());
40
+ };
41
+ static isImageThumbnailable = (fileType, size) => {
42
+ if (size > ThumbnailUtils.MAX_IMAGE_THUMBNAILABLE_SIZE_IN_MB)
43
+ return false;
44
+ return fileType.trim().length > 0 && thumbnailableImageExtension.has(fileType.trim().toLowerCase());
45
+ };
46
+ }
47
+ exports.ThumbnailUtils = ThumbnailUtils;
@@ -1,6 +1,4 @@
1
1
  import { WebDavRequestedResource } from '../types/webdav.types';
2
- import { DriveFolderService } from '../services/drive/drive-folder.service';
3
- import { DriveFileService } from '../services/drive/drive-file.service';
4
2
  import { DriveFileItem, DriveFolderItem, DriveItem } from '../types/drive.types';
5
3
  export declare class WebDavUtils {
6
4
  static joinURL(...pathComponents: string[]): string;
@@ -8,22 +6,9 @@ export declare class WebDavUtils {
8
6
  static decodeUrl(requestUrl: string, decodeUri?: boolean): string;
9
7
  static normalizeFolderPath(path: string): string;
10
8
  static getRequestedResource(requestUrl: string, decodeUri?: boolean): Promise<WebDavRequestedResource>;
11
- static tryGetFileOrFolderMetadata({ url, driveFileService, driveFolderService, }: {
12
- url: string;
13
- driveFolderService: DriveFolderService;
14
- driveFileService: DriveFileService;
15
- }): Promise<DriveItem | undefined>;
16
- static getDriveFileFromResource({ url, driveFileService, }: {
17
- url: string;
18
- driveFileService: DriveFileService;
19
- }): Promise<DriveFileItem | undefined>;
20
- static getDriveFolderFromResource({ url, driveFolderService, }: {
21
- url: string;
22
- driveFolderService: DriveFolderService;
23
- }): Promise<DriveFolderItem | undefined>;
24
- static getDriveItemFromResource({ resource, driveFolderService, driveFileService, }: {
25
- resource: WebDavRequestedResource;
26
- driveFolderService: DriveFolderService;
27
- driveFileService: DriveFileService;
28
- }): Promise<DriveItem | undefined>;
9
+ static tryGetFileOrFolderMetadata(url: string): Promise<DriveItem | undefined>;
10
+ static getDriveFileFromResource(url: string): Promise<DriveFileItem | undefined>;
11
+ static getDriveFolderFromResource(url: string): Promise<DriveFolderItem | undefined>;
12
+ static getDriveItemFromResource(resource: WebDavRequestedResource): Promise<DriveItem | undefined>;
13
+ static deleteOrTrashItem(driveItem: DriveItem): Promise<void>;
29
14
  }
@@ -5,7 +5,12 @@ var __importDefault = (this && this.__importDefault) || function (mod) {
5
5
  Object.defineProperty(exports, "__esModule", { value: true });
6
6
  exports.WebDavUtils = void 0;
7
7
  const node_path_1 = __importDefault(require("node:path"));
8
+ const drive_folder_service_1 = require("../services/drive/drive-folder.service");
9
+ const drive_file_service_1 = require("../services/drive/drive-file.service");
8
10
  const logger_utils_1 = require("./logger.utils");
11
+ const config_service_1 = require("../services/config.service");
12
+ const trash_service_1 = require("../services/drive/trash.service");
13
+ const format_utils_1 = require("./format.utils");
9
14
  class WebDavUtils {
10
15
  static joinURL(...pathComponents) {
11
16
  return node_path_1.default.posix.join(...pathComponents);
@@ -44,48 +49,60 @@ class WebDavUtils {
44
49
  parentPath,
45
50
  };
46
51
  }
47
- static async tryGetFileOrFolderMetadata({ url, driveFileService, driveFolderService, }) {
52
+ static async tryGetFileOrFolderMetadata(url) {
48
53
  try {
49
- return await driveFileService.getFileMetadataByPath(url);
54
+ return await drive_file_service_1.DriveFileService.instance.getFileMetadataByPath(url);
50
55
  }
51
56
  catch {
52
- return await driveFolderService.getFolderMetadataByPath(url);
57
+ return await drive_folder_service_1.DriveFolderService.instance.getFolderMetadataByPath(url);
53
58
  }
54
59
  }
55
- static async getDriveFileFromResource({ url, driveFileService, }) {
60
+ static async getDriveFileFromResource(url) {
56
61
  try {
57
- return await driveFileService.getFileMetadataByPath(url);
62
+ return await drive_file_service_1.DriveFileService.instance.getFileMetadataByPath(url);
58
63
  }
59
64
  catch (err) {
60
65
  logger_utils_1.webdavLogger.error('Exception while getting the file metadata by path', err);
61
66
  }
62
67
  }
63
- static async getDriveFolderFromResource({ url, driveFolderService, }) {
68
+ static async getDriveFolderFromResource(url) {
64
69
  try {
65
- return await driveFolderService.getFolderMetadataByPath(url);
70
+ return await drive_folder_service_1.DriveFolderService.instance.getFolderMetadataByPath(url);
66
71
  }
67
72
  catch (err) {
68
73
  logger_utils_1.webdavLogger.error('Exception while getting the folder metadata by path', err);
69
74
  }
70
75
  }
71
- static async getDriveItemFromResource({ resource, driveFolderService, driveFileService, }) {
76
+ static async getDriveItemFromResource(resource) {
72
77
  let item = undefined;
73
78
  const isFolder = resource.url.endsWith('/');
74
79
  try {
75
80
  if (isFolder) {
76
- item = await driveFolderService.getFolderMetadataByPath(resource.url);
81
+ item = await drive_folder_service_1.DriveFolderService.instance.getFolderMetadataByPath(resource.url);
77
82
  }
78
83
  else {
79
- item = await this.tryGetFileOrFolderMetadata({
80
- url: resource.url,
81
- driveFileService,
82
- driveFolderService,
83
- });
84
+ item = await this.tryGetFileOrFolderMetadata(resource.url);
84
85
  }
85
86
  }
86
87
  catch {
87
88
  }
88
89
  return item;
89
90
  }
91
+ static async deleteOrTrashItem(driveItem) {
92
+ const configs = await config_service_1.ConfigService.instance.readWebdavConfig();
93
+ const type = format_utils_1.FormatUtils.capitalizeFirstLetter(driveItem.itemType);
94
+ if (configs.deleteFilesPermanently) {
95
+ logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Deleting permanently ${driveItem.itemType}`);
96
+ await trash_service_1.TrashService.instance.deleteItemPermanently(driveItem.itemType, driveItem.uuid);
97
+ logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} deleted permanently successfully`);
98
+ }
99
+ else {
100
+ logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${driveItem.itemType}`);
101
+ await trash_service_1.TrashService.instance.trashItems({
102
+ items: [{ type: driveItem.itemType, uuid: driveItem.uuid }],
103
+ });
104
+ logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} trashed successfully`);
105
+ }
106
+ }
90
107
  }
91
108
  exports.WebDavUtils = WebDavUtils;
@@ -1,4 +1,4 @@
1
- import { X2jOptions, XmlBuilderOptions } from '../types/fast-xml-parser.types';
1
+ import { X2jOptions, XmlBuilderOptions } from 'fast-xml-parser';
2
2
  export declare class XMLUtils {
3
3
  static readonly DEFAULT_NAMESPACE_LETTER = "D";
4
4
  static toJSON(xml: string, options?: X2jOptions): any;
@@ -1,14 +1,5 @@
1
1
  import { Request, Response } from 'express';
2
2
  import { WebDavMethodHandler } from '../../types/webdav.types';
3
- import { TrashService } from '../../services/drive/trash.service';
4
- import { DriveFileService } from '../../services/drive/drive-file.service';
5
- import { DriveFolderService } from '../../services/drive/drive-folder.service';
6
3
  export declare class DELETERequestHandler implements WebDavMethodHandler {
7
- private readonly dependencies;
8
- constructor(dependencies: {
9
- trashService: TrashService;
10
- driveFileService: DriveFileService;
11
- driveFolderService: DriveFolderService;
12
- });
13
4
  handle: (req: Request, res: Response) => Promise<void>;
14
5
  }
@@ -5,29 +5,15 @@ const webdav_utils_1 = require("../../utils/webdav.utils");
5
5
  const logger_utils_1 = require("../../utils/logger.utils");
6
6
  const errors_utils_1 = require("../../utils/errors.utils");
7
7
  class DELETERequestHandler {
8
- dependencies;
9
- constructor(dependencies) {
10
- this.dependencies = dependencies;
11
- }
12
8
  handle = async (req, res) => {
13
- const { driveFileService, driveFolderService, trashService } = this.dependencies;
14
9
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
15
10
  logger_utils_1.webdavLogger.info(`[DELETE] Request received for item at ${resource.url}`);
16
- const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource({
17
- resource,
18
- driveFolderService,
19
- driveFileService: driveFileService,
20
- });
11
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
21
12
  if (!driveItem) {
22
13
  throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
23
14
  }
24
- logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] Trashing ${driveItem.itemType}`);
25
- await trashService.trashItems({
26
- items: [{ type: driveItem.itemType, uuid: driveItem.uuid }],
27
- });
15
+ await webdav_utils_1.WebDavUtils.deleteOrTrashItem(driveItem);
28
16
  res.status(204).send();
29
- const type = driveItem.itemType.charAt(0).toUpperCase() + driveItem.itemType.substring(1);
30
- logger_utils_1.webdavLogger.info(`[DELETE] [${driveItem.uuid}] ${type} trashed successfully`);
31
17
  };
32
18
  }
33
19
  exports.DELETERequestHandler = DELETERequestHandler;
@@ -1,18 +1,5 @@
1
1
  import { WebDavMethodHandler } from '../../types/webdav.types';
2
2
  import { Request, Response } from 'express';
3
- import { DriveFileService } from '../../services/drive/drive-file.service';
4
- import { NetworkFacade } from '../../services/network/network-facade.service';
5
- import { DownloadService } from '../../services/network/download.service';
6
- import { CryptoService } from '../../services/crypto.service';
7
- import { AuthService } from '../../services/auth.service';
8
3
  export declare class GETRequestHandler implements WebDavMethodHandler {
9
- private readonly dependencies;
10
- constructor(dependencies: {
11
- driveFileService: DriveFileService;
12
- downloadService: DownloadService;
13
- cryptoService: CryptoService;
14
- authService: AuthService;
15
- networkFacade: NetworkFacade;
16
- });
17
4
  handle: (req: Request, res: Response) => Promise<void>;
18
5
  }
@@ -2,28 +2,22 @@
2
2
  Object.defineProperty(exports, "__esModule", { value: true });
3
3
  exports.GETRequestHandler = void 0;
4
4
  const webdav_utils_1 = require("../../utils/webdav.utils");
5
+ const auth_service_1 = require("../../services/auth.service");
5
6
  const errors_utils_1 = require("../../utils/errors.utils");
6
7
  const logger_utils_1 = require("../../utils/logger.utils");
7
8
  const network_utils_1 = require("../../utils/network.utils");
8
9
  const command_types_1 = require("../../types/command.types");
10
+ const cli_utils_1 = require("../../utils/cli.utils");
9
11
  class GETRequestHandler {
10
- dependencies;
11
- constructor(dependencies) {
12
- this.dependencies = dependencies;
13
- }
14
12
  handle = async (req, res) => {
15
- const { driveFileService, authService, networkFacade } = this.dependencies;
16
13
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
17
14
  logger_utils_1.webdavLogger.info(`[GET] Request received item at ${resource.url}`);
18
- const driveFile = await webdav_utils_1.WebDavUtils.getDriveFileFromResource({
19
- url: resource.url,
20
- driveFileService,
21
- });
15
+ const driveFile = await webdav_utils_1.WebDavUtils.getDriveFileFromResource(resource.url);
22
16
  if (!driveFile) {
23
17
  throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}, if trying to access a folder use PROPFIND instead.`);
24
18
  }
25
19
  logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Found Drive File`);
26
- const { user } = await authService.getAuthDetails();
20
+ const { user } = await auth_service_1.AuthService.instance.getAuthDetails();
27
21
  logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Network ready for download`);
28
22
  res.header('Content-Type', 'application/octet-stream');
29
23
  const fileSize = driveFile.size ?? 0;
@@ -50,7 +44,8 @@ class GETRequestHandler {
50
44
  if (!driveFile.fileId) {
51
45
  throw new command_types_1.NotValidFileIdError();
52
46
  }
53
- const [executeDownload] = await networkFacade.downloadToStream(driveFile.bucket, user.mnemonic, driveFile.fileId, contentLength, writable, rangeOptions);
47
+ const { networkFacade, bucket, mnemonic } = await cli_utils_1.CLIUtils.prepareNetwork(user);
48
+ const [executeDownload] = await networkFacade.downloadToStream(bucket, mnemonic, driveFile.fileId, contentLength, writable, rangeOptions);
54
49
  logger_utils_1.webdavLogger.info(`[GET] [${driveFile.uuid}] Download prepared, executing...`);
55
50
  res.status(200);
56
51
  await executeDownload;
@@ -1,10 +1,5 @@
1
1
  import { Request, Response } from 'express';
2
2
  import { WebDavMethodHandler } from '../../types/webdav.types';
3
- import { DriveFileService } from '../../services/drive/drive-file.service';
4
3
  export declare class HEADRequestHandler implements WebDavMethodHandler {
5
- private readonly dependencies;
6
- constructor(dependencies: {
7
- driveFileService: DriveFileService;
8
- });
9
4
  handle: (req: Request, res: Response) => Promise<void>;
10
5
  }
@@ -6,41 +6,29 @@ const logger_utils_1 = require("../../utils/logger.utils");
6
6
  const network_utils_1 = require("../../utils/network.utils");
7
7
  const errors_utils_1 = require("../../utils/errors.utils");
8
8
  class HEADRequestHandler {
9
- dependencies;
10
- constructor(dependencies) {
11
- this.dependencies = dependencies;
12
- }
13
9
  handle = async (req, res) => {
14
- const { driveFileService } = this.dependencies;
15
10
  const resource = await webdav_utils_1.WebDavUtils.getRequestedResource(req.url);
16
- logger_utils_1.webdavLogger.info(`[HEAD] Request received for file at ${resource.url}`);
17
- try {
18
- const driveFile = await webdav_utils_1.WebDavUtils.getDriveFileFromResource({
19
- url: resource.url,
20
- driveFileService,
21
- });
22
- if (!driveFile) {
23
- throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
24
- }
25
- logger_utils_1.webdavLogger.info(`[HEAD] [${driveFile.uuid}] Found Drive File`);
11
+ logger_utils_1.webdavLogger.info(`[HEAD] Request received for item at ${resource.url}`);
12
+ const driveItem = await webdav_utils_1.WebDavUtils.getDriveItemFromResource(resource);
13
+ if (!driveItem) {
14
+ throw new errors_utils_1.NotFoundError(`Resource not found on Internxt Drive at ${resource.url}`);
15
+ }
16
+ logger_utils_1.webdavLogger.info(`[HEAD] [${driveItem.uuid}] Found Drive item`);
17
+ if (driveItem.itemType === 'file') {
26
18
  const range = req.headers['range'];
27
19
  const rangeOptions = network_utils_1.NetworkUtils.parseRangeHeader({
28
20
  range,
29
- totalFileSize: driveFile.size,
21
+ totalFileSize: driveItem.size,
30
22
  });
31
- let contentLength = driveFile.size;
23
+ let contentLength = driveItem.size;
32
24
  if (rangeOptions) {
33
- logger_utils_1.webdavLogger.info(`[HEAD] [${driveFile.uuid}] Range request received:`, { rangeOptions });
25
+ logger_utils_1.webdavLogger.info(`[HEAD] [${driveItem.uuid}] Range request received:`, { rangeOptions });
34
26
  contentLength = rangeOptions.rangeSize;
35
27
  }
36
28
  res.header('Content-Type', 'application/octet-stream');
37
29
  res.header('Content-length', contentLength.toString());
38
- res.status(200).send();
39
- }
40
- catch {
41
- res.header('Content-Type', 'application/octet-stream');
42
- res.status(200).send();
43
30
  }
31
+ res.status(200).send();
44
32
  };
45
33
  }
46
34
  exports.HEADRequestHandler = HEADRequestHandler;