TF-1718 Implement unsubscribeMail on Jmap server in offline mode
(cherry picked from commit 354808e6883501a8dc1e0ecd5c0d1a6beab0e83a)
This commit is contained in:
@@ -1,4 +1,4 @@
|
|||||||
|
|
||||||
class CacheVersion {
|
class CacheVersion {
|
||||||
static const int hiveDBVersion = 7;
|
static const int hiveDBVersion = 8;
|
||||||
}
|
}
|
||||||
@@ -23,7 +23,8 @@ extension EmailRequestExtension on EmailRequest {
|
|||||||
identityId: identityId,
|
identityId: identityId,
|
||||||
mailboxNameRequest: mailboxRequest?.newName,
|
mailboxNameRequest: mailboxRequest?.newName,
|
||||||
creationIdRequest: mailboxRequest?.creationId,
|
creationIdRequest: mailboxRequest?.creationId,
|
||||||
sendingState: newState
|
sendingState: newState,
|
||||||
|
previousEmailId: previousEmailId
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -26,7 +26,8 @@ extension SendingEmailHiveCacheExtension on SendingEmailHiveCache {
|
|||||||
identityId: const IdentityIdNullableConverter().fromJson(identityId),
|
identityId: const IdentityIdNullableConverter().fromJson(identityId),
|
||||||
mailboxNameRequest: const MailboxNameConverter().fromJson(mailboxNameRequest),
|
mailboxNameRequest: const MailboxNameConverter().fromJson(mailboxNameRequest),
|
||||||
creationIdRequest: const IdNullableConverter().fromJson(creationIdRequest),
|
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)
|
@HiveField(10)
|
||||||
final String sendingState;
|
final String sendingState;
|
||||||
|
|
||||||
|
@HiveField(11)
|
||||||
|
final String? previousEmailId;
|
||||||
|
|
||||||
SendingEmailHiveCache(
|
SendingEmailHiveCache(
|
||||||
this.sendingId,
|
this.sendingId,
|
||||||
this.email,
|
this.email,
|
||||||
@@ -53,6 +56,7 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin {
|
|||||||
this.mailboxNameRequest,
|
this.mailboxNameRequest,
|
||||||
this.creationIdRequest,
|
this.creationIdRequest,
|
||||||
this.sendingState,
|
this.sendingState,
|
||||||
|
this.previousEmailId,
|
||||||
);
|
);
|
||||||
|
|
||||||
@override
|
@override
|
||||||
@@ -68,5 +72,6 @@ class SendingEmailHiveCache extends HiveObject with EquatableMixin {
|
|||||||
mailboxNameRequest,
|
mailboxNameRequest,
|
||||||
creationIdRequest,
|
creationIdRequest,
|
||||||
sendingState,
|
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/account_id.dart';
|
||||||
import 'package:jmap_dart_client/jmap/core/session/session.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/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/account_id_extensions.dart';
|
||||||
import 'package:model/extensions/session_extension.dart';
|
import 'package:model/extensions/session_extension.dart';
|
||||||
import 'package:model/oidc/token_oidc.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/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/state/send_email_state.dart';
|
||||||
import 'package:tmail_ui_user/features/composer/domain/usecases/send_email_interactor.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/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/state/get_session_state.dart';
|
||||||
import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart';
|
import 'package:tmail_ui_user/features/home/domain/usecases/get_session_interactor.dart';
|
||||||
@@ -43,6 +47,7 @@ class SendingEmailWorker extends Worker {
|
|||||||
GetSessionInteractor? _getSessionInteractor;
|
GetSessionInteractor? _getSessionInteractor;
|
||||||
SendingQueueIsolateManager? _sendingQueueIsolateManager;
|
SendingQueueIsolateManager? _sendingQueueIsolateManager;
|
||||||
SendingEmailCacheManager? _sendingEmailCacheManager;
|
SendingEmailCacheManager? _sendingEmailCacheManager;
|
||||||
|
UnsubscribeEmailInteractor? _unsubscribeEmailInteractor;
|
||||||
|
|
||||||
late Completer<bool> _completer;
|
late Completer<bool> _completer;
|
||||||
late SendingEmail _sendingEmail;
|
late SendingEmail _sendingEmail;
|
||||||
@@ -97,6 +102,8 @@ class SendingEmailWorker extends Worker {
|
|||||||
failure is GetStoredTokenOidcFailure ||
|
failure is GetStoredTokenOidcFailure ||
|
||||||
failure is GetCredentialFailure) {
|
failure is GetCredentialFailure) {
|
||||||
_handleWorkerTaskToRetry();
|
_handleWorkerTaskToRetry();
|
||||||
|
} else if (failure is UnsubscribeEmailFailure) {
|
||||||
|
_handleWorkerTaskSuccess();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -111,6 +118,8 @@ class SendingEmailWorker extends Worker {
|
|||||||
_handleGetAccountByBasicAuthSuccess(success);
|
_handleGetAccountByBasicAuthSuccess(success);
|
||||||
} else if (success is SendEmailSuccess) {
|
} else if (success is SendEmailSuccess) {
|
||||||
_handleSendEmailSuccess(success);
|
_handleSendEmailSuccess(success);
|
||||||
|
} else if (success is UnsubscribeEmailSuccess) {
|
||||||
|
_handleWorkerTaskSuccess();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -128,6 +137,7 @@ class SendingEmailWorker extends Worker {
|
|||||||
_sendEmailInteractor = getBinding<SendEmailInteractor>();
|
_sendEmailInteractor = getBinding<SendEmailInteractor>();
|
||||||
_sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
|
_sendingQueueIsolateManager = getBinding<SendingQueueIsolateManager>();
|
||||||
_sendingEmailCacheManager = getBinding<SendingEmailCacheManager>();
|
_sendingEmailCacheManager = getBinding<SendingEmailCacheManager>();
|
||||||
|
_unsubscribeEmailInteractor = getBinding<UnsubscribeEmailInteractor>();
|
||||||
}
|
}
|
||||||
|
|
||||||
void _updatingSendingStateToMainUI({String? sendingId, SendingState? sendingState}) {
|
void _updatingSendingStateToMainUI({String? sendingId, SendingState? sendingState}) {
|
||||||
@@ -204,7 +214,12 @@ class SendingEmailWorker extends Worker {
|
|||||||
}
|
}
|
||||||
|
|
||||||
void _handleSendEmailSuccess(SendEmailSuccess success) {
|
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) {
|
void _handleSendEmailFailure(SendEmailFailure failure) {
|
||||||
@@ -246,4 +261,21 @@ class SendingEmailWorker extends Worker {
|
|||||||
UserName? userName
|
UserName? userName
|
||||||
}
|
}
|
||||||
) => TupleKey(sendingId, sendingState.name, accountId?.asString, userName?.value).toString();
|
) => 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,
|
mailboxNameRequest?.name,
|
||||||
creationIdRequest?.value,
|
creationIdRequest?.value,
|
||||||
sendingState.name,
|
sendingState.name,
|
||||||
|
previousEmailId?.asString,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -34,7 +35,8 @@ extension SendingEmailExtension on SendingEmail {
|
|||||||
emailIdDestroyed: emailIdDestroyed,
|
emailIdDestroyed: emailIdDestroyed,
|
||||||
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
|
emailIdAnsweredOrForwarded: emailIdAnsweredOrForwarded,
|
||||||
identityId: identityId,
|
identityId: identityId,
|
||||||
storedSendingId: sendingId
|
storedSendingId: sendingId,
|
||||||
|
previousEmailId: previousEmailId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -51,7 +53,8 @@ extension SendingEmailExtension on SendingEmail {
|
|||||||
mailboxNameRequest: mailboxNameRequest,
|
mailboxNameRequest: mailboxNameRequest,
|
||||||
creationIdRequest: creationIdRequest,
|
creationIdRequest: creationIdRequest,
|
||||||
sendingState: sendingState,
|
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,
|
mailboxNameRequest: mailboxNameRequest,
|
||||||
creationIdRequest: creationIdRequest,
|
creationIdRequest: creationIdRequest,
|
||||||
sendingState: sendingState,
|
sendingState: sendingState,
|
||||||
selectMode: SelectMode.INACTIVE
|
selectMode: SelectMode.INACTIVE,
|
||||||
|
previousEmailId: previousEmailId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -85,7 +89,8 @@ extension SendingEmailExtension on SendingEmail {
|
|||||||
mailboxNameRequest: mailboxNameRequest,
|
mailboxNameRequest: mailboxNameRequest,
|
||||||
creationIdRequest: creationIdRequest,
|
creationIdRequest: creationIdRequest,
|
||||||
sendingState: newState,
|
sendingState: newState,
|
||||||
selectMode: selectMode
|
selectMode: selectMode,
|
||||||
|
previousEmailId: previousEmailId,
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -31,6 +31,7 @@ class SendingEmail with EquatableMixin {
|
|||||||
final DateTime createTime;
|
final DateTime createTime;
|
||||||
final SelectMode selectMode;
|
final SelectMode selectMode;
|
||||||
final SendingState sendingState;
|
final SendingState sendingState;
|
||||||
|
final EmailId? previousEmailId;
|
||||||
|
|
||||||
SendingEmail({
|
SendingEmail({
|
||||||
required this.sendingId,
|
required this.sendingId,
|
||||||
@@ -44,7 +45,8 @@ class SendingEmail with EquatableMixin {
|
|||||||
this.mailboxNameRequest,
|
this.mailboxNameRequest,
|
||||||
this.creationIdRequest,
|
this.creationIdRequest,
|
||||||
this.selectMode = SelectMode.INACTIVE,
|
this.selectMode = SelectMode.INACTIVE,
|
||||||
this.sendingState = SendingState.waiting
|
this.sendingState = SendingState.waiting,
|
||||||
|
this.previousEmailId,
|
||||||
});
|
});
|
||||||
|
|
||||||
Map<String, dynamic> toJson() {
|
Map<String, dynamic> toJson() {
|
||||||
@@ -66,6 +68,7 @@ class SendingEmail with EquatableMixin {
|
|||||||
writeNotNull('identityId', const IdentityIdNullableConverter().toJson(identityId));
|
writeNotNull('identityId', const IdentityIdNullableConverter().toJson(identityId));
|
||||||
writeNotNull('mailboxNameRequest', mailboxNameRequest?.name);
|
writeNotNull('mailboxNameRequest', mailboxNameRequest?.name);
|
||||||
writeNotNull('creationIdRequest', const IdNullableConverter().toJson(creationIdRequest));
|
writeNotNull('creationIdRequest', const IdNullableConverter().toJson(creationIdRequest));
|
||||||
|
writeNotNull('previousEmailId', const EmailIdNullableConverter().toJson(previousEmailId));
|
||||||
|
|
||||||
return val;
|
return val;
|
||||||
}
|
}
|
||||||
@@ -88,6 +91,7 @@ class SendingEmail with EquatableMixin {
|
|||||||
identityId: const IdentityIdNullableConverter().fromJson(json['identityId'] as String?),
|
identityId: const IdentityIdNullableConverter().fromJson(json['identityId'] as String?),
|
||||||
mailboxNameRequest: const MailboxNameConverter().fromJson(json['mailboxNameRequest'] as String?),
|
mailboxNameRequest: const MailboxNameConverter().fromJson(json['mailboxNameRequest'] as String?),
|
||||||
creationIdRequest: const IdNullableConverter().fromJson(json['creationIdRequest'] 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,
|
creationIdRequest,
|
||||||
selectMode,
|
selectMode,
|
||||||
sendingState,
|
sendingState,
|
||||||
|
previousEmailId,
|
||||||
];
|
];
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user