diff --git a/mobile/lib/infrastructure/entities/merged_asset.drift b/mobile/lib/infrastructure/entities/merged_asset.drift index 217a18b75..2e08b6424 100644 --- a/mobile/lib/infrastructure/entities/merged_asset.drift +++ b/mobile/lib/infrastructure/entities/merged_asset.drift @@ -90,8 +90,14 @@ FROM ( SELECT CASE - WHEN :group_by = 0 THEN STRFTIME('%Y-%m-%d', rae.local_date_time) - WHEN :group_by = 1 THEN STRFTIME('%Y-%m', rae.local_date_time) + WHEN :group_by = 0 THEN COALESCE( + STRFTIME('%Y-%m-%d', rae.local_date_time), + STRFTIME('%Y-%m-%d', rae.created_at, 'localtime') + ) + WHEN :group_by = 1 THEN COALESCE( + STRFTIME('%Y-%m', rae.local_date_time), + STRFTIME('%Y-%m', rae.created_at, 'localtime') + ) END as bucket_date FROM remote_asset_entity rae diff --git a/mobile/lib/infrastructure/entities/merged_asset.drift.dart b/mobile/lib/infrastructure/entities/merged_asset.drift.dart index cd2fe5cfc..e88d11d44 100644 Binary files a/mobile/lib/infrastructure/entities/merged_asset.drift.dart and b/mobile/lib/infrastructure/entities/merged_asset.drift.dart differ diff --git a/mobile/test/infrastructure/repositories/merged_asset_drift_test.dart b/mobile/test/infrastructure/repositories/merged_asset_drift_test.dart new file mode 100644 index 000000000..a25a9d92a --- /dev/null +++ b/mobile/test/infrastructure/repositories/merged_asset_drift_test.dart @@ -0,0 +1,51 @@ +import 'package:drift/drift.dart'; +import 'package:drift/native.dart'; +import 'package:flutter_test/flutter_test.dart'; +import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; +import 'package:immich_mobile/domain/models/timeline.model.dart'; +import 'package:immich_mobile/infrastructure/entities/remote_asset.entity.drift.dart'; +import 'package:immich_mobile/infrastructure/entities/user.entity.drift.dart'; +import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; + +void main() { + late Drift db; + + setUp(() { + db = Drift(DatabaseConnection(NativeDatabase.memory(), closeStreamsSynchronously: true)); + }); + + tearDown(() async { + await db.close(); + }); + + test('mergedBucket falls back to createdAt when localDateTime is null', () async { + const userId = 'user-1'; + final createdAt = DateTime(2024, 1, 1, 12); + + await db + .into(db.userEntity) + .insert(UserEntityCompanion.insert(id: userId, email: 'user-1@test.dev', name: 'User 1')); + + await db + .into(db.remoteAssetEntity) + .insert( + RemoteAssetEntityCompanion.insert( + id: 'asset-1', + name: 'asset-1.jpg', + type: AssetType.image, + checksum: 'checksum-1', + ownerId: userId, + visibility: AssetVisibility.timeline, + createdAt: Value(createdAt), + updatedAt: Value(createdAt), + localDateTime: const Value(null), + ), + ); + + final buckets = await db.mergedAssetDrift.mergedBucket(groupBy: GroupAssetsBy.day.index, userIds: [userId]).get(); + + expect(buckets, hasLength(1)); + expect(buckets.single.assetCount, 1); + expect(buckets.single.bucketDate, isNotEmpty); + }); +}