Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

TF-3150 Fix cancel sending email not work as expected #3186

Open
wants to merge 1 commit into
base: master
Choose a base branch
from
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -1,3 +1,7 @@
class SendingEmailCanceledException implements Exception {}

class SavingEmailToDraftsCanceledException implements Exception {}
class SavingEmailToDraftsCanceledException implements Exception {}

class SendingEmailTimeoutException implements Exception {}

class SavingEmailToDraftsTimeoutException implements Exception {}
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:async';

import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
Expand Down Expand Up @@ -32,6 +34,7 @@ class CreateNewAndSaveEmailToDraftsInteractor {
Stream<dartz.Either<Failure, Success>> execute({
required CreateEmailRequest createEmailRequest,
CancelToken? cancelToken,
Duration? timeout,
}) async* {
try {
yield dartz.Right<Failure, Success>(GenerateEmailLoading());
Expand All @@ -43,45 +46,47 @@ class CreateNewAndSaveEmailToDraftsInteractor {

final emailCreated = await _createEmailObject(createEmailRequest);

if (emailCreated != null) {
if (createEmailRequest.draftsEmailId == null) {
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());

final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
cancelToken: cancelToken
);

yield dartz.Right<Failure, Success>(
SaveEmailAsDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
} else {
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());

final emailDraftSaved = await _emailRepository.updateEmailDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
createEmailRequest.draftsEmailId!,
cancelToken: cancelToken
);

yield dartz.Right<Failure, Success>(
UpdateEmailDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
}
} else {
if (emailCreated == null) {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
return;
}

if (createEmailRequest.draftsEmailId == null) {
yield dartz.Right<Failure, Success>(SaveEmailAsDraftsLoading());

final emailDraftSaved = await _emailRepository.saveEmailAsDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
cancelToken: cancelToken,
timeout: timeout,
);

yield dartz.Right<Failure, Success>(
SaveEmailAsDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
} else {
yield dartz.Right<Failure, Success>(UpdatingEmailDrafts());

final emailDraftSaved = await _emailRepository.updateEmailDrafts(
createEmailRequest.session,
createEmailRequest.accountId,
emailCreated,
createEmailRequest.draftsEmailId!,
cancelToken: cancelToken
);

yield dartz.Right<Failure, Success>(
UpdateEmailDraftsSuccess(
emailDraftSaved.id!,
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2
)
);
}
} catch (e) {
logError('CreateNewAndSaveEmailToDraftsInteractor::execute: Exception: $e');
Expand All @@ -91,6 +96,10 @@ class CreateNewAndSaveEmailToDraftsInteractor {
} else {
yield dartz.Left<Failure, Success>(UpdateEmailDraftsFailure(SavingEmailToDraftsCanceledException()));
}
} else if (e is TimeoutException) {
yield dartz.Left<Failure, Success>(createEmailRequest.draftsEmailId == null
? SaveEmailAsDraftsFailure(SavingEmailToDraftsTimeoutException())
: UpdateEmailDraftsFailure(SavingEmailToDraftsTimeoutException()));
} else {
if (createEmailRequest.draftsEmailId == null) {
yield dartz.Left<Failure, Success>(SaveEmailAsDraftsFailure(e));
Expand Down
Original file line number Diff line number Diff line change
@@ -1,3 +1,5 @@
import 'dart:async';

import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
import 'package:core/utils/app_logger.dart';
Expand Down Expand Up @@ -32,7 +34,8 @@ class CreateNewAndSendEmailInteractor {

Stream<dartz.Either<Failure, Success>> execute({
required CreateEmailRequest createEmailRequest,
CancelToken? cancelToken
CancelToken? cancelToken,
Duration? timeout,
}) async* {
SendingEmailArguments? sendingEmailArguments;
try {
Expand All @@ -45,36 +48,37 @@ class CreateNewAndSendEmailInteractor {

sendingEmailArguments = await _createEmailObject(createEmailRequest);

if (sendingEmailArguments != null) {
yield dartz.Right<Failure, Success>(SendEmailLoading());
if (sendingEmailArguments == null) {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
return;
}

await _emailRepository.sendEmail(
sendingEmailArguments.session,
sendingEmailArguments.accountId,
sendingEmailArguments.emailRequest,
mailboxRequest: sendingEmailArguments.mailboxRequest,
cancelToken: cancelToken
);
yield dartz.Right<Failure, Success>(SendEmailLoading());

if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
await _deleteOldDraftsEmail(
session: sendingEmailArguments.session,
accountId: sendingEmailArguments.accountId,
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
cancelToken: cancelToken
);
}

yield dartz.Right<Failure, Success>(
SendEmailSuccess(
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2,
emailRequest: sendingEmailArguments.emailRequest
)
await _emailRepository.sendEmail(
sendingEmailArguments.session,
sendingEmailArguments.accountId,
sendingEmailArguments.emailRequest,
mailboxRequest: sendingEmailArguments.mailboxRequest,
cancelToken: cancelToken,
timeout: timeout,
);

if (sendingEmailArguments.emailRequest.emailIdDestroyed != null) {
await _deleteOldDraftsEmail(
session: sendingEmailArguments.session,
accountId: sendingEmailArguments.accountId,
draftEmailId: sendingEmailArguments.emailRequest.emailIdDestroyed!,
);
} else {
yield dartz.Left<Failure, Success>(GenerateEmailFailure(CannotCreateEmailObjectException()));
}

yield dartz.Right<Failure, Success>(
SendEmailSuccess(
currentMailboxState: listCurrentState?.value1,
currentEmailState: listCurrentState?.value2,
emailRequest: sendingEmailArguments.emailRequest
)
);
} catch (e) {
logError('CreateNewAndSendEmailInteractor::execute: Exception: $e');
if (e is UnknownError && e.message is List<SendingEmailCanceledException>) {
Expand All @@ -85,6 +89,14 @@ class CreateNewAndSendEmailInteractor {
emailRequest: sendingEmailArguments?.emailRequest,
mailboxRequest: sendingEmailArguments?.mailboxRequest,
));
} else if (e is TimeoutException) {
yield dartz.Left<Failure, Success>(SendEmailFailure(
exception: SendingEmailTimeoutException(),
session: sendingEmailArguments?.session,
accountId: sendingEmailArguments?.accountId,
emailRequest: sendingEmailArguments?.emailRequest,
mailboxRequest: sendingEmailArguments?.mailboxRequest,
));
} else {
yield dartz.Left<Failure, Success>(SendEmailFailure(
exception: e,
Expand Down Expand Up @@ -132,14 +144,12 @@ class CreateNewAndSendEmailInteractor {
required Session session,
required AccountId accountId,
required EmailId draftEmailId,
CancelToken? cancelToken
}) async {
try {
await _emailRepository.deleteEmailPermanently(
session,
accountId,
draftEmailId,
cancelToken: cancelToken
);
} catch (e) {
logError('CreateNewAndSendEmailInteractor::_deleteOldDraftsEmail: Exception: $e');
Expand Down
Loading
Loading