group local assets by checksum before moving to trash

delete LocalAssetEntity records when moved to trash
refactor code
This commit is contained in:
Peter Ombodi 2025-09-05 17:41:30 +03:00
parent c7e4f9db85
commit d8fb41e795
2 changed files with 16 additions and 8 deletions

View file

@ -35,8 +35,8 @@ class TrashSyncService {
if (!_platform.isAndroid || !_appSettingsService.getSetting<bool>(AppSettingsEnum.manageLocalMediaAndroid)) {
return Future.value();
}
final trashedAssetsChecksums = <String>[];
final modifiedAssetsChecksums = <String>[];
final trashedAssetsChecksums = <String>{};
final modifiedAssetsChecksums = <String>{};
for (var syncItem in syncItems) {
if (syncItem.deletedAt != null) {
trashedAssetsChecksums.add(syncItem.checksum);
@ -52,15 +52,20 @@ class TrashSyncService {
if (trashedAssetsChecksums.isEmpty) {
return Future.value();
} else {
final localAssetsToTrash = await _localAssetRepository.getByChecksums(trashedAssetsChecksums);
if (localAssetsToTrash.isNotEmpty) {
final candidatesToTrash = await _localAssetRepository.getByChecksums(trashedAssetsChecksums);
if (candidatesToTrash.isNotEmpty) {
final groupedByChecksum = <String, LocalAsset>{};
for (final localAsset in candidatesToTrash) {
groupedByChecksum[localAsset.checksum!] = localAsset;
}
final mediaUrls = await Future.wait(
localAssetsToTrash.map(
groupedByChecksum.values.map(
(localAsset) => _storageRepository.getAssetEntityForAsset(localAsset).then((e) => e?.getMediaUrl()),
),
);
_logger.info("Moving to trash ${mediaUrls.join(", ")} assets");
await _localFilesManager.moveToTrash(mediaUrls.nonNulls.toList());
await _localAssetRepository.delete(candidatesToTrash.map((asset) => asset.id));
}
}
}

View file

@ -44,7 +44,7 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository {
});
}
Future<void> delete(List<String> ids) {
Future<void> delete(Iterable<String> ids) {
if (ids.isEmpty) {
return Future.value();
}
@ -71,8 +71,11 @@ class DriftLocalAssetRepository extends DriftDatabaseRepository {
}
Future<List<LocalAsset>> getByChecksums(Iterable<String> checksums) {
if (checksums.isEmpty) return Future.value([]);
final query = _db.localAssetEntity.select()..where((lae) => lae.checksum.isIn(checksums));
if (checksums.isEmpty) {
return Future.value([]);
}
final query = _db.localAssetEntity.select()
..where((lae) => lae.checksum.isIn(checksums));
return query.map((row) => row.toDto()).get();
}
}