From 15aa941436fe397993c228abef330ec3bed39217 Mon Sep 17 00:00:00 2001 From: Jeffrey Starke Date: Wed, 21 May 2025 16:34:21 -0400 Subject: [PATCH] Limit delete archived media requests to 1000 items at a time. Fixes an error that occurs when attempting to delete all archived media caused by exceeding the API's 1000 item limit. --- .../securesms/backup/v2/BackupRepository.kt | 28 +++++++++++++------ 1 file changed, 19 insertions(+), 9 deletions(-) diff --git a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt index f135600655..57888e8541 100644 --- a/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt +++ b/app/src/main/java/org/thoughtcrime/securesms/backup/v2/BackupRepository.kt @@ -1282,29 +1282,39 @@ object BackupRepository { } fun debugDeleteAllArchivedMedia(): NetworkResult { + val itemLimit = 1000 return debugGetArchivedMediaState() .then { archivedMedia -> - val mediaToDelete = archivedMedia + val mediaChunksToDelete = archivedMedia .map { DeleteArchivedMediaRequest.ArchivedMediaObject( cdn = it.cdn, mediaId = it.mediaId ) } + .chunked(itemLimit) - if (mediaToDelete.isEmpty()) { + if (mediaChunksToDelete.isEmpty()) { Log.i(TAG, "No media to delete, quick success") - NetworkResult.Success(Unit) - } else { - getArchiveServiceAccessPair() - .then { credential -> - SignalNetwork.archive.deleteArchivedMedia( + return@then NetworkResult.Success(Unit) + } + + getArchiveServiceAccessPair() + .then processChunks@{ credential -> + mediaChunksToDelete.forEachIndexed { index, chunk -> + val result = SignalNetwork.archive.deleteArchivedMedia( aci = SignalStore.account.requireAci(), archiveServiceAccess = credential.mediaBackupAccess, - mediaToDelete = mediaToDelete + mediaToDelete = chunk ) + + if (result !is NetworkResult.Success) { + Log.w(TAG, "Error occurred while deleting archived media chunk #$index: $result") + return@processChunks result + } } - } + NetworkResult.Success(Unit) + } } .map { SignalDatabase.attachments.clearAllArchiveData()