import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/domain/models/album/album.model.dart'; import 'package:immich_mobile/providers/api.provider.dart'; import 'package:immich_mobile/repositories/api.repository.dart'; // ignore: import_rule_openapi import 'package:openapi/api.dart'; final driftAlbumApiRepositoryProvider = Provider( (ref) => DriftAlbumApiRepository(ref.watch(apiServiceProvider).albumsApi), ); class DriftAlbumApiRepository extends ApiRepository { final AlbumsApi _api; DriftAlbumApiRepository(this._api); Future createDriftAlbum(String name, {required Iterable assetIds, String? description}) async { final responseDto = await checkNull( _api.createAlbum(CreateAlbumDto(albumName: name, description: description, assetIds: assetIds.toList())), ); return responseDto.toRemoteAlbum(); } Future<({List removed, List failed})> removeAssets(String albumId, Iterable assetIds) async { final response = await checkNull(_api.removeAssetFromAlbum(albumId, BulkIdsDto(ids: assetIds.toList()))); final List removed = [], failed = []; for (final dto in response) { if (dto.success) { removed.add(dto.id); } else { failed.add(dto.id); } } return (removed: removed, failed: failed); } Future<({List added, List failed})> addAssets(String albumId, Iterable assetIds) async { final response = await checkNull(_api.addAssetsToAlbum(albumId, BulkIdsDto(ids: assetIds.toList()))); final List added = [], failed = []; for (final dto in response) { if (dto.success) { added.add(dto.id); } else { failed.add(dto.id); } } return (added: added, failed: failed); } Future updateAlbum( String albumId, { String? name, String? description, String? thumbnailAssetId, bool? isActivityEnabled, AlbumAssetOrder? order, }) async { AssetOrder? apiOrder; if (order != null) { apiOrder = order == AlbumAssetOrder.asc ? AssetOrder.asc : AssetOrder.desc; } final responseDto = await checkNull( _api.updateAlbumInfo( albumId, UpdateAlbumDto( albumName: name, description: description, albumThumbnailAssetId: thumbnailAssetId, isActivityEnabled: isActivityEnabled, order: apiOrder, ), ), ); return responseDto.toRemoteAlbum(); } Future deleteAlbum(String albumId) { return _api.deleteAlbum(albumId); } Future addUsers(String albumId, Iterable userIds) async { final albumUsers = userIds.map((userId) => AlbumUserAddDto(userId: userId)).toList(); final response = await checkNull(_api.addUsersToAlbum(albumId, AddUsersDto(albumUsers: albumUsers))); return response.toRemoteAlbum(); } } extension on AlbumResponseDto { RemoteAlbum toRemoteAlbum() { return RemoteAlbum( id: id, name: albumName, ownerId: owner.id, description: description, createdAt: createdAt, updatedAt: updatedAt, thumbnailAssetId: albumThumbnailAssetId, isActivityEnabled: isActivityEnabled, order: order == AssetOrder.asc ? AlbumAssetOrder.asc : AlbumAssetOrder.desc, assetCount: assetCount, ownerName: owner.name, ); } }