Browse Source

[mob][photos] Minor refactor

Neeraj Gupta 1 year ago
parent
commit
b18e5cb036
1 changed files with 58 additions and 4 deletions
  1. 58 4
      mobile/lib/services/collections_service.dart

+ 58 - 4
mobile/lib/services/collections_service.dart

@@ -1149,10 +1149,7 @@ class CollectionsService {
   }
 
   Future<void> addToCollection(int collectionID, List<EnteFile> 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<void> copyToCollection(int collectionID, List<EnteFile> 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 = <String, dynamic>{};
+    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<EnteFile> linkLocalFileToExistingUploadedFileInAnotherCollection(
     int destCollectionID, {
     required EnteFile localFileToUpload,