mirror of
https://github.com/immich-app/immich.git
synced 2026-07-05 20:27:52 -07:00
429e181c8f
onIosUpload runs sync local, sync remote, hash and handle backup sequentially. on the bg refresh task path that's a 20s budget from iOS, and sync + hash usually eat all of it before backup gets a turn to enqueue any candidates. these phases don't actually depend on each other. local + remote sync touch different tables. hash works off whatever's already in drift. handle backup reads candidates and just enqueues to URLSession bg. anything one phase produces in this fire shows up to the others on the next fire, and server-side dedup catches the rare race where backup enqueues something sync remote was about to mark as already uploaded. so this runs all four concurrently via Future.wait, with hash getting the full maxSeconds-1 budget instead of a fixed 5s. outer budget timeout still caps everything before iOS expires. second small change: getAssetsToHash orders by createdAt DESC instead of id ASC to match getCandidates. when hash runs inside a refresh fire it processes recent photos first.
57 lines
2.0 KiB
Dart
57 lines
2.0 KiB
Dart
import 'package:drift/drift.dart';
|
|
import 'package:immich_mobile/domain/models/asset/base_asset.model.dart';
|
|
import 'package:immich_mobile/infrastructure/entities/local_asset.entity.drift.dart';
|
|
import 'package:immich_mobile/infrastructure/utils/asset.mixin.dart';
|
|
import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart';
|
|
|
|
@TableIndex.sql('CREATE INDEX IF NOT EXISTS idx_local_asset_checksum ON local_asset_entity (checksum)')
|
|
@TableIndex.sql('CREATE INDEX IF NOT EXISTS idx_local_asset_cloud_id ON local_asset_entity (i_cloud_id)')
|
|
@TableIndex.sql('CREATE INDEX IF NOT EXISTS idx_local_asset_created_at ON local_asset_entity (created_at)')
|
|
class LocalAssetEntity extends Table with DriftDefaultsMixin, AssetEntityMixin {
|
|
const LocalAssetEntity();
|
|
|
|
TextColumn get id => text()();
|
|
TextColumn get checksum => text().nullable()();
|
|
|
|
// Only used during backup to mirror the favorite status of the asset in the server
|
|
BoolColumn get isFavorite => boolean().withDefault(const Constant(false))();
|
|
|
|
IntColumn get orientation => integer().withDefault(const Constant(0))();
|
|
|
|
TextColumn get iCloudId => text().nullable()();
|
|
|
|
DateTimeColumn get adjustmentTime => dateTime().nullable()();
|
|
|
|
RealColumn get latitude => real().nullable()();
|
|
|
|
RealColumn get longitude => real().nullable()();
|
|
|
|
IntColumn get playbackStyle => intEnum<AssetPlaybackStyle>().withDefault(const Constant(0))();
|
|
|
|
@override
|
|
Set<Column> get primaryKey => {id};
|
|
}
|
|
|
|
extension LocalAssetEntityDataDomainExtension on LocalAssetEntityData {
|
|
LocalAsset toDto({String? remoteId}) => LocalAsset(
|
|
id: id,
|
|
name: name,
|
|
checksum: checksum,
|
|
type: type,
|
|
createdAt: createdAt,
|
|
updatedAt: updatedAt,
|
|
durationMs: durationMs,
|
|
isFavorite: isFavorite,
|
|
height: height,
|
|
width: width,
|
|
remoteId: remoteId,
|
|
orientation: orientation,
|
|
playbackStyle: playbackStyle,
|
|
adjustmentTime: adjustmentTime,
|
|
latitude: latitude,
|
|
longitude: longitude,
|
|
cloudId: iCloudId,
|
|
isEdited: false,
|
|
);
|
|
}
|