diff --git a/mobile/lib/services/collections_service.dart b/mobile/lib/services/collections_service.dart index ae8ae150f..881c28b20 100644 --- a/mobile/lib/services/collections_service.dart +++ b/mobile/lib/services/collections_service.dart @@ -1149,10 +1149,7 @@ class CollectionsService { } Future addToCollection(int collectionID, List files) async { - final containsUploadedFile = files.firstWhereOrNull( - (element) => element.uploadedFileID != null, - ) != - null; + final containsUploadedFile = files.any((e) => e.isUploaded); if (containsUploadedFile) { final existingFileIDsInCollection = await FilesDB.instance.getUploadedFileIDs(collectionID); @@ -1263,6 +1260,63 @@ class CollectionsService { } } + Future copyToCollection(int collectionID, List files) async { + final containsUploadedFile = files.firstWhereOrNull( + (element) => element.uploadedFileID != null, + ) != + null; + if (containsUploadedFile) { + final existingFileIDsInCollection = + await FilesDB.instance.getUploadedFileIDs(collectionID); + files.removeWhere( + (element) => + element.uploadedFileID != null && + existingFileIDsInCollection.contains(element.uploadedFileID), + ); + } + if (files.isEmpty || !containsUploadedFile) { + _logger.info("nothing to add to the collection"); + return; + } + + final params = {}; + params["collectionID"] = collectionID; + final batchedFiles = files.chunks(batchSize); + for (final batch in batchedFiles) { + params["files"] = []; + for (final file in batch) { + final fileKey = getFileKey(file); + file.generatedID = + null; // So that a new entry is created in the FilesDB + file.collectionID = collectionID; + final encryptedKeyData = + CryptoUtil.encryptSync(fileKey, getCollectionKey(collectionID)); + file.encryptedKey = + CryptoUtil.bin2base64(encryptedKeyData.encryptedData!); + file.keyDecryptionNonce = + CryptoUtil.bin2base64(encryptedKeyData.nonce!); + params["files"].add( + CollectionFileItem( + file.uploadedFileID!, + file.encryptedKey!, + file.keyDecryptionNonce!, + ).toMap(), + ); + } + + try { + await _enteDio.post( + "/collections/add-files", + data: params, + ); + await _filesDB.insertMultiple(batch); + Bus.instance.fire(CollectionUpdatedEvent(collectionID, batch, "addTo")); + } catch (e) { + rethrow; + } + } + } + Future linkLocalFileToExistingUploadedFileInAnotherCollection( int destCollectionID, { required EnteFile localFileToUpload,