mirror of
https://github.com/immich-app/immich.git
synced 2026-05-18 03:10:24 +03:00
cleanup
This commit is contained in:
@@ -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)';
|
|
||||||
}
|
|
||||||
@@ -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 {
|
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
|
@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
|
@override
|
||||||
int get hashCode => log.hashCode;
|
int get hashCode => logLevel.hashCode;
|
||||||
|
|
||||||
@override
|
@override
|
||||||
String toString() => 'SystemConfig(log: $log)';
|
String toString() => 'SystemConfig(logLevel: $logLevel)';
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -56,7 +56,7 @@ class LogService {
|
|||||||
}) async {
|
}) async {
|
||||||
final instance = LogService._(logRepository, metadataRepository, shouldBuffer);
|
final instance = LogService._(logRepository, metadataRepository, shouldBuffer);
|
||||||
await logRepository.truncate(limit: kLogTruncateLimit);
|
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;
|
Logger.root.level = Level.LEVELS.elementAtOrNull(level.index) ?? Level.INFO;
|
||||||
return instance;
|
return instance;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -1,6 +1,5 @@
|
|||||||
import 'package:drift/drift.dart';
|
import 'package:drift/drift.dart';
|
||||||
import 'package:immich_mobile/domain/models/config/app_config.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/system_config.dart';
|
||||||
import 'package:immich_mobile/domain/models/config/theme_config.dart';
|
import 'package:immich_mobile/domain/models/config/theme_config.dart';
|
||||||
import 'package:immich_mobile/domain/models/metadata_key.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();
|
await (_db.delete(_db.metadataEntity)..where((t) => t.key.equals(key.key))).go();
|
||||||
}
|
}
|
||||||
|
|
||||||
Future<void> 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)));
|
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<AppConfig> watchAppConfig() => _watchDomain(MetadataDomain.appConfig).map((_) => appConfig).distinct();
|
Stream<AppConfig> watchAppConfig() => _watchDomain(MetadataDomain.appConfig).map((_) => appConfig).distinct();
|
||||||
|
|
||||||
|
|||||||
@@ -1,18 +1,15 @@
|
|||||||
import 'dart:async';
|
import 'dart:async';
|
||||||
|
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
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/models/store.model.dart';
|
||||||
import 'package:immich_mobile/domain/utils/background_sync.dart';
|
import 'package:immich_mobile/domain/utils/background_sync.dart';
|
||||||
import 'package:immich_mobile/entities/store.entity.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/infrastructure/repositories/network.repository.dart';
|
||||||
import 'package:immich_mobile/models/auth/auxilary_endpoint.model.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/models/auth/login_response.model.dart';
|
||||||
import 'package:immich_mobile/providers/api.provider.dart';
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
import 'package:immich_mobile/providers/app_settings.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/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.repository.dart';
|
||||||
import 'package:immich_mobile/repositories/auth_api.repository.dart';
|
import 'package:immich_mobile/repositories/auth_api.repository.dart';
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
import 'package:immich_mobile/services/api.service.dart';
|
||||||
@@ -29,7 +26,6 @@ final authServiceProvider = Provider(
|
|||||||
ref.watch(networkServiceProvider),
|
ref.watch(networkServiceProvider),
|
||||||
ref.watch(backgroundSyncProvider),
|
ref.watch(backgroundSyncProvider),
|
||||||
ref.watch(appSettingsServiceProvider),
|
ref.watch(appSettingsServiceProvider),
|
||||||
ref.watch(metadataProvider),
|
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -40,7 +36,6 @@ class AuthService {
|
|||||||
final NetworkService _networkService;
|
final NetworkService _networkService;
|
||||||
final BackgroundSyncManager _backgroundSyncManager;
|
final BackgroundSyncManager _backgroundSyncManager;
|
||||||
final AppSettingsService _appSettingsService;
|
final AppSettingsService _appSettingsService;
|
||||||
final MetadataRepository _metadataRepository;
|
|
||||||
final _log = Logger("AuthService");
|
final _log = Logger("AuthService");
|
||||||
|
|
||||||
AuthService(
|
AuthService(
|
||||||
@@ -50,7 +45,6 @@ class AuthService {
|
|||||||
this._networkService,
|
this._networkService,
|
||||||
this._backgroundSyncManager,
|
this._backgroundSyncManager,
|
||||||
this._appSettingsService,
|
this._appSettingsService,
|
||||||
this._metadataRepository,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
/// Validates the provided server URL by resolving and setting the endpoint.
|
/// Validates the provided server URL by resolving and setting the endpoint.
|
||||||
@@ -134,7 +128,6 @@ class AuthService {
|
|||||||
Store.delete(StoreKey.preferredWifiName),
|
Store.delete(StoreKey.preferredWifiName),
|
||||||
Store.delete(StoreKey.localEndpoint),
|
Store.delete(StoreKey.localEndpoint),
|
||||||
Store.delete(StoreKey.externalEndpointList),
|
Store.delete(StoreKey.externalEndpointList),
|
||||||
_metadataRepository.clearDomain(MetadataDomain.appConfig),
|
|
||||||
]);
|
]);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -31,7 +31,7 @@ class AdvancedSettings extends HookConsumerWidget {
|
|||||||
final manageLocalMediaAndroid = useAppSettingsState(AppSettingsEnum.manageLocalMediaAndroid);
|
final manageLocalMediaAndroid = useAppSettingsState(AppSettingsEnum.manageLocalMediaAndroid);
|
||||||
final isManageMediaSupported = useState(false);
|
final isManageMediaSupported = useState(false);
|
||||||
final manageMediaAndroidPermission = useState(false);
|
final manageMediaAndroidPermission = useState(false);
|
||||||
final levelId = useState<int>(ref.read(systemConfigProvider).log.level.index);
|
final levelId = useState<int>(ref.read(systemConfigProvider).logLevel.index);
|
||||||
final preferRemote = useAppSettingsState(AppSettingsEnum.preferRemoteImage);
|
final preferRemote = useAppSettingsState(AppSettingsEnum.preferRemoteImage);
|
||||||
final readonlyModeEnabled = useAppSettingsState(AppSettingsEnum.readonlyModeEnabled);
|
final readonlyModeEnabled = useAppSettingsState(AppSettingsEnum.readonlyModeEnabled);
|
||||||
|
|
||||||
|
|||||||
@@ -1,7 +1,6 @@
|
|||||||
import 'package:collection/collection.dart';
|
import 'package:collection/collection.dart';
|
||||||
import 'package:flutter_test/flutter_test.dart';
|
import 'package:flutter_test/flutter_test.dart';
|
||||||
import 'package:immich_mobile/constants/constants.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/config/system_config.dart';
|
||||||
import 'package:immich_mobile/domain/models/log.model.dart';
|
import 'package:immich_mobile/domain/models/log.model.dart';
|
||||||
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
import 'package:immich_mobile/domain/models/metadata_key.dart';
|
||||||
@@ -40,9 +39,7 @@ void main() {
|
|||||||
registerFallbackValue(LogLevel.info);
|
registerFallbackValue(LogLevel.info);
|
||||||
|
|
||||||
when(() => mockLogRepo.truncate(limit: any(named: 'limit'))).thenAnswer((_) async => {});
|
when(() => mockLogRepo.truncate(limit: any(named: 'limit'))).thenAnswer((_) async => {});
|
||||||
when(
|
when(() => mockMetadataRepository.systemConfig).thenReturn(const SystemConfig(logLevel: LogLevel.fine));
|
||||||
() => mockMetadataRepository.systemConfig,
|
|
||||||
).thenReturn(const SystemConfig(log: LogConfig(level: LogLevel.fine)));
|
|
||||||
when(() => mockMetadataRepository.write<LogLevel>(MetadataKey.logLevel, any())).thenAnswer((_) async {});
|
when(() => mockMetadataRepository.write<LogLevel>(MetadataKey.logLevel, any())).thenAnswer((_) async {});
|
||||||
when(() => mockLogRepo.getAll()).thenAnswer((_) async => []);
|
when(() => mockLogRepo.getAll()).thenAnswer((_) async => []);
|
||||||
when(() => mockLogRepo.insert(any())).thenAnswer((_) async => true);
|
when(() => mockLogRepo.insert(any())).thenAnswer((_) async => true);
|
||||||
|
|||||||
@@ -32,7 +32,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('systemConfig returns key defaults when DB is empty', () {
|
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(.themeMode, ThemeMode.light);
|
||||||
await sut.write(.logLevel, LogLevel.severe);
|
await sut.write(.logLevel, LogLevel.severe);
|
||||||
expect(sut.appConfig.theme.mode, ThemeMode.light);
|
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', () {
|
group('refresh', () {
|
||||||
test('picks up rows that were inserted directly into the DB', () async {
|
test('picks up rows that were inserted directly into the DB', () async {
|
||||||
await ctx.db
|
await ctx.db
|
||||||
@@ -145,7 +130,7 @@ void main() {
|
|||||||
});
|
});
|
||||||
|
|
||||||
test('watchSystemConfig emits the new value after a write', () async {
|
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 sut.write(MetadataKey.logLevel, LogLevel.warning);
|
||||||
await expectation;
|
await expectation;
|
||||||
});
|
});
|
||||||
|
|||||||
@@ -2,18 +2,15 @@ import 'package:drift/drift.dart' hide isNull;
|
|||||||
import 'package:drift/native.dart';
|
import 'package:drift/native.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:flutter_test/flutter_test.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/domain/services/store.service.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/store.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/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:immich_mobile/services/auth.service.dart';
|
||||||
import 'package:mocktail/mocktail.dart';
|
import 'package:mocktail/mocktail.dart';
|
||||||
import 'package:openapi/api.dart';
|
import 'package:openapi/api.dart';
|
||||||
|
|
||||||
import '../domain/service.mock.dart';
|
import '../domain/service.mock.dart';
|
||||||
import '../infrastructure/repository.mock.dart';
|
|
||||||
import '../repository.mocks.dart';
|
import '../repository.mocks.dart';
|
||||||
import '../service.mocks.dart';
|
import '../service.mocks.dart';
|
||||||
|
|
||||||
@@ -25,7 +22,6 @@ void main() {
|
|||||||
late MockNetworkService networkService;
|
late MockNetworkService networkService;
|
||||||
late MockBackgroundSyncManager backgroundSyncManager;
|
late MockBackgroundSyncManager backgroundSyncManager;
|
||||||
late MockAppSettingService appSettingsService;
|
late MockAppSettingService appSettingsService;
|
||||||
late MockMetadataRepository metadataRepository;
|
|
||||||
late Drift db;
|
late Drift db;
|
||||||
|
|
||||||
setUp(() async {
|
setUp(() async {
|
||||||
@@ -35,7 +31,6 @@ void main() {
|
|||||||
networkService = MockNetworkService();
|
networkService = MockNetworkService();
|
||||||
backgroundSyncManager = MockBackgroundSyncManager();
|
backgroundSyncManager = MockBackgroundSyncManager();
|
||||||
appSettingsService = MockAppSettingService();
|
appSettingsService = MockAppSettingService();
|
||||||
metadataRepository = MockMetadataRepository();
|
|
||||||
|
|
||||||
sut = AuthService(
|
sut = AuthService(
|
||||||
authApiRepository,
|
authApiRepository,
|
||||||
@@ -44,7 +39,6 @@ void main() {
|
|||||||
networkService,
|
networkService,
|
||||||
backgroundSyncManager,
|
backgroundSyncManager,
|
||||||
appSettingsService,
|
appSettingsService,
|
||||||
metadataRepository,
|
|
||||||
);
|
);
|
||||||
|
|
||||||
registerFallbackValue(Uri());
|
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', () {
|
group('setOpenApiServiceEndpoint', () {
|
||||||
setUp(() {
|
setUp(() {
|
||||||
when(() => networkService.getWifiName()).thenAnswer((_) async => 'TestWifi');
|
when(() => networkService.getWifiName()).thenAnswer((_) async => 'TestWifi');
|
||||||
|
|||||||
Reference in New Issue
Block a user