TF-32 Add data layer of export attachment for ios platform

This commit is contained in:
dab246
2021-09-16 09:46:29 +07:00
committed by Dat H. Pham
parent 0158142e45
commit afae25a97a
4 changed files with 65 additions and 4 deletions
@@ -1,3 +1,4 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/read_actions.dart';
@@ -17,4 +18,12 @@ abstract class EmailDataSource {
String baseDownloadUrl,
AccountRequest accountRequest
);
Future<String> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
AccountRequest accountRequest,
CancelToken cancelToken
);
}
@@ -1,3 +1,4 @@
import 'package:dio/dio.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/read_actions.dart';
@@ -54,4 +55,19 @@ class EmailDataSourceImpl extends EmailDataSource {
throw error;
});
}
@override
Future<String> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
AccountRequest accountRequest,
CancelToken cancelToken
) {
return Future.sync(() async {
return await emailAPI.exportAttachment(attachment, accountId, baseDownloadUrl, accountRequest, cancelToken);
}).catchError((error) {
throw error;
});
}
}
+23 -4
View File
@@ -3,6 +3,7 @@ import 'dart:convert';
import 'dart:io';
import 'package:core/core.dart';
import 'package:dio/dio.dart';
import 'package:external_path/external_path.dart';
import 'package:flutter_downloader/flutter_downloader.dart';
import 'package:jmap_dart_client/http/http_client.dart';
@@ -29,14 +30,15 @@ import 'package:model/model.dart';
class EmailAPI {
final HttpClient httpClient;
final HttpClient _httpClient;
final DownloadManager _downloadManager;
EmailAPI(this.httpClient);
EmailAPI(this._httpClient, this._downloadManager);
Future<Email> getEmailContent(AccountId accountId, EmailId emailId) async {
final processingInvocation = ProcessingInvocation();
final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation);
final jmapRequestBuilder = JmapRequestBuilder(_httpClient, processingInvocation);
final getEmailMethod = GetEmailMethod(accountId)
..addIds({emailId.id})
@@ -84,7 +86,7 @@ class EmailAPI {
})
});
final requestBuilder = JmapRequestBuilder(httpClient, ProcessingInvocation());
final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation());
final setEmailInvocation = requestBuilder.invocation(setEmailMethod);
final setEmailSubmissionInvocation = requestBuilder.invocation(setEmailSubmissionMethod);
@@ -172,4 +174,21 @@ class EmailAPI {
.map((taskId) => DownloadTaskId(taskId!))
.toList();
}
Future<String> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
AccountRequest accountRequest,
CancelToken cancelToken
) async {
final basicAuth = 'Basic ' + base64Encode(utf8.encode('${accountRequest.userName.userName}:${accountRequest.password.value}'));
return _downloadManager.downloadFile(
attachment.getDownloadUrl(baseDownloadUrl, accountId),
getTemporaryDirectory(),
attachment.name ?? '',
basicAuth,
cancelToken: cancelToken);
}
}
@@ -1,4 +1,5 @@
import 'package:dio/src/cancel_token.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/read_actions.dart';
@@ -39,4 +40,20 @@ class EmailRepositoryImpl extends EmailRepository {
) {
return emailDataSource.downloadAttachments(attachments, accountId, baseDownloadUrl, accountRequest);
}
@override
Future<String> exportAttachment(
Attachment attachment,
AccountId accountId,
String baseDownloadUrl,
AccountRequest accountRequest,
CancelToken cancelToken
) {
return emailDataSource.exportAttachment(
attachment,
accountId,
baseDownloadUrl,
accountRequest,
cancelToken);
}
}