TF-2101 Handle restore deleted messages

(cherry picked from commit e675f98a6c85d9c4a90efc686e6ff72d23b4c678)
This commit is contained in:
hieubt
2023-12-21 16:56:06 +07:00
committed by Dat H. Pham
parent 4f6b500fa0
commit 71dc206ccd
30 changed files with 457 additions and 99 deletions
@@ -4,21 +4,56 @@ import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:dartz/dartz.dart';
import 'package:email_recovery/email_recovery/email_recovery_action_id.dart';
import 'package:email_recovery/email_recovery/email_recovery_status.dart.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/mailbox/mailbox.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/get_restored_deleted_message_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class GetRestoredDeletedMessageInterator {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
GetRestoredDeletedMessageInterator(this._emailRepository);
GetRestoredDeletedMessageInterator(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
EmailRecoveryActionId emailRecoveryActionId,
) async* {
try {
yield Right<Failure, Success>(GetRestoredDeletedMessageLoading());
final emailRecovery = await _emailRepository.getRestoredDeletedMessage(emailRecoveryActionId);
yield Right<Failure, Success>(GetRestoredDeletedMessageSuccess(emailRecovery));
switch (emailRecovery.status) {
case EmailRecoveryStatus.completed:
final getMailboxByRoleResponse = await _mailboxRepository.getMailboxByRole(
session,
accountId,
Role('Restored-Messages')
);
final recoveredMailbox = getMailboxByRoleResponse.mailbox;
yield Right<Failure, Success>(GetRestoredDeletedMessageCompleted(emailRecovery, recoveredMailbox: recoveredMailbox));
break;
case EmailRecoveryStatus.failed:
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(null));
break;
case EmailRecoveryStatus.inProgress:
yield Right<Failure, Success>(GetRestoredDeletedMessageInProgress(emailRecovery));
break;
case EmailRecoveryStatus.waiting:
yield Right<Failure, Success>(GetRestoredDeletedMessageWaiting(emailRecovery));
break;
case EmailRecoveryStatus.canceled:
yield Right<Failure, Success>(GetRestoredDeletedMessageCanceled(emailRecovery));
break;
default:
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(null));
}
} catch (e) {
yield Left<Failure, Success>(GetRestoredDeletedMessageFailure(e));
}
@@ -3,22 +3,29 @@ import 'dart:async';
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:tmail_ui_user/features/email/domain/model/restore_deleted_message_request.dart';
import 'package:tmail_ui_user/features/email/domain/repository/email_repository.dart';
import 'package:tmail_ui_user/features/email/domain/state/restore_deleted_message_state.dart';
import 'package:tmail_ui_user/features/mailbox/domain/repository/mailbox_repository.dart';
class RestoredDeletedMessageInteractor {
final EmailRepository _emailRepository;
final MailboxRepository _mailboxRepository;
RestoredDeletedMessageInteractor(this._emailRepository);
RestoredDeletedMessageInteractor(this._emailRepository, this._mailboxRepository);
Stream<Either<Failure, Success>> execute(
Session session,
AccountId accountId,
RestoredDeletedMessageRequest newRecoveryRequest,
) async* {
try {
yield Right<Failure, Success>(RestoreDeletedMessageLoading());
final currentMailboxState = await _mailboxRepository.getMailboxState(session, accountId);
final emailRecovery = await _emailRepository.restoreDeletedMessage(newRecoveryRequest);
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery));
yield Right<Failure, Success>(RestoreDeletedMessageSuccess(emailRecovery, currentMailboxState: currentMailboxState));
} catch (e) {
yield Left<Failure, Success>(RestoreDeletedMessageFailure(e));
}