From 9ce2fa69db8d0b8a63eaf13ac9e3d5d657a5db70 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 17 May 2024 17:56:38 +0700 Subject: [PATCH] TF-2858 Create store event attendance status interactor --- .../data/datasource/email_datasource.dart | 7 ++++ .../email_datasource_impl.dart | 17 ++++++++ .../email_hive_cache_datasource_impl.dart | 6 +++ .../repository/email_repository_impl.dart | 15 +++++++ .../domain/repository/email_repository.dart | 7 ++++ .../store_event_attendance_status_state.dart | 34 +++++++++++++++ ...re_event_attendance_status_interactor.dart | 41 +++++++++++++++++++ 7 files changed, 127 insertions(+) create mode 100644 lib/features/email/domain/state/store_event_attendance_status_state.dart create mode 100644 lib/features/email/domain/usecases/store_event_attendance_status_interactor.dart diff --git a/lib/features/email/data/datasource/email_datasource.dart b/lib/features/email/data/datasource/email_datasource.dart index db3d4c283..4667207cc 100644 --- a/lib/features/email/data/datasource/email_datasource.dart +++ b/lib/features/email/data/datasource/email_datasource.dart @@ -19,6 +19,7 @@ import 'package:model/email/mark_star_action.dart'; import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -112,4 +113,10 @@ abstract class EmailDataSource { Future restoreDeletedMessage(RestoredDeletedMessageRequest restoredDeletedMessageRequest); Future getRestoredDeletedMessage(EmailRecoveryActionId emailRecoveryActionId); + + Future storeEventAttendanceStatus( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType); } \ 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 76a5e7ee8..57c3e6be3 100644 --- a/lib/features/email/data/datasource_impl/email_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_datasource_impl.dart @@ -18,6 +18,7 @@ import 'package:tmail_ui_user/features/composer/domain/model/email_request.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'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -252,4 +253,20 @@ class EmailDataSourceImpl extends EmailDataSource { return await emailAPI.getRestoredDeletedMessage(emailRecoveryActionId); }).catchError(_exceptionThrower.throwException); } + + @override + Future storeEventAttendanceStatus( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType + ) { + return Future.sync(() async { + return await emailAPI.storeEventAttendanceStatus( + session, + accountId, + emailId, + eventActionType); + }).catchError(_exceptionThrower.throwException); + } } \ No newline at end of file diff --git a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart index c18814746..cad48ac12 100644 --- a/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart +++ b/lib/features/email/data/datasource_impl/email_hive_cache_datasource_impl.dart @@ -27,6 +27,7 @@ import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.da import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_extension.dart'; import 'package:tmail_ui_user/features/email/domain/extensions/detailed_email_hive_cache_extension.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -303,4 +304,9 @@ class EmailHiveCacheDataSourceImpl extends EmailDataSource { Future getRestoredDeletedMessage(EmailRecoveryActionId emailRecoveryActionId) { throw UnimplementedError(); } + + @override + Future storeEventAttendanceStatus(Session session, AccountId accountId, EmailId emailId, EventActionType eventActionType) { + throw UnimplementedError(); + } } \ 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 014bca06b..fda620f2d 100644 --- a/lib/features/email/data/repository/email_repository_impl.dart +++ b/lib/features/email/data/repository/email_repository_impl.dart @@ -26,6 +26,7 @@ import 'package:tmail_ui_user/features/email/data/datasource/html_datasource.dar import 'package:tmail_ui_user/features/email/data/datasource/print_file_datasource.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/email_print.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart'; import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; @@ -237,4 +238,18 @@ class EmailRepositoryImpl extends EmailRepository { Future printEmail(EmailPrint emailPrint) { return _printFileDataSource.printEmail(emailPrint); } + + @override + Future storeEventAttendanceStatus( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType + ) { + return emailDataSource[DataSourceType.network]!.storeEventAttendanceStatus( + session, + accountId, + emailId, + eventActionType); + } } \ No newline at end of file diff --git a/lib/features/email/domain/repository/email_repository.dart b/lib/features/email/domain/repository/email_repository.dart index 53bb1daf5..1e4bbf5b3 100644 --- a/lib/features/email/domain/repository/email_repository.dart +++ b/lib/features/email/domain/repository/email_repository.dart @@ -22,6 +22,7 @@ import 'package:model/email/read_actions.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/detailed_email.dart'; import 'package:tmail_ui_user/features/email/domain/model/email_print.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart'; import 'package:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart'; import 'package:tmail_ui_user/features/mailbox/domain/model/create_new_mailbox_request.dart'; @@ -115,4 +116,10 @@ abstract class EmailRepository { Future getRestoredDeletedMessage(EmailRecoveryActionId emailRecoveryActionId); Future printEmail(EmailPrint emailPrint); + + Future storeEventAttendanceStatus( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType); } \ No newline at end of file diff --git a/lib/features/email/domain/state/store_event_attendance_status_state.dart b/lib/features/email/domain/state/store_event_attendance_status_state.dart new file mode 100644 index 000000000..942e6accb --- /dev/null +++ b/lib/features/email/domain/state/store_event_attendance_status_state.dart @@ -0,0 +1,34 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:jmap_dart_client/jmap/core/state.dart' as jmap; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/base/state/ui_action_state.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; + +class StoreEventAttendanceStatusLoading extends LoadingState {} + +class StoreEventAttendanceStatusSuccess extends UIActionState { + + final EventActionType eventActionType; + final Email updatedEmail; + + StoreEventAttendanceStatusSuccess( + this.eventActionType, + this.updatedEmail, + { + jmap.State? currentEmailState, + jmap.State? currentMailboxState, + } + ) : super(currentEmailState, currentMailboxState); + + @override + List get props => [ + eventActionType, + updatedEmail, + ...super.props]; +} + +class StoreEventAttendanceStatusFailure extends FeatureFailure { + + StoreEventAttendanceStatusFailure({dynamic exception}) : super(exception: exception); +} \ No newline at end of file diff --git a/lib/features/email/domain/usecases/store_event_attendance_status_interactor.dart b/lib/features/email/domain/usecases/store_event_attendance_status_interactor.dart new file mode 100644 index 000000000..d2abe8422 --- /dev/null +++ b/lib/features/email/domain/usecases/store_event_attendance_status_interactor.dart @@ -0,0 +1,41 @@ +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/mail/email/email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; +import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart'; +import 'package:tmail_ui_user/features/email/domain/state/store_event_attendance_status_state.dart'; + +class StoreEventAttendanceStatusInteractor { + final EmailRepository _emailRepository; + + StoreEventAttendanceStatusInteractor(this._emailRepository); + + Stream> execute( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType + ) async* { + try { + yield Right(StoreEventAttendanceStatusLoading()); + + final currentEmailState = await _emailRepository.getEmailState(session, accountId); + + final updatedEmail = await _emailRepository.storeEventAttendanceStatus( + session, + accountId, + emailId, + eventActionType); + + yield Right(StoreEventAttendanceStatusSuccess( + eventActionType, + updatedEmail, + currentEmailState: currentEmailState)); + } catch (e) { + yield Left(StoreEventAttendanceStatusFailure(exception: e)); + } + } +} \ No newline at end of file