import 'package:immich_mobile/domain/models/album/local_album.model.dart'; import 'package:immich_mobile/domain/models/asset/base_asset.model.dart'; import 'package:immich_mobile/domain/models/exif.model.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/repositories/asset_api.repository.dart'; class AssetService { final RemoteAssetRepository _remoteRepository; final DriftLocalAssetRepository _localRepository; final AssetApiRepository _apiRepository; const AssetService({required this._remoteRepository, required this._localRepository, required this._apiRepository}); Future getAsset(BaseAsset asset) { final id = asset is LocalAsset ? asset.id : (asset as RemoteAsset).id; return asset is LocalAsset ? _localRepository.get(id) : _remoteRepository.get(id); } Stream watchAsset(BaseAsset asset) { final id = asset is LocalAsset ? asset.id : (asset as RemoteAsset).id; return asset is LocalAsset ? _localRepository.watch(id) : _remoteRepository.watch(id); } Future> getLocalAssetsByChecksum(String checksum) { return _localRepository.getByChecksum(checksum); } Future getRemoteAssetByChecksum(String checksum) { return _remoteRepository.getByChecksum(checksum); } Future getRemoteAsset(String id) { return _remoteRepository.get(id); } Future> getStack(RemoteAsset asset) async { if (asset.stackId == null) { return const []; } final stack = await _remoteRepository.getStackChildren(asset); // Include the primary asset in the stack as the first item return [asset, ...stack]; } Future getExif(BaseAsset asset) async { if (!asset.hasRemote) { return null; } final id = asset is LocalAsset ? asset.remoteId! : (asset as RemoteAsset).id; return _remoteRepository.getExif(id); } Future> getPlaces(String userId) { return _remoteRepository.getPlaces(userId); } Future<(int local, int remote)> getAssetCounts() async { return (await _localRepository.getCount(), await _remoteRepository.getCount()); } Future getLocalHashedCount() { return _localRepository.getHashedCount(); } Future> getSourceAlbums(String localAssetId, {BackupSelection? backupSelection}) { return _localRepository.getSourceAlbums(localAssetId, backupSelection: backupSelection); } Future updateFavorite(List remoteIds, bool isFavorite) async { if (remoteIds.isEmpty) { return; } await _apiRepository.updateFavorite(remoteIds, isFavorite); await _remoteRepository.updateFavorite(remoteIds, isFavorite); } }