From 6bee2bbdfb727888f4fb1ac98a1b6f921c91e412 Mon Sep 17 00:00:00 2001 From: shenlong-tanwen <139912620+shalong-tanwen@users.noreply.github.com> Date: Sat, 25 Oct 2025 18:49:11 +0530 Subject: [PATCH] fix: use drift for persistence in background_downloader --- mobile/build.yaml | 1 + .../background_downloader.entity.dart | 66 + .../background_downloader.entity.drift.dart | 2165 +++++++++++++++++ .../background_downloader.repository.dart | 195 ++ ...ackground_downloader.repository.drift.dart | 45 + mobile/lib/main.dart | 3 +- .../lib/repositories/upload.repository.dart | 2 +- 7 files changed, 2475 insertions(+), 2 deletions(-) create mode 100644 mobile/lib/infrastructure/entities/background_downloader.entity.dart create mode 100644 mobile/lib/infrastructure/entities/background_downloader.entity.drift.dart create mode 100644 mobile/lib/infrastructure/repositories/background_downloader.repository.dart create mode 100644 mobile/lib/infrastructure/repositories/background_downloader.repository.drift.dart diff --git a/mobile/build.yaml b/mobile/build.yaml index cb718d9d3e..1d0654bce3 100644 --- a/mobile/build.yaml +++ b/mobile/build.yaml @@ -20,6 +20,7 @@ targets: - lib/infrastructure/entities/*.drift - lib/infrastructure/repositories/db.repository.dart - lib/infrastructure/repositories/logger_db.repository.dart + - lib/infrastructure/repositories/background_downloader.repository.dart drift_dev:modular: enabled: true options: *drift_options diff --git a/mobile/lib/infrastructure/entities/background_downloader.entity.dart b/mobile/lib/infrastructure/entities/background_downloader.entity.dart new file mode 100644 index 0000000000..68c5834c98 --- /dev/null +++ b/mobile/lib/infrastructure/entities/background_downloader.entity.dart @@ -0,0 +1,66 @@ +import 'package:drift/drift.dart'; +import 'package:immich_mobile/infrastructure/utils/drift_default.mixin.dart'; + +class TaskRecordEntity extends Table with DriftDefaultsMixin { + const TaskRecordEntity(); + + TextColumn get taskId => text()(); + + TextColumn get url => text()(); + + TextColumn get filename => text()(); + + TextColumn get group => text()(); + + TextColumn get metaData => text()(); + + IntColumn get creationTime => integer()(); + + IntColumn get status => integer()(); + + RealColumn get progress => real()(); + + TextColumn get objectJsonMap => text()(); + + @override + Set get primaryKey => {taskId}; +} + +class PausedTasksEntity extends Table with DriftDefaultsMixin { + const PausedTasksEntity(); + + TextColumn get taskId => text()(); + + IntColumn get modified => integer()(); + + TextColumn get objectJsonMap => text()(); + + @override + Set get primaryKey => {taskId}; +} + +class ModifiedTasksEntity extends Table with DriftDefaultsMixin { + const ModifiedTasksEntity(); + + TextColumn get taskId => text()(); + + IntColumn get modified => integer()(); + + TextColumn get objectJsonMap => text()(); + + @override + Set get primaryKey => {taskId}; +} + +class ResumeTasksEntity extends Table with DriftDefaultsMixin { + const ResumeTasksEntity(); + + TextColumn get taskId => text()(); + + IntColumn get modified => integer()(); + + TextColumn get objectJsonMap => text()(); + + @override + Set get primaryKey => {taskId}; +} diff --git a/mobile/lib/infrastructure/entities/background_downloader.entity.drift.dart b/mobile/lib/infrastructure/entities/background_downloader.entity.drift.dart new file mode 100644 index 0000000000..228020e6b8 --- /dev/null +++ b/mobile/lib/infrastructure/entities/background_downloader.entity.drift.dart @@ -0,0 +1,2165 @@ +// dart format width=80 +// ignore_for_file: type=lint +import 'package:drift/drift.dart' as i0; +import 'package:immich_mobile/infrastructure/entities/background_downloader.entity.drift.dart' + as i1; +import 'package:immich_mobile/infrastructure/entities/background_downloader.entity.dart' + as i2; + +typedef $$TaskRecordEntityTableCreateCompanionBuilder = + i1.TaskRecordEntityCompanion Function({ + required String taskId, + required String url, + required String filename, + required String group, + required String metaData, + required int creationTime, + required int status, + required double progress, + required String objectJsonMap, + }); +typedef $$TaskRecordEntityTableUpdateCompanionBuilder = + i1.TaskRecordEntityCompanion Function({ + i0.Value taskId, + i0.Value url, + i0.Value filename, + i0.Value group, + i0.Value metaData, + i0.Value creationTime, + i0.Value status, + i0.Value progress, + i0.Value objectJsonMap, + }); + +class $$TaskRecordEntityTableFilterComposer + extends i0.Composer { + $$TaskRecordEntityTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnFilters get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get url => $composableBuilder( + column: $table.url, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get filename => $composableBuilder( + column: $table.filename, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get metaData => $composableBuilder( + column: $table.metaData, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get creationTime => $composableBuilder( + column: $table.creationTime, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get status => $composableBuilder( + column: $table.status, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get progress => $composableBuilder( + column: $table.progress, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnFilters(column), + ); +} + +class $$TaskRecordEntityTableOrderingComposer + extends i0.Composer { + $$TaskRecordEntityTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnOrderings get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get url => $composableBuilder( + column: $table.url, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get filename => $composableBuilder( + column: $table.filename, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get group => $composableBuilder( + column: $table.group, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get metaData => $composableBuilder( + column: $table.metaData, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get creationTime => $composableBuilder( + column: $table.creationTime, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get status => $composableBuilder( + column: $table.status, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get progress => $composableBuilder( + column: $table.progress, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnOrderings(column), + ); +} + +class $$TaskRecordEntityTableAnnotationComposer + extends i0.Composer { + $$TaskRecordEntityTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.GeneratedColumn get taskId => + $composableBuilder(column: $table.taskId, builder: (column) => column); + + i0.GeneratedColumn get url => + $composableBuilder(column: $table.url, builder: (column) => column); + + i0.GeneratedColumn get filename => + $composableBuilder(column: $table.filename, builder: (column) => column); + + i0.GeneratedColumn get group => + $composableBuilder(column: $table.group, builder: (column) => column); + + i0.GeneratedColumn get metaData => + $composableBuilder(column: $table.metaData, builder: (column) => column); + + i0.GeneratedColumn get creationTime => $composableBuilder( + column: $table.creationTime, + builder: (column) => column, + ); + + i0.GeneratedColumn get status => + $composableBuilder(column: $table.status, builder: (column) => column); + + i0.GeneratedColumn get progress => + $composableBuilder(column: $table.progress, builder: (column) => column); + + i0.GeneratedColumn get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => column, + ); +} + +class $$TaskRecordEntityTableTableManager + extends + i0.RootTableManager< + i0.GeneratedDatabase, + i1.$TaskRecordEntityTable, + i1.TaskRecordEntityData, + i1.$$TaskRecordEntityTableFilterComposer, + i1.$$TaskRecordEntityTableOrderingComposer, + i1.$$TaskRecordEntityTableAnnotationComposer, + $$TaskRecordEntityTableCreateCompanionBuilder, + $$TaskRecordEntityTableUpdateCompanionBuilder, + ( + i1.TaskRecordEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$TaskRecordEntityTable, + i1.TaskRecordEntityData + >, + ), + i1.TaskRecordEntityData, + i0.PrefetchHooks Function() + > { + $$TaskRecordEntityTableTableManager( + i0.GeneratedDatabase db, + i1.$TaskRecordEntityTable table, + ) : super( + i0.TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + i1.$$TaskRecordEntityTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => i1 + .$$TaskRecordEntityTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + i1.$$TaskRecordEntityTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + i0.Value taskId = const i0.Value.absent(), + i0.Value url = const i0.Value.absent(), + i0.Value filename = const i0.Value.absent(), + i0.Value group = const i0.Value.absent(), + i0.Value metaData = const i0.Value.absent(), + i0.Value creationTime = const i0.Value.absent(), + i0.Value status = const i0.Value.absent(), + i0.Value progress = const i0.Value.absent(), + i0.Value objectJsonMap = const i0.Value.absent(), + }) => i1.TaskRecordEntityCompanion( + taskId: taskId, + url: url, + filename: filename, + group: group, + metaData: metaData, + creationTime: creationTime, + status: status, + progress: progress, + objectJsonMap: objectJsonMap, + ), + createCompanionCallback: + ({ + required String taskId, + required String url, + required String filename, + required String group, + required String metaData, + required int creationTime, + required int status, + required double progress, + required String objectJsonMap, + }) => i1.TaskRecordEntityCompanion.insert( + taskId: taskId, + url: url, + filename: filename, + group: group, + metaData: metaData, + creationTime: creationTime, + status: status, + progress: progress, + objectJsonMap: objectJsonMap, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$TaskRecordEntityTableProcessedTableManager = + i0.ProcessedTableManager< + i0.GeneratedDatabase, + i1.$TaskRecordEntityTable, + i1.TaskRecordEntityData, + i1.$$TaskRecordEntityTableFilterComposer, + i1.$$TaskRecordEntityTableOrderingComposer, + i1.$$TaskRecordEntityTableAnnotationComposer, + $$TaskRecordEntityTableCreateCompanionBuilder, + $$TaskRecordEntityTableUpdateCompanionBuilder, + ( + i1.TaskRecordEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$TaskRecordEntityTable, + i1.TaskRecordEntityData + >, + ), + i1.TaskRecordEntityData, + i0.PrefetchHooks Function() + >; +typedef $$PausedTasksEntityTableCreateCompanionBuilder = + i1.PausedTasksEntityCompanion Function({ + required String taskId, + required int modified, + required String objectJsonMap, + }); +typedef $$PausedTasksEntityTableUpdateCompanionBuilder = + i1.PausedTasksEntityCompanion Function({ + i0.Value taskId, + i0.Value modified, + i0.Value objectJsonMap, + }); + +class $$PausedTasksEntityTableFilterComposer + extends i0.Composer { + $$PausedTasksEntityTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnFilters get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnFilters(column), + ); +} + +class $$PausedTasksEntityTableOrderingComposer + extends i0.Composer { + $$PausedTasksEntityTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnOrderings get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnOrderings(column), + ); +} + +class $$PausedTasksEntityTableAnnotationComposer + extends i0.Composer { + $$PausedTasksEntityTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.GeneratedColumn get taskId => + $composableBuilder(column: $table.taskId, builder: (column) => column); + + i0.GeneratedColumn get modified => + $composableBuilder(column: $table.modified, builder: (column) => column); + + i0.GeneratedColumn get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => column, + ); +} + +class $$PausedTasksEntityTableTableManager + extends + i0.RootTableManager< + i0.GeneratedDatabase, + i1.$PausedTasksEntityTable, + i1.PausedTasksEntityData, + i1.$$PausedTasksEntityTableFilterComposer, + i1.$$PausedTasksEntityTableOrderingComposer, + i1.$$PausedTasksEntityTableAnnotationComposer, + $$PausedTasksEntityTableCreateCompanionBuilder, + $$PausedTasksEntityTableUpdateCompanionBuilder, + ( + i1.PausedTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$PausedTasksEntityTable, + i1.PausedTasksEntityData + >, + ), + i1.PausedTasksEntityData, + i0.PrefetchHooks Function() + > { + $$PausedTasksEntityTableTableManager( + i0.GeneratedDatabase db, + i1.$PausedTasksEntityTable table, + ) : super( + i0.TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + i1.$$PausedTasksEntityTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => i1 + .$$PausedTasksEntityTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + i1.$$PausedTasksEntityTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + i0.Value taskId = const i0.Value.absent(), + i0.Value modified = const i0.Value.absent(), + i0.Value objectJsonMap = const i0.Value.absent(), + }) => i1.PausedTasksEntityCompanion( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + createCompanionCallback: + ({ + required String taskId, + required int modified, + required String objectJsonMap, + }) => i1.PausedTasksEntityCompanion.insert( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$PausedTasksEntityTableProcessedTableManager = + i0.ProcessedTableManager< + i0.GeneratedDatabase, + i1.$PausedTasksEntityTable, + i1.PausedTasksEntityData, + i1.$$PausedTasksEntityTableFilterComposer, + i1.$$PausedTasksEntityTableOrderingComposer, + i1.$$PausedTasksEntityTableAnnotationComposer, + $$PausedTasksEntityTableCreateCompanionBuilder, + $$PausedTasksEntityTableUpdateCompanionBuilder, + ( + i1.PausedTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$PausedTasksEntityTable, + i1.PausedTasksEntityData + >, + ), + i1.PausedTasksEntityData, + i0.PrefetchHooks Function() + >; +typedef $$ModifiedTasksEntityTableCreateCompanionBuilder = + i1.ModifiedTasksEntityCompanion Function({ + required String taskId, + required int modified, + required String objectJsonMap, + }); +typedef $$ModifiedTasksEntityTableUpdateCompanionBuilder = + i1.ModifiedTasksEntityCompanion Function({ + i0.Value taskId, + i0.Value modified, + i0.Value objectJsonMap, + }); + +class $$ModifiedTasksEntityTableFilterComposer + extends i0.Composer { + $$ModifiedTasksEntityTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnFilters get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnFilters(column), + ); +} + +class $$ModifiedTasksEntityTableOrderingComposer + extends i0.Composer { + $$ModifiedTasksEntityTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnOrderings get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnOrderings(column), + ); +} + +class $$ModifiedTasksEntityTableAnnotationComposer + extends i0.Composer { + $$ModifiedTasksEntityTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.GeneratedColumn get taskId => + $composableBuilder(column: $table.taskId, builder: (column) => column); + + i0.GeneratedColumn get modified => + $composableBuilder(column: $table.modified, builder: (column) => column); + + i0.GeneratedColumn get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => column, + ); +} + +class $$ModifiedTasksEntityTableTableManager + extends + i0.RootTableManager< + i0.GeneratedDatabase, + i1.$ModifiedTasksEntityTable, + i1.ModifiedTasksEntityData, + i1.$$ModifiedTasksEntityTableFilterComposer, + i1.$$ModifiedTasksEntityTableOrderingComposer, + i1.$$ModifiedTasksEntityTableAnnotationComposer, + $$ModifiedTasksEntityTableCreateCompanionBuilder, + $$ModifiedTasksEntityTableUpdateCompanionBuilder, + ( + i1.ModifiedTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$ModifiedTasksEntityTable, + i1.ModifiedTasksEntityData + >, + ), + i1.ModifiedTasksEntityData, + i0.PrefetchHooks Function() + > { + $$ModifiedTasksEntityTableTableManager( + i0.GeneratedDatabase db, + i1.$ModifiedTasksEntityTable table, + ) : super( + i0.TableManagerState( + db: db, + table: table, + createFilteringComposer: () => i1 + .$$ModifiedTasksEntityTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => + i1.$$ModifiedTasksEntityTableOrderingComposer( + $db: db, + $table: table, + ), + createComputedFieldComposer: () => + i1.$$ModifiedTasksEntityTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + i0.Value taskId = const i0.Value.absent(), + i0.Value modified = const i0.Value.absent(), + i0.Value objectJsonMap = const i0.Value.absent(), + }) => i1.ModifiedTasksEntityCompanion( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + createCompanionCallback: + ({ + required String taskId, + required int modified, + required String objectJsonMap, + }) => i1.ModifiedTasksEntityCompanion.insert( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$ModifiedTasksEntityTableProcessedTableManager = + i0.ProcessedTableManager< + i0.GeneratedDatabase, + i1.$ModifiedTasksEntityTable, + i1.ModifiedTasksEntityData, + i1.$$ModifiedTasksEntityTableFilterComposer, + i1.$$ModifiedTasksEntityTableOrderingComposer, + i1.$$ModifiedTasksEntityTableAnnotationComposer, + $$ModifiedTasksEntityTableCreateCompanionBuilder, + $$ModifiedTasksEntityTableUpdateCompanionBuilder, + ( + i1.ModifiedTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$ModifiedTasksEntityTable, + i1.ModifiedTasksEntityData + >, + ), + i1.ModifiedTasksEntityData, + i0.PrefetchHooks Function() + >; +typedef $$ResumeTasksEntityTableCreateCompanionBuilder = + i1.ResumeTasksEntityCompanion Function({ + required String taskId, + required int modified, + required String objectJsonMap, + }); +typedef $$ResumeTasksEntityTableUpdateCompanionBuilder = + i1.ResumeTasksEntityCompanion Function({ + i0.Value taskId, + i0.Value modified, + i0.Value objectJsonMap, + }); + +class $$ResumeTasksEntityTableFilterComposer + extends i0.Composer { + $$ResumeTasksEntityTableFilterComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnFilters get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnFilters(column), + ); + + i0.ColumnFilters get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnFilters(column), + ); +} + +class $$ResumeTasksEntityTableOrderingComposer + extends i0.Composer { + $$ResumeTasksEntityTableOrderingComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.ColumnOrderings get taskId => $composableBuilder( + column: $table.taskId, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get modified => $composableBuilder( + column: $table.modified, + builder: (column) => i0.ColumnOrderings(column), + ); + + i0.ColumnOrderings get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => i0.ColumnOrderings(column), + ); +} + +class $$ResumeTasksEntityTableAnnotationComposer + extends i0.Composer { + $$ResumeTasksEntityTableAnnotationComposer({ + required super.$db, + required super.$table, + super.joinBuilder, + super.$addJoinBuilderToRootComposer, + super.$removeJoinBuilderFromRootComposer, + }); + i0.GeneratedColumn get taskId => + $composableBuilder(column: $table.taskId, builder: (column) => column); + + i0.GeneratedColumn get modified => + $composableBuilder(column: $table.modified, builder: (column) => column); + + i0.GeneratedColumn get objectJsonMap => $composableBuilder( + column: $table.objectJsonMap, + builder: (column) => column, + ); +} + +class $$ResumeTasksEntityTableTableManager + extends + i0.RootTableManager< + i0.GeneratedDatabase, + i1.$ResumeTasksEntityTable, + i1.ResumeTasksEntityData, + i1.$$ResumeTasksEntityTableFilterComposer, + i1.$$ResumeTasksEntityTableOrderingComposer, + i1.$$ResumeTasksEntityTableAnnotationComposer, + $$ResumeTasksEntityTableCreateCompanionBuilder, + $$ResumeTasksEntityTableUpdateCompanionBuilder, + ( + i1.ResumeTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$ResumeTasksEntityTable, + i1.ResumeTasksEntityData + >, + ), + i1.ResumeTasksEntityData, + i0.PrefetchHooks Function() + > { + $$ResumeTasksEntityTableTableManager( + i0.GeneratedDatabase db, + i1.$ResumeTasksEntityTable table, + ) : super( + i0.TableManagerState( + db: db, + table: table, + createFilteringComposer: () => + i1.$$ResumeTasksEntityTableFilterComposer($db: db, $table: table), + createOrderingComposer: () => i1 + .$$ResumeTasksEntityTableOrderingComposer($db: db, $table: table), + createComputedFieldComposer: () => + i1.$$ResumeTasksEntityTableAnnotationComposer( + $db: db, + $table: table, + ), + updateCompanionCallback: + ({ + i0.Value taskId = const i0.Value.absent(), + i0.Value modified = const i0.Value.absent(), + i0.Value objectJsonMap = const i0.Value.absent(), + }) => i1.ResumeTasksEntityCompanion( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + createCompanionCallback: + ({ + required String taskId, + required int modified, + required String objectJsonMap, + }) => i1.ResumeTasksEntityCompanion.insert( + taskId: taskId, + modified: modified, + objectJsonMap: objectJsonMap, + ), + withReferenceMapper: (p0) => p0 + .map((e) => (e.readTable(table), i0.BaseReferences(db, table, e))) + .toList(), + prefetchHooksCallback: null, + ), + ); +} + +typedef $$ResumeTasksEntityTableProcessedTableManager = + i0.ProcessedTableManager< + i0.GeneratedDatabase, + i1.$ResumeTasksEntityTable, + i1.ResumeTasksEntityData, + i1.$$ResumeTasksEntityTableFilterComposer, + i1.$$ResumeTasksEntityTableOrderingComposer, + i1.$$ResumeTasksEntityTableAnnotationComposer, + $$ResumeTasksEntityTableCreateCompanionBuilder, + $$ResumeTasksEntityTableUpdateCompanionBuilder, + ( + i1.ResumeTasksEntityData, + i0.BaseReferences< + i0.GeneratedDatabase, + i1.$ResumeTasksEntityTable, + i1.ResumeTasksEntityData + >, + ), + i1.ResumeTasksEntityData, + i0.PrefetchHooks Function() + >; + +class $TaskRecordEntityTable extends i2.TaskRecordEntity + with i0.TableInfo<$TaskRecordEntityTable, i1.TaskRecordEntityData> { + @override + final i0.GeneratedDatabase attachedDatabase; + final String? _alias; + $TaskRecordEntityTable(this.attachedDatabase, [this._alias]); + static const i0.VerificationMeta _taskIdMeta = const i0.VerificationMeta( + 'taskId', + ); + @override + late final i0.GeneratedColumn taskId = i0.GeneratedColumn( + 'task_id', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _urlMeta = const i0.VerificationMeta('url'); + @override + late final i0.GeneratedColumn url = i0.GeneratedColumn( + 'url', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _filenameMeta = const i0.VerificationMeta( + 'filename', + ); + @override + late final i0.GeneratedColumn filename = i0.GeneratedColumn( + 'filename', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _groupMeta = const i0.VerificationMeta( + 'group', + ); + @override + late final i0.GeneratedColumn group = i0.GeneratedColumn( + 'group', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _metaDataMeta = const i0.VerificationMeta( + 'metaData', + ); + @override + late final i0.GeneratedColumn metaData = i0.GeneratedColumn( + 'meta_data', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _creationTimeMeta = + const i0.VerificationMeta('creationTime'); + @override + late final i0.GeneratedColumn creationTime = i0.GeneratedColumn( + 'creation_time', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _statusMeta = const i0.VerificationMeta( + 'status', + ); + @override + late final i0.GeneratedColumn status = i0.GeneratedColumn( + 'status', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _progressMeta = const i0.VerificationMeta( + 'progress', + ); + @override + late final i0.GeneratedColumn progress = i0.GeneratedColumn( + 'progress', + aliasedName, + false, + type: i0.DriftSqlType.double, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _objectJsonMapMeta = + const i0.VerificationMeta('objectJsonMap'); + @override + late final i0.GeneratedColumn objectJsonMap = + i0.GeneratedColumn( + 'object_json_map', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [ + taskId, + url, + filename, + group, + metaData, + creationTime, + status, + progress, + objectJsonMap, + ]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'task_record_entity'; + @override + i0.VerificationContext validateIntegrity( + i0.Insertable instance, { + bool isInserting = false, + }) { + final context = i0.VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('task_id')) { + context.handle( + _taskIdMeta, + taskId.isAcceptableOrUnknown(data['task_id']!, _taskIdMeta), + ); + } else if (isInserting) { + context.missing(_taskIdMeta); + } + if (data.containsKey('url')) { + context.handle( + _urlMeta, + url.isAcceptableOrUnknown(data['url']!, _urlMeta), + ); + } else if (isInserting) { + context.missing(_urlMeta); + } + if (data.containsKey('filename')) { + context.handle( + _filenameMeta, + filename.isAcceptableOrUnknown(data['filename']!, _filenameMeta), + ); + } else if (isInserting) { + context.missing(_filenameMeta); + } + if (data.containsKey('group')) { + context.handle( + _groupMeta, + group.isAcceptableOrUnknown(data['group']!, _groupMeta), + ); + } else if (isInserting) { + context.missing(_groupMeta); + } + if (data.containsKey('meta_data')) { + context.handle( + _metaDataMeta, + metaData.isAcceptableOrUnknown(data['meta_data']!, _metaDataMeta), + ); + } else if (isInserting) { + context.missing(_metaDataMeta); + } + if (data.containsKey('creation_time')) { + context.handle( + _creationTimeMeta, + creationTime.isAcceptableOrUnknown( + data['creation_time']!, + _creationTimeMeta, + ), + ); + } else if (isInserting) { + context.missing(_creationTimeMeta); + } + if (data.containsKey('status')) { + context.handle( + _statusMeta, + status.isAcceptableOrUnknown(data['status']!, _statusMeta), + ); + } else if (isInserting) { + context.missing(_statusMeta); + } + if (data.containsKey('progress')) { + context.handle( + _progressMeta, + progress.isAcceptableOrUnknown(data['progress']!, _progressMeta), + ); + } else if (isInserting) { + context.missing(_progressMeta); + } + if (data.containsKey('object_json_map')) { + context.handle( + _objectJsonMapMeta, + objectJsonMap.isAcceptableOrUnknown( + data['object_json_map']!, + _objectJsonMapMeta, + ), + ); + } else if (isInserting) { + context.missing(_objectJsonMapMeta); + } + return context; + } + + @override + Set get $primaryKey => {taskId}; + @override + i1.TaskRecordEntityData map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return i1.TaskRecordEntityData( + taskId: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}task_id'], + )!, + url: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}url'], + )!, + filename: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}filename'], + )!, + group: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}group'], + )!, + metaData: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}meta_data'], + )!, + creationTime: attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}creation_time'], + )!, + status: attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}status'], + )!, + progress: attachedDatabase.typeMapping.read( + i0.DriftSqlType.double, + data['${effectivePrefix}progress'], + )!, + objectJsonMap: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}object_json_map'], + )!, + ); + } + + @override + $TaskRecordEntityTable createAlias(String alias) { + return $TaskRecordEntityTable(attachedDatabase, alias); + } + + @override + bool get withoutRowId => true; + @override + bool get isStrict => true; +} + +class TaskRecordEntityData extends i0.DataClass + implements i0.Insertable { + final String taskId; + final String url; + final String filename; + final String group; + final String metaData; + final int creationTime; + final int status; + final double progress; + final String objectJsonMap; + const TaskRecordEntityData({ + required this.taskId, + required this.url, + required this.filename, + required this.group, + required this.metaData, + required this.creationTime, + required this.status, + required this.progress, + required this.objectJsonMap, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['task_id'] = i0.Variable(taskId); + map['url'] = i0.Variable(url); + map['filename'] = i0.Variable(filename); + map['group'] = i0.Variable(group); + map['meta_data'] = i0.Variable(metaData); + map['creation_time'] = i0.Variable(creationTime); + map['status'] = i0.Variable(status); + map['progress'] = i0.Variable(progress); + map['object_json_map'] = i0.Variable(objectJsonMap); + return map; + } + + factory TaskRecordEntityData.fromJson( + Map json, { + i0.ValueSerializer? serializer, + }) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return TaskRecordEntityData( + taskId: serializer.fromJson(json['taskId']), + url: serializer.fromJson(json['url']), + filename: serializer.fromJson(json['filename']), + group: serializer.fromJson(json['group']), + metaData: serializer.fromJson(json['metaData']), + creationTime: serializer.fromJson(json['creationTime']), + status: serializer.fromJson(json['status']), + progress: serializer.fromJson(json['progress']), + objectJsonMap: serializer.fromJson(json['objectJsonMap']), + ); + } + @override + Map toJson({i0.ValueSerializer? serializer}) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return { + 'taskId': serializer.toJson(taskId), + 'url': serializer.toJson(url), + 'filename': serializer.toJson(filename), + 'group': serializer.toJson(group), + 'metaData': serializer.toJson(metaData), + 'creationTime': serializer.toJson(creationTime), + 'status': serializer.toJson(status), + 'progress': serializer.toJson(progress), + 'objectJsonMap': serializer.toJson(objectJsonMap), + }; + } + + i1.TaskRecordEntityData copyWith({ + String? taskId, + String? url, + String? filename, + String? group, + String? metaData, + int? creationTime, + int? status, + double? progress, + String? objectJsonMap, + }) => i1.TaskRecordEntityData( + taskId: taskId ?? this.taskId, + url: url ?? this.url, + filename: filename ?? this.filename, + group: group ?? this.group, + metaData: metaData ?? this.metaData, + creationTime: creationTime ?? this.creationTime, + status: status ?? this.status, + progress: progress ?? this.progress, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + TaskRecordEntityData copyWithCompanion(i1.TaskRecordEntityCompanion data) { + return TaskRecordEntityData( + taskId: data.taskId.present ? data.taskId.value : this.taskId, + url: data.url.present ? data.url.value : this.url, + filename: data.filename.present ? data.filename.value : this.filename, + group: data.group.present ? data.group.value : this.group, + metaData: data.metaData.present ? data.metaData.value : this.metaData, + creationTime: data.creationTime.present + ? data.creationTime.value + : this.creationTime, + status: data.status.present ? data.status.value : this.status, + progress: data.progress.present ? data.progress.value : this.progress, + objectJsonMap: data.objectJsonMap.present + ? data.objectJsonMap.value + : this.objectJsonMap, + ); + } + + @override + String toString() { + return (StringBuffer('TaskRecordEntityData(') + ..write('taskId: $taskId, ') + ..write('url: $url, ') + ..write('filename: $filename, ') + ..write('group: $group, ') + ..write('metaData: $metaData, ') + ..write('creationTime: $creationTime, ') + ..write('status: $status, ') + ..write('progress: $progress, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash( + taskId, + url, + filename, + group, + metaData, + creationTime, + status, + progress, + objectJsonMap, + ); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is i1.TaskRecordEntityData && + other.taskId == this.taskId && + other.url == this.url && + other.filename == this.filename && + other.group == this.group && + other.metaData == this.metaData && + other.creationTime == this.creationTime && + other.status == this.status && + other.progress == this.progress && + other.objectJsonMap == this.objectJsonMap); +} + +class TaskRecordEntityCompanion + extends i0.UpdateCompanion { + final i0.Value taskId; + final i0.Value url; + final i0.Value filename; + final i0.Value group; + final i0.Value metaData; + final i0.Value creationTime; + final i0.Value status; + final i0.Value progress; + final i0.Value objectJsonMap; + const TaskRecordEntityCompanion({ + this.taskId = const i0.Value.absent(), + this.url = const i0.Value.absent(), + this.filename = const i0.Value.absent(), + this.group = const i0.Value.absent(), + this.metaData = const i0.Value.absent(), + this.creationTime = const i0.Value.absent(), + this.status = const i0.Value.absent(), + this.progress = const i0.Value.absent(), + this.objectJsonMap = const i0.Value.absent(), + }); + TaskRecordEntityCompanion.insert({ + required String taskId, + required String url, + required String filename, + required String group, + required String metaData, + required int creationTime, + required int status, + required double progress, + required String objectJsonMap, + }) : taskId = i0.Value(taskId), + url = i0.Value(url), + filename = i0.Value(filename), + group = i0.Value(group), + metaData = i0.Value(metaData), + creationTime = i0.Value(creationTime), + status = i0.Value(status), + progress = i0.Value(progress), + objectJsonMap = i0.Value(objectJsonMap); + static i0.Insertable custom({ + i0.Expression? taskId, + i0.Expression? url, + i0.Expression? filename, + i0.Expression? group, + i0.Expression? metaData, + i0.Expression? creationTime, + i0.Expression? status, + i0.Expression? progress, + i0.Expression? objectJsonMap, + }) { + return i0.RawValuesInsertable({ + if (taskId != null) 'task_id': taskId, + if (url != null) 'url': url, + if (filename != null) 'filename': filename, + if (group != null) 'group': group, + if (metaData != null) 'meta_data': metaData, + if (creationTime != null) 'creation_time': creationTime, + if (status != null) 'status': status, + if (progress != null) 'progress': progress, + if (objectJsonMap != null) 'object_json_map': objectJsonMap, + }); + } + + i1.TaskRecordEntityCompanion copyWith({ + i0.Value? taskId, + i0.Value? url, + i0.Value? filename, + i0.Value? group, + i0.Value? metaData, + i0.Value? creationTime, + i0.Value? status, + i0.Value? progress, + i0.Value? objectJsonMap, + }) { + return i1.TaskRecordEntityCompanion( + taskId: taskId ?? this.taskId, + url: url ?? this.url, + filename: filename ?? this.filename, + group: group ?? this.group, + metaData: metaData ?? this.metaData, + creationTime: creationTime ?? this.creationTime, + status: status ?? this.status, + progress: progress ?? this.progress, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (taskId.present) { + map['task_id'] = i0.Variable(taskId.value); + } + if (url.present) { + map['url'] = i0.Variable(url.value); + } + if (filename.present) { + map['filename'] = i0.Variable(filename.value); + } + if (group.present) { + map['group'] = i0.Variable(group.value); + } + if (metaData.present) { + map['meta_data'] = i0.Variable(metaData.value); + } + if (creationTime.present) { + map['creation_time'] = i0.Variable(creationTime.value); + } + if (status.present) { + map['status'] = i0.Variable(status.value); + } + if (progress.present) { + map['progress'] = i0.Variable(progress.value); + } + if (objectJsonMap.present) { + map['object_json_map'] = i0.Variable(objectJsonMap.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('TaskRecordEntityCompanion(') + ..write('taskId: $taskId, ') + ..write('url: $url, ') + ..write('filename: $filename, ') + ..write('group: $group, ') + ..write('metaData: $metaData, ') + ..write('creationTime: $creationTime, ') + ..write('status: $status, ') + ..write('progress: $progress, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } +} + +class $PausedTasksEntityTable extends i2.PausedTasksEntity + with i0.TableInfo<$PausedTasksEntityTable, i1.PausedTasksEntityData> { + @override + final i0.GeneratedDatabase attachedDatabase; + final String? _alias; + $PausedTasksEntityTable(this.attachedDatabase, [this._alias]); + static const i0.VerificationMeta _taskIdMeta = const i0.VerificationMeta( + 'taskId', + ); + @override + late final i0.GeneratedColumn taskId = i0.GeneratedColumn( + 'task_id', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _modifiedMeta = const i0.VerificationMeta( + 'modified', + ); + @override + late final i0.GeneratedColumn modified = i0.GeneratedColumn( + 'modified', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _objectJsonMapMeta = + const i0.VerificationMeta('objectJsonMap'); + @override + late final i0.GeneratedColumn objectJsonMap = + i0.GeneratedColumn( + 'object_json_map', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [taskId, modified, objectJsonMap]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'paused_tasks_entity'; + @override + i0.VerificationContext validateIntegrity( + i0.Insertable instance, { + bool isInserting = false, + }) { + final context = i0.VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('task_id')) { + context.handle( + _taskIdMeta, + taskId.isAcceptableOrUnknown(data['task_id']!, _taskIdMeta), + ); + } else if (isInserting) { + context.missing(_taskIdMeta); + } + if (data.containsKey('modified')) { + context.handle( + _modifiedMeta, + modified.isAcceptableOrUnknown(data['modified']!, _modifiedMeta), + ); + } else if (isInserting) { + context.missing(_modifiedMeta); + } + if (data.containsKey('object_json_map')) { + context.handle( + _objectJsonMapMeta, + objectJsonMap.isAcceptableOrUnknown( + data['object_json_map']!, + _objectJsonMapMeta, + ), + ); + } else if (isInserting) { + context.missing(_objectJsonMapMeta); + } + return context; + } + + @override + Set get $primaryKey => {taskId}; + @override + i1.PausedTasksEntityData map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return i1.PausedTasksEntityData( + taskId: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}task_id'], + )!, + modified: attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}modified'], + )!, + objectJsonMap: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}object_json_map'], + )!, + ); + } + + @override + $PausedTasksEntityTable createAlias(String alias) { + return $PausedTasksEntityTable(attachedDatabase, alias); + } + + @override + bool get withoutRowId => true; + @override + bool get isStrict => true; +} + +class PausedTasksEntityData extends i0.DataClass + implements i0.Insertable { + final String taskId; + final int modified; + final String objectJsonMap; + const PausedTasksEntityData({ + required this.taskId, + required this.modified, + required this.objectJsonMap, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['task_id'] = i0.Variable(taskId); + map['modified'] = i0.Variable(modified); + map['object_json_map'] = i0.Variable(objectJsonMap); + return map; + } + + factory PausedTasksEntityData.fromJson( + Map json, { + i0.ValueSerializer? serializer, + }) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return PausedTasksEntityData( + taskId: serializer.fromJson(json['taskId']), + modified: serializer.fromJson(json['modified']), + objectJsonMap: serializer.fromJson(json['objectJsonMap']), + ); + } + @override + Map toJson({i0.ValueSerializer? serializer}) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return { + 'taskId': serializer.toJson(taskId), + 'modified': serializer.toJson(modified), + 'objectJsonMap': serializer.toJson(objectJsonMap), + }; + } + + i1.PausedTasksEntityData copyWith({ + String? taskId, + int? modified, + String? objectJsonMap, + }) => i1.PausedTasksEntityData( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + PausedTasksEntityData copyWithCompanion(i1.PausedTasksEntityCompanion data) { + return PausedTasksEntityData( + taskId: data.taskId.present ? data.taskId.value : this.taskId, + modified: data.modified.present ? data.modified.value : this.modified, + objectJsonMap: data.objectJsonMap.present + ? data.objectJsonMap.value + : this.objectJsonMap, + ); + } + + @override + String toString() { + return (StringBuffer('PausedTasksEntityData(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(taskId, modified, objectJsonMap); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is i1.PausedTasksEntityData && + other.taskId == this.taskId && + other.modified == this.modified && + other.objectJsonMap == this.objectJsonMap); +} + +class PausedTasksEntityCompanion + extends i0.UpdateCompanion { + final i0.Value taskId; + final i0.Value modified; + final i0.Value objectJsonMap; + const PausedTasksEntityCompanion({ + this.taskId = const i0.Value.absent(), + this.modified = const i0.Value.absent(), + this.objectJsonMap = const i0.Value.absent(), + }); + PausedTasksEntityCompanion.insert({ + required String taskId, + required int modified, + required String objectJsonMap, + }) : taskId = i0.Value(taskId), + modified = i0.Value(modified), + objectJsonMap = i0.Value(objectJsonMap); + static i0.Insertable custom({ + i0.Expression? taskId, + i0.Expression? modified, + i0.Expression? objectJsonMap, + }) { + return i0.RawValuesInsertable({ + if (taskId != null) 'task_id': taskId, + if (modified != null) 'modified': modified, + if (objectJsonMap != null) 'object_json_map': objectJsonMap, + }); + } + + i1.PausedTasksEntityCompanion copyWith({ + i0.Value? taskId, + i0.Value? modified, + i0.Value? objectJsonMap, + }) { + return i1.PausedTasksEntityCompanion( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (taskId.present) { + map['task_id'] = i0.Variable(taskId.value); + } + if (modified.present) { + map['modified'] = i0.Variable(modified.value); + } + if (objectJsonMap.present) { + map['object_json_map'] = i0.Variable(objectJsonMap.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('PausedTasksEntityCompanion(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } +} + +class $ModifiedTasksEntityTable extends i2.ModifiedTasksEntity + with i0.TableInfo<$ModifiedTasksEntityTable, i1.ModifiedTasksEntityData> { + @override + final i0.GeneratedDatabase attachedDatabase; + final String? _alias; + $ModifiedTasksEntityTable(this.attachedDatabase, [this._alias]); + static const i0.VerificationMeta _taskIdMeta = const i0.VerificationMeta( + 'taskId', + ); + @override + late final i0.GeneratedColumn taskId = i0.GeneratedColumn( + 'task_id', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _modifiedMeta = const i0.VerificationMeta( + 'modified', + ); + @override + late final i0.GeneratedColumn modified = i0.GeneratedColumn( + 'modified', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _objectJsonMapMeta = + const i0.VerificationMeta('objectJsonMap'); + @override + late final i0.GeneratedColumn objectJsonMap = + i0.GeneratedColumn( + 'object_json_map', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [taskId, modified, objectJsonMap]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'modified_tasks_entity'; + @override + i0.VerificationContext validateIntegrity( + i0.Insertable instance, { + bool isInserting = false, + }) { + final context = i0.VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('task_id')) { + context.handle( + _taskIdMeta, + taskId.isAcceptableOrUnknown(data['task_id']!, _taskIdMeta), + ); + } else if (isInserting) { + context.missing(_taskIdMeta); + } + if (data.containsKey('modified')) { + context.handle( + _modifiedMeta, + modified.isAcceptableOrUnknown(data['modified']!, _modifiedMeta), + ); + } else if (isInserting) { + context.missing(_modifiedMeta); + } + if (data.containsKey('object_json_map')) { + context.handle( + _objectJsonMapMeta, + objectJsonMap.isAcceptableOrUnknown( + data['object_json_map']!, + _objectJsonMapMeta, + ), + ); + } else if (isInserting) { + context.missing(_objectJsonMapMeta); + } + return context; + } + + @override + Set get $primaryKey => {taskId}; + @override + i1.ModifiedTasksEntityData map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return i1.ModifiedTasksEntityData( + taskId: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}task_id'], + )!, + modified: attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}modified'], + )!, + objectJsonMap: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}object_json_map'], + )!, + ); + } + + @override + $ModifiedTasksEntityTable createAlias(String alias) { + return $ModifiedTasksEntityTable(attachedDatabase, alias); + } + + @override + bool get withoutRowId => true; + @override + bool get isStrict => true; +} + +class ModifiedTasksEntityData extends i0.DataClass + implements i0.Insertable { + final String taskId; + final int modified; + final String objectJsonMap; + const ModifiedTasksEntityData({ + required this.taskId, + required this.modified, + required this.objectJsonMap, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['task_id'] = i0.Variable(taskId); + map['modified'] = i0.Variable(modified); + map['object_json_map'] = i0.Variable(objectJsonMap); + return map; + } + + factory ModifiedTasksEntityData.fromJson( + Map json, { + i0.ValueSerializer? serializer, + }) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return ModifiedTasksEntityData( + taskId: serializer.fromJson(json['taskId']), + modified: serializer.fromJson(json['modified']), + objectJsonMap: serializer.fromJson(json['objectJsonMap']), + ); + } + @override + Map toJson({i0.ValueSerializer? serializer}) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return { + 'taskId': serializer.toJson(taskId), + 'modified': serializer.toJson(modified), + 'objectJsonMap': serializer.toJson(objectJsonMap), + }; + } + + i1.ModifiedTasksEntityData copyWith({ + String? taskId, + int? modified, + String? objectJsonMap, + }) => i1.ModifiedTasksEntityData( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + ModifiedTasksEntityData copyWithCompanion( + i1.ModifiedTasksEntityCompanion data, + ) { + return ModifiedTasksEntityData( + taskId: data.taskId.present ? data.taskId.value : this.taskId, + modified: data.modified.present ? data.modified.value : this.modified, + objectJsonMap: data.objectJsonMap.present + ? data.objectJsonMap.value + : this.objectJsonMap, + ); + } + + @override + String toString() { + return (StringBuffer('ModifiedTasksEntityData(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(taskId, modified, objectJsonMap); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is i1.ModifiedTasksEntityData && + other.taskId == this.taskId && + other.modified == this.modified && + other.objectJsonMap == this.objectJsonMap); +} + +class ModifiedTasksEntityCompanion + extends i0.UpdateCompanion { + final i0.Value taskId; + final i0.Value modified; + final i0.Value objectJsonMap; + const ModifiedTasksEntityCompanion({ + this.taskId = const i0.Value.absent(), + this.modified = const i0.Value.absent(), + this.objectJsonMap = const i0.Value.absent(), + }); + ModifiedTasksEntityCompanion.insert({ + required String taskId, + required int modified, + required String objectJsonMap, + }) : taskId = i0.Value(taskId), + modified = i0.Value(modified), + objectJsonMap = i0.Value(objectJsonMap); + static i0.Insertable custom({ + i0.Expression? taskId, + i0.Expression? modified, + i0.Expression? objectJsonMap, + }) { + return i0.RawValuesInsertable({ + if (taskId != null) 'task_id': taskId, + if (modified != null) 'modified': modified, + if (objectJsonMap != null) 'object_json_map': objectJsonMap, + }); + } + + i1.ModifiedTasksEntityCompanion copyWith({ + i0.Value? taskId, + i0.Value? modified, + i0.Value? objectJsonMap, + }) { + return i1.ModifiedTasksEntityCompanion( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (taskId.present) { + map['task_id'] = i0.Variable(taskId.value); + } + if (modified.present) { + map['modified'] = i0.Variable(modified.value); + } + if (objectJsonMap.present) { + map['object_json_map'] = i0.Variable(objectJsonMap.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ModifiedTasksEntityCompanion(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } +} + +class $ResumeTasksEntityTable extends i2.ResumeTasksEntity + with i0.TableInfo<$ResumeTasksEntityTable, i1.ResumeTasksEntityData> { + @override + final i0.GeneratedDatabase attachedDatabase; + final String? _alias; + $ResumeTasksEntityTable(this.attachedDatabase, [this._alias]); + static const i0.VerificationMeta _taskIdMeta = const i0.VerificationMeta( + 'taskId', + ); + @override + late final i0.GeneratedColumn taskId = i0.GeneratedColumn( + 'task_id', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _modifiedMeta = const i0.VerificationMeta( + 'modified', + ); + @override + late final i0.GeneratedColumn modified = i0.GeneratedColumn( + 'modified', + aliasedName, + false, + type: i0.DriftSqlType.int, + requiredDuringInsert: true, + ); + static const i0.VerificationMeta _objectJsonMapMeta = + const i0.VerificationMeta('objectJsonMap'); + @override + late final i0.GeneratedColumn objectJsonMap = + i0.GeneratedColumn( + 'object_json_map', + aliasedName, + false, + type: i0.DriftSqlType.string, + requiredDuringInsert: true, + ); + @override + List get $columns => [taskId, modified, objectJsonMap]; + @override + String get aliasedName => _alias ?? actualTableName; + @override + String get actualTableName => $name; + static const String $name = 'resume_tasks_entity'; + @override + i0.VerificationContext validateIntegrity( + i0.Insertable instance, { + bool isInserting = false, + }) { + final context = i0.VerificationContext(); + final data = instance.toColumns(true); + if (data.containsKey('task_id')) { + context.handle( + _taskIdMeta, + taskId.isAcceptableOrUnknown(data['task_id']!, _taskIdMeta), + ); + } else if (isInserting) { + context.missing(_taskIdMeta); + } + if (data.containsKey('modified')) { + context.handle( + _modifiedMeta, + modified.isAcceptableOrUnknown(data['modified']!, _modifiedMeta), + ); + } else if (isInserting) { + context.missing(_modifiedMeta); + } + if (data.containsKey('object_json_map')) { + context.handle( + _objectJsonMapMeta, + objectJsonMap.isAcceptableOrUnknown( + data['object_json_map']!, + _objectJsonMapMeta, + ), + ); + } else if (isInserting) { + context.missing(_objectJsonMapMeta); + } + return context; + } + + @override + Set get $primaryKey => {taskId}; + @override + i1.ResumeTasksEntityData map( + Map data, { + String? tablePrefix, + }) { + final effectivePrefix = tablePrefix != null ? '$tablePrefix.' : ''; + return i1.ResumeTasksEntityData( + taskId: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}task_id'], + )!, + modified: attachedDatabase.typeMapping.read( + i0.DriftSqlType.int, + data['${effectivePrefix}modified'], + )!, + objectJsonMap: attachedDatabase.typeMapping.read( + i0.DriftSqlType.string, + data['${effectivePrefix}object_json_map'], + )!, + ); + } + + @override + $ResumeTasksEntityTable createAlias(String alias) { + return $ResumeTasksEntityTable(attachedDatabase, alias); + } + + @override + bool get withoutRowId => true; + @override + bool get isStrict => true; +} + +class ResumeTasksEntityData extends i0.DataClass + implements i0.Insertable { + final String taskId; + final int modified; + final String objectJsonMap; + const ResumeTasksEntityData({ + required this.taskId, + required this.modified, + required this.objectJsonMap, + }); + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + map['task_id'] = i0.Variable(taskId); + map['modified'] = i0.Variable(modified); + map['object_json_map'] = i0.Variable(objectJsonMap); + return map; + } + + factory ResumeTasksEntityData.fromJson( + Map json, { + i0.ValueSerializer? serializer, + }) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return ResumeTasksEntityData( + taskId: serializer.fromJson(json['taskId']), + modified: serializer.fromJson(json['modified']), + objectJsonMap: serializer.fromJson(json['objectJsonMap']), + ); + } + @override + Map toJson({i0.ValueSerializer? serializer}) { + serializer ??= i0.driftRuntimeOptions.defaultSerializer; + return { + 'taskId': serializer.toJson(taskId), + 'modified': serializer.toJson(modified), + 'objectJsonMap': serializer.toJson(objectJsonMap), + }; + } + + i1.ResumeTasksEntityData copyWith({ + String? taskId, + int? modified, + String? objectJsonMap, + }) => i1.ResumeTasksEntityData( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + ResumeTasksEntityData copyWithCompanion(i1.ResumeTasksEntityCompanion data) { + return ResumeTasksEntityData( + taskId: data.taskId.present ? data.taskId.value : this.taskId, + modified: data.modified.present ? data.modified.value : this.modified, + objectJsonMap: data.objectJsonMap.present + ? data.objectJsonMap.value + : this.objectJsonMap, + ); + } + + @override + String toString() { + return (StringBuffer('ResumeTasksEntityData(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } + + @override + int get hashCode => Object.hash(taskId, modified, objectJsonMap); + @override + bool operator ==(Object other) => + identical(this, other) || + (other is i1.ResumeTasksEntityData && + other.taskId == this.taskId && + other.modified == this.modified && + other.objectJsonMap == this.objectJsonMap); +} + +class ResumeTasksEntityCompanion + extends i0.UpdateCompanion { + final i0.Value taskId; + final i0.Value modified; + final i0.Value objectJsonMap; + const ResumeTasksEntityCompanion({ + this.taskId = const i0.Value.absent(), + this.modified = const i0.Value.absent(), + this.objectJsonMap = const i0.Value.absent(), + }); + ResumeTasksEntityCompanion.insert({ + required String taskId, + required int modified, + required String objectJsonMap, + }) : taskId = i0.Value(taskId), + modified = i0.Value(modified), + objectJsonMap = i0.Value(objectJsonMap); + static i0.Insertable custom({ + i0.Expression? taskId, + i0.Expression? modified, + i0.Expression? objectJsonMap, + }) { + return i0.RawValuesInsertable({ + if (taskId != null) 'task_id': taskId, + if (modified != null) 'modified': modified, + if (objectJsonMap != null) 'object_json_map': objectJsonMap, + }); + } + + i1.ResumeTasksEntityCompanion copyWith({ + i0.Value? taskId, + i0.Value? modified, + i0.Value? objectJsonMap, + }) { + return i1.ResumeTasksEntityCompanion( + taskId: taskId ?? this.taskId, + modified: modified ?? this.modified, + objectJsonMap: objectJsonMap ?? this.objectJsonMap, + ); + } + + @override + Map toColumns(bool nullToAbsent) { + final map = {}; + if (taskId.present) { + map['task_id'] = i0.Variable(taskId.value); + } + if (modified.present) { + map['modified'] = i0.Variable(modified.value); + } + if (objectJsonMap.present) { + map['object_json_map'] = i0.Variable(objectJsonMap.value); + } + return map; + } + + @override + String toString() { + return (StringBuffer('ResumeTasksEntityCompanion(') + ..write('taskId: $taskId, ') + ..write('modified: $modified, ') + ..write('objectJsonMap: $objectJsonMap') + ..write(')')) + .toString(); + } +} diff --git a/mobile/lib/infrastructure/repositories/background_downloader.repository.dart b/mobile/lib/infrastructure/repositories/background_downloader.repository.dart new file mode 100644 index 0000000000..5a7e0fcd95 --- /dev/null +++ b/mobile/lib/infrastructure/repositories/background_downloader.repository.dart @@ -0,0 +1,195 @@ +import 'dart:convert'; + +import 'package:background_downloader/background_downloader.dart'; +import 'package:drift/drift.dart'; +import 'package:drift_flutter/drift_flutter.dart'; +import 'package:immich_mobile/domain/interfaces/db.interface.dart'; +import 'package:immich_mobile/infrastructure/entities/background_downloader.entity.dart'; +import 'package:logging/logging.dart'; + +import 'background_downloader.repository.drift.dart'; + +final driftPersistentStorage = DriftPersistentStorage(DriftBackgroundDownloader()); + +class _SqlPersistentStorageMigrator extends BasePersistentStorageMigrator { + _SqlPersistentStorageMigrator(); + + @override + Future migrateFrom(String persistentStorageName, PersistentStorage toStorage) => + switch (persistentStorageName.toLowerCase().replaceAll('_', '')) { + 'localstore' => migrateFromLocalStore(toStorage), + _ => Future.value(false), + }; +} + +@DriftDatabase(tables: [TaskRecordEntity, PausedTasksEntity, ModifiedTasksEntity, ResumeTasksEntity]) +class DriftBackgroundDownloader extends $DriftBackgroundDownloader implements IDatabaseRepository { + DriftBackgroundDownloader([QueryExecutor? executor]) + : super( + executor ?? + driftDatabase( + name: 'immich_background_downloader', + native: const DriftNativeOptions(shareAcrossIsolates: true), + ), + ); + + @override + int get schemaVersion => 1; + + @override + MigrationStrategy get migration => MigrationStrategy( + onCreate: (migrator) async { + await migrator.createAll(); + await _SqlPersistentStorageMigrator().migrateFromLocalStore(driftPersistentStorage); + }, + beforeOpen: (details) async { + await customStatement('PRAGMA synchronous = NORMAL'); + await customStatement('PRAGMA journal_mode = WAL'); + await customStatement('PRAGMA busy_timeout = 500'); + await driftPersistentStorage.purgeOldRecords(); + }, + ); +} + +class DriftPersistentStorage implements PersistentStorage { + final log = Logger('DriftPersistentStorage'); + + late final DriftBackgroundDownloader db; + + DriftPersistentStorage(this.db); + + @override + (String, int) get currentDatabaseVersion => ('Sqlite', 1); + + @override + Future initialize() async {} + + Future purgeOldRecords({Duration age = const Duration(days: 30)}) async { + final cutOff = (DateTime.now().subtract(age).millisecondsSinceEpoch / 1000).floor(); + for (final TableInfo table in [db.modifiedTasksEntity, db.pausedTasksEntity, db.resumeTasksEntity]) { + await db.customStatement('DELETE FROM ${table.actualTableName} WHERE modified < ?', [cutOff]); + } + } + + Future _remove(TableInfo table, String? taskId) async { + if (taskId == null) { + await db.delete(table).go(); + } else { + await db.customStatement('DELETE FROM ${table.actualTableName} WHERE task_id = ?', [taskId]); + } + } + + @override + Future removePausedTask(String? taskId) => _remove(db.pausedTasksEntity, taskId); + + @override + Future removeResumeData(String? taskId) => _remove(db.resumeTasksEntity, taskId); + + @override + Future removeTaskRecord(String? taskId) => _remove(db.taskRecordEntity, taskId); + + @override + Future> retrieveAllPausedTasks() async { + final query = db.selectOnly(db.pausedTasksEntity)..addColumns([db.pausedTasksEntity.objectJsonMap]); + final result = await query.map((row) => row.read(db.pausedTasksEntity.objectJsonMap)).get(); + return result.nonNulls.map((e) => Task.createFromJson(jsonDecode(e))).toList(growable: false); + } + + @override + Future> retrieveAllResumeData() async { + final query = db.selectOnly(db.resumeTasksEntity)..addColumns([db.resumeTasksEntity.objectJsonMap]); + final result = await query.map((row) => row.read(db.resumeTasksEntity.objectJsonMap)).get(); + return result.nonNulls.map((e) => ResumeData.fromJson(jsonDecode(e))).toList(growable: false); + } + + @override + Future> retrieveAllTaskRecords() async { + final query = db.selectOnly(db.taskRecordEntity)..addColumns([db.taskRecordEntity.objectJsonMap]); + final result = await query.map((row) => row.read(db.taskRecordEntity.objectJsonMap)).get(); + return result.nonNulls.map((e) => TaskRecord.fromJson(jsonDecode(e))).toList(growable: false); + } + + @override + Future retrievePausedTask(String taskId) async { + final query = db.selectOnly(db.pausedTasksEntity) + ..addColumns([db.pausedTasksEntity.objectJsonMap]) + ..where(db.pausedTasksEntity.taskId.equals(taskId)); + final result = await query.map((row) => row.read(db.pausedTasksEntity.objectJsonMap)).getSingleOrNull(); + if (result == null) { + return null; + } + return Task.createFromJson(jsonDecode(result)); + } + + @override + Future retrieveResumeData(String taskId) async { + final query = db.selectOnly(db.resumeTasksEntity) + ..addColumns([db.resumeTasksEntity.objectJsonMap]) + ..where(db.resumeTasksEntity.taskId.equals(taskId)); + final result = await query.map((row) => row.read(db.resumeTasksEntity.objectJsonMap)).getSingleOrNull(); + if (result == null) { + return null; + } + return ResumeData.fromJson(jsonDecode(result)); + } + + @override + Future retrieveTaskRecord(String taskId) async { + final query = db.selectOnly(db.taskRecordEntity) + ..addColumns([db.taskRecordEntity.objectJsonMap]) + ..where(db.taskRecordEntity.taskId.equals(taskId)); + final result = await query.map((row) => row.read(db.taskRecordEntity.objectJsonMap)).getSingleOrNull(); + if (result == null) { + return null; + } + return TaskRecord.fromJson(jsonDecode(result)); + } + + @override + Future storePausedTask(Task task) async { + await db.managers.pausedTasksEntity.create( + (o) => o( + modified: (DateTime.now().millisecondsSinceEpoch / 1000).floor(), + objectJsonMap: jsonEncode(task.toJson()), + taskId: task.taskId, + ), + mode: InsertMode.insertOrReplace, + ); + } + + @override + Future storeResumeData(ResumeData resumeData) async { + await db.managers.resumeTasksEntity.create( + (o) => o( + modified: (DateTime.now().millisecondsSinceEpoch / 1000).floor(), + objectJsonMap: jsonEncode(resumeData.toJson()), + taskId: resumeData.taskId, + ), + mode: InsertMode.insertOrReplace, + ); + } + + @override + Future storeTaskRecord(TaskRecord record) async { + final task = record.task; + await db.managers.taskRecordEntity.create( + (o) => o( + taskId: task.taskId, + url: task.url, + filename: task.filename, + group: task.group, + metaData: task.metaData, + creationTime: (task.creationTime.millisecondsSinceEpoch / 1000).floor(), + status: record.status.index, + progress: record.progress, + objectJsonMap: jsonEncode(record.toJson()), + ), + mode: InsertMode.insertOrReplace, + ); + } + + @override + Future<(String, int)> get storedDatabaseVersion async { + return ('Sqlite', db.schemaVersion); + } +} diff --git a/mobile/lib/infrastructure/repositories/background_downloader.repository.drift.dart b/mobile/lib/infrastructure/repositories/background_downloader.repository.drift.dart new file mode 100644 index 0000000000..f128d8c838 --- /dev/null +++ b/mobile/lib/infrastructure/repositories/background_downloader.repository.drift.dart @@ -0,0 +1,45 @@ +// dart format width=80 +// ignore_for_file: type=lint +import 'package:drift/drift.dart' as i0; +import 'package:immich_mobile/infrastructure/entities/background_downloader.entity.drift.dart' + as i1; + +abstract class $DriftBackgroundDownloader extends i0.GeneratedDatabase { + $DriftBackgroundDownloader(i0.QueryExecutor e) : super(e); + $DriftBackgroundDownloaderManager get managers => + $DriftBackgroundDownloaderManager(this); + late final i1.$TaskRecordEntityTable taskRecordEntity = i1 + .$TaskRecordEntityTable(this); + late final i1.$PausedTasksEntityTable pausedTasksEntity = i1 + .$PausedTasksEntityTable(this); + late final i1.$ModifiedTasksEntityTable modifiedTasksEntity = i1 + .$ModifiedTasksEntityTable(this); + late final i1.$ResumeTasksEntityTable resumeTasksEntity = i1 + .$ResumeTasksEntityTable(this); + @override + Iterable> get allTables => + allSchemaEntities.whereType>(); + @override + List get allSchemaEntities => [ + taskRecordEntity, + pausedTasksEntity, + modifiedTasksEntity, + resumeTasksEntity, + ]; + @override + i0.DriftDatabaseOptions get options => + const i0.DriftDatabaseOptions(storeDateTimeAsText: true); +} + +class $DriftBackgroundDownloaderManager { + final $DriftBackgroundDownloader _db; + $DriftBackgroundDownloaderManager(this._db); + i1.$$TaskRecordEntityTableTableManager get taskRecordEntity => + i1.$$TaskRecordEntityTableTableManager(_db, _db.taskRecordEntity); + i1.$$PausedTasksEntityTableTableManager get pausedTasksEntity => + i1.$$PausedTasksEntityTableTableManager(_db, _db.pausedTasksEntity); + i1.$$ModifiedTasksEntityTableTableManager get modifiedTasksEntity => + i1.$$ModifiedTasksEntityTableTableManager(_db, _db.modifiedTasksEntity); + i1.$$ResumeTasksEntityTableTableManager get resumeTasksEntity => + i1.$$ResumeTasksEntityTableTableManager(_db, _db.resumeTasksEntity); +} diff --git a/mobile/lib/main.dart b/mobile/lib/main.dart index b1d87b36ab..d1eaa2f791 100644 --- a/mobile/lib/main.dart +++ b/mobile/lib/main.dart @@ -19,6 +19,7 @@ import 'package:immich_mobile/extensions/build_context_extensions.dart'; import 'package:immich_mobile/extensions/translate_extensions.dart'; import 'package:immich_mobile/generated/codegen_loader.g.dart'; import 'package:immich_mobile/generated/intl_keys.g.dart'; +import 'package:immich_mobile/infrastructure/repositories/background_downloader.repository.dart'; import 'package:immich_mobile/platform/background_worker_lock_api.g.dart'; import 'package:immich_mobile/providers/app_life_cycle.provider.dart'; import 'package:immich_mobile/providers/asset_viewer/share_intent_upload.provider.dart'; @@ -103,7 +104,7 @@ Future initApp() async { initializeTimeZones(); // Initialize the file downloader - await FileDownloader().configure( + await FileDownloader(persistentStorage: driftPersistentStorage).configure( // maxConcurrent: 6, maxConcurrentByHost(server):6, maxConcurrentByGroup: 3 // On Android, if files are larger than 256MB, run in foreground service diff --git a/mobile/lib/repositories/upload.repository.dart b/mobile/lib/repositories/upload.repository.dart index 38f2c22cf2..f6943d3237 100644 --- a/mobile/lib/repositories/upload.repository.dart +++ b/mobile/lib/repositories/upload.repository.dart @@ -7,8 +7,8 @@ import 'package:hooks_riverpod/hooks_riverpod.dart'; import 'package:immich_mobile/constants/constants.dart'; import 'package:immich_mobile/domain/models/store.model.dart'; import 'package:immich_mobile/entities/store.entity.dart'; -import 'package:logging/logging.dart'; import 'package:immich_mobile/utils/debug_print.dart'; +import 'package:logging/logging.dart'; class UploadTaskWithFile { final File file;