Ver código fonte

Add ignored file service & cache ignoredIDs

Neeraj Gupta 3 anos atrás
pai
commit
8a4d6801ab

+ 10 - 0
lib/db/ignored_files_db.dart

@@ -127,6 +127,16 @@ class IgnoredFilesDB {
     return result;
   }
 
+  Future<List<IgnoredFile>> getAll() async {
+    final db = await instance.database;
+    final rows = await db.query(tableName);
+    final result = <IgnoredFile>[];
+    for (final row in rows) {
+      result.add(_getIgnoredFileFromRow(row));
+    }
+    return result;
+  }
+
   IgnoredFile _getIgnoredFileFromRow(Map<String, dynamic> row) {
     return IgnoredFile(row[columnLocalID], row[columnTitle],
         row[columnDeviceFolder], row[columnReason]);

+ 57 - 0
lib/services/ignored_files_service.dart

@@ -0,0 +1,57 @@
+import 'dart:async';
+import 'dart:io';
+
+import 'package:logging/logging.dart';
+import 'package:photos/db/ignored_files_db.dart';
+import 'package:photos/models/ignored_file.dart';
+
+class IgnoredFilesService {
+  final _logger = Logger("IgnoredFilesService");
+  final _db = IgnoredFilesDB.instance;
+
+  IgnoredFilesService._privateConstructor();
+
+  static final IgnoredFilesService instance =
+      IgnoredFilesService._privateConstructor();
+
+  Future<Set<String>> _ignoredIDs;
+
+  Future<Set<String>> get ignoredIDs async {
+    // lazily instantiate the db the first time it is accessed
+    _ignoredIDs ??= _loadExistingIDs();
+    return _ignoredIDs;
+  }
+
+  Future<void> cacheAndInsert(List<IgnoredFile> ignoredFiles) async {
+    final existingIDs = await ignoredIDs;
+    existingIDs.addAll(ignoredFiles.map((e) => _iDForIgnoredFile(e)).toSet());
+    return _db.insertMultiple(ignoredFiles);
+  }
+
+  Future<Set<String>> _loadExistingIDs() async {
+    final result = await _db.getAll();
+    return result.map((e) => _iDForIgnoredFile(e)).toSet();
+  }
+
+  String _iDForIgnoredFile(IgnoredFile ignoredFile) {
+    return _geIgnoreID(
+        ignoredFile.localID, ignoredFile.deviceFolder, ignoredFile.title);
+  }
+
+  // _computeIgnoreID will return null if don't have sufficient information
+  // to ignore the file based on the platform
+  String _geIgnoreID(String localID, String deviceFolder, String title) {
+    // file was not uploaded from mobile device
+    if (localID == null || localID.isEmpty) {
+      return null;
+    }
+    if (Platform.isAndroid) {
+      if (deviceFolder == null || title == null) {
+        return null;
+      }
+      return '$deviceFolder-$title';
+    } else {
+      return localID;
+    }
+  }
+}

+ 2 - 2
lib/services/trash_sync_service.dart

@@ -2,12 +2,12 @@ import 'package:dio/dio.dart';
 import 'package:logging/logging.dart';
 import 'package:photos/core/configuration.dart';
 import 'package:photos/core/network.dart';
-import 'package:photos/db/ignored_files_db.dart';
 import 'package:photos/db/trash_db.dart';
 import 'package:photos/models/file.dart';
 import 'package:photos/models/ignored_file.dart';
 import 'package:photos/models/trash_file.dart';
 import 'package:photos/models/trash_item_request.dart';
+import 'package:photos/services/ignored_files_service.dart';
 import 'package:photos/utils/trash_diff_fetcher.dart';
 import 'package:shared_preferences/shared_preferences.dart';
 
@@ -73,7 +73,7 @@ class TrashSyncService {
     }
     if (ignoredFiles.isNotEmpty) {
       _logger.fine('updating ${ignoredFiles.length} ignored files ');
-      await IgnoredFilesDB.instance.insertMultiple(ignoredFiles);
+      await IgnoredFilesService.instance.cacheAndInsert(ignoredFiles);
     }
   }