TF-2858 Implement update event attendance status keywords property in email api

This commit is contained in:
dab246
2024-05-17 17:11:41 +07:00
committed by Dat H. Pham
parent 42ead79d67
commit c47013fadf
4 changed files with 93 additions and 0 deletions
@@ -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<Email> 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<GetEmailResponse>(
getEmailInvocation.methodCallId,
GetEmailResponse.deserialize);
final listEmails = getEmailResponse?.list ?? [];
if (listEmails.isNotEmpty) {
return listEmails.first;
} else {
throw NotFoundEmailException();
}
}
}
@@ -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<Id, PatchObject> generateMapUpdateObjectEventAttendanceStatus(EventActionType eventActionType) {
return {
id: eventActionType.generateEventAttendanceStatusActionPath()
};
}
}
@@ -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 {
@@ -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';