2024-09-24 08:24:48 +02:00
|
|
|
import 'package:hooks_riverpod/hooks_riverpod.dart';
|
2025-05-20 08:35:22 -05:00
|
|
|
import 'package:immich_mobile/constants/enums.dart';
|
2024-09-24 08:24:48 +02:00
|
|
|
import 'package:immich_mobile/entities/asset.entity.dart';
|
|
|
|
import 'package:immich_mobile/providers/api.provider.dart';
|
2024-09-30 16:37:30 +02:00
|
|
|
import 'package:immich_mobile/repositories/api.repository.dart';
|
2025-07-02 00:52:11 +08:00
|
|
|
import 'package:maplibre_gl/maplibre_gl.dart';
|
2024-09-24 08:24:48 +02:00
|
|
|
import 'package:openapi/api.dart';
|
|
|
|
|
|
|
|
final assetApiRepositoryProvider = Provider(
|
2024-09-24 14:50:21 +02:00
|
|
|
(ref) => AssetApiRepository(
|
|
|
|
ref.watch(apiServiceProvider).assetsApi,
|
|
|
|
ref.watch(apiServiceProvider).searchApi,
|
|
|
|
),
|
2024-09-24 08:24:48 +02:00
|
|
|
);
|
|
|
|
|
2025-06-21 18:06:38 -05:00
|
|
|
class AssetApiRepository extends ApiRepository {
|
2024-09-24 08:24:48 +02:00
|
|
|
final AssetsApi _api;
|
2024-09-24 14:50:21 +02:00
|
|
|
final SearchApi _searchApi;
|
2024-09-24 08:24:48 +02:00
|
|
|
|
2024-09-24 14:50:21 +02:00
|
|
|
AssetApiRepository(this._api, this._searchApi);
|
2024-09-24 08:24:48 +02:00
|
|
|
|
|
|
|
Future<Asset> update(String id, {String? description}) async {
|
|
|
|
final response = await checkNull(
|
|
|
|
_api.updateAsset(id, UpdateAssetDto(description: description)),
|
|
|
|
);
|
|
|
|
return Asset.remote(response);
|
|
|
|
}
|
2024-09-24 14:50:21 +02:00
|
|
|
|
|
|
|
Future<List<Asset>> search({List<String> personIds = const []}) async {
|
|
|
|
// TODO this always fetches all assets, change API and usage to actually do pagination
|
|
|
|
final List<Asset> result = [];
|
|
|
|
bool hasNext = true;
|
|
|
|
int currentPage = 1;
|
|
|
|
while (hasNext) {
|
|
|
|
final response = await checkNull(
|
2024-11-20 14:47:25 -05:00
|
|
|
_searchApi.searchAssets(
|
2024-09-24 14:50:21 +02:00
|
|
|
MetadataSearchDto(
|
|
|
|
personIds: personIds,
|
|
|
|
page: currentPage,
|
|
|
|
size: 1000,
|
|
|
|
),
|
|
|
|
),
|
|
|
|
);
|
|
|
|
result.addAll(response.assets.items.map(Asset.remote));
|
|
|
|
hasNext = response.assets.nextPage != null;
|
|
|
|
currentPage++;
|
|
|
|
}
|
|
|
|
return result;
|
|
|
|
}
|
2025-05-20 08:35:22 -05:00
|
|
|
|
2025-07-03 01:26:07 +08:00
|
|
|
Future<void> delete(List<String> ids, bool force) async {
|
|
|
|
return _api.deleteAssets(AssetBulkDeleteDto(ids: ids, force: force));
|
|
|
|
}
|
|
|
|
|
2025-05-20 08:35:22 -05:00
|
|
|
Future<void> updateVisibility(
|
|
|
|
List<String> ids,
|
|
|
|
AssetVisibilityEnum visibility,
|
|
|
|
) async {
|
|
|
|
return _api.updateAssets(
|
|
|
|
AssetBulkUpdateDto(ids: ids, visibility: _mapVisibility(visibility)),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2025-06-30 12:21:09 -05:00
|
|
|
Future<void> updateFavorite(
|
|
|
|
List<String> ids,
|
|
|
|
bool isFavorite,
|
|
|
|
) async {
|
|
|
|
return _api.updateAssets(
|
|
|
|
AssetBulkUpdateDto(ids: ids, isFavorite: isFavorite),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2025-07-02 00:52:11 +08:00
|
|
|
Future<void> updateLocation(
|
|
|
|
List<String> ids,
|
|
|
|
LatLng location,
|
|
|
|
) async {
|
|
|
|
return _api.updateAssets(
|
|
|
|
AssetBulkUpdateDto(
|
|
|
|
ids: ids,
|
|
|
|
latitude: location.latitude,
|
|
|
|
longitude: location.longitude,
|
|
|
|
),
|
|
|
|
);
|
|
|
|
}
|
|
|
|
|
2025-06-25 13:06:24 +05:30
|
|
|
_mapVisibility(AssetVisibilityEnum visibility) => switch (visibility) {
|
|
|
|
AssetVisibilityEnum.timeline => AssetVisibility.timeline,
|
|
|
|
AssetVisibilityEnum.hidden => AssetVisibility.hidden,
|
|
|
|
AssetVisibilityEnum.locked => AssetVisibility.locked,
|
|
|
|
AssetVisibilityEnum.archive => AssetVisibility.archive,
|
|
|
|
};
|
2025-06-08 21:55:23 -05:00
|
|
|
|
|
|
|
Future<String?> 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;
|
|
|
|
}
|
2024-09-24 08:24:48 +02:00
|
|
|
}
|