diff --git a/src/services/collectionService.ts b/src/services/collectionService.ts index b4f627313..902f614df 100644 --- a/src/services/collectionService.ts +++ b/src/services/collectionService.ts @@ -66,6 +66,8 @@ import { } from 'utils/collection'; import ComlinkCryptoWorker from 'utils/comlink/ComlinkCryptoWorker'; import { getLocalFiles } from './fileService'; +import { REQUEST_BATCH_SIZE } from 'constants/api'; +import { batch } from 'utils/common'; const ENDPOINT = getEndpoint(); const COLLECTION_TABLE = 'collections'; @@ -405,21 +407,24 @@ export const addToCollection = async ( ) => { try { const token = getToken(); - const fileKeysEncryptedWithNewCollection = - await encryptWithNewCollectionKey(collection, files); + const batchedFiles = batch(files, REQUEST_BATCH_SIZE); + for (const batch of batchedFiles) { + const fileKeysEncryptedWithNewCollection = + await encryptWithNewCollectionKey(collection, batch); - const requestBody: AddToCollectionRequest = { - collectionID: collection.id, - files: fileKeysEncryptedWithNewCollection, - }; - await HTTPService.post( - `${ENDPOINT}/collections/add-files`, - requestBody, - null, - { - 'X-Auth-Token': token, - } - ); + const requestBody: AddToCollectionRequest = { + collectionID: collection.id, + files: fileKeysEncryptedWithNewCollection, + }; + await HTTPService.post( + `${ENDPOINT}/collections/add-files`, + requestBody, + null, + { + 'X-Auth-Token': token, + } + ); + } } catch (e) { logError(e, 'Add to collection Failed '); throw e; @@ -432,21 +437,24 @@ export const restoreToCollection = async ( ) => { try { const token = getToken(); - const fileKeysEncryptedWithNewCollection = - await encryptWithNewCollectionKey(collection, files); + const batchedFiles = batch(files, REQUEST_BATCH_SIZE); + for (const batch of batchedFiles) { + const fileKeysEncryptedWithNewCollection = + await encryptWithNewCollectionKey(collection, batch); - const requestBody: AddToCollectionRequest = { - collectionID: collection.id, - files: fileKeysEncryptedWithNewCollection, - }; - await HTTPService.post( - `${ENDPOINT}/collections/restore-files`, - requestBody, - null, - { - 'X-Auth-Token': token, - } - ); + const requestBody: AddToCollectionRequest = { + collectionID: collection.id, + files: fileKeysEncryptedWithNewCollection, + }; + await HTTPService.post( + `${ENDPOINT}/collections/restore-files`, + requestBody, + null, + { + 'X-Auth-Token': token, + } + ); + } } catch (e) { logError(e, 'restore to collection Failed '); throw e; @@ -459,22 +467,25 @@ export const moveToCollection = async ( ) => { try { const token = getToken(); - const fileKeysEncryptedWithNewCollection = - await encryptWithNewCollectionKey(toCollection, files); + const batchedFiles = batch(files, REQUEST_BATCH_SIZE); + for (const batch of batchedFiles) { + const fileKeysEncryptedWithNewCollection = + await encryptWithNewCollectionKey(toCollection, batch); - const requestBody: MoveToCollectionRequest = { - fromCollectionID: fromCollectionID, - toCollectionID: toCollection.id, - files: fileKeysEncryptedWithNewCollection, - }; - await HTTPService.post( - `${ENDPOINT}/collections/move-files`, - requestBody, - null, - { - 'X-Auth-Token': token, - } - ); + const requestBody: MoveToCollectionRequest = { + fromCollectionID: fromCollectionID, + toCollectionID: toCollection.id, + files: fileKeysEncryptedWithNewCollection, + }; + await HTTPService.post( + `${ENDPOINT}/collections/move-files`, + requestBody, + null, + { + 'X-Auth-Token': token, + } + ); + } } catch (e) { logError(e, 'move to collection Failed '); throw e; @@ -605,18 +616,20 @@ export const removeNonUserFiles = async ( try { const fileIDs = nonUserFiles.map((f) => f.id); const token = getToken(); + const batchedFileIDs = batch(fileIDs, REQUEST_BATCH_SIZE); + for (const batch of batchedFileIDs) { + const request: RemoveFromCollectionRequest = { + collectionID, + fileIDs: batch, + }; - const request: RemoveFromCollectionRequest = { - collectionID, - fileIDs, - }; - - await HTTPService.post( - `${ENDPOINT}/collections/v3/remove-files`, - request, - null, - { 'X-Auth-Token': token } - ); + await HTTPService.post( + `${ENDPOINT}/collections/v3/remove-files`, + request, + null, + { 'X-Auth-Token': token } + ); + } } catch (e) { logError(e, 'remove non user files failed '); throw e; diff --git a/src/services/fileService.ts b/src/services/fileService.ts index 763512e00..a11f9eb93 100644 --- a/src/services/fileService.ts +++ b/src/services/fileService.ts @@ -12,9 +12,8 @@ import { sortFiles, } from 'utils/file'; import { eventBus, Events } from './events'; -import { EnteFile, EncryptedEnteFile, TrashRequest } from 'types/file'; +import { EnteFile, EncryptedEnteFile } from 'types/file'; import { SetFiles } from 'types/gallery'; -import { MAX_TRASH_BATCH_SIZE } from 'constants/file'; import { BulkUpdateMagicMetadataRequest } from 'types/magicMetadata'; import { addLogLine } from 'utils/logging'; import { isCollectionHidden } from 'utils/collection'; @@ -24,6 +23,8 @@ import { getCollectionLastSyncTime, setCollectionLastSyncTime, } from './collectionService'; +import { REQUEST_BATCH_SIZE } from 'constants/api'; +import { batch } from 'utils/common'; const ENDPOINT = getEndpoint(); const FILES_TABLE = 'files'; @@ -161,24 +162,11 @@ export const trashFiles = async (filesToTrash: EnteFile[]) => { if (!token) { return; } - - const trashBatch: TrashRequest = { - items: [], - }; - - for (const file of filesToTrash) { - trashBatch.items.push({ - collectionID: file.collectionID, - fileID: file.id, + const batchedFilesToTrash = batch(filesToTrash, REQUEST_BATCH_SIZE); + for (const batch of batchedFilesToTrash) { + await HTTPService.post(`${ENDPOINT}/files/trash`, batch, null, { + 'X-Auth-Token': token, }); - if (trashBatch.items.length >= MAX_TRASH_BATCH_SIZE) { - await trashFilesFromServer(trashBatch, token); - trashBatch.items = []; - } - } - - if (trashBatch.items.length > 0) { - await trashFilesFromServer(trashBatch, token); } } catch (e) { logError(e, 'trash file failed'); @@ -192,16 +180,16 @@ export const deleteFromTrash = async (filesToDelete: number[]) => { if (!token) { return; } - let deleteBatch: number[] = []; - for (const fileID of filesToDelete) { - deleteBatch.push(fileID); - if (deleteBatch.length >= MAX_TRASH_BATCH_SIZE) { - await deleteBatchFromTrash(token, deleteBatch); - deleteBatch = []; - } - } - if (deleteBatch.length > 0) { - await deleteBatchFromTrash(token, deleteBatch); + const batchedFilesToDelete = batch(filesToDelete, REQUEST_BATCH_SIZE); + for (const batch of batchedFilesToDelete) { + await HTTPService.post( + `${ENDPOINT}/trash/delete`, + { fileIDs: batch }, + null, + { + 'X-Auth-Token': token, + } + ); } } catch (e) { logError(e, 'deleteFromTrash failed'); @@ -209,22 +197,6 @@ export const deleteFromTrash = async (filesToDelete: number[]) => { } }; -const deleteBatchFromTrash = async (token: string, deleteBatch: number[]) => { - try { - await HTTPService.post( - `${ENDPOINT}/trash/delete`, - { fileIDs: deleteBatch }, - null, - { - 'X-Auth-Token': token, - } - ); - } catch (e) { - logError(e, 'deleteBatchFromTrash failed'); - throw e; - } -}; - export const updateFileMagicMetadata = async (files: EnteFile[]) => { const token = getToken(); if (!token) { @@ -303,14 +275,3 @@ export const updateFilePublicMagicMetadata = async (files: EnteFile[]) => { }) ); }; - -async function trashFilesFromServer(trashBatch: TrashRequest, token: any) { - try { - await HTTPService.post(`${ENDPOINT}/files/trash`, trashBatch, null, { - 'X-Auth-Token': token, - }); - } catch (e) { - logError(e, 'trash files from server failed'); - throw e; - } -}