diff --git a/mobile/lib/domain/utils/migrate_cloud_ids.dart b/mobile/lib/domain/utils/migrate_cloud_ids.dart index 1e63bfb229..1e7fe64021 100644 --- a/mobile/lib/domain/utils/migrate_cloud_ids.dart +++ b/mobile/lib/domain/utils/migrate_cloud_ids.dart @@ -1,7 +1,9 @@ import 'package:drift/drift.dart'; import 'package:hooks_riverpod/hooks_riverpod.dart'; +import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/domain/models/asset/asset_metadata.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/extensions/drift_extensions.dart'; import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart'; @@ -56,6 +58,20 @@ Future _populateCloudIds(Drift drift) async { typedef _CloudIdMapping = ({String remoteAssetId, LocalAsset localAsset}); Future> _fetchCloudIdMappings(Drift drift, String userId) async { + final createdAt = drift.localAssetEntity.createdAt.strftime('%s'); + final adjustmentTime = coalesce([drift.localAssetEntity.adjustmentTime.strftime('%s'), const Constant('0')]); + final latitude = coalesce([ + drift.localAssetEntity.latitude, + const Constant(0.0), + ]).truncateTo(2).cast(DriftSqlType.string); + final longitude = coalesce([ + drift.localAssetEntity.longitude, + const Constant(0.0), + ]).truncateTo(2).cast(DriftSqlType.string); + + final delimiter = const Constant(kUploadETagDelimiter); + final eTag = createdAt + delimiter + adjustmentTime + delimiter + latitude + delimiter + longitude; + final query = drift.remoteAssetEntity.select().join([ leftOuterJoin( @@ -71,7 +87,7 @@ Future> _fetchCloudIdMappings(Drift drift, String userId) drift.localAssetEntity.id.isNotNull() & drift.localAssetEntity.iCloudId.isNotNull() & drift.remoteAssetEntity.ownerId.equals(userId) & - drift.remoteAssetCloudIdEntity.cloudId.isNull(), + (drift.remoteAssetCloudIdEntity.cloudId.isNull() | drift.remoteAssetCloudIdEntity.eTag.isNotExp(eTag)), ); return query.map((row) { return (