refactor(mobile): album.interface.dart (#19354)

This commit is contained in:
Alex 2025-06-21 18:32:06 -05:00 committed by GitHub
parent 2b03802e9c
commit 81eb98d4e5
No known key found for this signature in database
GPG Key ID: B5690EEEBB952194
5 changed files with 7 additions and 81 deletions

View File

@ -1,55 +0,0 @@
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/entities/album.entity.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/interfaces/database.interface.dart';
import 'package:immich_mobile/models/albums/album_search.model.dart';
abstract interface class IAlbumRepository implements IDatabaseRepository {
Future<Album> create(Album album);
Future<Album?> get(int id);
Future<Album?> getByName(
String name, {
bool? shared,
bool? remote,
bool? owner,
});
Future<List<Album>> getAll({
bool? shared,
bool? remote,
int? ownerId,
AlbumSort? sortBy,
});
Future<Album> update(Album album);
Future<void> delete(int albumId);
Future<void> deleteAllLocal();
Future<int> count({bool? local});
Future<void> addUsers(Album album, List<UserDto> users);
Future<void> removeUsers(Album album, List<UserDto> users);
Future<void> addAssets(Album album, List<Asset> assets);
Future<void> removeAssets(Album album, List<Asset> assets);
Future<Album> recalculateMetadata(Album album);
Future<List<Album>> search(String searchTerm, QuickFilterMode filterMode);
Stream<List<Album>> watchRemoteAlbums();
Stream<List<Album>> watchLocalAlbums();
Stream<Album?> watchAlbum(int id);
Future<void> clearTable();
}
enum AlbumSort { remoteId, localId }

View File

@ -6,20 +6,20 @@ import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/infrastructure/entities/user.entity.dart'
as entity;
import 'package:immich_mobile/interfaces/album.interface.dart';
import 'package:immich_mobile/models/albums/album_search.model.dart';
import 'package:immich_mobile/providers/db.provider.dart';
import 'package:immich_mobile/repositories/database.repository.dart';
import 'package:immich_mobile/utils/hash.dart';
import 'package:isar/isar.dart';
enum AlbumSort { remoteId, localId }
final albumRepositoryProvider =
Provider((ref) => AlbumRepository(ref.watch(dbProvider)));
class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
class AlbumRepository extends DatabaseRepository {
AlbumRepository(super.db);
@override
Future<int> count({bool? local}) {
final baseQuery = db.albums.where();
final QueryBuilder<Album, Album, QAfterWhereClause> query = switch (local) {
@ -30,10 +30,8 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
return query.count();
}
@override
Future<Album> create(Album album) => txn(() => db.albums.store(album));
@override
Future<Album?> getByName(
String name, {
bool? shared,
@ -58,13 +56,10 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
return query.findFirst();
}
@override
Future<Album> update(Album album) => txn(() => db.albums.store(album));
@override
Future<void> delete(int albumId) => txn(() => db.albums.delete(albumId));
@override
Future<List<Album>> getAll({
bool? shared,
bool? remote,
@ -96,23 +91,18 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
return query.findAll();
}
@override
Future<Album?> get(int id) => db.albums.get(id);
@override
Future<void> removeUsers(Album album, List<UserDto> users) => txn(
() => album.sharedUsers.update(unlink: users.map(entity.User.fromDto)),
);
@override
Future<void> addAssets(Album album, List<Asset> assets) =>
txn(() => album.assets.update(link: assets));
@override
Future<void> removeAssets(Album album, List<Asset> assets) =>
txn(() => album.assets.update(unlink: assets));
@override
Future<Album> recalculateMetadata(Album album) async {
album.startDate = await album.assets.filter().fileCreatedAtProperty().min();
album.endDate = await album.assets.filter().fileCreatedAtProperty().max();
@ -121,15 +111,12 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
return album;
}
@override
Future<void> addUsers(Album album, List<UserDto> users) =>
txn(() => album.sharedUsers.update(link: users.map(entity.User.fromDto)));
@override
Future<void> deleteAllLocal() =>
txn(() => db.albums.where().localIdIsNotNull().deleteAll());
@override
Future<List<Album>> search(
String searchTerm,
QuickFilterMode filterMode,
@ -152,24 +139,20 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
return await query.findAll();
}
@override
Future<void> clearTable() async {
await txn(() async {
await db.albums.clear();
});
}
@override
Stream<List<Album>> watchRemoteAlbums() {
return db.albums.where().remoteIdIsNotNull().watch();
}
@override
Stream<List<Album>> watchLocalAlbums() {
return db.albums.where().localIdIsNotNull().watch();
}
@override
Stream<Album?> watchAlbum(int id) {
return db.albums.watchObject(id, fireImmediately: true);
}

View File

@ -13,7 +13,6 @@ import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/backup_album.entity.dart';
import 'package:immich_mobile/infrastructure/entities/user.entity.dart'
as entity;
import 'package:immich_mobile/interfaces/album.interface.dart';
import 'package:immich_mobile/models/albums/album_add_asset_response.model.dart';
import 'package:immich_mobile/models/albums/album_search.model.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
@ -44,7 +43,7 @@ class AlbumService {
final SyncService _syncService;
final UserService _userService;
final EntityService _entityService;
final IAlbumRepository _albumRepository;
final AlbumRepository _albumRepository;
final AssetRepository _assetRepository;
final BackupAlbumRepository _backupAlbumRepository;
final AlbumMediaRepository _albumMediaRepository;

View File

@ -13,7 +13,6 @@ import 'package:immich_mobile/entities/etag.entity.dart';
import 'package:immich_mobile/extensions/collection_extensions.dart';
import 'package:immich_mobile/infrastructure/repositories/user.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/user_api.repository.dart';
import 'package:immich_mobile/interfaces/album.interface.dart';
import 'package:immich_mobile/providers/app_settings.provider.dart';
import 'package:immich_mobile/providers/infrastructure/exif.provider.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
@ -59,7 +58,7 @@ class SyncService {
final EntityService _entityService;
final AlbumMediaRepository _albumMediaRepository;
final AlbumApiRepository _albumApiRepository;
final IAlbumRepository _albumRepository;
final AlbumRepository _albumRepository;
final AssetRepository _assetRepository;
final IExifInfoRepository _exifInfoRepository;
final IsarUserRepository _isarUserRepository;

View File

@ -1,5 +1,4 @@
import 'package:immich_mobile/domain/interfaces/exif.interface.dart';
import 'package:immich_mobile/interfaces/album.interface.dart';
import 'package:immich_mobile/repositories/partner_api.repository.dart';
import 'package:immich_mobile/repositories/album_media.repository.dart';
import 'package:immich_mobile/repositories/album_api.repository.dart';
@ -12,10 +11,11 @@ import 'package:immich_mobile/repositories/auth.repository.dart';
import 'package:immich_mobile/repositories/auth_api.repository.dart';
import 'package:immich_mobile/repositories/asset.repository.dart';
import 'package:immich_mobile/repositories/asset_media.repository.dart';
import 'package:immich_mobile/repositories/album.repository.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart';
import 'package:mocktail/mocktail.dart';
class MockAlbumRepository extends Mock implements IAlbumRepository {}
class MockAlbumRepository extends Mock implements AlbumRepository {}
class MockAssetRepository extends Mock implements AssetRepository {}