make the repository an accessor

This commit is contained in:
shenlong-tanwen 2026-08-22 16:26:12 +05:30
parent dd8fc833ba
commit 6bb68ab030
11 changed files with 26 additions and 35 deletions

View file

@ -82,7 +82,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
trashedLocalAssetRepository: db.trashedLocalAssetRepository,
assetMediaRepository: ref.read(assetMediaRepositoryProvider),
permissionRepository: ref.read(permissionRepositoryProvider),
appMetadataRepository: ref.read(appMetadataRepositoryProvider),
appMetadataRepository: db.appMetadataRepository,
cancellation: _cancellationToken,
);
_remoteSyncService = SyncStreamService(
@ -94,7 +94,7 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
permissionRepository: ref.read(permissionRepositoryProvider),
syncMigrationRepository: db.syncMigrationRepository,
api: ref.read(apiServiceProvider),
appMetadataRepository: ref.read(appMetadataRepositoryProvider),
appMetadataRepository: db.appMetadataRepository,
cancellation: _cancellationToken,
);
_hashService = HashService(

View file

@ -1,12 +1,14 @@
import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/models/app_metadata_key.dart';
import 'package:immich_mobile/infrastructure/entities/app_metadata.entity.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
class AppMetadataRepository {
final Drift _db;
@DriftAccessor()
class AppMetadataRepository extends DatabaseAccessor<Drift> with $AppMetadataRepositoryMixin {
AppMetadataRepository(super.attachedDatabase);
const AppMetadataRepository(this._db);
Drift get _db => attachedDatabase;
Future<T> get<T>(AppMetadataKey<T> key) async {
final row = await (_db.select(_db.appMetadataEntity)..where((row) => row.key.equals(key.name))).getSingleOrNull();

View file

@ -34,6 +34,7 @@ import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity
import 'package:immich_mobile/infrastructure/entities/trashed_local_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
import 'package:immich_mobile/infrastructure/entities/user_metadata.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/backup.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.steps.dart';
@ -93,6 +94,7 @@ import 'package:sqlite_async/sqlite_async.dart';
],
include: {'package:immich_mobile/infrastructure/entities/merged_asset.drift'},
daos: [
AppMetadataRepository,
AuthUserRepository,
BackupRepository,
LocalAlbumRepository,

View file

@ -5,8 +5,8 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/presentation/actions/action.dart';
import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/toast.provider.dart';
import 'package:immich_mobile/providers/server_info.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
@ -218,7 +218,7 @@ Future<int> _cleanupLocalAssets(
final requiresPrompt =
requestCustomPrompt &&
CurrentPlatform.isAndroid &&
await ref.read(appMetadataRepositoryProvider).get(.manageLocalMediaAndroid);
await ref.read(driftProvider).appMetadataRepository.get(.manageLocalMediaAndroid);
if (requiresPrompt && context.mounted) {
final confirmed = await showDialog<bool>(

View file

@ -1,7 +0,0 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/infrastructure/repositories/app_metadata.repository.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
final appMetadataRepositoryProvider = Provider<AppMetadataRepository>(
(ref) => AppMetadataRepository(ref.watch(driftProvider)),
);

View file

@ -1,10 +1,5 @@
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/services/asset.service.dart';
import 'package:immich_mobile/infrastructure/repositories/local_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_asset.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_exif.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/trashed_local_asset.repository.dart';
import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/user.provider.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart';
@ -19,6 +14,7 @@ final assetServiceProvider = Provider((ref) {
apiRepository: ref.watch(assetApiRepositoryProvider),
mediaRepository: ref.watch(assetMediaRepositoryProvider),
trashedLocalRepository: db.trashedLocalAssetRepository,
appMetadataRepository: db.appMetadataRepository,
);
});

View file

@ -4,9 +4,6 @@ import 'package:immich_mobile/domain/services/local_sync.service.dart';
import 'package:immich_mobile/domain/services/sync_stream.service.dart';
import 'package:immich_mobile/infrastructure/repositories/sync_api.repository.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/cancel.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
@ -24,7 +21,7 @@ final syncStreamServiceProvider = Provider((ref) {
permissionRepository: ref.watch(permissionRepositoryProvider),
syncMigrationRepository: db.syncMigrationRepository,
api: ref.watch(apiServiceProvider),
appMetadataRepository: ref.watch(appMetadataRepositoryProvider),
appMetadataRepository: db.appMetadataRepository,
cancellation: ref.watch(cancellationProvider),
);
});
@ -40,7 +37,7 @@ final localSyncServiceProvider = Provider((ref) {
assetMediaRepository: ref.watch(assetMediaRepositoryProvider),
permissionRepository: ref.watch(permissionRepositoryProvider),
nativeSyncApi: ref.watch(nativeSyncApiProvider),
appMetadataRepository: ref.watch(appMetadataRepositoryProvider),
appMetadataRepository: db.appMetadataRepository,
cancellation: ref.watch(cancellationProvider),
);
});

View file

@ -31,7 +31,7 @@ Future<void> migrateDatabaseIfNeeded(Drift drift) async {
.count(where: (row) => row.key.equals(AppMetadataKey.version.name))
.map((count) => count == 0)
.getSingle();
final metadata = AppMetadataRepository(drift);
final metadata = drift.appMetadataRepository;
final version = await metadata.get(.version);
if (version < 25) {

View file

@ -9,6 +9,7 @@ import 'package:immich_mobile/domain/models/app_metadata_key.dart';
import 'package:immich_mobile/domain/services/log.service.dart';
import 'package:immich_mobile/extensions/build_context_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/infrastructure/readonly_mode.provider.dart';
import 'package:immich_mobile/providers/infrastructure/settings.provider.dart';
@ -69,7 +70,8 @@ class AdvancedSettings extends HookConsumerWidget {
if (isManageMediaSupported.value) {
manageLocalMediaAndroid.value = await ref
.read(appMetadataRepositoryProvider)
.read(driftProvider)
.appMetadataRepository
.get(AppMetadataKey.manageLocalMediaAndroid);
if (!context.mounted) {
return;
@ -103,9 +105,9 @@ class AdvancedSettings extends HookConsumerWidget {
if (!context.mounted) {
return;
}
await ref.read(appMetadataRepositoryProvider).set(.manageLocalMediaAndroid, result);
await ref.read(driftProvider).appMetadataRepository.set(.manageLocalMediaAndroid, result);
} else {
await ref.read(appMetadataRepositoryProvider).set(.manageLocalMediaAndroid, false);
await ref.read(driftProvider).appMetadataRepository.set(.manageLocalMediaAndroid, false);
}
},
),

View file

@ -3,6 +3,7 @@ import 'dart:io';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/app_metadata_key.dart';
import 'package:immich_mobile/domain/models/server_capability.model.dart';
import 'package:immich_mobile/domain/services/local_album.service.dart';
import 'package:immich_mobile/domain/services/memory.service.dart';
@ -11,7 +12,6 @@ import 'package:immich_mobile/extensions/platform_extensions.dart';
import 'package:immich_mobile/generated/translations.g.dart';
import 'package:immich_mobile/providers/background_sync.provider.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/storage.provider.dart';
@ -223,7 +223,6 @@ class _SyncStatsCounts extends ConsumerWidget {
final localAlbumService = LocalAlbumService(db.localAlbumRepository);
final remoteAlbumService = ref.watch(remoteAlbumServiceProvider);
final memoryService = DriftMemoryService(db.memoryRepository);
final appSettingsService = ref.watch(appSettingsServiceProvider);
Future<List<dynamic>> loadCounts() async {
final assetCounts = assetService.getAssetCounts();
@ -231,7 +230,7 @@ class _SyncStatsCounts extends ConsumerWidget {
final remoteAlbumCounts = remoteAlbumService.getCount();
final memoryCount = memoryService.getCount();
final getLocalHashedCount = assetService.getLocalHashedCount();
final manageLocalMediaAndroid = appMetadataRepository.get(AppMetadataKey.manageLocalMediaAndroid);
final manageLocalMediaAndroid = db.appMetadataRepository.get(AppMetadataKey.manageLocalMediaAndroid);
return await Future.wait([
assetCounts,
@ -343,8 +342,7 @@ class _SyncStatsCounts extends ConsumerWidget {
),
),
// To be removed once the experimental feature is stable
if (CurrentPlatform.isAndroid &&
appSettingsService.getSetting<bool>(AppSettingsEnum.manageLocalMediaAndroid)) ...[
if (CurrentPlatform.isAndroid && manageLocalMediaAndroid) ...[
SettingGroupTitle(title: context.t.trash),
Consumer(
builder: (context, ref, _) {

View file

@ -5,6 +5,7 @@ import 'package:flutter/material.dart';
import 'package:flutter_test/flutter_test.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/constants/locales.dart';
import 'package:immich_mobile/domain/models/app_metadata_key.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/services/store.service.dart';
@ -16,7 +17,6 @@ import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'
import 'package:immich_mobile/presentation/actions/action.dart';
import 'package:immich_mobile/presentation/actions/action.widget.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/app_metadata.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
@ -64,12 +64,12 @@ class PresentationContext {
serverInfoServiceProvider.overrideWithValue(service.serverInfo),
inLockedViewProvider.overrideWithValue(false),
assetMediaRepositoryProvider.overrideWithValue(repository.assetMedia.api),
appMetadataRepositoryProvider.overrideWithValue(repository.metadata),
];
Drift _mockDrift() {
final drift = MockDrift();
when(() => drift.remoteAssetRepository).thenReturn(repository.remoteAsset.repo);
when(() => drift.appMetadataRepository).thenReturn(repository.metadata);
return drift;
}
@ -97,6 +97,7 @@ class PresentationContext {
void setup() {
when(service.user.tryGetMyUser).thenAnswer((_) async => currentUser);
when(service.user.service.watchMyUser).thenAnswer((_) => Stream.value(currentUser));
when(() => repository.metadata.get(AppMetadataKey.manageLocalMediaAndroid)).thenAnswer((_) async => false);
}
Future<void> dispose() async {