feat(mobile): new upload (#18726)

This commit is contained in:
Alex
2025-07-18 23:58:53 -05:00
committed by GitHub
parent f929dc0816
commit fafb88d31c
27 changed files with 1733 additions and 102 deletions
+64 -19
View File
@@ -1,3 +1,4 @@
import 'dart:async';
import 'dart:io';
import 'package:background_downloader/background_downloader.dart';
@@ -6,22 +7,28 @@ import 'package:immich_mobile/domain/models/store.model.dart';
import 'package:immich_mobile/entities/store.entity.dart';
import 'package:immich_mobile/repositories/upload.repository.dart';
import 'package:immich_mobile/services/api.service.dart';
import 'package:immich_mobile/utils/upload.dart';
import 'package:path/path.dart';
// import 'package:logging/logging.dart';
final uploadServiceProvider = Provider(
(ref) => UploadService(
ref.watch(uploadRepositoryProvider),
),
);
final uploadServiceProvider = Provider((ref) {
final service = UploadService(ref.watch(uploadRepositoryProvider));
ref.onDispose(service.dispose);
return service;
});
class UploadService {
final UploadRepository _uploadRepository;
// final Logger _log = Logger("UploadService");
void Function(TaskStatusUpdate)? onUploadStatus;
void Function(TaskProgressUpdate)? onTaskProgress;
final StreamController<TaskStatusUpdate> _taskStatusController =
StreamController<TaskStatusUpdate>.broadcast();
final StreamController<TaskProgressUpdate> _taskProgressController =
StreamController<TaskProgressUpdate>.broadcast();
Stream<TaskStatusUpdate> get taskStatusStream => _taskStatusController.stream;
Stream<TaskProgressUpdate> get taskProgressStream =>
_taskProgressController.stream;
UploadService(
this._uploadRepository,
) {
@@ -31,29 +38,65 @@ class UploadService {
void _onTaskProgressCallback(TaskProgressUpdate update) {
onTaskProgress?.call(update);
if (!_taskProgressController.isClosed) {
_taskProgressController.add(update);
}
}
void _onUploadCallback(TaskStatusUpdate update) {
onUploadStatus?.call(update);
if (!_taskStatusController.isClosed) {
_taskStatusController.add(update);
}
}
void dispose() {
_taskStatusController.close();
_taskProgressController.close();
}
Future<bool> cancelUpload(String id) {
return FileDownloader().cancelTaskWithId(id);
}
Future<void> upload(File file) async {
final task = await _buildUploadTask(
hash(file.path).toString(),
file,
);
await _uploadRepository.upload(task);
Future<void> cancelAllForGroup(String group) async {
await _uploadRepository.cancelAll(group);
await _uploadRepository.reset(group);
await _uploadRepository.deleteAllTrackingRecords(group);
}
Future<UploadTask> _buildUploadTask(
void enqueueTasks(List<UploadTask> tasks) {
_uploadRepository.enqueueAll(tasks);
}
Future<UploadTask> buildUploadTask(
File file, {
required String group,
Map<String, String>? fields,
String? originalFileName,
String? deviceAssetId,
String? metadata,
int? priority,
}) async {
return _buildTask(
deviceAssetId ?? hash(file.path).toString(),
file,
fields: fields,
originalFileName: originalFileName,
metadata: metadata,
group: group,
priority: priority,
);
}
Future<UploadTask> _buildTask(
String id,
File file, {
required String group,
Map<String, String>? fields,
String? originalFileName,
String? metadata,
int? priority,
}) async {
final serverEndpoint = Store.get(StoreKey.serverEndpoint);
final url = Uri.parse('$serverEndpoint/assets').toString();
@@ -65,9 +108,8 @@ class UploadService {
final stats = await file.stat();
final fileCreatedAt = stats.changed;
final fileModifiedAt = stats.modified;
final fieldsMap = {
'filename': filename,
'filename': originalFileName ?? filename,
'deviceAssetId': id,
'deviceId': deviceId,
'fileCreatedAt': fileCreatedAt.toUtc().toIso8601String(),
@@ -79,6 +121,7 @@ class UploadService {
return UploadTask(
taskId: id,
displayName: originalFileName ?? filename,
httpRequestMethod: 'POST',
url: url,
headers: headers,
@@ -87,7 +130,9 @@ class UploadService {
baseDirectory: baseDirectory,
directory: directory,
fileField: 'assetData',
group: uploadGroup,
metaData: metadata ?? '',
group: group,
priority: priority ?? 5,
updates: Updates.statusAndProgress,
);
}