Get state cache by AccountId

(cherry picked from commit 9bb1de613ca58e5a7cb66fbc97ecd308754d088b)
This commit is contained in:
dab246
2023-04-25 16:00:25 +07:00
committed by Dat Vu
parent 06277d3532
commit eb27022a08
29 changed files with 50 additions and 49 deletions
@@ -18,8 +18,8 @@ class SaveEmailAsDraftsInteractor {
yield Right<Failure, Success>(SaveEmailAsDraftsLoading()); yield Right<Failure, Success>(SaveEmailAsDraftsLoading());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -25,8 +25,8 @@ class SendEmailInteractor {
yield Right<Failure, Success>(SendingEmailState()); yield Right<Failure, Success>(SendingEmailState());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -20,8 +20,8 @@ class UpdateEmailDraftsInteractor {
yield Right<Failure, Success>(UpdatingEmailDrafts()); yield Right<Failure, Success>(UpdatingEmailDrafts());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -171,7 +171,7 @@ class EmailRepositoryImpl extends EmailRepository {
} }
@override @override
Future<jmap.State?> getEmailState() { Future<jmap.State?> getEmailState(AccountId accountId) {
return _stateDataSource.getState(StateType.email); return _stateDataSource.getState(accountId, StateType.email);
} }
} }
@@ -85,5 +85,5 @@ abstract class EmailRepository {
Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId); Future<bool> deleteEmailPermanently(Session session, AccountId accountId, EmailId emailId);
Future<jmap.State?> getEmailState(); Future<jmap.State?> getEmailState(AccountId accountId);
} }
@@ -18,8 +18,8 @@ class DeleteEmailPermanentlyInteractor {
yield Right<Failure, Success>(StartDeleteEmailPermanently()); yield Right<Failure, Success>(StartDeleteEmailPermanently());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -18,8 +18,8 @@ class DeleteMultipleEmailsPermanentlyInteractor {
yield Right<Failure, Success>(LoadingDeleteMultipleEmailsPermanentlyAll()); yield Right<Failure, Success>(LoadingDeleteMultipleEmailsPermanentlyAll());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -12,7 +12,7 @@ class GetStoredEmailStateInteractor {
Stream<Either<Failure, Success>> execute(AccountId accountId) async* { Stream<Either<Failure, Success>> execute(AccountId accountId) async* {
try { try {
final state = await _emailRepository.getEmailState(); final state = await _emailRepository.getEmailState(accountId);
if (state != null) { if (state != null) {
yield Right<Failure, Success>(GetStoredEmailStateSuccess(state)); yield Right<Failure, Success>(GetStoredEmailStateSuccess(state));
} else { } else {
@@ -17,8 +17,8 @@ class MarkAsEmailReadInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, ReadActions readAction) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, ReadActions readAction) async* {
try { try {
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -14,7 +14,7 @@ class MarkAsStarEmailInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, MarkStarAction markStarAction) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, Email email, MarkStarAction markStarAction) async* {
try { try {
final currentEmailState = await emailRepository.getEmailState(); final currentEmailState = await emailRepository.getEmailState(accountId);
final result = await emailRepository.markAsStar(session, accountId, [email], markStarAction); final result = await emailRepository.markAsStar(session, accountId, [email], markStarAction);
if (result.isNotEmpty) { if (result.isNotEmpty) {
final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords); final updatedEmail = email.updatedEmail(newKeywords: result.first.keywords);
@@ -18,8 +18,8 @@ class MoveToMailboxInteractor {
yield Right(LoadingMoveToMailbox()); yield Right(LoadingMoveToMailbox());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -4,7 +4,7 @@ import 'package:tmail_ui_user/features/mailbox/data/model/state_cache.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart'; import 'package:tmail_ui_user/features/mailbox/data/model/state_type.dart';
abstract class StateDataSource { abstract class StateDataSource {
Future<State?> getState(StateType stateType); Future<State?> getState(AccountId accountId, StateType stateType);
Future<void> saveState(AccountId accountId, StateCache stateCache); Future<void> saveState(AccountId accountId, StateCache stateCache);
} }
@@ -18,9 +18,10 @@ class StateDataSourceImpl extends StateDataSource {
StateDataSourceImpl(this._stateCacheClient, this._exceptionThrower); StateDataSourceImpl(this._stateCacheClient, this._exceptionThrower);
@override @override
Future<State?> getState(StateType stateType) { Future<State?> getState(AccountId accountId, StateType stateType) {
return Future.sync(() async { return Future.sync(() async {
final stateCache = await _stateCacheClient.getItem(stateType.value); final stateKey = TupleKey(stateType.value, accountId.asString).toString();
final stateCache = await _stateCacheClient.getItem(stateKey);
return stateCache?.toState(); return stateCache?.toState();
}).catchError(_exceptionThrower.throwException); }).catchError(_exceptionThrower.throwException);
} }
@@ -40,7 +40,7 @@ class MailboxRepositoryImpl extends MailboxRepository {
Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async* { Stream<MailboxResponse> getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async* {
final localMailboxResponse = await Future.wait([ final localMailboxResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId),
stateDataSource.getState(StateType.mailbox) stateDataSource.getState(accountId, StateType.mailbox)
]).then((List response) { ]).then((List response) {
return MailboxResponse(mailboxes: response.first, state: response.last); return MailboxResponse(mailboxes: response.first, state: response.last);
}); });
@@ -84,7 +84,7 @@ class MailboxRepositoryImpl extends MailboxRepository {
final newMailboxResponse = await Future.wait([ final newMailboxResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId),
stateDataSource.getState(StateType.mailbox) stateDataSource.getState(accountId, StateType.mailbox)
]).then((List response) { ]).then((List response) {
return MailboxResponse(mailboxes: response.first, state: response.last); return MailboxResponse(mailboxes: response.first, state: response.last);
}); });
@@ -147,7 +147,7 @@ class MailboxRepositoryImpl extends MailboxRepository {
final newMailboxResponse = await Future.wait([ final newMailboxResponse = await Future.wait([
mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId),
stateDataSource.getState(StateType.mailbox) stateDataSource.getState(accountId, StateType.mailbox)
]).then((List response) { ]).then((List response) {
return MailboxResponse(mailboxes: response.first, state: response.last); return MailboxResponse(mailboxes: response.first, state: response.last);
}); });
@@ -191,8 +191,8 @@ class MailboxRepositoryImpl extends MailboxRepository {
} }
@override @override
Future<State?> getMailboxState() { Future<State?> getMailboxState(AccountId accountId) {
return stateDataSource.getState(StateType.mailbox); return stateDataSource.getState(accountId, StateType.mailbox);
} }
@override @override
@@ -38,7 +38,7 @@ abstract class MailboxRepository {
Future<bool> moveMailbox(Session session, AccountId accountId, MoveMailboxRequest request); Future<bool> moveMailbox(Session session, AccountId accountId, MoveMailboxRequest request);
Future<State?> getMailboxState(); Future<State?> getMailboxState(AccountId accountId);
Future<bool> subscribeMailbox(Session session, AccountId accountId, SubscribeMailboxRequest request); Future<bool> subscribeMailbox(Session session, AccountId accountId, SubscribeMailboxRequest request);
@@ -19,7 +19,7 @@ class CreateNewMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingCreateNewMailbox()); yield Right<Failure, Success>(LoadingCreateNewMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final newMailbox = await _mailboxRepository.createNewMailbox(session, accountId, newMailboxRequest); final newMailbox = await _mailboxRepository.createNewMailbox(session, accountId, newMailboxRequest);
if (newMailbox != null) { if (newMailbox != null) {
yield Right<Failure, Success>(CreateNewMailboxSuccess( yield Right<Failure, Success>(CreateNewMailboxSuccess(
@@ -22,7 +22,7 @@ class DeleteMultipleMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingDeleteMultipleMailboxAll()); yield Right<Failure, Success>(LoadingDeleteMultipleMailboxAll());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final listResult = await Future.wait( final listResult = await Future.wait(
mapMailboxIdToDelete.keys.map((mailboxId) { mapMailboxIdToDelete.keys.map((mailboxId) {
@@ -28,8 +28,8 @@ class MarkAsMailboxReadInteractor {
onProgressController.add(Right(MarkAsMailboxReadLoading())); onProgressController.add(Right(MarkAsMailboxReadLoading()));
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -15,7 +15,7 @@ class MoveMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingMoveMailbox()); yield Right<Failure, Success>(LoadingMoveMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final result = await _mailboxRepository.moveMailbox(session, accountId, request); final result = await _mailboxRepository.moveMailbox(session, accountId, request);
if (result) { if (result) {
yield Right<Failure, Success>(MoveMailboxSuccess( yield Right<Failure, Success>(MoveMailboxSuccess(
@@ -15,7 +15,7 @@ class RenameMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingRenameMailbox()); yield Right<Failure, Success>(LoadingRenameMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final result = await _mailboxRepository.renameMailbox(session, accountId, request); final result = await _mailboxRepository.renameMailbox(session, accountId, request);
if (result) { if (result) {
@@ -16,7 +16,7 @@ class SubscribeMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingSubscribeMailbox()); yield Right<Failure, Success>(LoadingSubscribeMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final result = await _mailboxRepository.subscribeMailbox(session, accountId, request); final result = await _mailboxRepository.subscribeMailbox(session, accountId, request);
@@ -20,7 +20,7 @@ class SubscribeMultipleMailboxInteractor {
try { try {
yield Right<Failure, Success>(LoadingSubscribeMultipleMailbox()); yield Right<Failure, Success>(LoadingSubscribeMultipleMailbox());
final currentMailboxState = await _mailboxRepository.getMailboxState(); final currentMailboxState = await _mailboxRepository.getMailboxState(accountId);
final listResult = await _mailboxRepository.subscribeMultipleMailbox(session, accountId, subscribeRequest); final listResult = await _mailboxRepository.subscribeMultipleMailbox(session, accountId, subscribeRequest);
final matchedSize = listResult.length == subscribeRequest.mailboxIdsSubscribe.length; final matchedSize = listResult.length == subscribeRequest.mailboxIdsSubscribe.length;
@@ -16,8 +16,8 @@ class RemoveEmailDraftsInteractor {
Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* { Stream<Either<Failure, Success>> execute(Session session, AccountId accountId, EmailId emailId) async* {
try { try {
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -29,7 +29,7 @@ class GetEmailChangesToRemoveNotificationInteractor {
try { try {
yield Right<Failure, Success>(GetEmailChangesToRemoveNotificationLoading()); yield Right<Failure, Success>(GetEmailChangesToRemoveNotificationLoading());
final currentState = await _emailRepository.getEmailState(); final currentState = await _emailRepository.getEmailState(accountId);
log('GetEmailChangesToRemoveNotificationInteractor::execute():currentState: $currentState'); log('GetEmailChangesToRemoveNotificationInteractor::execute():currentState: $currentState');
if (currentState != null) { if (currentState != null) {
final emailIds = await _fcmRepository.getEmailChangesToRemoveNotification( final emailIds = await _fcmRepository.getEmailChangesToRemoveNotification(
@@ -51,7 +51,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort, sort: sort,
limit: limit, limit: limit,
filterOption: emailFilter?.filterOption), filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email) stateDataSource.getState(accountId, StateType.email)
]).then((List response) { ]).then((List response) {
return EmailsResponse(emailList: response.first, state: response.last); return EmailsResponse(emailList: response.first, state: response.last);
}); });
@@ -110,7 +110,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort, sort: sort,
limit: limit, limit: limit,
filterOption: emailFilter?.filterOption), filterOption: emailFilter?.filterOption),
stateDataSource.getState(StateType.email) stateDataSource.getState(accountId, StateType.email)
]).then((List response) { ]).then((List response) {
return EmailsResponse(emailList: response.first, state: response.last); return EmailsResponse(emailList: response.first, state: response.last);
}); });
@@ -224,7 +224,7 @@ class ThreadRepositoryImpl extends ThreadRepository {
sort: sort, sort: sort,
filterOption: emailFilter?.filterOption filterOption: emailFilter?.filterOption
), ),
stateDataSource.getState(StateType.email) stateDataSource.getState(accountId, StateType.email)
]).then((List response) { ]).then((List response) {
return EmailsResponse(emailList: response.first, state: response.last); return EmailsResponse(emailList: response.first, state: response.last);
}); });
@@ -24,8 +24,8 @@ class EmptyTrashFolderInteractor {
yield Right<Failure, Success>(LoadingState()); yield Right<Failure, Success>(LoadingState());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -24,8 +24,8 @@ class MarkAsMultipleEmailReadInteractor {
yield Right(LoadingMarkAsMultipleEmailReadAll()); yield Right(LoadingMarkAsMultipleEmailReadAll());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;
@@ -21,7 +21,7 @@ class MarkAsStarMultipleEmailInteractor {
try { try {
yield Right(LoadingMarkAsStarMultipleEmailAll()); yield Right(LoadingMarkAsStarMultipleEmailAll());
final currentEmailState = await _emailRepository.getEmailState(); final currentEmailState = await _emailRepository.getEmailState(accountId);
final listEmailNeedMarkStar = emails final listEmailNeedMarkStar = emails
.where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred) .where((email) => markStarAction == MarkStarAction.unMarkStar ? email.hasStarred : !email.hasStarred)
@@ -24,8 +24,8 @@ class MoveMultipleEmailToMailboxInteractor {
yield Right(LoadingMoveMultipleEmailToMailboxAll()); yield Right(LoadingMoveMultipleEmailToMailboxAll());
final listState = await Future.wait([ final listState = await Future.wait([
_mailboxRepository.getMailboxState(), _mailboxRepository.getMailboxState(accountId),
_emailRepository.getEmailState(), _emailRepository.getEmailState(accountId),
], eagerError: true); ], eagerError: true);
final currentMailboxState = listState.first; final currentMailboxState = listState.first;