From afae25a97ae79b9bc286cb2d9ce47cfe6b342264 Mon Sep 17 00:00:00 2001 From: dab246 Date: Thu, 16 Sep 2021 09:46:29 +0700 Subject: [PATCH] TF-32 Add data layer of export attachment for ios platform --- .../data/datasource/email_datasource.dart | 9 +++++++ .../email_datasource_impl.dart | 16 +++++++++++ .../email/data/network/email_api.dart | 27 ++++++++++++++++--- .../repository/email_repository_impl.dart | 17 ++++++++++++ 4 files changed, 65 insertions(+), 4 deletions(-) diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index 41f735c8e..c33bc820f 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -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 exportAttachment( + Attachment attachment, + AccountId accountId, + String baseDownloadUrl, + AccountRequest accountRequest, + CancelToken cancelToken + ); } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_datasource_impl.dart index a0bf60cc0..abed73c6e 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -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 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; + }); + } } \ No newline at end of file diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 1c853fdea..d992abc43 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -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 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 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); + } } \ No newline at end of file diff --git a/lib/features/email/data/repository/email_repository_impl.dart b/lib/features/email/data/repository/email_repository_impl.dart index 3afbed3a4..ee9042774 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -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 exportAttachment( + Attachment attachment, + AccountId accountId, + String baseDownloadUrl, + AccountRequest accountRequest, + CancelToken cancelToken + ) { + return emailDataSource.exportAttachment( + attachment, + accountId, + baseDownloadUrl, + accountRequest, + cancelToken); + } } \ No newline at end of file