mirror of
https://github.com/immich-app/immich.git
synced 2025-05-24 01:12:58 -04:00
refactor: cleanup background service (#16855)
refactor: background service Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
parent
9a4495eb5b
commit
1e184a70f1
@ -11,57 +11,32 @@ import 'package:flutter/foundation.dart';
|
|||||||
import 'package:flutter/services.dart';
|
import 'package:flutter/services.dart';
|
||||||
import 'package:flutter/widgets.dart';
|
import 'package:flutter/widgets.dart';
|
||||||
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
||||||
import 'package:immich_mobile/domain/interfaces/exif.interface.dart';
|
|
||||||
import 'package:immich_mobile/domain/interfaces/user.interface.dart';
|
|
||||||
import 'package:immich_mobile/domain/interfaces/user_api.repository.dart';
|
|
||||||
import 'package:immich_mobile/domain/models/store.model.dart';
|
import 'package:immich_mobile/domain/models/store.model.dart';
|
||||||
import 'package:immich_mobile/domain/services/store.service.dart';
|
|
||||||
import 'package:immich_mobile/entities/backup_album.entity.dart';
|
import 'package:immich_mobile/entities/backup_album.entity.dart';
|
||||||
import 'package:immich_mobile/entities/store.entity.dart';
|
import 'package:immich_mobile/entities/store.entity.dart';
|
||||||
import 'package:immich_mobile/infrastructure/repositories/exif.repository.dart';
|
|
||||||
import 'package:immich_mobile/infrastructure/repositories/user.repository.dart';
|
|
||||||
import 'package:immich_mobile/infrastructure/repositories/user_api.repository.dart';
|
|
||||||
import 'package:immich_mobile/interfaces/backup_album.interface.dart';
|
import 'package:immich_mobile/interfaces/backup_album.interface.dart';
|
||||||
import 'package:immich_mobile/interfaces/partner.interface.dart';
|
|
||||||
import 'package:immich_mobile/models/backup/backup_candidate.model.dart';
|
import 'package:immich_mobile/models/backup/backup_candidate.model.dart';
|
||||||
import 'package:immich_mobile/models/backup/current_upload_asset.model.dart';
|
import 'package:immich_mobile/models/backup/current_upload_asset.model.dart';
|
||||||
import 'package:immich_mobile/models/backup/error_upload_asset.model.dart';
|
import 'package:immich_mobile/models/backup/error_upload_asset.model.dart';
|
||||||
import 'package:immich_mobile/models/backup/success_upload_asset.model.dart';
|
import 'package:immich_mobile/models/backup/success_upload_asset.model.dart';
|
||||||
import 'package:immich_mobile/repositories/album.repository.dart';
|
import 'package:immich_mobile/providers/api.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/album_api.repository.dart';
|
import 'package:immich_mobile/providers/app_settings.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/album_media.repository.dart';
|
import 'package:immich_mobile/providers/db.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/asset.repository.dart';
|
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
|
||||||
import 'package:immich_mobile/repositories/asset_media.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/auth.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/auth_api.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/backup.repository.dart';
|
import 'package:immich_mobile/repositories/backup.repository.dart';
|
||||||
import 'package:immich_mobile/repositories/etag.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/file_media.repository.dart';
|
import 'package:immich_mobile/repositories/file_media.repository.dart';
|
||||||
import 'package:immich_mobile/repositories/network.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/partner.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/partner_api.repository.dart';
|
|
||||||
import 'package:immich_mobile/repositories/permission.repository.dart';
|
|
||||||
import 'package:immich_mobile/services/album.service.dart';
|
|
||||||
import 'package:immich_mobile/services/api.service.dart';
|
|
||||||
import 'package:immich_mobile/services/app_settings.service.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:immich_mobile/services/backup.service.dart';
|
import 'package:immich_mobile/services/backup.service.dart';
|
||||||
import 'package:immich_mobile/services/entity.service.dart';
|
|
||||||
import 'package:immich_mobile/services/hash.service.dart';
|
|
||||||
import 'package:immich_mobile/services/localization.service.dart';
|
import 'package:immich_mobile/services/localization.service.dart';
|
||||||
import 'package:immich_mobile/services/network.service.dart';
|
|
||||||
import 'package:immich_mobile/services/sync.service.dart';
|
|
||||||
import 'package:immich_mobile/utils/backup_progress.dart';
|
import 'package:immich_mobile/utils/backup_progress.dart';
|
||||||
import 'package:immich_mobile/utils/bootstrap.dart';
|
import 'package:immich_mobile/utils/bootstrap.dart';
|
||||||
import 'package:immich_mobile/utils/diff.dart';
|
import 'package:immich_mobile/utils/diff.dart';
|
||||||
import 'package:immich_mobile/utils/http_ssl_cert_override.dart';
|
import 'package:immich_mobile/utils/http_ssl_cert_override.dart';
|
||||||
import 'package:network_info_plus/network_info_plus.dart';
|
|
||||||
import 'package:path_provider_foundation/path_provider_foundation.dart';
|
import 'package:path_provider_foundation/path_provider_foundation.dart';
|
||||||
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
|
import 'package:photo_manager/photo_manager.dart' show PMProgressHandler;
|
||||||
|
|
||||||
final backgroundServiceProvider = Provider(
|
final backgroundServiceProvider = Provider((ref) => BackgroundService());
|
||||||
(ref) => BackgroundService(),
|
|
||||||
);
|
|
||||||
|
|
||||||
/// Background backup service
|
/// Background backup service
|
||||||
class BackgroundService {
|
class BackgroundService {
|
||||||
@ -377,96 +352,40 @@ class BackgroundService {
|
|||||||
final db = await Bootstrap.initIsar();
|
final db = await Bootstrap.initIsar();
|
||||||
await Bootstrap.initDomain(db);
|
await Bootstrap.initDomain(db);
|
||||||
|
|
||||||
|
final ref = ProviderContainer(
|
||||||
|
overrides: [
|
||||||
|
dbProvider.overrideWithValue(db),
|
||||||
|
isarProvider.overrideWithValue(db),
|
||||||
|
],
|
||||||
|
);
|
||||||
|
|
||||||
HttpOverrides.global = HttpSSLCertOverride();
|
HttpOverrides.global = HttpSSLCertOverride();
|
||||||
ApiService apiService = ApiService();
|
ref
|
||||||
apiService.setAccessToken(Store.get(StoreKey.accessToken));
|
.read(apiServiceProvider)
|
||||||
AppSettingsService settingsService = AppSettingsService();
|
.setAccessToken(Store.get(StoreKey.accessToken));
|
||||||
AlbumRepository albumRepository = AlbumRepository(db);
|
await ref.read(authServiceProvider).setOpenApiServiceEndpoint();
|
||||||
AssetRepository assetRepository = AssetRepository(db);
|
|
||||||
BackupAlbumRepository backupRepository = BackupAlbumRepository(db);
|
|
||||||
IExifInfoRepository exifInfoRepository = IsarExifRepository(db);
|
|
||||||
ETagRepository eTagRepository = ETagRepository(db);
|
|
||||||
AlbumMediaRepository albumMediaRepository = AlbumMediaRepository();
|
|
||||||
FileMediaRepository fileMediaRepository = FileMediaRepository();
|
|
||||||
AssetMediaRepository assetMediaRepository = AssetMediaRepository();
|
|
||||||
IUserRepository userRepository = IsarUserRepository(db);
|
|
||||||
IUserApiRepository userApiRepository =
|
|
||||||
UserApiRepository(apiService.usersApi);
|
|
||||||
AlbumApiRepository albumApiRepository =
|
|
||||||
AlbumApiRepository(apiService.albumsApi);
|
|
||||||
PartnerApiRepository partnerApiRepository =
|
|
||||||
PartnerApiRepository(apiService.partnersApi);
|
|
||||||
HashService hashService =
|
|
||||||
HashService(assetRepository, this, albumMediaRepository);
|
|
||||||
EntityService entityService =
|
|
||||||
EntityService(assetRepository, userRepository);
|
|
||||||
IPartnerRepository partnerRepository = PartnerRepository(db);
|
|
||||||
SyncService syncSerive = SyncService(
|
|
||||||
hashService,
|
|
||||||
entityService,
|
|
||||||
albumMediaRepository,
|
|
||||||
albumApiRepository,
|
|
||||||
albumRepository,
|
|
||||||
assetRepository,
|
|
||||||
exifInfoRepository,
|
|
||||||
partnerRepository,
|
|
||||||
userRepository,
|
|
||||||
StoreService.I,
|
|
||||||
eTagRepository,
|
|
||||||
partnerApiRepository,
|
|
||||||
userApiRepository,
|
|
||||||
);
|
|
||||||
AlbumService albumService = AlbumService(
|
|
||||||
syncSerive,
|
|
||||||
entityService,
|
|
||||||
albumRepository,
|
|
||||||
assetRepository,
|
|
||||||
backupRepository,
|
|
||||||
albumMediaRepository,
|
|
||||||
albumApiRepository,
|
|
||||||
);
|
|
||||||
BackupService backupService = BackupService(
|
|
||||||
apiService,
|
|
||||||
settingsService,
|
|
||||||
albumService,
|
|
||||||
albumMediaRepository,
|
|
||||||
fileMediaRepository,
|
|
||||||
assetRepository,
|
|
||||||
assetMediaRepository,
|
|
||||||
);
|
|
||||||
|
|
||||||
AuthApiRepository authApiRepository = AuthApiRepository(apiService);
|
|
||||||
AuthRepository authRepository = AuthRepository(db);
|
|
||||||
NetworkRepository networkRepository = NetworkRepository(NetworkInfo());
|
|
||||||
PermissionRepository permissionRepository = PermissionRepository();
|
|
||||||
NetworkService networkService =
|
|
||||||
NetworkService(networkRepository, permissionRepository);
|
|
||||||
AuthService authService = AuthService(
|
|
||||||
authApiRepository,
|
|
||||||
authRepository,
|
|
||||||
apiService,
|
|
||||||
networkService,
|
|
||||||
);
|
|
||||||
|
|
||||||
final endpoint = await authService.setOpenApiServiceEndpoint();
|
|
||||||
if (kDebugMode) {
|
if (kDebugMode) {
|
||||||
debugPrint("[BG UPLOAD] Using endpoint: $endpoint");
|
debugPrint(
|
||||||
|
"[BG UPLOAD] Using endpoint: ${ref.read(apiServiceProvider).apiClient.basePath}",
|
||||||
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
final selectedAlbums =
|
final selectedAlbums = await ref
|
||||||
await backupRepository.getAllBySelection(BackupSelection.select);
|
.read(backupAlbumRepositoryProvider)
|
||||||
final excludedAlbums =
|
.getAllBySelection(BackupSelection.select);
|
||||||
await backupRepository.getAllBySelection(BackupSelection.exclude);
|
final excludedAlbums = await ref
|
||||||
|
.read(backupAlbumRepositoryProvider)
|
||||||
|
.getAllBySelection(BackupSelection.exclude);
|
||||||
if (selectedAlbums.isEmpty) {
|
if (selectedAlbums.isEmpty) {
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
await fileMediaRepository.enableBackgroundAccess();
|
await ref.read(fileMediaRepositoryProvider).enableBackgroundAccess();
|
||||||
|
|
||||||
do {
|
do {
|
||||||
final bool backupOk = await _runBackup(
|
final bool backupOk = await _runBackup(
|
||||||
backupService,
|
ref.read(backupServiceProvider),
|
||||||
settingsService,
|
ref.read(appSettingsServiceProvider),
|
||||||
selectedAlbums,
|
selectedAlbums,
|
||||||
excludedAlbums,
|
excludedAlbums,
|
||||||
);
|
);
|
||||||
@ -475,8 +394,9 @@ class BackgroundService {
|
|||||||
final backupAlbums = [...selectedAlbums, ...excludedAlbums];
|
final backupAlbums = [...selectedAlbums, ...excludedAlbums];
|
||||||
backupAlbums.sortBy((e) => e.id);
|
backupAlbums.sortBy((e) => e.id);
|
||||||
|
|
||||||
final dbAlbums =
|
final dbAlbums = await ref
|
||||||
await backupRepository.getAll(sort: BackupAlbumSort.id);
|
.read(backupAlbumRepositoryProvider)
|
||||||
|
.getAll(sort: BackupAlbumSort.id);
|
||||||
final List<int> toDelete = [];
|
final List<int> toDelete = [];
|
||||||
final List<BackupAlbum> toUpsert = [];
|
final List<BackupAlbum> toUpsert = [];
|
||||||
// stores the most recent `lastBackup` per album but always keeps the `selection` from the most recent DB state
|
// stores the most recent `lastBackup` per album but always keeps the `selection` from the most recent DB state
|
||||||
@ -494,8 +414,8 @@ class BackgroundService {
|
|||||||
onlyFirst: (BackupAlbum a) => toUpsert.add(a),
|
onlyFirst: (BackupAlbum a) => toUpsert.add(a),
|
||||||
onlySecond: (BackupAlbum b) => toDelete.add(b.isarId),
|
onlySecond: (BackupAlbum b) => toDelete.add(b.isarId),
|
||||||
);
|
);
|
||||||
await backupRepository.deleteAll(toDelete);
|
await ref.read(backupAlbumRepositoryProvider).deleteAll(toDelete);
|
||||||
await backupRepository.updateAll(toUpsert);
|
await ref.read(backupAlbumRepositoryProvider).updateAll(toUpsert);
|
||||||
} else if (Store.tryGet(StoreKey.backupFailedSince) == null) {
|
} else if (Store.tryGet(StoreKey.backupFailedSince) == null) {
|
||||||
Store.put(StoreKey.backupFailedSince, DateTime.now());
|
Store.put(StoreKey.backupFailedSince, DateTime.now());
|
||||||
return false;
|
return false;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user