Explorar el Código

Publish a single event for file deletions within a collection

vishnukvmd hace 3 años
padre
commit
ff3e88a2f1
Se han modificado 2 ficheros con 95 adiciones y 91 borrados
  1. 13 3
      lib/services/remote_sync_service.dart
  2. 82 88
      lib/utils/diff_fetcher.dart

+ 13 - 3
lib/services/remote_sync_service.dart

@@ -8,6 +8,7 @@ import 'package:photos/core/errors.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/events/collection_updated_event.dart';
 import 'package:photos/events/collection_updated_event.dart';
+import 'package:photos/events/files_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/sync_status_update_event.dart';
 import 'package:photos/events/sync_status_update_event.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/file.dart';
@@ -92,15 +93,24 @@ class RemoteSyncService {
   Future<void> _syncCollectionDiff(int collectionID, int sinceTime) async {
   Future<void> _syncCollectionDiff(int collectionID, int sinceTime) async {
     final diff = await _diffFetcher.getEncryptedFilesDiff(
     final diff = await _diffFetcher.getEncryptedFilesDiff(
         collectionID, sinceTime, kDiffLimit);
         collectionID, sinceTime, kDiffLimit);
+    if (diff.deletedFiles.isNotEmpty) {
+      final fileIDs = diff.deletedFiles.map((f) => f.uploadedFileID).toList();
+      final deletedFiles =
+          (await FilesDB.instance.getFilesFromIDs(fileIDs)).values.toList();
+      await FilesDB.instance.deleteFilesFromCollection(collectionID, fileIDs);
+      Bus.instance.fire(CollectionUpdatedEvent(collectionID, deletedFiles));
+      Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles));
+    }
     if (diff.updatedFiles.isNotEmpty) {
     if (diff.updatedFiles.isNotEmpty) {
       await _storeDiff(diff.updatedFiles, collectionID);
       await _storeDiff(diff.updatedFiles, collectionID);
       _logger.info("Updated " +
       _logger.info("Updated " +
           diff.updatedFiles.length.toString() +
           diff.updatedFiles.length.toString() +
           " files in collection " +
           " files in collection " +
           collectionID.toString());
           collectionID.toString());
-      Bus.instance.fire(LocalPhotosUpdatedEvent(diff.updatedFiles));
-      Bus.instance
-          .fire(CollectionUpdatedEvent(collectionID, diff.updatedFiles));
+      Bus.instance.fire(
+          LocalPhotosUpdatedEvent(diff.updatedFiles, type: EventType.deleted));
+      Bus.instance.fire(CollectionUpdatedEvent(collectionID, diff.updatedFiles,
+          type: EventType.deleted));
     }
     }
     if (diff.fetchCount == kDiffLimit) {
     if (diff.fetchCount == kDiffLimit) {
       return await _syncCollectionDiff(collectionID,
       return await _syncCollectionDiff(collectionID,

+ 82 - 88
lib/utils/diff_fetcher.dart

@@ -7,8 +7,6 @@ import 'package:photos/core/configuration.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/event_bus.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/core/network.dart';
 import 'package:photos/db/files_db.dart';
 import 'package:photos/db/files_db.dart';
-import 'package:photos/events/collection_updated_event.dart';
-import 'package:photos/events/local_photos_updated_event.dart';
 import 'package:photos/events/remote_sync_event.dart';
 import 'package:photos/events/remote_sync_event.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/magic_metadata.dart';
 import 'package:photos/models/magic_metadata.dart';
@@ -21,100 +19,96 @@ class DiffFetcher {
 
 
   Future<Diff> getEncryptedFilesDiff(
   Future<Diff> getEncryptedFilesDiff(
       int collectionID, int sinceTime, int limit) async {
       int collectionID, int sinceTime, int limit) async {
-    return _dio
-        .get(
-          Configuration.instance.getHttpEndpoint() + "/collections/diff",
-          options: Options(
-              headers: {"X-Auth-Token": Configuration.instance.getToken()}),
-          queryParameters: {
-            "collectionID": collectionID,
-            "sinceTime": sinceTime,
-            "limit": limit,
-          },
-        )
-        .catchError((e) => _logger.severe(e))
-        .then((response) async {
-          final files = <File>[];
-          if (response != null) {
-            Bus.instance.fire(RemoteSyncEvent(true));
-            final diff = response.data["diff"] as List;
-            final startTime = DateTime.now();
-            final existingFiles =
-                await FilesDB.instance.getUploadedFileIDs(collectionID);
-            for (final item in diff) {
-              final file = File();
-              file.uploadedFileID = item["id"];
-              file.collectionID = item["collectionID"];
-              if (item["isDeleted"]) {
-                if (existingFiles.contains(file.uploadedFileID)) {
-                  await FilesDB.instance.deleteFromCollection(
-                      file.uploadedFileID, file.collectionID);
-                  Bus.instance
-                      .fire(CollectionUpdatedEvent(file.collectionID, [file]));
-                  Bus.instance.fire(LocalPhotosUpdatedEvent([file]));
-                }
-                continue;
-              }
-              if (existingFiles.contains(file.uploadedFileID)) {
-                final existingFile = await FilesDB.instance
-                    .getUploadedFile(file.uploadedFileID, file.collectionID);
-                if (existingFile != null) {
-                  file.generatedID = existingFile.generatedID;
-                }
-              }
-              file.updationTime = item["updationTime"];
-              file.ownerID = item["ownerID"];
-              file.encryptedKey = item["encryptedKey"];
-              file.keyDecryptionNonce = item["keyDecryptionNonce"];
-              file.fileDecryptionHeader = item["file"]["decryptionHeader"];
-              file.thumbnailDecryptionHeader =
-                  item["thumbnail"]["decryptionHeader"];
-              file.metadataDecryptionHeader =
-                  item["metadata"]["decryptionHeader"];
-
-              final fileDecryptionKey = decryptFileKey(file);
-              final encodedMetadata = await CryptoUtil.decryptChaCha(
-                Sodium.base642bin(item["metadata"]["encryptedData"]),
-                fileDecryptionKey,
-                Sodium.base642bin(file.metadataDecryptionHeader),
-              );
-              Map<String, dynamic> metadata =
-                  jsonDecode(utf8.decode(encodedMetadata));
-              file.applyMetadata(metadata);
-              if (item['magicMetadata'] != null) {
-                final utfEncodedMmd = await CryptoUtil.decryptChaCha(
-                    Sodium.base642bin(item['magicMetadata']['data']),
-                    fileDecryptionKey,
-                    Sodium.base642bin(item['magicMetadata']['header']));
-                file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
-                file.mMdVersion = item['magicMetadata']['version'];
-                file.magicMetadata =
-                    MagicMetadata.fromEncodedJson(file.mMdEncodedJson);
-              }
-              files.add(file);
+    return _dio.get(
+      Configuration.instance.getHttpEndpoint() + "/collections/diff",
+      options:
+          Options(headers: {"X-Auth-Token": Configuration.instance.getToken()}),
+      queryParameters: {
+        "collectionID": collectionID,
+        "sinceTime": sinceTime,
+        "limit": limit,
+      },
+    ).catchError((e) {
+      _logger.severe(e);
+    }).then((response) async {
+      final files = <File>[];
+      if (response != null) {
+        Bus.instance.fire(RemoteSyncEvent(true));
+        final diff = response.data["diff"] as List;
+        final startTime = DateTime.now();
+        final existingFiles =
+            await FilesDB.instance.getUploadedFileIDs(collectionID);
+        final deletedFiles = <File>[];
+        for (final item in diff) {
+          final file = File();
+          file.uploadedFileID = item["id"];
+          file.collectionID = item["collectionID"];
+          if (item["isDeleted"]) {
+            if (existingFiles.contains(file.uploadedFileID)) {
+              deletedFiles.add(file);
+            }
+            continue;
+          }
+          if (existingFiles.contains(file.uploadedFileID)) {
+            final existingFile = await FilesDB.instance
+                .getUploadedFile(file.uploadedFileID, file.collectionID);
+            if (existingFile != null) {
+              file.generatedID = existingFile.generatedID;
             }
             }
+          }
+          file.updationTime = item["updationTime"];
+          file.ownerID = item["ownerID"];
+          file.encryptedKey = item["encryptedKey"];
+          file.keyDecryptionNonce = item["keyDecryptionNonce"];
+          file.fileDecryptionHeader = item["file"]["decryptionHeader"];
+          file.thumbnailDecryptionHeader =
+              item["thumbnail"]["decryptionHeader"];
+          file.metadataDecryptionHeader = item["metadata"]["decryptionHeader"];
 
 
-            final endTime = DateTime.now();
-            _logger.info("time for parsing " +
-                files.length.toString() +
-                ": " +
-                Duration(
-                        microseconds: (endTime.microsecondsSinceEpoch -
-                            startTime.microsecondsSinceEpoch))
-                    .inMilliseconds
-                    .toString());
-            return Diff(files, diff.length);
-          } else {
-            Bus.instance.fire(RemoteSyncEvent(false));
-            return Diff(<File>[], 0);
+          final fileDecryptionKey = decryptFileKey(file);
+          final encodedMetadata = await CryptoUtil.decryptChaCha(
+            Sodium.base642bin(item["metadata"]["encryptedData"]),
+            fileDecryptionKey,
+            Sodium.base642bin(file.metadataDecryptionHeader),
+          );
+          Map<String, dynamic> metadata =
+              jsonDecode(utf8.decode(encodedMetadata));
+          file.applyMetadata(metadata);
+          if (item['magicMetadata'] != null) {
+            final utfEncodedMmd = await CryptoUtil.decryptChaCha(
+                Sodium.base642bin(item['magicMetadata']['data']),
+                fileDecryptionKey,
+                Sodium.base642bin(item['magicMetadata']['header']));
+            file.mMdEncodedJson = utf8.decode(utfEncodedMmd);
+            file.mMdVersion = item['magicMetadata']['version'];
+            file.magicMetadata =
+                MagicMetadata.fromEncodedJson(file.mMdEncodedJson);
           }
           }
-        });
+          files.add(file);
+        }
+
+        final endTime = DateTime.now();
+        _logger.info("time for parsing " +
+            files.length.toString() +
+            ": " +
+            Duration(
+                    microseconds: (endTime.microsecondsSinceEpoch -
+                        startTime.microsecondsSinceEpoch))
+                .inMilliseconds
+                .toString());
+        return Diff(files, deletedFiles, diff.length);
+      } else {
+        Bus.instance.fire(RemoteSyncEvent(false));
+        return Diff(<File>[], <File>[], 0);
+      }
+    });
   }
   }
 }
 }
 
 
 class Diff {
 class Diff {
   final List<File> updatedFiles;
   final List<File> updatedFiles;
+  final List<File> deletedFiles;
   final int fetchCount;
   final int fetchCount;
 
 
-  Diff(this.updatedFiles, this.fetchCount);
+  Diff(this.updatedFiles, this.deletedFiles, this.fetchCount);
 }
 }