Files
immich/mobile-v2/lib/domain/repositories/album.repository.dart
T
shenlong-tanwen 8f47645cdb more refactors
2025-02-26 08:58:19 +05:30

82 lines
2.1 KiB
Dart

import 'dart:async';
import 'package:drift/drift.dart';
import 'package:immich_mobile/domain/entities/album.entity.drift.dart';
import 'package:immich_mobile/domain/interfaces/album.interface.dart';
import 'package:immich_mobile/domain/models/album.model.dart';
import 'package:immich_mobile/domain/repositories/database.repository.dart';
import 'package:immich_mobile/utils/mixins/log.mixin.dart';
class AlbumRepository with LogMixin implements IAlbumRepository {
final DriftDatabaseRepository _db;
const AlbumRepository({required DriftDatabaseRepository db}) : _db = db;
@override
FutureOr<Album?> upsert(Album album) async {
try {
final albumData = _toEntity(album);
final data = await _db.album.insertReturningOrNull(
albumData,
onConflict: DoUpdate((_) => albumData, target: [_db.album.localId]),
);
if (data != null) {
return _toModel(data);
}
} catch (e, s) {
log.e("Error while adding an album to the DB", e, s);
}
return null;
}
@override
FutureOr<List<Album>> getAll({
bool localOnly = false,
bool remoteOnly = false,
}) async {
final query = _db.album.select();
if (localOnly == true) {
query.where((album) => album.localId.isNotNull());
}
if (remoteOnly == true) {
query.where((album) => album.remoteId.isNotNull());
}
query.orderBy([(album) => OrderingTerm.asc(album.name)]);
return await query.map(_toModel).get();
}
@override
FutureOr<void> deleteId(int id) async {
await _db.album.deleteWhere((row) => row.id.equals(id));
}
@override
FutureOr<void> deleteAll() async {
await _db.album.deleteAll();
}
}
AlbumCompanion _toEntity(Album album) {
return AlbumCompanion.insert(
id: Value.absentIfNull(album.id),
localId: Value(album.localId),
remoteId: Value(album.remoteId),
name: album.name,
modifiedTime: Value(album.modifiedTime),
thumbnailAssetId: Value(album.thumbnailAssetId),
);
}
Album _toModel(AlbumData album) {
return Album(
id: album.id,
localId: album.localId,
remoteId: album.remoteId,
name: album.name,
modifiedTime: album.modifiedTime,
);
}