This commit is contained in:
shenlong-tanwen
2026-05-01 23:03:23 +07:00
parent 3a10b438ce
commit 6fdb841732
3 changed files with 94 additions and 33 deletions
@@ -1,6 +1,4 @@
import 'package:collection/collection.dart';
import 'package:drift/drift.dart';
import 'package:flutter/foundation.dart';
import 'package:immich_mobile/domain/models/config/app_config.dart';
import 'package:immich_mobile/domain/models/config/system_config.dart';
import 'package:immich_mobile/domain/models/metadata_key.dart';
@@ -55,30 +53,11 @@ class MetadataRepository extends DriftDatabaseRepository {
await _db
.into(_db.metadataEntity)
.insertOnConflictUpdate(
MetadataEntityCompanion.insert(key: key.key, value: encode(value), updatedAt: Value(DateTime.now())),
MetadataEntityCompanion.insert(key: key.key, value: key.encode(value), updatedAt: Value(DateTime.now())),
);
_updateCache(key, value);
}
@visibleForTesting
static String encode<T extends Object>(T value) => switch (value) {
Enum() => value.name,
DateTime() => value.toIso8601String(),
_ => throw ArgumentError('Unsupported metadata value type: ${value.runtimeType}'),
};
@visibleForTesting
static T decode<T extends Object>(MetadataKey<T> key, String raw) {
final enumValues = key.enumValues;
if (enumValues != null) {
return enumValues.firstWhereOrNull((v) => (v as Enum).name == raw) ?? key.defaultValue;
}
return switch (key.defaultValue) {
DateTime() => (DateTime.tryParse(raw) ?? key.defaultValue) as T,
_ => throw ArgumentError('Unsupported metadata value type: ${key.defaultValue.runtimeType}'),
};
}
Future<void> delete<T extends Object>(MetadataKey<T> key) async {
await (_db.delete(_db.metadataEntity)..where((t) => t.key.equals(key.key))).go();
_updateCache(key, key.defaultValue);
@@ -101,7 +80,7 @@ class MetadataRepository extends DriftDatabaseRepository {
for (final row in rows) {
final key = keyMap[row.key];
if (key == null) continue;
_updateCache(key, decode(key, row.value));
_updateCache(key, key.decode(row.value));
}
}