Bläddra i källkod

Update the delete files API

Vishnu Mohandas 4 år sedan
förälder
incheckning
5a6d538879
4 ändrade filer med 38 tillägg och 39 borttagningar
  1. 5 8
      lib/db/files_db.dart
  2. 13 17
      lib/services/sync_service.dart
  3. 0 2
      lib/ui/gallery_app_bar_widget.dart
  4. 20 12
      lib/utils/file_util.dart

+ 5 - 8
lib/db/files_db.dart

@@ -490,24 +490,21 @@ class FilesDB {
     );
   }
 
-  Future<int> markForDeletion(int uploadedFileID) async {
+  Future<int> delete(int uploadedFileID) async {
     final db = await instance.database;
-    final values = new Map<String, dynamic>();
-    values[columnIsDeleted] = 1;
-    return db.update(
+    return db.delete(
       table,
-      values,
       where: '$columnUploadedFileID =?',
       whereArgs: [uploadedFileID],
     );
   }
 
-  Future<int> delete(int uploadedFileID) async {
+  Future<int> deleteMultipleUploadedFiles(List<int> uploadedFileIDs) async {
     final db = await instance.database;
     return db.delete(
       table,
-      where: '$columnUploadedFileID =?',
-      whereArgs: [uploadedFileID],
+      where: '$columnUploadedFileID IN (?)',
+      whereArgs: [uploadedFileIDs.join(", ")],
     );
   }
 

+ 13 - 17
lib/services/sync_service.dart

@@ -287,7 +287,6 @@ class SyncService {
       await _syncCollectionDiff(c.id);
       _collectionsService.setCollectionSyncTime(c.id, c.updationTime);
     }
-    await deleteFilesOnServer();
     bool hasUploadedFiles = await _uploadDiff();
     if (hasUploadedFiles) {
       syncWithRemote(silently: true);
@@ -443,24 +442,21 @@ class SyncService {
     }
   }
 
-  Future<void> deleteFilesOnServer() async {
-    return _db.getDeletedFileIDs().then((ids) async {
-      for (int id in ids) {
-        await _deleteFileOnServer(id);
-        await _db.delete(id);
-      }
-    });
-  }
-
-  Future<void> _deleteFileOnServer(int fileID) async {
+  Future<void> deleteFilesOnServer(List<int> fileIDs) async {
     return _dio
-        .delete(
-          Configuration.instance.getHttpEndpoint() +
-              "/files/" +
-              fileID.toString(),
+        .post(
+          Configuration.instance.getHttpEndpoint() + "/files/delete",
           options: Options(
-              headers: {"X-Auth-Token": Configuration.instance.getToken()}),
+            headers: {
+              "X-Auth-Token": Configuration.instance.getToken(),
+            },
+          ),
+          data: {
+            "fileIDs": fileIDs,
+          }
         )
-        .catchError((e) => _logger.severe(e));
+        .catchError((e) {
+          _logger.severe(e);
+        });
   }
 }

+ 0 - 2
lib/ui/gallery_app_bar_widget.dart

@@ -288,7 +288,6 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
           await deleteFilesFromEverywhere(
               context, widget.selectedFiles.files.toList());
           _clearSelectedFiles();
-          showToast("files deleted from everywhere");
           Navigator.of(context, rootNavigator: true).pop();
         },
       ));
@@ -300,7 +299,6 @@ class _GalleryAppBarWidgetState extends State<GalleryAppBarWidget> {
           await deleteFilesFromEverywhere(
               context, widget.selectedFiles.files.toList());
           _clearSelectedFiles();
-          showToast("files deleted from everywhere");
           Navigator.of(context, rootNavigator: true).pop();
         },
       ));

+ 20 - 12
lib/utils/file_util.dart

@@ -28,6 +28,7 @@ import 'package:photos/models/file_type.dart';
 import 'package:photos/services/collections_service.dart';
 import 'package:photos/services/sync_service.dart';
 import 'package:photos/utils/dialog_util.dart';
+import 'package:photos/utils/toast_util.dart';
 
 import 'crypto_util.dart';
 
@@ -49,8 +50,8 @@ Future<void> deleteFilesFromEverywhere(
   } catch (e, s) {
     _logger.severe("Could not delete file", e, s);
   }
-  bool hasUploadedFiles = false;
   final updatedCollectionIDs = Set<int>();
+  final List<int> uploadedFileIDsToBeDeleted = [];
   final List<File> deletedFiles = [];
   for (final file in files) {
     if (file.localID != null) {
@@ -58,23 +59,28 @@ Future<void> deleteFilesFromEverywhere(
       if (deletedIDs.contains(file.localID)) {
         deletedFiles.add(file);
         if (file.uploadedFileID != null) {
-          hasUploadedFiles = true;
-          await FilesDB.instance.markForDeletion(file.uploadedFileID);
+          uploadedFileIDsToBeDeleted.add(file.uploadedFileID);
           updatedCollectionIDs.add(file.collectionID);
         } else {
           await FilesDB.instance.deleteLocalFile(file.localID);
         }
       }
     } else {
-      hasUploadedFiles = true;
-      await FilesDB.instance.markForDeletion(file.uploadedFileID);
+      uploadedFileIDsToBeDeleted.add(file.uploadedFileID);
     }
-    await dialog.hide();
   }
-  if (deletedFiles.isNotEmpty) {
-    Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles));
-  }
-  if (hasUploadedFiles) {
+  if (uploadedFileIDsToBeDeleted.isNotEmpty) {
+    try {
+      await SyncService.instance
+          .deleteFilesOnServer(uploadedFileIDsToBeDeleted);
+      await FilesDB.instance
+          .deleteMultipleUploadedFiles(uploadedFileIDsToBeDeleted);
+      await dialog.hide();
+    } catch (e) {
+      await dialog.hide();
+      showGenericErrorDialog(context);
+      throw e;
+    }
     for (final collectionID in updatedCollectionIDs) {
       Bus.instance.fire(CollectionUpdatedEvent(
           collectionID,
@@ -82,9 +88,11 @@ Future<void> deleteFilesFromEverywhere(
               .where((file) => file.collectionID == collectionID)
               .toList()));
     }
-    // TODO: Blocking call?
-    SyncService.instance.deleteFilesOnServer();
   }
+  if (deletedFiles.isNotEmpty) {
+    Bus.instance.fire(LocalPhotosUpdatedEvent(deletedFiles));
+  }
+  showToast("deleted from everywhere");
 }
 
 Future<void> deleteFilesOnDeviceOnly(