fix(mobile): migrate legacy manage-media flag through the boolean migration path

This commit is contained in:
Peter Ombodi 2026-08-11 13:35:44 +03:00
parent 57ac0ec86d
commit d3b04378cc
2 changed files with 37 additions and 13 deletions

View file

@ -155,7 +155,7 @@ Future<void> _migrateTo26(Drift drift) async {
Future<void> _migrateTo27(Drift drift) async {
final migrator = _StoreMigrator(drift);
await migrator.migrateTrashSyncMode(.legacyManageLocalMediaAndroid);
await migrator.migrateBool(.legacyManageLocalMediaAndroid, .trashSyncEnabled);
await migrator.complete();
}
@ -275,18 +275,6 @@ class _StoreMigrator {
_migratedStoreIds.add(legacyKey.id);
}
Future<void> migrateTrashSyncMode(StoreKey<bool> legacyKey) async {
final intValue = await readLegacyStoreInt(legacyKey.id);
if (intValue == null) {
return;
}
if (intValue != 0) {
_cache[SettingsKey.trashSyncMode] = TrashSyncMode.autoSync;
}
_migratedStoreIds.add(legacyKey.id);
}
Future<void> migrateLegacyTrashSyncSetting() async {
final row = await (_db.settingsEntity.select()..where((row) => row.key.equals(SettingsKey.trashSyncEnabled.name)))
.getSingleOrNull();

View file

@ -7,6 +7,7 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/store.service.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/infrastructure/entities/settings.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/store.entity.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/store.repository.dart';
import 'package:immich_mobile/utils/migration.dart';
@ -54,6 +55,37 @@ void main() {
expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull);
expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull);
});
group('fresh install migrating from before version 27', () {
setUp(() => Store.put(StoreKey.version, 26));
test('carries an enabled legacy manage-media setting through steps 27 and 28 into a mode', () async {
await Store.put(StoreKey.legacyManageLocalMediaAndroid, true);
await migrateDatabaseIfNeeded(db);
expect(await _readSetting(db, SettingsKey.trashSyncMode), TrashSyncMode.autoSync);
expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull);
expect(await _readLegacyStoreRow(db, StoreKey.legacyManageLocalMediaAndroid), isNull);
});
test('drops a disabled legacy manage-media setting without creating a mode', () async {
await Store.put(StoreKey.legacyManageLocalMediaAndroid, false);
await migrateDatabaseIfNeeded(db);
expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull);
expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull);
expect(await _readLegacyStoreRow(db, StoreKey.legacyManageLocalMediaAndroid), isNull);
});
test('leaves an absent legacy manage-media setting at the default mode', () async {
await migrateDatabaseIfNeeded(db);
expect(await _readSetting(db, SettingsKey.trashSyncMode), isNull);
expect(await _readSetting(db, SettingsKey.trashSyncEnabled), isNull);
});
});
}
Future<void> _writeSetting<T>(Drift db, SettingsKey<T> key, T value) {
@ -66,3 +98,7 @@ Future<T?> _readSetting<T>(Drift db, SettingsKey<T> key) async {
final row = await (db.settingsEntity.select()..where((row) => row.key.equals(key.name))).getSingleOrNull();
return row?.value == null ? null : key.decode(row!.value!);
}
Future<StoreEntityData?> _readLegacyStoreRow(Drift db, StoreKey key) {
return (db.storeEntity.select()..where((row) => row.id.equals(key.id))).getSingleOrNull();
}