diff --git a/lib/features/email/data/network/email_api.dart b/lib/features/email/data/network/email_api.dart index 2540ba130..c2409188d 100644 --- a/lib/features/email/data/network/email_api.dart +++ b/lib/features/email/data/network/email_api.dart @@ -60,6 +60,8 @@ import 'package:tmail_ui_user/features/base/mixin/handle_error_mixin.dart'; import 'package:tmail_ui_user/features/composer/domain/exceptions/set_method_exception.dart'; import 'package:tmail_ui_user/features/composer/domain/model/email_request.dart'; import 'package:tmail_ui_user/features/email/domain/exceptions/email_exceptions.dart'; +import 'package:tmail_ui_user/features/email/domain/extensions/email_id_extensions.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; import 'package:tmail_ui_user/features/email/domain/model/move_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'; @@ -734,4 +736,44 @@ class EmailAPI with HandleSetErrorMixin { throw NotFoundEmailRecoveryActionException(); } } + + Future storeEventAttendanceStatus( + Session session, + AccountId accountId, + EmailId emailId, + EventActionType eventActionType + ) async { + final setEmailMethod = SetEmailMethod(accountId) + ..addUpdates(emailId.generateMapUpdateObjectEventAttendanceStatus(eventActionType)); + + final getEmailMethod = GetEmailMethod(accountId) + ..addIds({emailId.id}) + ..addProperties(Properties({EmailProperty.keywords})); + + final requestBuilder = JmapRequestBuilder(_httpClient, ProcessingInvocation()); + + requestBuilder.invocation(setEmailMethod); + + final getEmailInvocation = requestBuilder.invocation(getEmailMethod); + + final capabilities = setEmailMethod.requiredCapabilities + .toCapabilitiesSupportTeamMailboxes(session, accountId); + + final response = await (requestBuilder + ..usings(capabilities)) + .build() + .execute(); + + final getEmailResponse = response.parse( + getEmailInvocation.methodCallId, + GetEmailResponse.deserialize); + + final listEmails = getEmailResponse?.list ?? []; + + if (listEmails.isNotEmpty) { + return listEmails.first; + } else { + throw NotFoundEmailException(); + } + } } \ No newline at end of file diff --git a/lib/features/email/domain/extensions/email_id_extensions.dart b/lib/features/email/domain/extensions/email_id_extensions.dart new file mode 100644 index 000000000..012912598 --- /dev/null +++ b/lib/features/email/domain/extensions/email_id_extensions.dart @@ -0,0 +1,12 @@ +import 'package:jmap_dart_client/jmap/core/id.dart'; +import 'package:jmap_dart_client/jmap/core/patch_object.dart'; +import 'package:jmap_dart_client/jmap/mail/email/email.dart'; +import 'package:tmail_ui_user/features/email/domain/model/event_action.dart'; + +extension EmailIdExtension on EmailId { + Map generateMapUpdateObjectEventAttendanceStatus(EventActionType eventActionType) { + return { + id: eventActionType.generateEventAttendanceStatusActionPath() + }; + } +} \ No newline at end of file diff --git a/lib/features/email/domain/model/event_action.dart b/lib/features/email/domain/model/event_action.dart index e2368bb64..144985f9d 100644 --- a/lib/features/email/domain/model/event_action.dart +++ b/lib/features/email/domain/model/event_action.dart @@ -1,6 +1,8 @@ import 'package:equatable/equatable.dart'; import 'package:flutter/cupertino.dart'; +import 'package:jmap_dart_client/jmap/core/patch_object.dart'; +import 'package:model/extensions/keyword_identifier_extension.dart'; import 'package:tmail_ui_user/main/localizations/app_localizations.dart'; enum EventActionType { @@ -18,6 +20,40 @@ enum EventActionType { return AppLocalizations.of(context).no; } } + + PatchObject generateEventAttendanceStatusActionPath() { + switch(this) { + case EventActionType.yes: + return PatchObject({ + KeyWordIdentifierExtension.acceptedEventAttendance.generatePath(): true, + KeyWordIdentifierExtension.tentativelyAcceptedEventAttendance.generatePath(): null, + KeyWordIdentifierExtension.rejectedEventAttendance.generatePath(): null, + }); + case EventActionType.maybe: + return PatchObject({ + KeyWordIdentifierExtension.acceptedEventAttendance.generatePath(): null, + KeyWordIdentifierExtension.tentativelyAcceptedEventAttendance.generatePath(): true, + KeyWordIdentifierExtension.rejectedEventAttendance.generatePath(): null, + }); + case EventActionType.no: + return PatchObject({ + KeyWordIdentifierExtension.acceptedEventAttendance.generatePath(): null, + KeyWordIdentifierExtension.tentativelyAcceptedEventAttendance.generatePath(): null, + KeyWordIdentifierExtension.rejectedEventAttendance.generatePath(): true, + }); + } + } + + String getToastMessageSuccess(BuildContext context) { + switch(this) { + case EventActionType.yes: + return AppLocalizations.of(context).youWillAttendThisMeeting; + case EventActionType.maybe: + return AppLocalizations.of(context).youMayAttendThisMeeting; + case EventActionType.no: + return AppLocalizations.of(context).youWillNotAttendThisMeeting; + } + } } class EventAction with EquatableMixin { diff --git a/model/lib/extensions/keyword_identifier_extension.dart b/model/lib/extensions/keyword_identifier_extension.dart index 4f0bcfeec..4cf8d3e00 100644 --- a/model/lib/extensions/keyword_identifier_extension.dart +++ b/model/lib/extensions/keyword_identifier_extension.dart @@ -5,6 +5,9 @@ import 'package:model/email/read_actions.dart'; extension KeyWordIdentifierExtension on KeyWordIdentifier { static final unsubscribeMail = KeyWordIdentifier('\$unsubscribe'); + static final acceptedEventAttendance = KeyWordIdentifier('\$accepted'); + static final tentativelyAcceptedEventAttendance = KeyWordIdentifier('\$tentativelyaccepted'); + static final rejectedEventAttendance = KeyWordIdentifier('\$rejected'); String generatePath() { return '${PatchObject.keywordsProperty}/$value';