Skip to content
Merged
Show file tree
Hide file tree
Changes from 25 commits
Commits
Show all changes
34 commits
Select commit Hold shift + click to select a range
65ee227
feat: migrated delete folder endpoint to drive-new
larryrider Jun 3, 2025
775851d
fix: update @internxt/sdk version to 1.9.25
larryrider Jun 3, 2025
0f8ff7b
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 3, 2025
b0843c0
feat: update storage client to use new API on fetch limit
larryrider Jun 3, 2025
b1baa09
feat: update usage service to utilize new API and response type
larryrider Jun 3, 2025
60fa4b5
feat: update deleteFile function to use new API
larryrider Jun 3, 2025
5f2916b
refactor: remove deprecated storage client methods
larryrider Jun 3, 2025
0b83eaf
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 5, 2025
1400a8f
feat: add unit tests for usageService and remove unused uuid import
larryrider Jun 5, 2025
517ac39
feat: add unit tests for limitService to validate fetchLimit function…
larryrider Jun 5, 2025
083b622
feat: update SDK mock implementation in limitService and usageService…
larryrider Jun 6, 2025
a3c1ce7
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 6, 2025
1ba780e
feat: mock error service and validate error reporting in usageService…
larryrider Jun 6, 2025
98534a4
feat: update error service mock structure in usageService tests
larryrider Jun 6, 2025
3f4fe6a
feat: refactor backup device deletion to use backupsService and filte…
larryrider Jun 12, 2025
4239a89
feat: update @internxt/sdk version to 1.9.28 in package.json and yarn…
larryrider Jun 12, 2025
5013f8a
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 12, 2025
309e44d
feat: add unit tests for deleteBackupDeviceAsFolder in backupsService…
larryrider Jun 12, 2025
d658450
feat: add unit tests for deleteFolderByUuid in newStorageService
larryrider Jun 12, 2025
f417740
feat: update package dependencies and improve node version compatibility
larryrider Jun 13, 2025
c513826
feat: update pdf.js worker source to use module URL for improved comp…
larryrider Jun 13, 2025
49da521
feat: update FilePdfViewer to create Blob with correct MIME type for …
larryrider Jun 13, 2025
f6f1d15
feat: enhance business plan usage details to include total usage calc…
larryrider Jun 13, 2025
ffd8e66
feat: update pdf.js worker source to use unpkg URL for improved loading
larryrider Jun 13, 2025
2b99356
feat: remove asmcrypto.js dependency and related tests for improved c…
larryrider Jun 13, 2025
a355f05
Revert "feat: remove asmcrypto.js dependency and related tests for im…
larryrider Jun 13, 2025
b2b7a7d
Revert feat: update pdf.js worker source to use module URL for improv…
larryrider Jun 13, 2025
477f49f
Revert "feat: update package dependencies and improve node version co…
larryrider Jun 13, 2025
1df9e35
Revert "feat: update FilePdfViewer to create Blob with correct MIME t…
larryrider Jun 16, 2025
ddb7eca
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 16, 2025
79848ff
test: add unit tests for deleteFile function in file.service
larryrider Jun 16, 2025
f0d3f39
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 16, 2025
f390c44
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
larryrider Jun 16, 2025
1392e5f
Merge branch 'master' into feat/PB-4520-migrate-storage-endpoints
CandelR Jun 17, 2025
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
10 changes: 5 additions & 5 deletions package.json
Original file line number Diff line number Diff line change
Expand Up @@ -9,7 +9,7 @@
"@internxt/css-config": "^1.0.3",
"@internxt/inxt-js": "=1.2.21",
"@internxt/lib": "^1.2.0",
"@internxt/sdk": "=1.9.23",
"@internxt/sdk": "=1.9.28",
"@internxt/ui": "^0.0.23",
"@phosphor-icons/react": "^2.1.7",
"@popperjs/core": "^2.11.6",
Expand All @@ -25,6 +25,7 @@
"axios": "^1.8.2",
"bip39": "^3.0.3",
"browserify-zlib": "^0.2.0",
"browserslist": "^4.25.0",
"copy-to-clipboard": "^3.3.1",
"crypto-browserify": "^3.12.0",
"crypto-js": "4.1.1",
Expand Down Expand Up @@ -66,7 +67,7 @@
"react-international-phone": "^4.3.0",
"react-live-chat-loader": "^2.8.2",
"react-loading-skeleton": "^2.2.0",
"react-pdf": "^7.7.3",
"react-pdf": "^9.2.1",
"react-popper": "^2.3.0",
"react-redux": "^7.2.4",
"react-router-dom": "^5.3.4",
Expand Down Expand Up @@ -146,9 +147,8 @@
"@types/react-window": "^1.8.8",
"@types/streamsaver": "^2.0.1",
"@types/wicg-file-system-access": "^2020.9.4",
"@vitejs/plugin-react": "=4.5.1",
"@vitejs/plugin-react": "=4.5.2",
"@vitest/coverage-istanbul": "^2.1.6",
"asmcrypto.js": "git+https://github.com/asmcrypto/asmcrypto.js.git",
"autoprefixer": "^10.4.16",
"buffer": "^6.0.3",
"cross-env": "^7.0.3",
Expand All @@ -173,7 +173,7 @@
"webpack-bundle-analyzer": "^4.9.1"
},
"engines": {
"node": ">=14.17.0 < 21"
"node": ">=14.17.0"
},
"lint-staged": {
"*.{js,jsx,tsx,ts}": [
Expand Down
2 changes: 1 addition & 1 deletion src/App.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,7 @@ import { manager } from './app/utils/dnd-utils';
import useBeforeUnload from './hooks/useBeforeUnload';
import useVpnAuth from './hooks/useVpnAuth';

pdfjs.GlobalWorkerOptions.workerSrc = `//cdnjs.cloudflare.com/ajax/libs/pdf.js/${pdfjs.version}/pdf.worker.js`;
pdfjs.GlobalWorkerOptions.workerSrc = `//unpkg.com/pdfjs-dist@${pdfjs.version}/build/pdf.worker.min.mjs`;

interface AppProps {
isAuthenticated: boolean;
Expand Down
4 changes: 2 additions & 2 deletions src/app/backups/hooks/useBackupDeviceActions.ts
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
import { DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
import { Device } from 'app/backups/types';
import { deleteBackupDeviceAsFolder } from 'app/drive/services/folder.service';
import backupsService from '../services/backups.service';
import { DriveItemData, DriveFolderData as DriveWebFolderData } from 'app/drive/types';
import { AppDispatch } from 'app/store';
import { useAppSelector } from 'app/store/hooks';
Expand Down Expand Up @@ -79,7 +79,7 @@ export const useBackupDeviceActions = (
dispatch(backupsThunks.deleteDeviceThunk(selectedDevice));
} else {
await dispatch(deleteItemsThunk([selectedDevice as DriveItemData])).unwrap();
await deleteBackupDeviceAsFolder(selectedDevice as DriveWebFolderData);
await backupsService.deleteBackupDeviceAsFolder((selectedDevice as DriveWebFolderData).uuid);
dispatch(backupsThunks.fetchDevicesThunk());
}
}
Expand Down
27 changes: 27 additions & 0 deletions src/app/backups/services/backups.service.test.ts
Original file line number Diff line number Diff line change
@@ -0,0 +1,27 @@
import { describe, expect, it, Mock, vi } from 'vitest';
import backupsService from './backups.service';
import { SdkFactory } from '../../core/factory/sdk';

vi.mock('../../core/factory/sdk', () => ({
SdkFactory: {
getNewApiInstance: vi.fn(),
},
}));

describe('backupsService', () => {
describe('deleteBackupDeviceAsFolder', () => {
const mockFolderId = 'test-folder-id';

it('should call deleteBackupDeviceAsFolder with the correct folderId', async () => {
const mockResponse = vi.fn().mockResolvedValue({});
const mockStorageClient = { deleteBackupDeviceAsFolder: mockResponse };
(SdkFactory.getNewApiInstance as Mock).mockReturnValue({
createBackupsClient: () => mockStorageClient,
});

await backupsService.deleteBackupDeviceAsFolder(mockFolderId);

expect(mockStorageClient.deleteBackupDeviceAsFolder).toHaveBeenCalledWith(mockFolderId);
});
});
});
7 changes: 6 additions & 1 deletion src/app/backups/services/backups.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -15,7 +15,7 @@ const backupsService = {
async getAllDevicesAsFolders(): Promise<DriveFolderData[]> {
const backupsClient = SdkFactory.getNewApiInstance().createBackupsClient();
const encryptedFolders = await backupsClient.getAllDevicesAsFolder();
return encryptedFolders.map(mapBackupFolder);
return encryptedFolders.filter((folder) => !folder.deleted).map(mapBackupFolder);
},

async getAllBackups(mac: string): Promise<DeviceBackup[]> {
Expand All @@ -41,6 +41,11 @@ const backupsService = {
const backupsClient = SdkFactory.getNewApiInstance().createBackupsClient();
return backupsClient.deleteBackupDevice(device.id);
},

deleteBackupDeviceAsFolder(folderId: string) {
const backupsClient = SdkFactory.getNewApiInstance().createBackupsClient();
return backupsClient.deleteBackupDeviceAsFolder(folderId);
}
};

export default backupsService;
6 changes: 3 additions & 3 deletions src/app/backups/views/BackupsView/BackupsView.tsx
Original file line number Diff line number Diff line change
Expand Up @@ -8,10 +8,10 @@ import WarningMessageWrapper from '../../../drive/components/WarningMessage/Warn
import BackupsAsFoldersList from '../../components/BackupsAsFoldersList/BackupsAsFoldersList';
import DeviceList from '../../components/DeviceList/DeviceList';
import FileViewerWrapper from '../../../drive/components/FileViewer/FileViewerWrapper';
import { deleteBackupDeviceAsFolder } from '../../../drive/services/folder.service';
import newStorageService from '../../../drive/services/new-storage.service';
import { deleteFile } from '../../../drive/services/file.service';
import { deleteItemsThunk } from '../../../store/slices/storage/storage.thunks/deleteItemsThunk';
import { DriveFolderData as DriveWebFolderData, DriveItemData } from '../../../drive/types';
import { DriveItemData } from '../../../drive/types';
import { DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
import { contextMenuSelectedBackupItems } from '../../../drive/components/DriveExplorer/DriveExplorerList/DriveItemContextMenu';
import { useBackupListActions } from 'app/backups/hooks/useBackupListActions';
Expand Down Expand Up @@ -84,7 +84,7 @@ export default function BackupsView(): JSX.Element {
const filteredCurrentItems = currentItems.filter((item) => !selectedItemsIDs.has(item.id));
try {
const deletePromises = selectedItems.map((item) =>
item.isFolder ? deleteBackupDeviceAsFolder(item as DriveWebFolderData) : deleteFile(item),
item.isFolder ? newStorageService.deleteFolderByUuid(item.uuid) : deleteFile(item),
);
await Promise.all(deletePromises);
dispatch(deleteItemsThunk(selectedItems));
Expand Down
7 changes: 0 additions & 7 deletions src/app/core/factory/sdk/index.ts
Original file line number Diff line number Diff line change
Expand Up @@ -61,13 +61,6 @@ export class SdkFactory {
return Auth.client(apiUrl, appDetails, apiSecurity);
}

public createStorageClient(): Storage {
const apiUrl = this.getApiUrl();
const appDetails = SdkFactory.getAppDetails();
const apiSecurity = this.getApiSecurity();
return Storage.client(apiUrl, appDetails, apiSecurity);
}

public createNewStorageClient(): Storage {
const apiUrl = this.getApiUrl();
const appDetails = SdkFactory.getAppDetails();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -4,12 +4,11 @@ import { useAppDispatch, useAppSelector } from 'app/store/hooks';
import { RootState } from 'app/store';
import { DriveFolderData as DriveWebFolderData, DriveItemData } from '../../types';
import { deleteItemsThunk } from '../../../store/slices/storage/storage.thunks/deleteItemsThunk';
import { deleteBackupDeviceAsFolder } from '../../../drive/services/folder.service';
import { backupsThunks } from 'app/store/slices/backups';
import { SdkFactory } from '../../../core/factory/sdk';
import { DriveFolderData } from '@internxt/sdk/dist/drive/storage/types';
import { useTranslationContext } from 'app/i18n/provider/TranslationProvider';
import { Dialog } from '@internxt/ui';
import backupsService from 'app/backups/services/backups.service';

interface DeleteBackupDialogProps {
backupsAsFoldersPath: DriveFolderData[];
Expand All @@ -35,7 +34,7 @@ const DeleteBackupDialog = (props: DeleteBackupDialogProps): JSX.Element => {
if (currentDevice && 'mac' in currentDevice) dispatch(backupsThunks.deleteDeviceThunk(currentDevice));
else {
await dispatch(deleteItemsThunk([currentDevice as DriveItemData])).unwrap();
await deleteBackupDeviceAsFolder(currentDevice as DriveWebFolderData);
await backupsService.deleteBackupDeviceAsFolder((currentDevice as DriveWebFolderData).uuid);
await dispatch(backupsThunks.fetchDevicesThunk());
}
onClose();
Expand All @@ -45,8 +44,7 @@ const DeleteBackupDialog = (props: DeleteBackupDialogProps): JSX.Element => {
}
} else {
try {
const storageClient = SdkFactory.getInstance().createStorageClient();
await storageClient.deleteFolder(currentBackupsAsFoldersPath.id);
await backupsService.deleteBackupDeviceAsFolder(currentBackupsAsFoldersPath.uuid);
await dispatch(backupsThunks.fetchDevicesThunk());
onClose();
props.goToFolder(previousBackupsAsFoldersPath.id);
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ const DEFAULT_ZOOM = 1;

const FilePdfViewer = (props: FormatFileViewerProps): JSX.Element => {
const { translate } = useTranslationContext();
const [fileUrl] = useState(URL.createObjectURL(props.blob));
const [fileUrl] = useState(URL.createObjectURL(new Blob([props.blob], { type: 'application/pdf' })));
const [numPages, setNumPages] = useState<number>(0);
const [currentPage, setCurrentPage] = useState(1);
const [zoom, setZoom] = useState(DEFAULT_ZOOM);
Expand Down Expand Up @@ -92,7 +92,7 @@ const FilePdfViewer = (props: FormatFileViewerProps): JSX.Element => {
}, [currentPage, numPages]);

return (
<div className="flex max-h-full w-full items-center justify-center pt-20">
<div className="flex max-h-full w-full items-center justify-center">
<div>
<div className="flex items-center justify-center">
<Document file={fileUrl} loading="" onLoadSuccess={onDocumentLoadSuccess}>
Expand Down
32 changes: 2 additions & 30 deletions src/app/drive/services/file.service/index.ts
Original file line number Diff line number Diff line change
@@ -1,7 +1,6 @@
import { StorageTypes } from '@internxt/sdk/dist/drive';
import { FileMeta } from '@internxt/sdk/dist/drive/storage/types';
import { t } from 'i18next';
import * as uuid from 'uuid';
import { SdkFactory } from '../../../core/factory/sdk';
import errorService from '../../../core/services/error.service';
import { DriveFileData, DriveFileMetadataPayload } from '../../types';
Expand All @@ -18,32 +17,6 @@
return storageClient.updateFileNameWithUUID(payload, resourcesToken);
}

export async function moveFile(
fileId: string,
destination: number,
bucketId: string,
): Promise<StorageTypes.MoveFileResponse> {
const storageClient = SdkFactory.getInstance().createStorageClient();
const payload: StorageTypes.MoveFilePayload = {
fileId: fileId,
destination: destination,
bucketId: bucketId,
destinationPath: uuid.v4(),
};
return storageClient
.moveFile(payload)
.then((response) => {
return response;
})
.catch((error) => {
const castedError = errorService.castError(error);
if (castedError.status) {
castedError.message = t(`tasks.move-file.errors.${castedError.status}`);
}
throw castedError;
});
}

export async function moveFileByUuid(fileUuid: string, destinationFolderUuid: string): Promise<StorageTypes.FileMeta> {
const storageClient = SdkFactory.getNewApiInstance().createNewStorageClient();
const payload: StorageTypes.MoveFileUuidPayload = {
Expand All @@ -65,8 +38,8 @@
}

export async function deleteFile(fileData: DriveFileData): Promise<void> {
const storageClient = SdkFactory.getInstance().createStorageClient();
await storageClient.deleteFile({ fileId: fileData.id, folderId: fileData.folderId });
const storageClient = SdkFactory.getNewApiInstance().createNewStorageClient();
await storageClient.deleteFileByUuid(fileData.uuid);
}

async function fetchRecents(limit: number): Promise<StorageTypes.DriveFileData[]> {
Expand All @@ -75,7 +48,7 @@
}

async function fetchDeleted(): Promise<DriveFileData[]> {
const trashClient = SdkFactory.getNewApiInstance().createTrashClient();

Check failure on line 51 in src/app/drive/services/file.service/index.ts

View workflow job for this annotation

GitHub Actions / tests (20.x)

src/app/drive/services/limit.service.test.ts

ReferenceError: Cannot access 'uploadFile' before initialization ❯ src/app/drive/services/file.service/index.ts:51:3

const trashRequest = trashClient.getTrash();

Expand All @@ -94,7 +67,6 @@

const fileService = {
updateMetaData,
moveFile,
moveFileByUuid,
fetchRecents,
uploadFile,
Expand Down
50 changes: 0 additions & 50 deletions src/app/drive/services/folder.service.ts
Original file line number Diff line number Diff line change
Expand Up @@ -95,28 +95,6 @@ export interface DownloadFolderAsZipOptions {
workspaceId?: string;
}

export function createFolder(
currentFolderId: number,
folderName: string,
): [Promise<StorageTypes.CreateFolderResponse>, RequestCanceler] {
const payload: StorageTypes.CreateFolderPayload = {
parentFolderId: currentFolderId,
folderName: folderName,
};
const storageClient = SdkFactory.getInstance().createStorageClient();
const [createdFolderPromise, requestCanceler] = storageClient.createFolder(payload);

const finalPromise = createdFolderPromise
.then((response) => {
return response;
})
.catch((error) => {
throw errorService.castError(error);
});

return [finalPromise, requestCanceler];
}

export function createFolderByUuid(
parentFolderUuid: string,
plainName: string,
Expand Down Expand Up @@ -159,11 +137,6 @@ export async function deleteFolder(folderData: DriveFolderData): Promise<void> {
await trashClient.deleteFolder(folderData.id);
}

export async function deleteBackupDeviceAsFolder(folderData: DriveFolderData): Promise<void> {
const storageClient = SdkFactory.getInstance().createStorageClient();
await storageClient.deleteFolder(folderData.id);
}

interface GetDirectoryFoldersResponse {
folders: DriveFolderData[];
last: boolean;
Expand Down Expand Up @@ -588,27 +561,6 @@ async function fetchFolderTree(folderUUID: string): Promise<{
return { tree, folderDecryptedNames, fileDecryptedNames, size };
}

export async function moveFolder(folderId: number, destination: number): Promise<StorageTypes.MoveFolderResponse> {
const storageClient = SdkFactory.getInstance().createStorageClient();
const payload: StorageTypes.MoveFolderPayload = {
folderId: folderId,
destinationFolderId: destination,
};

return storageClient
.moveFolder(payload)
.then((response) => {
return response;
})
.catch((err) => {
const castedError = errorService.castError(err);
if (castedError.status) {
castedError.message = t(`tasks.move-folder.errors.${castedError.status}`);
}
throw castedError;
});
}

export async function moveFolderByUuid(
folderUuid: string,
destinationFolderUuid: string,
Expand All @@ -629,10 +581,8 @@ export async function moveFolderByUuid(
}

const folderService = {
createFolder,
createFolderByUuid,
updateMetaData,
moveFolder,
moveFolderByUuid,
fetchFolderTree,
downloadFolderAsZip,
Expand Down
Loading
Loading