From 7e0f338fa050b3230ad6a8e90ae36a8717affad2 Mon Sep 17 00:00:00 2001 From: dab246 Date: Wed, 10 May 2023 16:31:00 +0700 Subject: [PATCH] TF-1810 Add GetNewReceiveEmailFromNotificationInteractor to get new receive email from notification (cherry picked from commit df7a84a932f8496d92e5eed8ccd66c0b8709ae61) --- .../data/repository/fcm_repository_impl.dart | 32 ++++++++++++++ .../domain/exceptions/fcm_exception.dart | 6 ++- .../domain/repository/fcm_repository.dart | 2 + ...receive_email_from_notification_state.dart | 28 ++++++++++++ ...ve_email_from_notification_interactor.dart | 43 +++++++++++++++++++ 5 files changed, 110 insertions(+), 1 deletion(-) create mode 100644 lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart create mode 100644 lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart diff --git a/lib/features/push_notification/data/repository/fcm_repository_impl.dart b/lib/features/push_notification/data/repository/fcm_repository_impl.dart index 2c4fc2ac0..d5398d624 100644 --- a/lib/features/push_notification/data/repository/fcm_repository_impl.dart +++ b/lib/features/push_notification/data/repository/fcm_repository_impl.dart @@ -8,12 +8,14 @@ import 'package:jmap_dart_client/jmap/core/session/session.dart'; import 'package:jmap_dart_client/jmap/core/user_name.dart'; import 'package:jmap_dart_client/jmap/mail/email/email.dart'; import 'package:jmap_dart_client/jmap/mail/email/keyword_identifier.dart'; +import 'package:model/email/email_property.dart'; import 'package:model/extensions/list_email_extension.dart'; import 'package:model/extensions/mailbox_extension.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart'; import 'package:tmail_ui_user/features/push_notification/data/datasource/fcm_datasource.dart'; import 'package:tmail_ui_user/features/push_notification/data/extensions/fcm_subscription_extensions.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/exceptions/fcm_exception.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/fcm_subscription.dart'; import 'package:tmail_ui_user/features/push_notification/domain/model/register_new_token_request.dart'; import 'package:tmail_ui_user/features/push_notification/domain/repository/fcm_repository.dart'; @@ -184,4 +186,34 @@ class FCMRepositoryImpl extends FCMRepository { return []; } } + + @override + Future> getNewReceiveEmailFromNotification(Session session, AccountId accountId, jmap.State currentState) async { + EmailChangeResponse? emailChangeResponse; + bool hasMoreChanges = true; + jmap.State? sinceState = currentState; + + while (hasMoreChanges && sinceState != null) { + final changesResponse = await _threadDataSource.getChanges( + session, + accountId, + sinceState, + propertiesCreated: Properties({EmailProperty.id})); + + hasMoreChanges = changesResponse.hasMoreChanges; + sinceState = changesResponse.newStateChanges; + + if (emailChangeResponse != null) { + emailChangeResponse.union(changesResponse); + } else { + emailChangeResponse = changesResponse; + } + } + + if (emailChangeResponse?.created?.isNotEmpty == true) { + return emailChangeResponse!.created!.listEmailIds; + } else { + throw NotFoundNewReceiveEmailException(); + } + } } \ No newline at end of file diff --git a/lib/features/push_notification/domain/exceptions/fcm_exception.dart b/lib/features/push_notification/domain/exceptions/fcm_exception.dart index d352558b3..4be012173 100644 --- a/lib/features/push_notification/domain/exceptions/fcm_exception.dart +++ b/lib/features/push_notification/domain/exceptions/fcm_exception.dart @@ -10,4 +10,8 @@ class NotFoundFirebaseSubscriptionException implements Exception {} class NotFoundSubscriptionException implements Exception {} -class NotFoundEmailStateException implements Exception {} \ No newline at end of file +class NotFoundEmailStateException implements Exception {} + +class NotFoundNewReceiveEmailException implements Exception {} + +class EmailStateNoChangeException implements Exception {} \ No newline at end of file diff --git a/lib/features/push_notification/domain/repository/fcm_repository.dart b/lib/features/push_notification/domain/repository/fcm_repository.dart index d35284887..bee2561ed 100644 --- a/lib/features/push_notification/domain/repository/fcm_repository.dart +++ b/lib/features/push_notification/domain/repository/fcm_repository.dart @@ -49,4 +49,6 @@ abstract class FCMRepository { Properties? propertiesUpdated } ); + + Future> getNewReceiveEmailFromNotification(Session session, AccountId accountId, jmap.State currentState); } \ No newline at end of file diff --git a/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart b/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart new file mode 100644 index 000000000..edd04e2c7 --- /dev/null +++ b/lib/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart @@ -0,0 +1,28 @@ + +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; + +class GetNewReceiveEmailFromNotificationLoading extends UIState {} + +class GetNewReceiveEmailFromNotificationSuccess extends UIState { + + final List emailIds; + final AccountId accountId; + final UserName userName; + + GetNewReceiveEmailFromNotificationSuccess(this.accountId, this.userName, this.emailIds); + + @override + List get props => [accountId, userName, emailIds]; +} + +class GetNewReceiveEmailFromNotificationFailure extends FeatureFailure { + + GetNewReceiveEmailFromNotificationFailure(exception) : super(exception: exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart b/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart new file mode 100644 index 000000000..4d87279a0 --- /dev/null +++ b/lib/features/push_notification/domain/usecases/get_new_receive_email_from_notification_interactor.dart @@ -0,0 +1,43 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:jmap_dart_client/jmap/account_id.dart'; +import 'package:jmap_dart_client/jmap/core/session/session.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:jmap_dart_client/jmap/core/user_name.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/exceptions/fcm_exception.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/repository/fcm_repository.dart'; +import 'package:tmail_ui_user/features/push_notification/domain/state/get_new_receive_email_from_notification_state.dart'; + +class GetNewReceiveEmailFromNotificationInteractor { + final FCMRepository _fcmRepository; + final EmailRepository _emailRepository; + + GetNewReceiveEmailFromNotificationInteractor(this._fcmRepository, this._emailRepository); + + Stream> execute( + Session session, + AccountId accountId, + UserName userName, + jmap.State newState + ) async* { + try { + yield Right(GetNewReceiveEmailFromNotificationLoading()); + + final currentState = await _emailRepository.getEmailState(session, accountId); + if (currentState != null && currentState != newState) { + final listEmailIds = await _fcmRepository.getNewReceiveEmailFromNotification( + session, + accountId, + currentState); + + yield Right(GetNewReceiveEmailFromNotificationSuccess(accountId, userName, listEmailIds)); + } else { + yield Left(GetNewReceiveEmailFromNotificationFailure(EmailStateNoChangeException())); + } + } catch (e) { + yield Left(GetNewReceiveEmailFromNotificationFailure(e)); + } + } +} \ No newline at end of file