Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 1 addition & 2 deletions mobile/build.yaml
Original file line number Diff line number Diff line change
Expand Up @@ -18,8 +18,7 @@ targets:
generate_for: &drift_generate_for
- lib/infrastructure/entities/*.dart
- lib/infrastructure/entities/*.drift
- lib/infrastructure/repositories/db.repository.dart
- lib/infrastructure/repositories/logger_db.repository.dart
- lib/infrastructure/repositories/*.repository.dart
drift_dev:modular:
enabled: true
options: *drift_options
Expand Down
12 changes: 6 additions & 6 deletions mobile/lib/domain/services/asset.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -17,10 +17,10 @@ import 'package:maplibre_gl/maplibre_gl.dart';
class AssetService {
final RemoteAssetRepository _remoteRepository;
final RemoteExifRepository _exifRepository;
final DriftLocalAssetRepository _localRepository;
final LocalAssetRepository _localRepository;
final AssetApiRepository _apiRepository;
final AssetMediaRepository _mediaRepository;
final DriftTrashedLocalAssetRepository _trashedLocalRepository;
final TrashedLocalAssetRepository _trashedLocalRepository;

const AssetService({
required this._remoteRepository,
Expand Down Expand Up @@ -136,13 +136,13 @@ class AssetService {
location: location,
dateTimeOriginal: dateTime,
);
await _remoteRepository.update(
await _remoteRepository.updateAssets(
remoteIds,
isFavorite: isFavorite,
visibility: visibility,
createdAt: parsedDateTime,
);
await _exifRepository.update(
await _exifRepository.updateExif(
remoteIds,
location: location,
dateTimeOriginal: parsedDateTime,
Expand All @@ -165,7 +165,7 @@ class AssetService {
}

await _apiRepository.delete(remoteIds, true);
await _remoteRepository.delete(remoteIds);
await _remoteRepository.deleteAssets(remoteIds);
}

Future<void> applyEdits(String remoteId, List<AssetEdit> edits) async {
Expand All @@ -189,7 +189,7 @@ class AssetService {
if (CurrentPlatform.isAndroid && Store.get(StoreKey.manageLocalMediaAndroid, false)) {
await _trashedLocalRepository.applyTrashedAssets(deletedIds);
} else {
await _localRepository.delete(deletedIds);
await _localRepository.deleteAssets(deletedIds);
}
return deletedIds.length;
}
Expand Down
23 changes: 11 additions & 12 deletions mobile/lib/domain/services/background_worker.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -19,8 +19,6 @@ import 'package:immich_mobile/platform/background_worker_api.g.dart';
import 'package:immich_mobile/platform/background_worker_lock_api.g.dart';
import 'package:immich_mobile/providers/api.provider.dart';
import 'package:immich_mobile/providers/backup/drift_backup.provider.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/asset.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/platform.provider.dart';
import 'package:immich_mobile/providers/infrastructure/sync.provider.dart';
Expand Down Expand Up @@ -76,31 +74,32 @@ class BackgroundWorkerBgService extends BackgroundWorkerFlutterApi {
: _backgroundHostApi = BackgroundWorkerBgHostApi() {
final ref = ProviderContainer(overrides: [driftProvider.overrideWith(driftOverride(_drift))]);
_ref = ref;
final db = ref.read(driftProvider);
_localSyncService = LocalSyncService(
localAlbumRepository: ref.read(localAlbumRepository),
localAssetRepository: ref.read(localAssetRepository),
localAlbumRepository: db.localAlbumRepository,
localAssetRepository: db.localAssetRepository,
nativeSyncApi: ref.read(nativeSyncApiProvider),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
trashedLocalAssetRepository: db.trashedLocalAssetRepository,
assetMediaRepository: ref.read(assetMediaRepositoryProvider),
permissionRepository: ref.read(permissionRepositoryProvider),
cancellation: _cancellationToken,
);
_remoteSyncService = SyncStreamService(
syncApiRepository: ref.read(syncApiRepositoryProvider),
syncStreamRepository: ref.read(syncStreamRepositoryProvider),
localAssetRepository: ref.read(localAssetRepository),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
syncStreamRepository: db.syncStreamRepository,
localAssetRepository: db.localAssetRepository,
trashedLocalAssetRepository: db.trashedLocalAssetRepository,
assetMediaRepository: ref.read(assetMediaRepositoryProvider),
permissionRepository: ref.read(permissionRepositoryProvider),
syncMigrationRepository: ref.read(syncMigrationRepositoryProvider),
syncMigrationRepository: db.syncMigrationRepository,
api: ref.read(apiServiceProvider),
cancellation: _cancellationToken,
);
_hashService = HashService(
localAlbumRepository: ref.read(localAlbumRepository),
localAssetRepository: ref.read(localAssetRepository),
localAlbumRepository: db.localAlbumRepository,
localAssetRepository: db.localAssetRepository,
nativeSyncApi: ref.read(nativeSyncApiProvider),
trashedLocalAssetRepository: ref.read(trashedLocalAssetRepository),
trashedLocalAssetRepository: db.trashedLocalAssetRepository,
cancellation: _cancellationToken,
);
BackgroundWorkerFlutterApi.setUp(this);
Expand Down
6 changes: 3 additions & 3 deletions mobile/lib/domain/services/hash.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -15,9 +15,9 @@ const String _kHashCancelledCode = "HASH_CANCELLED";

class HashService {
final int _batchSize;
final DriftLocalAlbumRepository _localAlbumRepository;
final DriftLocalAssetRepository _localAssetRepository;
final DriftTrashedLocalAssetRepository _trashedLocalAssetRepository;
final LocalAlbumRepository _localAlbumRepository;
final LocalAssetRepository _localAssetRepository;
final TrashedLocalAssetRepository _trashedLocalAssetRepository;
final NativeSyncApi _nativeSyncApi;
final Completer<void>? _cancellation;
final _log = Logger('HashService');
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/domain/services/local_album.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';

class LocalAlbumService {
final DriftLocalAlbumRepository _repository;
final LocalAlbumRepository _repository;

const LocalAlbumService(this._repository);

Expand Down
8 changes: 4 additions & 4 deletions mobile/lib/domain/services/local_sync.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -21,11 +21,11 @@ import 'package:logging/logging.dart';
const String _kSyncCancelledCode = "SYNC_CANCELLED";

class LocalSyncService {
final DriftLocalAlbumRepository _localAlbumRepository;
final LocalAlbumRepository _localAlbumRepository;
// ignore: unused_field
final DriftLocalAssetRepository _localAssetRepository;
final LocalAssetRepository _localAssetRepository;
final NativeSyncApi _nativeSyncApi;
final DriftTrashedLocalAssetRepository _trashedLocalAssetRepository;
final TrashedLocalAssetRepository _trashedLocalAssetRepository;
final AssetMediaRepository _assetMediaRepository;
final DevicePermissionRepository _permissionRepository;
final Completer<void>? _cancellation;
Expand Down Expand Up @@ -186,7 +186,7 @@ class LocalSyncService {
_log.fine("Removing device album ${a.name}");
try {
// Asset deletion is handled in the repository
await _localAlbumRepository.delete(a.id);
await _localAlbumRepository.deleteAlbum(a.id);
} catch (e, s) {
_log.warning("Error while removing device album", e, s);
}
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/domain/services/map.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -8,7 +8,7 @@ typedef MapMarkerSource = Future<List<Marker>> Function(LatLngBounds? bounds);
typedef MapQuery = ({MapMarkerSource markerSource});

class MapFactory {
final DriftMapRepository _mapRepository;
final MapRepository _mapRepository;

const MapFactory({required this._mapRepository});

Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/domain/services/memory.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:logging/logging.dart';
class DriftMemoryService {
final log = Logger("DriftMemoryService");

final DriftMemoryRepository _repository;
final MemoryRepository _repository;

DriftMemoryService(this._repository);

Expand Down
4 changes: 2 additions & 2 deletions mobile/lib/domain/services/partner.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -27,7 +27,7 @@ class PartnerService {

Future<void> update({required String sharedById, required String sharedWithId, required bool inTimeline}) async {
await _partnerApiRepository.update(sharedById, inTimeline: inTimeline);
await _partnerRepository.update(sharedById: sharedById, sharedWithId: sharedWithId, inTimeline: inTimeline);
await _partnerRepository.updatePartner(sharedById: sharedById, sharedWithId: sharedWithId, inTimeline: inTimeline);
}

Future<void> create({required String sharedById, required String sharedWithId, bool inTimeline = false}) async {
Expand All @@ -37,6 +37,6 @@ class PartnerService {

Future<void> delete({required String sharedById, required String sharedWithId}) async {
await _partnerApiRepository.delete(sharedWithId);
await _partnerRepository.delete(sharedById: sharedById, sharedWithId: sharedWithId);
await _partnerRepository.deletePartner(sharedById: sharedById, sharedWithId: sharedWithId);
}
}
2 changes: 1 addition & 1 deletion mobile/lib/domain/services/people.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -5,7 +5,7 @@ import 'package:immich_mobile/infrastructure/repositories/people.repository.dart
import 'package:immich_mobile/repositories/person_api.repository.dart';

class DriftPeopleService {
final DriftPeopleRepository _repository;
final PeopleRepository _repository;
final PersonApiRepository _personApiRepository;

const DriftPeopleService(this._repository, this._personApiRepository);
Expand Down
4 changes: 2 additions & 2 deletions mobile/lib/domain/services/remote_album.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -25,7 +25,7 @@ class AlbumAssetCandidates {
class RemoteAlbumService {
static final _logger = Logger('RemoteAlbumService');

final DriftRemoteAlbumRepository _repository;
final RemoteAlbumRepository _repository;
final DriftAlbumApiRepository _albumApiRepository;
final ForegroundUploadService _uploadService;

Expand Down Expand Up @@ -152,7 +152,7 @@ class RemoteAlbumService {
);

// Update the local database
await _repository.update(updatedAlbum);
await _repository.updateAlbum(updatedAlbum);

return updatedAlbum;
}
Expand Down
10 changes: 5 additions & 5 deletions mobile/lib/domain/services/store.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,13 +6,13 @@ import 'package:immich_mobile/infrastructure/repositories/store.repository.dart'
/// Provides access to a persistent key-value store with an in-memory cache.
/// Listens for repository changes to keep the cache updated.
class StoreService {
final DriftStoreRepository _storeRepository;
final StoreRepository _storeRepository;

/// In-memory cache. Keys are [StoreKey.id]
final Map<int, Object?> _cache = {};
StreamSubscription<List<StoreDto>>? _storeUpdateSubscription;

StoreService._({required DriftStoreRepository isarStoreRepository}) : _storeRepository = isarStoreRepository;
StoreService._({required StoreRepository isarStoreRepository}) : _storeRepository = isarStoreRepository;

// TODO: Temporary typedef to make minimal changes. Remove this and make the presentation layer access store through a provider
static StoreService? _instance;
Expand All @@ -24,12 +24,12 @@ class StoreService {
}

// TODO: Replace the implementation with the one from create after removing the typedef
static Future<StoreService> init({required DriftStoreRepository storeRepository, bool listenUpdates = true}) async {
static Future<StoreService> init({required StoreRepository storeRepository, bool listenUpdates = true}) async {
_instance ??= await create(storeRepository: storeRepository, listenUpdates: listenUpdates);
return _instance!;
}

static Future<StoreService> create({required DriftStoreRepository storeRepository, bool listenUpdates = true}) async {
static Future<StoreService> create({required StoreRepository storeRepository, bool listenUpdates = true}) async {
final instance = StoreService._(isarStoreRepository: storeRepository);
await instance.populateCache();
if (listenUpdates) {
Expand Down Expand Up @@ -90,7 +90,7 @@ class StoreService {

/// Removes the value for [key]
Future<void> delete<T>(StoreKey<T> key) async {
await _storeRepository.delete(key);
await _storeRepository.deleteValue(key);
_cache.remove(key.id);
}

Expand Down
19 changes: 10 additions & 9 deletions mobile/lib/domain/services/sync_linked_album.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -6,24 +6,25 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/domain/services/store.service.dart';
import 'package:immich_mobile/infrastructure/repositories/local_album.repository.dart';
import 'package:immich_mobile/infrastructure/repositories/remote_album.repository.dart';
import 'package:immich_mobile/providers/infrastructure/album.provider.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';
import 'package:immich_mobile/providers/infrastructure/store.provider.dart';
import 'package:immich_mobile/repositories/drift_album_api_repository.dart';
import 'package:immich_mobile/utils/debug_print.dart';
import 'package:logging/logging.dart';

final syncLinkedAlbumServiceProvider = Provider(
(ref) => SyncLinkedAlbumService(
ref.watch(localAlbumRepository),
ref.watch(remoteAlbumRepository),
final syncLinkedAlbumServiceProvider = Provider((ref) {
final db = ref.watch(driftProvider);
return SyncLinkedAlbumService(
db.localAlbumRepository,
db.remoteAlbumRepository,
ref.watch(driftAlbumApiRepositoryProvider),
ref.watch(storeServiceProvider),
),
);
);
});

class SyncLinkedAlbumService {
final DriftLocalAlbumRepository _localAlbumRepository;
final DriftRemoteAlbumRepository _remoteAlbumRepository;
final LocalAlbumRepository _localAlbumRepository;
final RemoteAlbumRepository _remoteAlbumRepository;
final DriftAlbumApiRepository _albumApiRepository;
final StoreService _storeService;

Expand Down
4 changes: 2 additions & 2 deletions mobile/lib/domain/services/sync_stream.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -34,8 +34,8 @@ class SyncStreamService {

final SyncApiRepository _syncApiRepository;
final SyncStreamRepository _syncStreamRepository;
final DriftLocalAssetRepository _localAssetRepository;
final DriftTrashedLocalAssetRepository _trashedLocalAssetRepository;
final LocalAssetRepository _localAssetRepository;
final TrashedLocalAssetRepository _trashedLocalAssetRepository;
final AssetMediaRepository _assetMediaRepository;
final DevicePermissionRepository _permissionRepository;
final SyncMigrationRepository _syncMigrationRepository;
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/domain/services/timeline.service.dart
Original file line number Diff line number Diff line change
Expand Up @@ -38,7 +38,7 @@ enum TimelineOrigin {
}

class TimelineFactory {
final DriftTimelineRepository _timelineRepository;
final TimelineRepository _timelineRepository;
final SettingsRepository _settingsRepository;

const TimelineFactory({required this._timelineRepository, required this._settingsRepository});
Expand Down
2 changes: 1 addition & 1 deletion mobile/lib/domain/utils/migrate_cloud_ids.dart
Original file line number Diff line number Diff line change
Expand Up @@ -172,7 +172,7 @@ Future<void> _populateCloudIds(Drift drift) async {
);
}
}
await DriftLocalAlbumRepository(drift).updateCloudMapping(cloudMapping);
await LocalAlbumRepository(drift).updateCloudMapping(cloudMapping);
}

typedef _CloudIdMapping = ({String remoteAssetId, LocalAsset localAsset});
Expand Down
13 changes: 5 additions & 8 deletions mobile/lib/infrastructure/repositories/backup.repository.dart
Original file line number Diff line number Diff line change
@@ -1,21 +1,18 @@
import 'dart:async';

import 'package:drift/drift.dart';
import 'package:hooks_riverpod/hooks_riverpod.dart';
import 'package:immich_mobile/domain/models/album/local_album.model.dart';
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
import 'package:immich_mobile/infrastructure/entities/local_album_asset.entity.drift.dart';
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.dart';
import 'package:immich_mobile/infrastructure/repositories/backup.repository.drift.dart';
import 'package:immich_mobile/infrastructure/repositories/db.repository.dart';
import 'package:immich_mobile/providers/infrastructure/db.provider.dart';

final backupRepositoryProvider = Provider<DriftBackupRepository>(
(ref) => DriftBackupRepository(ref.watch(driftProvider)),
);
@DriftAccessor()
class BackupRepository extends DatabaseAccessor<Drift> with $BackupRepositoryMixin {
BackupRepository(super.attachedDatabase);

class DriftBackupRepository extends DriftDatabaseRepository {
final Drift _db;
const DriftBackupRepository(this._db) : super(_db);
Drift get _db => attachedDatabase;

JoinedSelectStatement<$LocalAlbumAssetEntityTable, LocalAlbumAssetEntityData> _getExcludedSubquery() {
return _db.localAlbumAssetEntity.selectOnly()
Expand Down
Loading
Loading