diff --git a/mobile/lib/domain/services/local_sync.service.dart b/mobile/lib/domain/services/local_sync.service.dart index ebb4adb382..4fedeca92b 100644 --- a/mobile/lib/domain/services/local_sync.service.dart +++ b/mobile/lib/domain/services/local_sync.service.dart @@ -44,8 +44,9 @@ class LocalSyncService { final deviceAlbums = await _nativeSyncApi.getAlbums(); await _localAlbumRepository.updateAll(deviceAlbums.toLocalAlbums()); + final newAssets = delta.updates.toLocalAssets(); await _localAlbumRepository.processDelta( - updates: delta.updates.toLocalAssets(), + updates: newAssets, deletes: delta.deletes, assetAlbums: delta.assetAlbums, ); @@ -74,11 +75,7 @@ class LocalSyncService { await updateAlbum(dbAlbum, album); } - final newAssetIds = delta.updates.map((e) => e.id).toList(); - if (newAssetIds.isNotEmpty) { - final cloudMapping = await _nativeSyncApi.getCloudIdForAssetIds(newAssetIds); - await _localAlbumRepository.updateCloudMapping(cloudMapping); - } + await _mapIosCloudIds(newAssets); } await _nativeSyncApi.checkpointSync(); @@ -118,9 +115,12 @@ class LocalSyncService { try { _log.fine("Adding device album ${album.name}"); - final assets = album.assetCount > 0 ? await _nativeSyncApi.getAssetsForAlbum(album.id) : []; + final assets = album.assetCount > 0 + ? await _nativeSyncApi.getAssetsForAlbum(album.id).then((a) => a.toLocalAssets()) + : []; - await _localAlbumRepository.upsert(album, toUpsert: assets.toLocalAssets()); + await _localAlbumRepository.upsert(album, toUpsert: assets); + await _mapIosCloudIds(assets); _log.fine("Successfully added device album ${album.name}"); } catch (e, s) { _log.warning("Error while adding device album", e, s); @@ -190,13 +190,16 @@ class LocalSyncService { return false; } - final newAssets = await _nativeSyncApi.getAssetsForAlbum(deviceAlbum.id, updatedTimeCond: updatedTime); + final newAssets = await _nativeSyncApi + .getAssetsForAlbum(deviceAlbum.id, updatedTimeCond: updatedTime) + .then((a) => a.toLocalAssets()); await _localAlbumRepository.upsert( deviceAlbum.copyWith(backupSelection: dbAlbum.backupSelection), - toUpsert: newAssets.toLocalAssets(), + toUpsert: newAssets, ); + await _mapIosCloudIds(newAssets); return true; } catch (e, s) { _log.warning("Error on fast syncing local album: ${dbAlbum.name}", e, s); @@ -228,6 +231,7 @@ class LocalSyncService { if (dbAlbum.assetCount == 0) { _log.fine("Device album ${deviceAlbum.name} is empty. Adding assets to DB."); await _localAlbumRepository.upsert(updatedDeviceAlbum, toUpsert: assetsInDevice); + await _mapIosCloudIds(assetsInDevice); return true; } @@ -265,6 +269,7 @@ class LocalSyncService { } await _localAlbumRepository.upsert(updatedDeviceAlbum, toUpsert: assetsToUpsert, toDelete: assetsToDelete); + await _mapIosCloudIds(assetsToUpsert); return true; } catch (e, s) { @@ -273,6 +278,16 @@ class LocalSyncService { return true; } + Future _mapIosCloudIds(List assets) async { + if (!_platform.isIOS || assets.isEmpty) { + return; + } + + final assetIds = assets.map((a) => a.id).toList(); + final cloudMapping = await _nativeSyncApi.getCloudIdForAssetIds(assetIds); + await _localAlbumRepository.updateCloudMapping(cloudMapping); + } + bool _assetsEqual(LocalAsset a, LocalAsset b) { return a.updatedAt.isAtSameMomentAs(b.updatedAt) && a.createdAt.isAtSameMomentAs(b.createdAt) &&