Browse Source

Add support for bulkEdit time

Neeraj Gupta 2 years ago
parent
commit
9f935e11f0
2 changed files with 67 additions and 1 deletions
  1. 1 1
      lib/extensions/list.dart
  2. 66 0
      lib/services/files_service.dart

+ 1 - 1
lib/extensions/list.dart

@@ -12,7 +12,7 @@ extension ListExtension<E> on List<E> {
   // splitMatch, based on the matchFunction, split the input list in two
   // lists. result.matched contains items which matched and result.unmatched
   // contains remaining items.
-  ListMatch<E> splitMatch(bool Function(E element) matchFunction) {
+  ListMatch<E> splitMatch(bool Function(E e) matchFunction) {
     final listMatch = ListMatch<E>();
     for (final element in this) {
       if (matchFunction(element)) {

+ 66 - 0
lib/services/files_service.dart

@@ -1,14 +1,28 @@
 import 'package:dio/dio.dart';
 import 'package:logging/logging.dart';
+import 'package:path/path.dart';
+import 'package:photos/core/configuration.dart';
 import 'package:photos/core/network.dart';
+import 'package:photos/db/files_db.dart';
+import 'package:photos/extensions/list.dart';
+import 'package:photos/models/file.dart';
+import 'package:photos/models/magic_metadata.dart';
+import 'package:photos/services/file_magic_service.dart';
+import 'package:photos/utils/date_time_util.dart';
 
 class FilesService {
   late Dio _enteDio;
   late Logger _logger;
+  late FilesDB _filesDB;
+  late Configuration _config;
+
   FilesService._privateConstructor() {
     _enteDio = Network.instance.enteDio;
     _logger = Logger("FilesService");
+    _filesDB = FilesDB.instance;
+    _config = Configuration.instance;
   }
+
   static final FilesService instance = FilesService._privateConstructor();
 
   Future<int> getFileSize(int uploadedFileID) async {
@@ -25,6 +39,58 @@ class FilesService {
       rethrow;
     }
   }
+
+  Future<void> bulkEditTime(
+    List<File> files,
+    EditTimeSource source,
+  ) async {
+    assert(
+      source == EditTimeSource.fileName,
+      "edit source ${source.name} is not supported yet",
+    );
+    final ListMatch<File> result = files.splitMatch(
+      (element) => element.isUploaded,
+    );
+    final List<File> uploadedFiles = result.matched;
+    // editTime For LocalFiles
+    final List<File> localOnlyFiles = result.unmatched;
+    for (File localFile in localOnlyFiles) {
+      final timeResult = parseDateTimeFromFileNameV2(
+        basenameWithoutExtension(localFile.title ?? ""),
+      );
+      if (timeResult != null) {
+        localFile.creationTime = timeResult.microsecondsSinceEpoch;
+      }
+    }
+    await _filesDB.insertMultiple(localOnlyFiles);
+
+    final List<File> remoteFilesToUpdate = [];
+    final Map<int, Map<String, int>> fileIDToUpdateMetadata = {};
+    for (File remoteFile in uploadedFiles) {
+      // discard files not owned by user and also dedupe already processed
+      // files
+      if (remoteFile.ownerID != _config.getUserID()! ||
+          fileIDToUpdateMetadata.containsKey(remoteFile.uploadedFileID)) {
+        continue;
+      }
+      final timeResult = parseDateTimeFromFileNameV2(
+        basenameWithoutExtension(remoteFile.title ?? ""),
+      );
+      if (timeResult != null) {
+        remoteFilesToUpdate.add(remoteFile);
+        fileIDToUpdateMetadata[remoteFile.uploadedFileID!] = {
+          pubMagicKeyEditedTime: timeResult.microsecondsSinceEpoch,
+        };
+      }
+    }
+    if (remoteFilesToUpdate.isNotEmpty) {
+      await FileMagicService.instance.updatePublicMagicMetadata(
+        remoteFilesToUpdate,
+        null,
+        metadataUpdateMap: fileIDToUpdateMetadata,
+      );
+    }
+  }
 }
 
 enum EditTimeSource {