import 'package:drift/drift.dart'; import 'package:immich_mobile/constants/enums.dart'; import 'package:immich_mobile/domain/models/user.model.dart'; import 'package:immich_mobile/domain/models/user_metadata.model.dart'; import 'package:immich_mobile/infrastructure/entities/auth_user.entity.drift.dart'; import 'package:immich_mobile/infrastructure/entities/user.entity.dart' as entity; import 'package:immich_mobile/infrastructure/repositories/db.repository.dart'; import 'package:immich_mobile/infrastructure/repositories/user_metadata.repository.dart'; import 'package:isar/isar.dart'; class IsarUserRepository extends IsarDatabaseRepository { final Isar _db; const IsarUserRepository(super.db) : _db = db; Future delete(List ids) async { await transaction(() async { await _db.users.deleteAllById(ids); }); } Future deleteAll() async { await transaction(() async { await _db.users.clear(); }); } Future> getAll({SortUserBy? sortBy}) async { return (await _db.users .where() .optional( sortBy != null, (query) => switch (sortBy!) { SortUserBy.id => query.sortById(), }, ) .findAll()) .map((u) => u.toDto()) .toList(); } Future getByUserId(String id) async { return (await _db.users.getById(id))?.toDto(); } Future> getByUserIds(List ids) async { return (await _db.users.getAllById(ids)).map((u) => u?.toDto()).toList(); } Future insert(UserDto user) async { await transaction(() async { await _db.users.put(entity.User.fromDto(user)); }); return true; } Future update(UserDto user) async { await transaction(() async { await _db.users.put(entity.User.fromDto(user)); }); return user; } Future updateAll(List users) async { await transaction(() async { await _db.users.putAll(users.map(entity.User.fromDto).toList()); }); return true; } } class DriftAuthUserRepository extends DriftDatabaseRepository { final Drift _db; const DriftAuthUserRepository(super.db) : _db = db; Future get(String id) async { final user = await _db.managers.authUserEntity.filter((user) => user.id.equals(id)).getSingleOrNull(); if (user == null) return null; final query = _db.userMetadataEntity.select()..where((e) => e.userId.equals(id)); final metadata = await query.map((row) => row.toDto()).get(); return user.toDto(metadata); } Future upsert(UserDto user) async { await _db.authUserEntity.insertOnConflictUpdate( AuthUserEntityCompanion( id: Value(user.id), name: Value(user.name), email: Value(user.email), hasProfileImage: Value(user.hasProfileImage), profileChangedAt: Value(user.profileChangedAt), isAdmin: Value(user.isAdmin), quotaSizeInBytes: Value(user.quotaSizeInBytes), quotaUsageInBytes: Value(user.quotaUsageInBytes), avatarColor: Value(user.avatarColor), ), ); return user; } } extension on AuthUserEntityData { UserDto toDto([List? metadata]) { bool memoryEnabled = true; if (metadata != null) { for (final meta in metadata) { if (meta.key == UserMetadataKey.preferences && meta.preferences != null) { memoryEnabled = meta.preferences?.memoriesEnabled ?? true; } } } return UserDto( id: id, email: email, name: name, profileChangedAt: profileChangedAt, hasProfileImage: hasProfileImage, avatarColor: avatarColor, memoryEnabled: memoryEnabled, isAdmin: isAdmin, quotaSizeInBytes: quotaSizeInBytes, quotaUsageInBytes: quotaUsageInBytes, ); } }