diff --git a/mobile/apps/photos/lib/db/remote/table/collection_files.dart b/mobile/apps/photos/lib/db/remote/table/collection_files.dart index 75d0d25ffa..54f88dc5c9 100644 --- a/mobile/apps/photos/lib/db/remote/table/collection_files.dart +++ b/mobile/apps/photos/lib/db/remote/table/collection_files.dart @@ -75,6 +75,20 @@ extension CollectionFiles on RemoteDB { .toList(growable: false); } + Future> getFileIdToCollectionFile( + List fileIDs, + ) async { + final rows = await sqliteDB.getAll( + "SELECT * FROM collection_files JOIN files on collection_files.file_id=files.id WHERE file_id IN (${fileIDs.join(",")})", + ); + final Map result = {}; + for (var row in rows) { + final entry = CollectionFile.fromMap(row); + result[entry.fileID] = entry; + } + return result; + } + Future> getAllFiles(int userID) { return sqliteDB.getAll( "SELECT * FROM collection_files JOIN files ON collection_files.file_id = files.id WHERE files.owner_id = ? ORDER BY files.creation_time DESC", diff --git a/mobile/apps/photos/lib/services/filedata/filedata_service.dart b/mobile/apps/photos/lib/services/filedata/filedata_service.dart index 5407011313..3185ec45fb 100644 --- a/mobile/apps/photos/lib/services/filedata/filedata_service.dart +++ b/mobile/apps/photos/lib/services/filedata/filedata_service.dart @@ -4,10 +4,11 @@ import "package:computer/computer.dart"; import "package:dio/dio.dart"; import "package:flutter/foundation.dart" show Uint8List; import "package:logging/logging.dart"; -import "package:photos/db/files_db.dart"; import "package:photos/db/ml/db.dart"; import "package:photos/db/ml/filedata.dart"; +import "package:photos/db/remote/table/collection_files.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/service_locator.dart"; import "package:photos/services/filedata/model/enc_file_data.dart"; import "package:photos/services/filedata/model/file_data.dart"; import "package:photos/services/filedata/model/response.dart"; @@ -102,14 +103,18 @@ class FileDataService { return result; } final inputs = <_DecoderInput>[]; - final fileMap = await FilesDB.instance - .getFileIDToFileFromIDs(remoteData.map((e) => e.fileID).toList()); + final fileToCFMap = await remoteDB + .getFileIdToCollectionFile(remoteData.map((e) => e.fileID).toList()); for (final data in remoteData) { - final file = fileMap[data.fileID]; - if (file == null) { + final cf = fileToCFMap[data.fileID]; + if (cf == null) { + assert( + false, + "Assert: CF for for fileID ${data.fileID} not found in DB", + ); continue; } - final fileKey = getFileKey(file); + final fileKey = getKeyFromCF(cf); final input = _DecoderInput(data, fileKey); inputs.add(input); } diff --git a/mobile/apps/photos/lib/services/filedata/model/file_data.dart b/mobile/apps/photos/lib/services/filedata/model/file_data.dart index 7de75dbb06..6c479998e3 100644 --- a/mobile/apps/photos/lib/services/filedata/model/file_data.dart +++ b/mobile/apps/photos/lib/services/filedata/model/file_data.dart @@ -122,7 +122,7 @@ class RemoteFaceEmbedding { factory RemoteFaceEmbedding.fromJson(Map json) { return RemoteFaceEmbedding( List.from( - json['faces'].map((x) => Face.fromJson(x as Map)), + json['faces'].map((x) => Face.fromJson(x as Map)), ), json['version'] as int, client: json['client'] as String, diff --git a/mobile/apps/photos/lib/utils/file_key.dart b/mobile/apps/photos/lib/utils/file_key.dart index 7cdc193571..2bee430e5c 100644 --- a/mobile/apps/photos/lib/utils/file_key.dart +++ b/mobile/apps/photos/lib/utils/file_key.dart @@ -2,10 +2,14 @@ import "dart:typed_data"; import "package:ente_crypto/ente_crypto.dart"; import "package:photos/models/file/file.dart"; +import "package:photos/models/file/remote/collection_file.dart"; import "package:photos/services/collections_service.dart"; Uint8List getFileKey(EnteFile file) { - final cf = file.cf!; + return getKeyFromCF(file.cf!); +} + +Uint8List getKeyFromCF(CollectionFile cf) { final collectionKey = CollectionsService.instance.getCollectionKey(cf.collectionID); return CryptoUtil.decryptSync(