From 1863ba8d02019230ff6e5c4aba92abf71dd0782d Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 10 Aug 2021 12:32:43 +0700 Subject: [PATCH] Add data layer for get list Email in Mailbox --- .../data/datasource/thread_datasource.dart | 19 ++++++ .../thread_datasource_impl.dart | 39 +++++++++++ .../thread/data/network/thread_api.dart | 68 +++++++++++++++++++ .../repository/thread_repository_impl.dart | 37 ++++++++++ 4 files changed, 163 insertions(+) create mode 100644 lib/features/thread/data/datasource/thread_datasource.dart create mode 100644 lib/features/thread/data/datasource_impl/thread_datasource_impl.dart create mode 100644 lib/features/thread/data/network/thread_api.dart create mode 100644 lib/features/thread/data/repository/thread_repository_impl.dart diff --git a/lib/features/thread/data/datasource/thread_datasource.dart b/lib/features/thread/data/datasource/thread_datasource.dart new file mode 100644 index 000000000..e9eccd370 --- /dev/null +++ b/lib/features/thread/data/datasource/thread_datasource.dart @@ -0,0 +1,19 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; + +abstract class ThreadDataSource { + Future> getAllEmail( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ); +} \ No newline at end of file diff --git a/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart new file mode 100644 index 000000000..dc8dfcb31 --- /dev/null +++ b/lib/features/thread/data/datasource_impl/thread_datasource_impl.dart @@ -0,0 +1,39 @@ +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; +import 'package:tmail_ui_user/features/thread/data/network/thread_api.dart'; + +class ThreadDataSourceImpl extends ThreadDataSource { + + final ThreadAPI threadAPI; + + ThreadDataSourceImpl(this.threadAPI); + + @override + Future> getAllEmail( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ) { + return Future.sync(() async { + return await threadAPI.getAllEmail( + accountId, + position: position, + limit: limit, + sort: sort, + filter: filter, + properties: properties); + }).catchError((error) { + throw error; + }); + } +} \ No newline at end of file diff --git a/lib/features/thread/data/network/thread_api.dart b/lib/features/thread/data/network/thread_api.dart new file mode 100644 index 000000000..a66a9391b --- /dev/null +++ b/lib/features/thread/data/network/thread_api.dart @@ -0,0 +1,68 @@ +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/filter/filter.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/request/reference_path.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.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'; +import 'package:jmap_dart_client/jmap/mail/email/query/query_email_method.dart'; + +class ThreadAPI { + + final HttpClient httpClient; + + ThreadAPI(this.httpClient); + + Future> getAllEmail( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ) async { + final processingInvocation = ProcessingInvocation(); + + final jmapRequestBuilder = JmapRequestBuilder(httpClient, processingInvocation); + + final queryEmailMethod = QueryEmailMethod(accountId); + + if (position != null) queryEmailMethod..addPosition(position); + + if (limit != null) queryEmailMethod..addLimit(limit); + + if (sort != null) queryEmailMethod..addSorts(sort); + + if (filter != null) queryEmailMethod..addFilters(filter); + + final queryEmailInvocation = jmapRequestBuilder.invocation(queryEmailMethod); + + final getEmailMethod = GetEmailMethod(accountId); + + if (properties != null) getEmailMethod..addProperties(properties); + + getEmailMethod..addReferenceIds(processingInvocation.createResultReference( + queryEmailInvocation.methodCallId, + ReferencePath.idsPath)); + + final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod); + + final result = await (jmapRequestBuilder + ..usings(getEmailMethod.requiredCapabilities)) + .build() + .execute(); + + final resultList = result.parse( + getEmailInvocation.methodCallId, GetEmailResponse.deserialize); + + return resultList == null ? [] : resultList.list; + } +} \ No newline at end of file diff --git a/lib/features/thread/data/repository/thread_repository_impl.dart b/lib/features/thread/data/repository/thread_repository_impl.dart new file mode 100644 index 000000000..454774225 --- /dev/null +++ b/lib/features/thread/data/repository/thread_repository_impl.dart @@ -0,0 +1,37 @@ + +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/filter/filter.dart'; +import 'package:jmap_dart_client/jmap/core/properties/properties.dart'; +import 'package:jmap_dart_client/jmap/core/sort/comparator.dart'; +import 'package:jmap_dart_client/jmap/core/unsigned_int.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/thread/data/datasource/thread_datasource.dart'; +import 'package:tmail_ui_user/features/thread/domain/repository/thread_repository.dart'; + +class ThreadRepositoryImpl extends ThreadRepository { + + final ThreadDataSource threadDataSource; + + ThreadRepositoryImpl(this.threadDataSource); + + @override + Future> getAllEmail( + AccountId accountId, + { + int? position, + UnsignedInt? limit, + Set? sort, + Filter? filter, + Properties? properties + } + ) { + return threadDataSource.getAllEmail( + accountId, + position: position, + limit: limit, + sort: sort, + filter: filter, + properties: properties + ); + } +} \ No newline at end of file