refactor: user entity (#16655)

* refactor: user entity

* fix: add users to album & user profile url

* chore: rebase fixes

* generate files

* fix(mobile): timeline not reset on login

* fix: test stub

* refactor: rename user model (#16813)

* refactor: rename user model

* simplify import

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>

* chore: generate files

* fix: use getAllAccessible instead of getAll

---------

Co-authored-by: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com>
Co-authored-by: Alex <alex.tran1502@gmail.com>
This commit is contained in:
shenlong 2025-03-12 19:26:56 +05:30 committed by GitHub
parent a75718ce99
commit d1c8fe5303
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
82 changed files with 1039 additions and 947 deletions

View file

@ -5,24 +5,27 @@ import 'package:collection/collection.dart';
import 'package:flutter/material.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/interfaces/exif.interface.dart';
import 'package:immich_mobile/domain/interfaces/user.interface.dart';
import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/models/user.model.dart';
import 'package:immich_mobile/domain/services/store.service.dart';
import 'package:immich_mobile/entities/asset.entity.dart';
import 'package:immich_mobile/entities/backup_album.entity.dart';
import 'package:immich_mobile/entities/user.entity.dart';
import 'package:immich_mobile/interfaces/asset.interface.dart';
import 'package:immich_mobile/interfaces/asset_api.interface.dart';
import 'package:immich_mobile/interfaces/asset_media.interface.dart';
import 'package:immich_mobile/interfaces/backup_album.interface.dart';
import 'package:immich_mobile/interfaces/etag.interface.dart';
import 'package:immich_mobile/interfaces/user.interface.dart';
import 'package:immich_mobile/models/backup/backup_candidate.model.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/infrastructure/exif.provider.dart';
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
import 'package:immich_mobile/providers/infrastructure/user.provider.dart';
import 'package:immich_mobile/repositories/asset.repository.dart';
import 'package:immich_mobile/repositories/asset_api.repository.dart';
import 'package:immich_mobile/repositories/asset_media.repository.dart';
import 'package:immich_mobile/repositories/backup.repository.dart';
import 'package:immich_mobile/repositories/etag.repository.dart';
import 'package:immich_mobile/repositories/user.repository.dart';
import 'package:immich_mobile/services/album.service.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/services/backup.service.dart';
@ -45,6 +48,7 @@ final assetServiceProvider = Provider(
ref.watch(userServiceProvider),
ref.watch(backupServiceProvider),
ref.watch(albumServiceProvider),
ref.watch(storeServiceProvider),
ref.watch(assetMediaRepositoryProvider),
),
);
@ -61,6 +65,7 @@ class AssetService {
final UserService _userService;
final BackupService _backupService;
final AlbumService _albumService;
final StoreService _storeService;
final IAssetMediaRepository _assetMediaRepository;
final log = Logger('AssetService');
@ -76,6 +81,7 @@ class AssetService {
this._userService,
this._backupService,
this._albumService,
this._storeService,
this._assetMediaRepository,
);
@ -83,9 +89,9 @@ class AssetService {
/// required. Returns `true` if there were any changes.
Future<bool> refreshRemoteAssets() async {
final syncedUserIds = await _etagRepository.getAllIds();
final List<User> syncedUsers = syncedUserIds.isEmpty
final List<UserDto> syncedUsers = syncedUserIds.isEmpty
? []
: await _userRepository.getByIds(syncedUserIds);
: (await _userRepository.getByUserIds(syncedUserIds)).nonNulls.toList();
final Stopwatch sw = Stopwatch()..start();
final bool changes = await _syncService.syncRemoteAssetsToDb(
users: syncedUsers,
@ -99,10 +105,10 @@ class AssetService {
/// Returns `(null, null)` if changes are invalid -> requires full sync
Future<(List<Asset>? toUpsert, List<String>? toDelete)>
_getRemoteAssetChanges(List<User> users, DateTime since) async {
_getRemoteAssetChanges(List<UserDto> users, DateTime since) async {
final dto = AssetDeltaSyncDto(
updatedAfter: since,
userIds: users.map((e) => e.id).toList(),
userIds: users.map((e) => e.uid).toList(),
);
final changes = await _apiService.syncApi.getDeltaSync(dto);
return changes == null || changes.needsFullSync
@ -132,7 +138,7 @@ class AssetService {
}
/// Returns `null` if the server state did not change, else list of assets
Future<List<Asset>?> _getRemoteAssets(User user, DateTime until) async {
Future<List<Asset>?> _getRemoteAssets(UserDto user, DateTime until) async {
const int chunkSize = 10000;
try {
final List<Asset> allAssets = [];
@ -143,7 +149,7 @@ class AssetService {
limit: chunkSize,
updatedUntil: until,
lastId: lastId,
userId: user.id,
userId: user.uid,
);
log.fine("Requesting $chunkSize assets from $lastId");
final List<AssetResponseDto>? assets =
@ -314,9 +320,9 @@ class AssetService {
);
await refreshRemoteAssets();
final owner = await _userRepository.me();
final owner = _storeService.get(StoreKey.currentUser);
final remoteAssets = await _assetRepository.getAll(
ownerId: owner.isarId,
ownerId: owner.id,
state: AssetState.merged,
);
@ -519,13 +525,13 @@ class AssetService {
return _assetRepository.watchAsset(id, fireImmediately: fireImmediately);
}
Future<List<Asset>> getRecentlyAddedAssets() async {
final me = await _userRepository.me();
return _assetRepository.getRecentlyAddedAssets(me.isarId);
Future<List<Asset>> getRecentlyAddedAssets() {
final me = _storeService.get(StoreKey.currentUser);
return _assetRepository.getRecentlyAddedAssets(me.id);
}
Future<List<Asset>> getMotionAssets() async {
final me = await _userRepository.me();
return _assetRepository.getMotionAssets(me.isarId);
Future<List<Asset>> getMotionAssets() {
final me = _storeService.get(StoreKey.currentUser);
return _assetRepository.getMotionAssets(me.id);
}
}