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
@@ -1,16 +1,55 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
class GetRestoredDeletedMessageLoading extends LoadingState {}
class GetRestoredDeletedMessageSuccess extends UIState {
class GetRestoredDeletedMessageSuccess extends UIActionState {
final EmailRecoveryAction emailRecoveryAction;
GetRestoredDeletedMessageSuccess(this.emailRecoveryAction);
GetRestoredDeletedMessageSuccess(
this.emailRecoveryAction,
{
jmap.State? currentMailboxState,
}
) : super(null, currentMailboxState);
@override
List<Object> get props => [emailRecoveryAction];
List<Object?> get props => [emailRecoveryAction, ...super.props];
}
class GetRestoredDeletedMessageCompleted extends GetRestoredDeletedMessageSuccess {
final Mailbox? recoveredMailbox;
GetRestoredDeletedMessageCompleted(
EmailRecoveryAction emailRecoveryAction,
{this.recoveredMailbox}
) : super(emailRecoveryAction);
@override
List<Object?> get props => [emailRecoveryAction, recoveredMailbox];
}
class GetRestoredDeletedMessageWaiting extends GetRestoredDeletedMessageSuccess {
GetRestoredDeletedMessageWaiting(
EmailRecoveryAction emailRecoveryAction,
) : super(emailRecoveryAction);
}
class GetRestoredDeletedMessageInProgress extends GetRestoredDeletedMessageSuccess {
GetRestoredDeletedMessageInProgress(
EmailRecoveryAction emailRecoveryAction,
) : super(emailRecoveryAction);
}
class GetRestoredDeletedMessageCanceled extends GetRestoredDeletedMessageSuccess {
GetRestoredDeletedMessageCanceled(
EmailRecoveryAction emailRecoveryAction,
) : super(emailRecoveryAction);
}
class GetRestoredDeletedMessageFailure extends FeatureFailure {
@@ -1,16 +1,23 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:email_recovery/email_recovery/email_recovery_action.dart';
import 'package:tmail_ui_user/features/base/state/ui_action_state.dart';
import 'package:jmap_dart_client/jmap/core/state.dart' as jmap;
class RestoreDeletedMessageLoading extends LoadingState {}
class RestoreDeletedMessageSuccess extends UIState {
class RestoreDeletedMessageSuccess extends UIActionState {
final EmailRecoveryAction emailRecoveryAction;
RestoreDeletedMessageSuccess(this.emailRecoveryAction);
RestoreDeletedMessageSuccess(
this.emailRecoveryAction,
{
jmap.State? currentMailboxState,
}
) : super(null, currentMailboxState);
@override
List<Object> get props => [emailRecoveryAction];
List<Object?> get props => [emailRecoveryAction, ...super.props];
}
class RestoreDeletedMessageFailure extends FeatureFailure {
@@ -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));
}