TF-3385 Update cache on set method

This commit is contained in:
DatDang
2025-01-02 17:23:18 +07:00
committed by Dat H. Pham
parent ea283207a7
commit 4bf4113c88
6 changed files with 296 additions and 48 deletions
@@ -13,6 +13,8 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/extensions/list_mailbox_extension.dart';
import 'package:model/extensions/mailbox_extension.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/local/mailbox_cache_manager.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_change_response.dart';
@@ -68,8 +70,26 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
}
@override
Future<bool> renameMailbox(Session session, AccountId accountId, RenameMailboxRequest request) {
throw UnimplementedError();
Future<bool> renameMailbox(
Session session,
AccountId accountId,
RenameMailboxRequest request,
) async {
final cachedMailboxes = await getAllMailboxCache(accountId, session.username);
final updatedMailbox = cachedMailboxes.findMailbox(request.mailboxId);
if (updatedMailbox == null) return false;
final updatedMailboxIndex = cachedMailboxes.indexOf(updatedMailbox);
if (updatedMailboxIndex == -1) return false;
cachedMailboxes[updatedMailboxIndex] = updatedMailbox.copyWith(name: request.newName);
await update(
accountId,
session.username,
updated: cachedMailboxes,
);
return true;
}
@override
@@ -79,12 +99,29 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource {
@override
Future<List<EmailId>> markAsMailboxRead(
Session session,
AccountId accountId,
MailboxId mailboxId,
int totalEmailUnread,
StreamController<dartz.Either<Failure, Success>> onProgressController) {
throw UnimplementedError();
Session session,
AccountId accountId,
MailboxId mailboxId,
int totalEmailUnread,
StreamController<dartz.Either<Failure, Success>> onProgressController,
) async {
final mailboxes = await getAllMailboxCache(accountId, session.username);
final updatedMailbox = mailboxes.findMailbox(mailboxId);
if (updatedMailbox == null) return [];
final updatedMailboxIndex = mailboxes.indexOf(updatedMailbox);
if (updatedMailboxIndex == -1) return [];
mailboxes[updatedMailboxIndex] = updatedMailbox.copyWith(
unreadEmails: UnreadEmails(UnsignedInt(totalEmailUnread)),
);
await _mailboxCacheManager.update(
accountId,
session.username,
updated: mailboxes,
);
return [];
}
@override
@@ -15,8 +15,10 @@ import 'package:jmap_dart_client/jmap/core/unsigned_int.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:jmap_dart_client/jmap/mail/email/email.dart';
import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart';
import 'package:model/email/read_actions.dart';
import 'package:model/extensions/list_mailbox_extension.dart';
import 'package:model/extensions/mailbox_extension.dart';
import 'package:tmail_ui_user/features/email/data/datasource/email_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/mailbox_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/datasource/state_datasource.dart';
import 'package:tmail_ui_user/features/mailbox/data/extensions/state_extension.dart';
@@ -36,10 +38,12 @@ class MailboxRepositoryImpl extends MailboxRepository {
final Map<DataSourceType, MailboxDataSource> mapDataSource;
final StateDataSource stateDataSource;
final EmailDataSource? emailDataSource;
MailboxRepositoryImpl(
this.mapDataSource,
this.stateDataSource,
[this.emailDataSource,]
);
@override
@@ -211,23 +215,44 @@ class MailboxRepositoryImpl extends MailboxRepository {
}
@override
Future<bool> renameMailbox(Session session, AccountId accountId, RenameMailboxRequest request) {
return mapDataSource[DataSourceType.network]!.renameMailbox(session, accountId, request);
Future<bool> renameMailbox(Session session, AccountId accountId, RenameMailboxRequest request) async {
final result = await mapDataSource[DataSourceType.network]
!.renameMailbox(session, accountId, request);
await mapDataSource[DataSourceType.local]
!.renameMailbox(session, accountId, request);
return result;
}
@override
Future<List<EmailId>> markAsMailboxRead(
Session session,
AccountId accountId,
MailboxId mailboxId,
int totalEmailUnread,
StreamController<dartz.Either<Failure, Success>> onProgressController) async {
return mapDataSource[DataSourceType.network]!.markAsMailboxRead(
Session session,
AccountId accountId,
MailboxId mailboxId,
int totalEmailUnread,
StreamController<dartz.Either<Failure, Success>> onProgressController,
) async {
final result = await mapDataSource[DataSourceType.network]!.markAsMailboxRead(
session,
accountId,
mailboxId,
totalEmailUnread,
onProgressController);
await mapDataSource[DataSourceType.local]!.markAsMailboxRead(
session,
accountId,
mailboxId,
totalEmailUnread - result.length,
onProgressController,
);
await emailDataSource?.markAsRead(
session,
accountId,
result,
ReadActions.markAsRead,
);
return result;
}
@override