refactor(mobile): remove int user id (#16814)

* refactor: user entity

* chore: rebase fixes

* refactor: remove int user Id

* refactor: migrate store userId from int to string

* refactor: rename uid to id

* fix: migration

* pr feedback

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
This commit is contained in:
shenlong
2025-03-18 21:35:37 +05:30
committed by GitHub
parent e96ffd43e7
commit 9cf3b88f80
38 changed files with 182 additions and 157 deletions
+7 -12
View File
@@ -10,6 +10,7 @@ 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';
final albumRepositoryProvider =
@@ -43,14 +44,11 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
if (shared != null) {
query = query.sharedEqualTo(shared);
}
final isarUserId = fastHash(Store.get(StoreKey.currentUser).id);
if (owner == true) {
query = query.owner(
(q) => q.isarIdEqualTo(Store.get(StoreKey.currentUser).id),
);
query = query.owner((q) => q.isarIdEqualTo(isarUserId));
} else if (owner == false) {
query = query.owner(
(q) => q.not().isarIdEqualTo(Store.get(StoreKey.currentUser).id),
);
query = query.owner((q) => q.not().isarIdEqualTo(isarUserId));
}
if (remote == true) {
query = query.localIdIsNull();
@@ -140,16 +138,13 @@ class AlbumRepository extends DatabaseRepository implements IAlbumRepository {
.filter()
.nameContains(searchTerm, caseSensitive: false)
.remoteIdIsNotNull();
final isarUserId = fastHash(Store.get(StoreKey.currentUser).id);
switch (filterMode) {
case QuickFilterMode.sharedWithMe:
query = query.owner(
(q) => q.not().isarIdEqualTo(Store.get(StoreKey.currentUser).id),
);
query = query.owner((q) => q.not().isarIdEqualTo(isarUserId));
case QuickFilterMode.myAlbums:
query = query.owner(
(q) => q.isarIdEqualTo(Store.get(StoreKey.currentUser).id),
);
query = query.owner((q) => q.isarIdEqualTo(isarUserId));
case QuickFilterMode.all:
break;
}
+23 -20
View File
@@ -11,6 +11,7 @@ import 'package:immich_mobile/infrastructure/entities/exif.entity.dart';
import 'package:immich_mobile/interfaces/asset.interface.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';
final assetRepositoryProvider =
@@ -22,20 +23,21 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
@override
Future<List<Asset>> getByAlbum(
Album album, {
Iterable<int> notOwnedBy = const [],
int? ownerId,
Iterable<String> notOwnedBy = const [],
String? ownerId,
AssetState? state,
AssetSort? sortBy,
}) {
var query = album.assets.filter();
final isarUserIds = notOwnedBy.map(fastHash).toList();
if (notOwnedBy.length == 1) {
query = query.not().ownerIdEqualTo(notOwnedBy.first);
query = query.not().ownerIdEqualTo(isarUserIds.first);
} else if (notOwnedBy.isNotEmpty) {
query =
query.not().anyOf(notOwnedBy, (q, int id) => q.ownerIdEqualTo(id));
query.not().anyOf(isarUserIds, (q, int id) => q.ownerIdEqualTo(id));
}
if (ownerId != null) {
query = query.ownerIdEqualTo(ownerId);
query = query.ownerIdEqualTo(fastHash(ownerId));
}
if (state != null) {
@@ -87,27 +89,28 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
@override
Future<List<Asset>> getAll({
required int ownerId,
required String ownerId,
AssetState? state,
AssetSort? sortBy,
int? limit,
}) {
final baseQuery = db.assets.where();
final isarUserIds = fastHash(ownerId);
final QueryBuilder<Asset, Asset, QAfterFilterCondition> filteredQuery =
switch (state) {
null => baseQuery.ownerIdEqualToAnyChecksum(ownerId).noOp(),
null => baseQuery.ownerIdEqualToAnyChecksum(isarUserIds).noOp(),
AssetState.local => baseQuery
.remoteIdIsNull()
.filter()
.localIdIsNotNull()
.ownerIdEqualTo(ownerId),
.ownerIdEqualTo(isarUserIds),
AssetState.remote => baseQuery
.localIdIsNull()
.filter()
.remoteIdIsNotNull()
.ownerIdEqualTo(ownerId),
.ownerIdEqualTo(isarUserIds),
AssetState.merged => baseQuery
.ownerIdEqualToAnyChecksum(ownerId)
.ownerIdEqualToAnyChecksum(isarUserIds)
.filter()
.remoteIdIsNotNull()
.localIdIsNotNull(),
@@ -132,7 +135,7 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
@override
Future<List<Asset>> getMatches({
required List<Asset> assets,
required int ownerId,
required String ownerId,
AssetState? state,
int limit = 100,
}) {
@@ -147,7 +150,7 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
AssetState.merged =>
baseQuery.localIdIsNotNull().filter().remoteIdIsNotNull(),
};
return _getMatchesImpl(query, ownerId, assets, limit);
return _getMatchesImpl(query, fastHash(ownerId), assets, limit);
}
@override
@@ -185,10 +188,10 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
@override
Future<List<Asset?>> getAllByOwnerIdChecksum(
List<int> ids,
List<int> ownerIds,
List<String> checksums,
) =>
db.assets.getAllByOwnerIdChecksum(ids, checksums);
db.assets.getAllByOwnerIdChecksum(ownerIds, checksums);
@override
Future<List<Asset>> getAllLocal() =>
@@ -224,30 +227,30 @@ class AssetRepository extends DatabaseRepository implements IAssetRepository {
}
@override
Future<List<Asset>> getTrashAssets(int userId) {
Future<List<Asset>> getTrashAssets(String userId) {
return db.assets
.where()
.remoteIdIsNotNull()
.filter()
.ownerIdEqualTo(userId)
.ownerIdEqualTo(fastHash(userId))
.isTrashedEqualTo(true)
.findAll();
}
@override
Future<List<Asset>> getRecentlyAddedAssets(int userId) {
Future<List<Asset>> getRecentlyAddedAssets(String userId) {
return db.assets
.where()
.ownerIdEqualToAnyChecksum(userId)
.ownerIdEqualToAnyChecksum(fastHash(userId))
.sortByFileCreatedAtDesc()
.findAll();
}
@override
Future<List<Asset>> getMotionAssets(int userId) {
Future<List<Asset>> getMotionAssets(String userId) {
return db.assets
.where()
.ownerIdEqualToAnyChecksum(userId)
.ownerIdEqualToAnyChecksum(fastHash(userId))
.filter()
.livePhotoVideoIdIsNotNull()
.findAll();
@@ -4,6 +4,7 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/interfaces/asset_media.interface.dart';
import 'package:immich_mobile/utils/hash.dart';
import 'package:photo_manager/photo_manager.dart' hide AssetType;
final assetMediaRepositoryProvider = Provider((ref) => AssetMediaRepository());
@@ -24,7 +25,7 @@ class AssetMediaRepository implements IAssetMediaRepository {
final Asset asset = Asset(
checksum: "",
localId: local.id,
ownerId: Store.get(StoreKey.currentUser).id,
ownerId: fastHash(Store.get(StoreKey.currentUser).id),
fileCreatedAt: local.createDateTime,
fileModifiedAt: local.modifiedDateTime,
updatedAt: local.modifiedDateTime,
+1 -1
View File
@@ -15,7 +15,7 @@ class ETagRepository extends DatabaseRepository implements IETagRepository {
Future<List<String>> getAllIds() => db.eTags.where().idProperty().findAll();
@override
Future<ETag?> get(int id) => db.eTags.get(id);
Future<ETag?> get(String id) => db.eTags.getById(id);
@override
Future<void> upsertAll(List<ETag> etags) => txn(() => db.eTags.putAll(etags));
@@ -6,6 +6,7 @@ import 'package:immich_mobile/infrastructure/entities/user.entity.dart';
import 'package:immich_mobile/interfaces/timeline.interface.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:immich_mobile/widgets/asset_grid/asset_grid_data_structure.dart';
import 'package:isar/isar.dart';
@@ -17,32 +18,32 @@ class TimelineRepository extends DatabaseRepository
TimelineRepository(super.db);
@override
Future<List<int>> getTimelineUserIds(int id) {
Future<List<String>> getTimelineUserIds(String id) {
return db.users
.filter()
.inTimelineEqualTo(true)
.or()
.isarIdEqualTo(id)
.isarIdProperty()
.idEqualTo(id)
.idProperty()
.findAll();
}
@override
Stream<List<int>> watchTimelineUsers(int id) {
Stream<List<String>> watchTimelineUsers(String id) {
return db.users
.filter()
.inTimelineEqualTo(true)
.or()
.isarIdEqualTo(id)
.isarIdProperty()
.idEqualTo(id)
.idProperty()
.watch();
}
@override
Stream<RenderList> watchArchiveTimeline(int userId) {
Stream<RenderList> watchArchiveTimeline(String userId) {
final query = db.assets
.where()
.ownerIdEqualToAnyChecksum(userId)
.ownerIdEqualToAnyChecksum(fastHash(userId))
.filter()
.isArchivedEqualTo(true)
.isTrashedEqualTo(false)
@@ -52,10 +53,10 @@ class TimelineRepository extends DatabaseRepository
}
@override
Stream<RenderList> watchFavoriteTimeline(int userId) {
Stream<RenderList> watchFavoriteTimeline(String userId) {
final query = db.assets
.where()
.ownerIdEqualToAnyChecksum(userId)
.ownerIdEqualToAnyChecksum(fastHash(userId))
.filter()
.isFavoriteEqualTo(true)
.isTrashedEqualTo(false)
@@ -79,10 +80,10 @@ class TimelineRepository extends DatabaseRepository
}
@override
Stream<RenderList> watchTrashTimeline(int userId) {
Stream<RenderList> watchTrashTimeline(String userId) {
final query = db.assets
.filter()
.ownerIdEqualTo(userId)
.ownerIdEqualTo(fastHash(userId))
.isTrashedEqualTo(true)
.sortByFileCreatedAtDesc();
@@ -103,12 +104,12 @@ class TimelineRepository extends DatabaseRepository
@override
Stream<RenderList> watchHomeTimeline(
int userId,
String userId,
GroupAssetsBy groupAssetByOption,
) {
final query = db.assets
.where()
.ownerIdEqualToAnyChecksum(userId)
.ownerIdEqualToAnyChecksum(fastHash(userId))
.filter()
.isArchivedEqualTo(false)
.isTrashedEqualTo(false)
@@ -120,12 +121,13 @@ class TimelineRepository extends DatabaseRepository
@override
Stream<RenderList> watchMultiUsersTimeline(
List<int> userIds,
List<String> userIds,
GroupAssetsBy groupAssetByOption,
) {
final isarUserIds = userIds.map(fastHash).toList();
final query = db.assets
.where()
.anyOf(userIds, (qb, userId) => qb.ownerIdEqualToAnyChecksum(userId))
.anyOf(isarUserIds, (qb, id) => qb.ownerIdEqualToAnyChecksum(id))
.filter()
.isArchivedEqualTo(false)
.isTrashedEqualTo(false)
@@ -143,12 +145,12 @@ class TimelineRepository extends DatabaseRepository
}
@override
Stream<RenderList> watchAssetSelectionTimeline(int userId) {
Stream<RenderList> watchAssetSelectionTimeline(String userId) {
final query = db.assets
.where()
.remoteIdIsNotNull()
.filter()
.ownerIdEqualTo(userId)
.ownerIdEqualTo(fastHash(userId))
.isTrashedEqualTo(false)
.stackPrimaryAssetIdIsNull()
.sortByFileCreatedAtDesc();