import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:http/http.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/asset_edit.model.dart' hide AssetEditAction; import 'package:immich_mobile/domain/models/stack.model.dart'; import 'package:immich_mobile/providers/api.provider.dart'; import 'package:immich_mobile/repositories/api.repository.dart'; import 'package:maplibre_gl/maplibre_gl.dart'; import 'package:openapi/api.dart'; final assetApiRepositoryProvider = Provider( (ref) => AssetApiRepository( ref.watch(apiServiceProvider).assetsApi, ref.watch(apiServiceProvider).stacksApi, ref.watch(apiServiceProvider).trashApi, ), ); class AssetApiRepository extends ApiRepository { final AssetsApi _api; final StacksApi _stacksApi; final TrashApi _trashApi; AssetApiRepository(this._api, this._stacksApi, this._trashApi); Future delete(List ids, bool force) async { return _api.deleteAssets(AssetBulkDeleteDto(ids: ids, force: Optional.present(force))); } Future restoreTrash(List ids) async { await _trashApi.restoreAssets(BulkIdsDto(ids: ids)); } Future emptyTrash() async { final response = await _trashApi.emptyTrash(); return response?.count ?? 0; } Future restoreAllTrash() async { final response = await _trashApi.restoreTrash(); return response?.count ?? 0; } Future updateVisibility(List ids, AssetVisibilityEnum visibility) async { return _api.updateAssets(AssetBulkUpdateDto(ids: ids, visibility: Optional.present(_mapVisibility(visibility)))); } Future updateFavorite(List ids, bool isFavorite) async { return _api.updateAssets(AssetBulkUpdateDto(ids: ids, isFavorite: Optional.present(isFavorite))); } Future updateLocation(List ids, LatLng location) async { return _api.updateAssets( AssetBulkUpdateDto( ids: ids, latitude: Optional.present(location.latitude), longitude: Optional.present(location.longitude), ), ); } Future updateDateTime(List ids, DateTime dateTime) async { return _api.updateAssets( AssetBulkUpdateDto(ids: ids, dateTimeOriginal: Optional.present(dateTime.toIso8601String())), ); } Future stack(List ids) async { final responseDto = await checkNull(_stacksApi.createStack(StackCreateDto(assetIds: ids))); return responseDto.toStack(); } Future unStack(List ids) async { return _stacksApi.deleteStacks(BulkIdsDto(ids: ids)); } Future downloadAsset(String id, {required bool edited}) { return _api.downloadAssetWithHttpInfo(id, edited: edited); } _mapVisibility(AssetVisibilityEnum visibility) => switch (visibility) { AssetVisibilityEnum.timeline => AssetVisibility.timeline, AssetVisibilityEnum.hidden => AssetVisibility.hidden, AssetVisibilityEnum.locked => AssetVisibility.locked, AssetVisibilityEnum.archive => AssetVisibility.archive, }; Future getAssetMIMEType(String assetId) async { final response = await checkNull(_api.getAssetInfo(assetId)); // we need to get the MIME of the thumbnail once that gets added to the API return response.originalMimeType.orElse(null); } Future updateDescription(String assetId, String description) { return _api.updateAsset(assetId, UpdateAssetDto(description: Optional.present(description))); } Future updateRating(String assetId, int rating) { return _api.updateAsset(assetId, UpdateAssetDto(rating: Optional.present(rating))); } Future editAsset(String assetId, List edits) { return _api.editAsset(assetId, AssetEditsCreateDto(edits: edits.map((e) => e.toApi()).toList())); } Future removeEdits(String assetId) async { return _api.removeAssetEdits(assetId); } } extension on StackResponseDto { StackResponse toStack() { return StackResponse(id: id, primaryAssetId: primaryAssetId, assetIds: assets.map((asset) => asset.id).toList()); } } extension on AssetEdit { AssetEditActionItemDto toApi() { return switch (this) { CropEdit(:final parameters) => AssetEditActionItemDto( action: AssetEditAction.crop, parameters: parameters.toJson(), ), RotateEdit(:final parameters) => AssetEditActionItemDto( action: AssetEditAction.rotate, parameters: parameters.toJson(), ), MirrorEdit(:final parameters) => AssetEditActionItemDto( action: AssetEditAction.mirror, parameters: parameters.toJson(), ), }; } }