TF-1718 Implement unsubscribeMail on Jmap server in offline mode

(cherry picked from commit 354808e6883501a8dc1e0ecd5c0d1a6beab0e83a)
This commit is contained in:
dab246
2023-11-16 13:23:40 +07:00
committed by Dat Vu
parent a6ecaf321d
commit 83bd14cb74
7 changed files with 58 additions and 9 deletions
@@ -1,4 +1,4 @@
class CacheVersion {
static const int hiveDBVersion = 7;
static const int hiveDBVersion = 8;
}
@@ -23,7 +23,8 @@ extension EmailRequestExtension on EmailRequest {
identityId: identityId,
mailboxNameRequest: mailboxRequest?.newName,
creationIdRequest: mailboxRequest?.creationId,
sendingState: newState
sendingState: newState,
previousEmailId: previousEmailId
);
}
}
@@ -26,7 +26,8 @@ extension SendingEmailHiveCacheExtension on SendingEmailHiveCache {
identityId: const IdentityIdNullableConverter().fromJson(identityId),
mailboxNameRequest: const MailboxNameConverter().fromJson(mailboxNameRequest),
creationIdRequest: const IdNullableConverter().fromJson(creationIdRequest),
sendingState: SendingState.values.firstWhere((value) => value.name == sendingState)
sendingState: SendingState.values.firstWhere((value) => value.name == sendingState),
previousEmailId: const EmailIdNullableConverter().fromJson(previousEmailId),
);
}
}
@@ -41,6 +41,9 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin {
@HiveField(10)
final String sendingState;
@HiveField(11)
final String? previousEmailId;
SendingEmailHiveCache(
this.sendingId,
this.email,
@@ -53,6 +56,7 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin {
this.mailboxNameRequest,
this.creationIdRequest,
this.sendingState,
this.previousEmailId,
);
@override
@@ -68,5 +72,6 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin {
mailboxNameRequest,
creationIdRequest,
sendingState,
previousEmailId,
];
}
@@ -6,6 +6,8 @@ import 'package:core/utils/app_logger.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/core/user_name.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:model/email/email_action_type.dart';
import 'package:model/extensions/account_id_extensions.dart';
import 'package:model/extensions/session_extension.dart';
import 'package:model/oidc/token_oidc.dart';
@@ -13,6 +15,8 @@ import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart';
import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart';
import 'package:tmail_ui_user/features/composer/domain/state/send_email_state.dart';
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.dart';
import 'package:tmail_ui_user/features/email/domain/state/unsubscribe_email_state.dart';
import 'package:tmail_ui_user/features/email/domain/usecases/unsubscribe_email_interactor.dart';
import 'package:tmail_ui_user/features/home/domain/extensions/session_extensions.dart';
import 'package:tmail_ui_user/features/home/domain/state/get_session_state.dart';
import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart';
@@ -43,6 +47,7 @@ class SendingEmailWorker extends Worker {
GetSessionInteractor? _getSessionInteractor;
SendingQueueIsolateManager? _sendingQueueIsolateManager;
SendingEmailCacheManager? _sendingEmailCacheManager;
UnsubscribeEmailInteractor? _unsubscribeEmailInteractor;
late Completer<bool> _completer;
late SendingEmail _sendingEmail;
@@ -97,6 +102,8 @@ class SendingEmailWorker extends Worker {
failure is GetStoredTokenOidcFailure ||
failure is GetCredentialFailure) {
_handleWorkerTaskToRetry();
} else if (failure is UnsubscribeEmailFailure) {
_handleWorkerTaskSuccess();
}
}
@@ -111,6 +118,8 @@ class SendingEmailWorker extends Worker {
_handleGetAccountByBasicAuthSuccess(success);
} else if (success is SendEmailSuccess) {
_handleSendEmailSuccess(success);
} else if (success is UnsubscribeEmailSuccess) {
_handleWorkerTaskSuccess();
}
}
@@ -128,6 +137,7 @@ class SendingEmailWorker extends Worker {
_sendEmailInteractor = getBinding<SendEmailInteractor>();
_sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
_sendingEmailCacheManager = getBinding<SendingEmailCacheManager>();
_unsubscribeEmailInteractor = getBinding<UnsubscribeEmailInteractor>();
}
void _updatingSendingStateToMainUI({String? sendingId, SendingState? sendingState}) {
@@ -204,7 +214,12 @@ class SendingEmailWorker extends Worker {
}
void _handleSendEmailSuccess(SendEmailSuccess success) {
_handleWorkerTaskSuccess();
if (success.emailRequest.emailActionType == EmailActionType.composeFromUnsubscribeMailtoLink &&
success.emailRequest.previousEmailId != null) {
_unsubscribeMail(success.emailRequest.previousEmailId!);
} else {
_handleWorkerTaskSuccess();
}
}
void _handleSendEmailFailure(SendEmailFailure failure) {
@@ -246,4 +261,21 @@ class SendingEmailWorker extends Worker {
UserName? userName
}
) => TupleKey(sendingId, sendingState.name, accountId?.asString, userName?.value).toString();
void _unsubscribeMail(EmailId emailId) {
if (_unsubscribeEmailInteractor != null &&
_currentSession != null &&
_currentAccountId != null
) {
consumeState(
_unsubscribeEmailInteractor!.execute(
_currentSession!,
_currentAccountId!,
emailId
)
);
} else {
_handleWorkerTaskSuccess();
}
}
}
@@ -23,6 +23,7 @@ extension SendingEmailExtension on SendingEmail {
mailboxNameRequest?.name,
creationIdRequest?.value,
sendingState.name,
previousEmailId?.asString,
);
}
@@ -34,7 +35,8 @@ extension SendingEmailExtension on SendingEmail {
emailIdDestroyed: emailIdDestroyed,
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
identityId: identityId,
storedSendingId: sendingId
storedSendingId: sendingId,
previousEmailId: previousEmailId,
);
}
@@ -51,7 +53,8 @@ extension SendingEmailExtension on SendingEmail {
mailboxNameRequest: mailboxNameRequest,
creationIdRequest: creationIdRequest,
sendingState: sendingState,
selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE
selectMode: selectMode == SelectMode.INACTIVE ? SelectMode.ACTIVE : SelectMode.INACTIVE,
previousEmailId: previousEmailId,
);
}
@@ -68,7 +71,8 @@ extension SendingEmailExtension on SendingEmail {
mailboxNameRequest: mailboxNameRequest,
creationIdRequest: creationIdRequest,
sendingState: sendingState,
selectMode: SelectMode.INACTIVE
selectMode: SelectMode.INACTIVE,
previousEmailId: previousEmailId,
);
}
@@ -85,7 +89,8 @@ extension SendingEmailExtension on SendingEmail {
mailboxNameRequest: mailboxNameRequest,
creationIdRequest: creationIdRequest,
sendingState: newState,
selectMode: selectMode
selectMode: selectMode,
previousEmailId: previousEmailId,
);
}
}
@@ -31,6 +31,7 @@ class SendingEmail with EquatableMixin {
final DateTime createTime;
final SelectMode selectMode;
final SendingState sendingState;
final EmailId? previousEmailId;
SendingEmail({
required this.sendingId,
@@ -44,7 +45,8 @@ class SendingEmail with EquatableMixin {
this.mailboxNameRequest,
this.creationIdRequest,
this.selectMode = SelectMode.INACTIVE,
this.sendingState = SendingState.waiting
this.sendingState = SendingState.waiting,
this.previousEmailId,
});
Map<String, dynamic> toJson() {
@@ -66,6 +68,7 @@ class SendingEmail with EquatableMixin {
writeNotNull('identityId', const IdentityIdNullableConverter().toJson(identityId));
writeNotNull('mailboxNameRequest', mailboxNameRequest?.name);
writeNotNull('creationIdRequest', const IdNullableConverter().toJson(creationIdRequest));
writeNotNull('previousEmailId', const EmailIdNullableConverter().toJson(previousEmailId));
return val;
}
@@ -88,6 +91,7 @@ class SendingEmail with EquatableMixin {
identityId: const IdentityIdNullableConverter().fromJson(json['identityId'] as String?),
mailboxNameRequest: const MailboxNameConverter().fromJson(json['mailboxNameRequest'] as String?),
creationIdRequest: const IdNullableConverter().fromJson(json['creationIdRequest'] as String?),
previousEmailId: const EmailIdNullableConverter().fromJson(json['previousEmailId'] as String?),
);
}
@@ -134,5 +138,6 @@ class SendingEmail with EquatableMixin {
creationIdRequest,
selectMode,
sendingState,
previousEmailId,
];
}