From 4c36716d5781783683ea602f197f70a84b43e7b3 Mon Sep 17 00:00:00 2001 From: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Date: Wed, 29 Apr 2026 07:54:06 +0700 Subject: [PATCH] cleanup --- .../lib/domain/models/config/log_config.dart | 18 --------- .../domain/models/config/system_config.dart | 14 +++---- mobile/lib/domain/services/log.service.dart | 2 +- .../repositories/metadata.repository.dart | 11 +---- mobile/lib/services/auth.service.dart | 7 ---- .../widgets/settings/advanced_settings.dart | 2 +- .../domain/services/log_service_test.dart | 5 +-- .../metadata_repository_test.dart | 21 ++-------- mobile/test/services/auth.service_test.dart | 40 ------------------- 9 files changed, 14 insertions(+), 106 deletions(-) delete mode 100644 mobile/lib/domain/models/config/log_config.dart diff --git a/mobile/lib/domain/models/config/log_config.dart b/mobile/lib/domain/models/config/log_config.dart deleted file mode 100644 index ef6a3a1293..0000000000 --- a/mobile/lib/domain/models/config/log_config.dart +++ /dev/null @@ -1,18 +0,0 @@ -import 'package:immich_mobile/domain/models/log.model.dart'; - -class LogConfig { - final LogLevel level; - - const LogConfig({this.level = .info}); - - LogConfig copyWith({LogLevel? level}) => .new(level: level ?? this.level); - - @override - bool operator ==(Object other) => identical(this, other) || (other is LogConfig && other.level == level); - - @override - int get hashCode => level.hashCode; - - @override - String toString() => 'LogConfig(level: $level)'; -} diff --git a/mobile/lib/domain/models/config/system_config.dart b/mobile/lib/domain/models/config/system_config.dart index e722b0fb8d..cbad77695d 100644 --- a/mobile/lib/domain/models/config/system_config.dart +++ b/mobile/lib/domain/models/config/system_config.dart @@ -1,18 +1,18 @@ -import 'package:immich_mobile/domain/models/config/log_config.dart'; +import 'package:immich_mobile/domain/models/log.model.dart'; class SystemConfig { - final LogConfig log; + final LogLevel logLevel; - const SystemConfig({this.log = const .new()}); + const SystemConfig({this.logLevel = .info}); - SystemConfig copyWith({LogConfig? log}) => .new(log: log ?? this.log); + SystemConfig copyWith({LogLevel? logLevel}) => SystemConfig(logLevel: logLevel ?? this.logLevel); @override - bool operator ==(Object other) => identical(this, other) || (other is SystemConfig && other.log == log); + bool operator ==(Object other) => identical(this, other) || (other is SystemConfig && other.logLevel == logLevel); @override - int get hashCode => log.hashCode; + int get hashCode => logLevel.hashCode; @override - String toString() => 'SystemConfig(log: $log)'; + String toString() => 'SystemConfig(logLevel: $logLevel)'; } diff --git a/mobile/lib/domain/services/log.service.dart b/mobile/lib/domain/services/log.service.dart index c28af23f95..1235d7ac76 100644 --- a/mobile/lib/domain/services/log.service.dart +++ b/mobile/lib/domain/services/log.service.dart @@ -56,7 +56,7 @@ class LogService { }) async { final instance = LogService._(logRepository, metadataRepository, shouldBuffer); await logRepository.truncate(limit: kLogTruncateLimit); - final level = instance._metadataRepository.systemConfig.log.level; + final level = instance._metadataRepository.systemConfig.logLevel; Logger.root.level = Level.LEVELS.elementAtOrNull(level.index) ?? Level.INFO; return instance; } diff --git a/mobile/lib/infrastructure/repositories/metadata.repository.dart b/mobile/lib/infrastructure/repositories/metadata.repository.dart index 7bf5234c81..e0977ef580 100644 --- a/mobile/lib/infrastructure/repositories/metadata.repository.dart +++ b/mobile/lib/infrastructure/repositories/metadata.repository.dart @@ -1,6 +1,5 @@ import 'package:drift/drift.dart'; import 'package:immich_mobile/domain/models/config/app_config.dart'; -import 'package:immich_mobile/domain/models/config/log_config.dart'; import 'package:immich_mobile/domain/models/config/system_config.dart'; import 'package:immich_mobile/domain/models/config/theme_config.dart'; import 'package:immich_mobile/domain/models/metadata_key.dart'; @@ -80,17 +79,9 @@ class MetadataRepository extends DriftDatabaseRepository { await (_db.delete(_db.metadataEntity)..where((t) => t.key.equals(key.key))).go(); } - Future clearDomain(MetadataDomain domain) async { - for (final k in MetadataKey.values.where((k) => k.domain == domain)) { - _cache[k] = k.defaultValue; - } - - await (_db.delete(_db.metadataEntity)..where((t) => t.key.like('${domain.prefix}.%'))).go(); - } - AppConfig get appConfig => AppConfig(theme: ThemeConfig(mode: _read(MetadataKey.themeMode))); - SystemConfig get systemConfig => SystemConfig(log: LogConfig(level: _read(MetadataKey.logLevel))); + SystemConfig get systemConfig => SystemConfig(logLevel: _read(MetadataKey.logLevel)); Stream watchAppConfig() => _watchDomain(MetadataDomain.appConfig).map((_) => appConfig).distinct(); diff --git a/mobile/lib/services/auth.service.dart b/mobile/lib/services/auth.service.dart index f11f112c37..667681e579 100644 --- a/mobile/lib/services/auth.service.dart +++ b/mobile/lib/services/auth.service.dart @@ -1,18 +1,15 @@ import 'dart:async'; import 'package:hooks_riverpod/hooks_riverpod.dart'; -import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/domain/utils/background_sync.dart'; import 'package:immich_mobile/entities/store.entity.dart'; -import 'package:immich_mobile/infrastructure/repositories/metadata.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/network.repository.dart'; import 'package:immich_mobile/models/auth/auxilary_endpoint.model.dart'; import 'package:immich_mobile/models/auth/login_response.model.dart'; import 'package:immich_mobile/providers/api.provider.dart'; import 'package:immich_mobile/providers/app_settings.provider.dart'; import 'package:immich_mobile/providers/background_sync.provider.dart'; -import 'package:immich_mobile/providers/infrastructure/metadata.provider.dart'; import 'package:immich_mobile/repositories/auth.repository.dart'; import 'package:immich_mobile/repositories/auth_api.repository.dart'; import 'package:immich_mobile/services/api.service.dart'; @@ -29,7 +26,6 @@ final authServiceProvider = Provider( ref.watch(networkServiceProvider), ref.watch(backgroundSyncProvider), ref.watch(appSettingsServiceProvider), - ref.watch(metadataProvider), ), ); @@ -40,7 +36,6 @@ class AuthService { final NetworkService _networkService; final BackgroundSyncManager _backgroundSyncManager; final AppSettingsService _appSettingsService; - final MetadataRepository _metadataRepository; final _log = Logger("AuthService"); AuthService( @@ -50,7 +45,6 @@ class AuthService { this._networkService, this._backgroundSyncManager, this._appSettingsService, - this._metadataRepository, ); /// Validates the provided server URL by resolving and setting the endpoint. @@ -134,7 +128,6 @@ class AuthService { Store.delete(StoreKey.preferredWifiName), Store.delete(StoreKey.localEndpoint), Store.delete(StoreKey.externalEndpointList), - _metadataRepository.clearDomain(MetadataDomain.appConfig), ]); } diff --git a/mobile/lib/widgets/settings/advanced_settings.dart b/mobile/lib/widgets/settings/advanced_settings.dart index 062cfe95f3..e2502aebae 100644 --- a/mobile/lib/widgets/settings/advanced_settings.dart +++ b/mobile/lib/widgets/settings/advanced_settings.dart @@ -31,7 +31,7 @@ class AdvancedSettings extends HookConsumerWidget { final manageLocalMediaAndroid = useAppSettingsState(AppSettingsEnum.manageLocalMediaAndroid); final isManageMediaSupported = useState(false); final manageMediaAndroidPermission = useState(false); - final levelId = useState(ref.read(systemConfigProvider).log.level.index); + final levelId = useState(ref.read(systemConfigProvider).logLevel.index); final preferRemote = useAppSettingsState(AppSettingsEnum.preferRemoteImage); final readonlyModeEnabled = useAppSettingsState(AppSettingsEnum.readonlyModeEnabled); diff --git a/mobile/test/domain/services/log_service_test.dart b/mobile/test/domain/services/log_service_test.dart index 7d8a4953c2..820e43ad72 100644 --- a/mobile/test/domain/services/log_service_test.dart +++ b/mobile/test/domain/services/log_service_test.dart @@ -1,7 +1,6 @@ import 'package:collection/collection.dart'; import 'package:flutter_test/flutter_test.dart'; import 'package:immich_mobile/constants/constants.dart'; -import 'package:immich_mobile/domain/models/config/log_config.dart'; import 'package:immich_mobile/domain/models/config/system_config.dart'; import 'package:immich_mobile/domain/models/log.model.dart'; import 'package:immich_mobile/domain/models/metadata_key.dart'; @@ -40,9 +39,7 @@ void main() { registerFallbackValue(LogLevel.info); when(() => mockLogRepo.truncate(limit: any(named: 'limit'))).thenAnswer((_) async => {}); - when( - () => mockMetadataRepository.systemConfig, - ).thenReturn(const SystemConfig(log: LogConfig(level: LogLevel.fine))); + when(() => mockMetadataRepository.systemConfig).thenReturn(const SystemConfig(logLevel: LogLevel.fine)); when(() => mockMetadataRepository.write(MetadataKey.logLevel, any())).thenAnswer((_) async {}); when(() => mockLogRepo.getAll()).thenAnswer((_) async => []); when(() => mockLogRepo.insert(any())).thenAnswer((_) async => true); diff --git a/mobile/test/medium/repositories/metadata_repository_test.dart b/mobile/test/medium/repositories/metadata_repository_test.dart index 98c747b32a..06c908f5c2 100644 --- a/mobile/test/medium/repositories/metadata_repository_test.dart +++ b/mobile/test/medium/repositories/metadata_repository_test.dart @@ -32,7 +32,7 @@ void main() { }); test('systemConfig returns key defaults when DB is empty', () { - expect(sut.systemConfig.log.level, LogLevel.info); + expect(sut.systemConfig.logLevel, LogLevel.info); }); }); @@ -46,7 +46,7 @@ void main() { await sut.write(.themeMode, ThemeMode.light); await sut.write(.logLevel, LogLevel.severe); expect(sut.appConfig.theme.mode, ThemeMode.light); - expect(sut.systemConfig.log.level, LogLevel.severe); + expect(sut.systemConfig.logLevel, LogLevel.severe); }); }); @@ -63,21 +63,6 @@ void main() { }); }); - group('clearDomain', () { - test('clears every key in the domain and leaves other domains alone', () async { - await sut.write(.themeMode, ThemeMode.dark); - await sut.write(.logLevel, LogLevel.severe); - - await sut.clearDomain(.appConfig); - - expect(sut.appConfig.theme.mode, ThemeMode.system); - expect(sut.systemConfig.log.level, LogLevel.severe); - - final remainingKeys = (await ctx.db.select(ctx.db.metadataEntity).get()).map((r) => r.key); - expect(remainingKeys, [MetadataKey.logLevel.key]); - }); - }); - group('refresh', () { test('picks up rows that were inserted directly into the DB', () async { await ctx.db @@ -145,7 +130,7 @@ void main() { }); test('watchSystemConfig emits the new value after a write', () async { - final expectation = expectLater(sut.watchSystemConfig().map((c) => c.log.level), emitsThrough(LogLevel.warning)); + final expectation = expectLater(sut.watchSystemConfig().map((c) => c.logLevel), emitsThrough(LogLevel.warning)); await sut.write(MetadataKey.logLevel, LogLevel.warning); await expectation; }); diff --git a/mobile/test/services/auth.service_test.dart b/mobile/test/services/auth.service_test.dart index 95663ee818..8bd813e8f6 100644 --- a/mobile/test/services/auth.service_test.dart +++ b/mobile/test/services/auth.service_test.dart @@ -2,18 +2,15 @@ import 'package:drift/drift.dart' hide isNull; import 'package:drift/native.dart'; import 'package:flutter/widgets.dart'; import 'package:flutter_test/flutter_test.dart'; -import 'package:immich_mobile/domain/models/metadata_key.dart'; import 'package:immich_mobile/domain/services/store.service.dart'; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'; import 'package:immich_mobile/models/auth/auxilary_endpoint.model.dart'; -import 'package:immich_mobile/services/app_settings.service.dart'; import 'package:immich_mobile/services/auth.service.dart'; import 'package:mocktail/mocktail.dart'; import 'package:openapi/api.dart'; import '../domain/service.mock.dart'; -import '../infrastructure/repository.mock.dart'; import '../repository.mocks.dart'; import '../service.mocks.dart'; @@ -25,7 +22,6 @@ void main() { late MockNetworkService networkService; late MockBackgroundSyncManager backgroundSyncManager; late MockAppSettingService appSettingsService; - late MockMetadataRepository metadataRepository; late Drift db; setUp(() async { @@ -35,7 +31,6 @@ void main() { networkService = MockNetworkService(); backgroundSyncManager = MockBackgroundSyncManager(); appSettingsService = MockAppSettingService(); - metadataRepository = MockMetadataRepository(); sut = AuthService( authApiRepository, @@ -44,7 +39,6 @@ void main() { networkService, backgroundSyncManager, appSettingsService, - metadataRepository, ); registerFallbackValue(Uri()); @@ -114,40 +108,6 @@ void main() { }); }); - group('logout', () { - setUp(() { - when(() => metadataRepository.clearDomain(MetadataDomain.appConfig)).thenAnswer((_) async {}); - }); - - test('Should logout user', () async { - when(() => authApiRepository.logout()).thenAnswer((_) async => {}); - when(() => backgroundSyncManager.cancel()).thenAnswer((_) async => {}); - when(() => authRepository.clearLocalData()).thenAnswer((_) => Future.value(null)); - when( - () => appSettingsService.setSetting(AppSettingsEnum.enableBackup, false), - ).thenAnswer((_) => Future.value(null)); - await sut.logout(); - - verify(() => authApiRepository.logout()).called(1); - verify(() => backgroundSyncManager.cancel()).called(1); - verify(() => authRepository.clearLocalData()).called(1); - }); - - test('Should clear local data even on server error', () async { - when(() => authApiRepository.logout()).thenThrow(Exception('Server error')); - when(() => backgroundSyncManager.cancel()).thenAnswer((_) async => {}); - when(() => authRepository.clearLocalData()).thenAnswer((_) => Future.value(null)); - when( - () => appSettingsService.setSetting(AppSettingsEnum.enableBackup, false), - ).thenAnswer((_) => Future.value(null)); - await sut.logout(); - - verify(() => authApiRepository.logout()).called(1); - verify(() => backgroundSyncManager.cancel()).called(1); - verify(() => authRepository.clearLocalData()).called(1); - }); - }); - group('setOpenApiServiceEndpoint', () { setUp(() { when(() => networkService.getWifiName()).thenAnswer((_) async => 'TestWifi');