Files
immich/mobile-v2/lib/domain/repositories/store.repository.dart
T
shenlong-tanwen 11cef4ec9a 🚀
2025-02-26 08:58:18 +05:30

67 lines
1.9 KiB
Dart

import 'dart:async';
import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/entities/store.entity.drift.dart';
import 'package:immich_mobile/domain/interfaces/store.interface.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/repositories/database.repository.dart';
class StoreDriftRepository implements IStoreRepository {
final DriftDatabaseRepository db;
const StoreDriftRepository(this.db);
@override
FutureOr<T?> getValue<T>(StoreKey key) async {
final value = await db.managers.store
.filter((s) => s.id.equals(key.id))
.getSingleOrNull();
return value?.toModel().extract(key.type);
}
@override
FutureOr<void> setValue<T>(StoreKey<T> key, T value) {
return db.transaction(() async {
final storeValue = StoreValue.of(key, value);
await db.into(db.store).insertOnConflictUpdate(StoreCompanion.insert(
id: Value(storeValue.id),
intValue: Value(storeValue.intValue),
stringValue: Value(storeValue.stringValue),
));
});
}
@override
FutureOr<void> deleteValue(StoreKey key) {
return db.transaction(() async {
await db.managers.store.filter((s) => s.id.equals(key.id)).delete();
});
}
@override
Stream<List<StoreValue>> watchStore() {
return (db.select(db.store).map((s) => s.toModel())).watch();
}
@override
Stream<T?> watchValue<T>(StoreKey key) {
return db.managers.store
.filter((s) => s.id.equals(key.id))
.watchSingleOrNull()
.map((e) => e?.toModel().extract(key.type));
}
@override
FutureOr<void> clearStore() {
return db.transaction(() async {
await db.managers.store.delete();
});
}
}
extension _StoreDataToStoreValue on StoreData {
StoreValue toModel() {
return StoreValue(id: id, intValue: intValue, stringValue: stringValue);
}
}