TF-1604: Add requiredCapabilities support TeamMailbox for SetEmailMethod

(cherry picked from commit af9432c91755489a544b781bf068dd037fc627ee)
This commit is contained in:
HuyNguyen
2023-03-22 13:32:49 +07:00
committed by Dat Vu
parent 02e5d9e6aa
commit a794d8491e
28 changed files with 477 additions and 291 deletions
@@ -2,7 +2,6 @@ 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/capability/capability_identifier.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';
@@ -27,23 +26,6 @@ class ThreadAPI {
ThreadAPI(this.httpClient);
Set<CapabilityIdentifier> _capabilitiesForEmailMethod(Session session, AccountId accountId) {
final getMailboxCreated = GetEmailMethod(accountId);
try {
requireCapability(
session,
accountId,
[CapabilityIdentifier.jmapTeamMailboxes]);
return {
CapabilityIdentifier.jmapCore,
CapabilityIdentifier.jmapMail,
CapabilityIdentifier.jmapTeamMailboxes
};
} catch (_) {
return getMailboxCreated.requiredCapabilities;
}
}
Future<EmailsResponse> getAllEmail(
Session session,
AccountId accountId,
@@ -78,8 +60,11 @@ class ThreadAPI {
final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod);
final capabilities = getEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId)))
..usings(capabilities))
.build()
.execute();
@@ -133,8 +118,11 @@ class ThreadAPI {
final getEmailUpdatedInvocation = jmapRequestBuilder.invocation(getMailboxUpdated);
final getEmailCreatedInvocation = jmapRequestBuilder.invocation(getEmailCreated);
final capabilities = getEmailCreated.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId)))
..usings(capabilities))
.build()
.execute();
@@ -175,8 +163,11 @@ class ThreadAPI {
final getEmailInvocation = jmapRequestBuilder.invocation(getEmailMethod);
final capabilities = getEmailMethod.requiredCapabilities
.toCapabilitiesSupportTeamMailboxes(session, accountId);
final result = await (jmapRequestBuilder
..usings(_capabilitiesForEmailMethod(session, accountId)))
..usings(capabilities))
.build()
.execute();
@@ -73,7 +73,7 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last;
hasEmails = true;
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.accountId, newEmailList.listEmailIds);
final listEmailIdDeleted = await args.emailAPI.deleteMultipleEmailsPermanently(args.session, args.accountId, newEmailList.listEmailIds);
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
sendPort.send(listEmailIdDeleted);
@@ -123,7 +123,7 @@ class ThreadIsolateWorker {
if (newEmailList.isNotEmpty) {
lastEmail = newEmailList.last;
hasEmails = true;
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(accountId, newEmailList.listEmailIds);
final listEmailIdDeleted = await _emailAPI.deleteMultipleEmailsPermanently(session, accountId, newEmailList.listEmailIds);
if (listEmailIdDeleted.isNotEmpty && listEmailIdDeleted.length == newEmailList.listEmailIds.length) {
await updateDestroyedEmailCache(listEmailIdDeleted);
@@ -1,6 +1,7 @@
import 'package:core/core.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:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -14,9 +15,10 @@ class MarkAsMultipleEmailReadInteractor {
MarkAsMultipleEmailReadInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
List<Email> emails,
ReadActions readAction
Session session,
AccountId accountId,
List<Email> emails,
ReadActions readAction
) async* {
try {
yield Right(LoadingMarkAsMultipleEmailReadAll());
@@ -33,7 +35,7 @@ class MarkAsMultipleEmailReadInteractor {
.where((email) => readAction == ReadActions.markAsUnread ? email.hasRead : !email.hasRead)
.toList();
final result = await _emailRepository.markAsRead(accountId, listEmailNeedMarkAsRead, readAction);
final result = await _emailRepository.markAsRead(session, accountId, listEmailNeedMarkAsRead, readAction);
if (listEmailNeedMarkAsRead.length == result.length) {
final countMarkAsReadSuccess = emails.length;
@@ -1,6 +1,7 @@
import 'package:core/core.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:model/model.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
@@ -12,9 +13,10 @@ class MarkAsStarMultipleEmailInteractor {
MarkAsStarMultipleEmailInteractor(this._emailRepository);
Stream<Either<Failure, Success>> execute(
AccountId accountId,
List<Email> emails,
MarkStarAction markStarAction
Session session,
AccountId accountId,
List<Email> emails,
MarkStarAction markStarAction
) async* {
try {
yield Right(LoadingMarkAsStarMultipleEmailAll());
@@ -25,7 +27,7 @@ class MarkAsStarMultipleEmailInteractor {
.where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred)
.toList();
final result = await _emailRepository.markAsStar(accountId, listEmailNeedMarkStar, markStarAction);
final result = await _emailRepository.markAsStar(session, accountId, listEmailNeedMarkStar, markStarAction);
if (listEmailNeedMarkStar.length == result.length) {
final countMarkStarSuccess = emails.length;
@@ -3,6 +3,7 @@ import 'dart:async';
import 'package:core/core.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:tmail_ui_user/features/email/domain/model/move_to_mailbox_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
@@ -14,7 +15,11 @@ class MoveMultipleEmailToMailboxInteractor {
MoveMultipleEmailToMailboxInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(AccountId accountId, MoveToMailboxRequest moveRequest) async* {
Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
MoveToMailboxRequest moveRequest
) async* {
try {
yield Right(LoadingMoveMultipleEmailToMailboxAll());
@@ -26,7 +31,7 @@ class MoveMultipleEmailToMailboxInteractor {
final currentMailboxState = listState.first;
final currentEmailState = listState.last;
final result = await _emailRepository.moveToMailbox(accountId, moveRequest);
final result = await _emailRepository.moveToMailbox(session, accountId, moveRequest);
int totalEmail = 0;
for (var element in moveRequest.currentMailboxes.values) {
totalEmail = totalEmail + element.length;
@@ -51,57 +51,69 @@ mixin EmailActionController on ViewAsDialogActionMixin {
}
void moveToTrash(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final trashMailboxId = mailboxDashBoardController.mapDefaultMailboxIdByRole[PresentationMailbox.roleTrash];
if (mailboxContain != null && accountId != null && trashMailboxId != null) {
_moveToTrashAction(accountId, MoveToMailboxRequest(
{mailboxContain.id: email.id != null ? [email.id!] : []},
trashMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToTrash)
if (session != null && mailboxContain != null && accountId != null && trashMailboxId != null) {
_moveToTrashAction(
session,
accountId,
MoveToMailboxRequest(
{mailboxContain.id: email.id != null ? [email.id!] : []},
trashMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToTrash)
);
}
}
void _moveToTrashAction(AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
void _moveToTrashAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
}
void moveToSpam(PresentationEmail email, {PresentationMailbox? mailboxContain}) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
if (mailboxContain != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest(
{mailboxContain.id: email.id != null ? [email.id!] : []},
spamMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToSpam)
if (session != null && mailboxContain != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(
session,
accountId,
MoveToMailboxRequest(
{mailboxContain.id: email.id != null ? [email.id!] : []},
spamMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.moveToSpam)
);
}
}
void unSpam(PresentationEmail email) async {
final session = mailboxDashBoardController.sessionCurrent;
final accountId = mailboxDashBoardController.accountId.value;
final spamMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleSpam);
final inboxMailboxId = mailboxDashBoardController.getMailboxIdByRole(PresentationMailbox.roleInbox);
if (inboxMailboxId != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(accountId, MoveToMailboxRequest(
{spamMailboxId: email.id != null ? [email.id!] : []},
inboxMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.unSpam)
if (session != null && inboxMailboxId != null && accountId != null && spamMailboxId != null) {
moveToSpamAction(
session,
accountId,
MoveToMailboxRequest(
{spamMailboxId: email.id != null ? [email.id!] : []},
inboxMailboxId,
MoveAction.moving,
mailboxDashBoardController.sessionCurrent!,
EmailActionType.unSpam)
);
}
}
void moveToSpamAction(AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
void moveToSpamAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
}
void moveToMailbox(
@@ -160,32 +172,41 @@ mixin EmailActionController on ViewAsDialogActionMixin {
PresentationMailbox destinationMailbox
) {
if (destinationMailbox.isTrash) {
moveToSpamAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
moveToSpamAction(
session,
EmailActionType.moveToTrash));
accountId,
MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToTrash));
} else if (destinationMailbox.isSpam) {
moveToSpamAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
moveToSpamAction(
session,
EmailActionType.moveToSpam));
accountId,
MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToSpam));
} else {
_moveToMailboxAction(accountId, MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
_moveToMailboxAction(
session,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
accountId,
MoveToMailboxRequest(
{currentMailbox.id: emailSelected.id != null ? [emailSelected.id!] : []},
destinationMailbox.id,
MoveAction.moving,
session,
EmailActionType.moveToMailbox,
destinationPath: destinationMailbox.mailboxPath));
}
}
void _moveToMailboxAction(AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(accountId, moveRequest);
void _moveToMailboxAction(Session session, AccountId accountId, MoveToMailboxRequest moveRequest) {
mailboxDashBoardController.moveToMailbox(session, accountId, moveRequest);
}
void deleteEmailPermanently(BuildContext context, PresentationEmail email) {