[mob][photos] Avoid localIDs of non-existant assets from being passed to photo_manager's deleteWithIds() when using free up space feature to avoid complete failure of free up space operation

This commit is contained in:
ashilkn
2025-02-21 20:04:12 +05:30
parent 5806eb6e60
commit 5e6860f2cd
2 changed files with 29 additions and 10 deletions

View File

@@ -1272,15 +1272,26 @@ class FilesDB {
);
}
Future<List<EnteFile>> getLocalFiles(List<String> localIDs) async {
Future<List<EnteFile>> getLocalFiles(
List<String> localIDs, {
bool dedupeByLocalID = false,
}) async {
late final String query;
final inParam = localIDs.map((id) => "'$id'").join(',');
final db = await instance.sqliteAsyncDB;
final results = await db.getAll(
'''
if (dedupeByLocalID) {
query = '''
SELECT * FROM $filesTable
WHERE $columnLocalID IN ($inParam)
GROUP BY $columnLocalID;
''';
} else {
query = '''
SELECT * FROM $filesTable
WHERE $columnLocalID IN ($inParam);
''',
);
''';
}
final results = await db.getAll(query);
return convertToFiles(results);
}

View File

@@ -325,18 +325,26 @@ Future<bool> deleteLocalFiles(
BuildContext context,
List<String> localIDs,
) async {
final files =
await FilesDB.instance.getLocalFiles(localIDs, dedupeByLocalID: true);
final List<String> deletedIDs = [];
final List<String> localAssetIDs = [];
final List<String> localSharedMediaIDs = [];
final List<String> alreadyDeletedIDs = []; // to ignore already deleted files
try {
for (String id in localIDs) {
if (id.startsWith(oldSharedMediaIdentifier) ||
id.startsWith(sharedMediaIdentifier)) {
localSharedMediaIDs.add(id);
for (final file in files) {
if (!(await _localFileExist(file))) {
_logger.warning("Already deleted " + file.toString());
alreadyDeletedIDs.add(file.localID!);
} else if (file.localID!.startsWith(oldSharedMediaIdentifier) ||
file.localID!.startsWith(sharedMediaIdentifier)) {
localSharedMediaIDs.add(file.localID!);
} else {
localAssetIDs.add(id);
localAssetIDs.add(file.localID!);
}
}
deletedIDs.addAll(alreadyDeletedIDs);
deletedIDs.addAll(await _tryDeleteSharedMediaFiles(localSharedMediaIDs));
final bool shouldDeleteInBatches =