import 'dart:async'; import 'package:immich_mobile/domain/models/album/album.model.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/infrastructure/repositories/remote_album.repository.dart'; import 'package:immich_mobile/models/albums/album_search.model.dart'; import 'package:immich_mobile/repositories/drift_album_api_repository.dart'; import 'package:immich_mobile/utils/remote_album.utils.dart'; class RemoteAlbumService { final DriftRemoteAlbumRepository _repository; final DriftAlbumApiRepository _albumApiRepository; const RemoteAlbumService(this._repository, this._albumApiRepository); Stream watchAlbum(String albumId) { return _repository.watchAlbum(albumId); } Future> getAll() { return _repository.getAll(); } Future get(String albumId) { return _repository.get(albumId); } List sortAlbums( List albums, RemoteAlbumSortMode sortMode, { bool isReverse = false, }) { return sortMode.sortFn(albums, isReverse); } List searchAlbums( List albums, String query, String? userId, [ QuickFilterMode filterMode = QuickFilterMode.all, ]) { final lowerQuery = query.toLowerCase(); List filtered = albums; // Apply text search filter if (query.isNotEmpty) { filtered = filtered .where( (album) => album.name.toLowerCase().contains(lowerQuery) || album.description.toLowerCase().contains(lowerQuery), ) .toList(); } if (userId != null) { switch (filterMode) { case QuickFilterMode.myAlbums: filtered = filtered.where((album) => album.ownerId == userId).toList(); break; case QuickFilterMode.sharedWithMe: filtered = filtered.where((album) => album.ownerId != userId).toList(); break; case QuickFilterMode.all: break; } } return filtered; } Future createAlbum({ required String title, required List assetIds, String? description, }) async { final album = await _albumApiRepository.createDriftAlbum( title, description: description, assetIds: assetIds, ); await _repository.create(album, assetIds); return album; } Future updateAlbum( String albumId, { String? name, String? description, String? thumbnailAssetId, bool? isActivityEnabled, AlbumAssetOrder? order, }) async { final updatedAlbum = await _albumApiRepository.updateAlbum( albumId, name: name, description: description, thumbnailAssetId: thumbnailAssetId, isActivityEnabled: isActivityEnabled, order: order, ); // Update the local database await _repository.update(updatedAlbum); return updatedAlbum; } FutureOr<(DateTime, DateTime)> getDateRange(String albumId) { return _repository.getDateRange(albumId); } Future> getSharedUsers(String albumId) { return _repository.getSharedUsers(albumId); } Future> getAssets(String albumId) { return _repository.getAssets(albumId); } Future addAssets({ required String albumId, required List assetIds, }) async { final album = await _albumApiRepository.addAssets( albumId, assetIds, ); await _repository.addAssets(albumId, album.added); return album.added.length; } Future deleteAlbum(String albumId) async { await _albumApiRepository.deleteAlbum(albumId); await _repository.deleteAlbum(albumId); } Future addUsers({ required String albumId, required List userIds, }) async { await _albumApiRepository.addUsers(albumId, userIds); return _repository.addUsers(albumId, userIds); } Future getCount() { return _repository.getCount(); } }