diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart new file mode 100644 index 000000000..9aa8967a9 --- /dev/null +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -0,0 +1,6 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; + +abstract class EmailDataSource { + Future getEmailContent(AccountId accountId, EmailId emailId); +} \ 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 new file mode 100644 index 000000000..e792145be --- /dev/null +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -0,0 +1,20 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; +import 'package:tmail_ui_user/features/email/data/network/email_api.dart'; + +class EmailDataSourceImpl extends EmailDataSource { + + final EmailAPI emailAPI; + + EmailDataSourceImpl(this.emailAPI); + + @override + Future getEmailContent(AccountId accountId, EmailId emailId) { + return Future.sync(() async { + return await emailAPI.getEmailContent(accountId, emailId); + }).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 new file mode 100644 index 000000000..72e3aeb95 --- /dev/null +++ b/lib/features/email/data/network/email_api.dart @@ -0,0 +1,43 @@ +import 'dart:async'; + +import 'package:jmap_dart_client/http/http_client.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/jmap_request.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:jmap_dart_client/jmap/mail/email/get/get_email_method.dart'; +import 'package:jmap_dart_client/jmap/mail/email/get/get_email_response.dart'; + +class EmailAPI { + + final HttpClient httpClient; + + EmailAPI(this.httpClient); + + Future getEmailContent(AccountId accountId, EmailId emailId) async { + final processingInvocation = ProcessingInvocation(); + + final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation); + + final getEmailMethod = GetEmailMethod(accountId) + ..addIds({emailId.id}) + ..addProperties(Properties({'bodyValues', 'htmlBody', 'attachments'})) + ..addFetchHTMLBodyValues(true); + + final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); + + final result = await (jmapRequestBuilder + ..usings(getEmailMethod.requiredCapabilities)) + .build() + .execute(); + + final resultList = result.parse( + getEmailInvocation.methodCallId, GetEmailResponse.deserialize); + + return Future.sync(() async { + return resultList!.list.first; + }).catchError((error) { + throw error; + }); + } +} \ 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 new file mode 100644 index 000000000..108ab0cb9 --- /dev/null +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -0,0 +1,17 @@ + +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; + +class EmailRepositoryImpl extends EmailRepository { + + final EmailDataSource emailDataSource; + + EmailRepositoryImpl(this.emailDataSource); + + @override + Future getEmailContent(AccountId accountId, EmailId emailId) { + return emailDataSource.getEmailContent(accountId, emailId); + } +} \ No newline at end of file