diff --git a/core/lib/core.dart b/core/lib/core.dart index 9739d5a2e..3aa837295 100644 --- a/core/lib/core.dart +++ b/core/lib/core.dart @@ -13,6 +13,7 @@ export 'presentation/extensions/compare_list_extensions.dart'; export 'presentation/extensions/string_extension.dart'; export 'presentation/extensions/tap_down_details_extension.dart'; export 'domain/extensions/media_type_extension.dart'; +export 'presentation/extensions/map_extensions.dart'; // Exceptions export 'domain/exceptions/download_file_exception.dart'; diff --git a/core/lib/presentation/extensions/map_extensions.dart b/core/lib/presentation/extensions/map_extensions.dart new file mode 100644 index 000000000..a741acb16 --- /dev/null +++ b/core/lib/presentation/extensions/map_extensions.dart @@ -0,0 +1,13 @@ + +extension MapExtensions on Map { + + Map where(bool Function(K, V) condition) { + Map result = {}; + for (var element in entries) { + if (condition(element.key, element.value)) { + result[element.key] = element.value; + } + } + return result; + } +} diff --git a/lib/features/caching/config/hive_cache_client.dart b/lib/features/caching/config/hive_cache_client.dart index 493d7fad2..7debd5d2c 100644 --- a/lib/features/caching/config/hive_cache_client.dart +++ b/lib/features/caching/config/hive_cache_client.dart @@ -1,8 +1,10 @@ import 'dart:typed_data'; +import 'package:core/core.dart'; import 'package:hive/hive.dart'; import 'package:tmail_ui_user/features/caching/config/hive_cache_config.dart'; +import 'package:tmail_ui_user/features/caching/utils/cache_utils.dart'; abstract class HiveCacheClient { @@ -77,6 +79,21 @@ abstract class HiveCacheClient { }); } + Future> getListByCollectionId(String collectionId) { + return Future.sync(() async { + final boxItem = encryption ? await openBoxEncryption() : await openBox(); + return boxItem.toMap() + .where((key, value) { + final tupleKey = TupleKey.fromString(key as String); + return tupleKey.parts.length >= 2 && tupleKey.parts[1] == collectionId; + }) + .values + .toList(); + }).catchError((error) { + throw error; + }); + } + Future updateItem(String key, T newObject) { return Future.sync(() async { final boxItem = encryption diff --git a/lib/features/mailbox/data/datasource/mailbox_datasource.dart b/lib/features/mailbox/data/datasource/mailbox_datasource.dart index 655eae1ad..8994a7a3a 100644 --- a/lib/features/mailbox/data/datasource/mailbox_datasource.dart +++ b/lib/features/mailbox/data/datasource/mailbox_datasource.dart @@ -22,7 +22,7 @@ import 'package:tmail_ui_user/features/mailbox/domain/model/subscribe_multiple_m abstract class MailboxDataSource { Future getAllMailbox(Session session, AccountId accountId, {Properties? properties}); - Future> getAllMailboxCache(); + Future> getAllMailboxCache(AccountId accountId); Future getChanges(Session session, AccountId accountId, State sinceState); diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart index efadf197a..35f23cc4e 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_cache_datasource_impl.dart @@ -47,9 +47,9 @@ class MailboxCacheDataSourceImpl extends MailboxDataSource { } @override - Future> getAllMailboxCache() { + Future> getAllMailboxCache(AccountId accountId) { return Future.sync(() async { - final listMailboxes = await _mailboxCacheManager.getAllMailbox(); + final listMailboxes = await _mailboxCacheManager.getAllMailbox(accountId); return listMailboxes; }).catchError(_exceptionThrower.throwException); } diff --git a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart index 18579a91a..cf87b3c02 100644 --- a/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart +++ b/lib/features/mailbox/data/datasource_impl/mailbox_datasource_impl.dart @@ -51,7 +51,7 @@ class MailboxDataSourceImpl extends MailboxDataSource { } @override - Future> getAllMailboxCache() { + Future> getAllMailboxCache(AccountId accountId) { throw UnimplementedError(); } diff --git a/lib/features/mailbox/data/extensions/list_mailbox_cache_extension.dart b/lib/features/mailbox/data/extensions/list_mailbox_cache_extension.dart new file mode 100644 index 000000000..e50c3d333 --- /dev/null +++ b/lib/features/mailbox/data/extensions/list_mailbox_cache_extension.dart @@ -0,0 +1,8 @@ + +import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_cache_extension.dart'; +import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_cache.dart'; + +extension ListMailboxCacheExtension on List { + List toMailboxList() => map((mailboxCache) => mailboxCache.toMailbox()).toList(); +} \ No newline at end of file diff --git a/lib/features/mailbox/data/local/mailbox_cache_manager.dart b/lib/features/mailbox/data/local/mailbox_cache_manager.dart index 44a8d881a..37d4aa16c 100644 --- a/lib/features/mailbox/data/local/mailbox_cache_manager.dart +++ b/lib/features/mailbox/data/local/mailbox_cache_manager.dart @@ -1,8 +1,10 @@ import 'package:jmap_dart_client/jmap/account_id.dart'; import 'package:jmap_dart_client/jmap/mail/mailbox/mailbox.dart'; +import 'package:model/extensions/account_id_extensions.dart'; import 'package:model/mailbox/presentation_mailbox.dart'; import 'package:tmail_ui_user/features/caching/mailbox_cache_client.dart'; +import 'package:tmail_ui_user/features/mailbox/data/extensions/list_mailbox_cache_extension.dart'; import 'package:tmail_ui_user/features/mailbox/data/extensions/list_mailbox_extension.dart'; import 'package:tmail_ui_user/features/mailbox/data/extensions/list_mailbox_id_extension.dart'; import 'package:tmail_ui_user/features/mailbox/data/extensions/mailbox_cache_extension.dart'; @@ -14,10 +16,9 @@ class MailboxCacheManager { MailboxCacheManager(this._mailboxCacheClient); - Future> getAllMailbox() async { - final mailboxCacheList = await _mailboxCacheClient.getAll(); - final mailboxList = mailboxCacheList.map((mailboxCache) => mailboxCache.toMailbox()).toList(); - return mailboxList; + Future> getAllMailbox(AccountId accountId) async { + final mailboxCacheList = await _mailboxCacheClient.getListByCollectionId(accountId.asString); + return mailboxCacheList.toMailboxList(); } Future update( diff --git a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart index 2ba1bb61d..c4e623749 100644 --- a/lib/features/mailbox/data/repository/mailbox_repository_impl.dart +++ b/lib/features/mailbox/data/repository/mailbox_repository_impl.dart @@ -39,7 +39,7 @@ class MailboxRepositoryImpl extends MailboxRepository { @override Stream getAllMailbox(Session session, AccountId accountId, {Properties? properties}) async* { final localMailboxResponse = await Future.wait([ - mapDataSource[DataSourceType.local]!.getAllMailboxCache(), + mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), stateDataSource.getState(StateType.mailbox) ]).then((List response) { return MailboxResponse(mailboxes: response.first, state: response.last); @@ -83,7 +83,7 @@ class MailboxRepositoryImpl extends MailboxRepository { } final newMailboxResponse = await Future.wait([ - mapDataSource[DataSourceType.local]!.getAllMailboxCache(), + mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), stateDataSource.getState(StateType.mailbox) ]).then((List response) { return MailboxResponse(mailboxes: response.first, state: response.last); @@ -118,7 +118,7 @@ class MailboxRepositoryImpl extends MailboxRepository { @override Stream refresh(Session session, AccountId accountId, State currentState) async* { - final localMailboxList = await mapDataSource[DataSourceType.local]!.getAllMailboxCache(); + final localMailboxList = await mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId); bool hasMoreChanges = true; State? sinceState = currentState; @@ -146,7 +146,7 @@ class MailboxRepositoryImpl extends MailboxRepository { } final newMailboxResponse = await Future.wait([ - mapDataSource[DataSourceType.local]!.getAllMailboxCache(), + mapDataSource[DataSourceType.local]!.getAllMailboxCache(accountId), stateDataSource.getState(StateType.mailbox) ]).then((List response) { return MailboxResponse(mailboxes: response.first, state: response.last); diff --git a/lib/features/push_notification/data/repository/fcm_repository_impl.dart b/lib/features/push_notification/data/repository/fcm_repository_impl.dart index df0848287..8ac272c62 100644 --- a/lib/features/push_notification/data/repository/fcm_repository_impl.dart +++ b/lib/features/push_notification/data/repository/fcm_repository_impl.dart @@ -117,7 +117,7 @@ class FCMRepositoryImpl extends FCMRepository { @override Future> getMailboxesNotPutNotifications(Session session, AccountId accountId) async { - final mailboxesCache = await _mapMailboxDataSource[DataSourceType.local]!.getAllMailboxCache(); + final mailboxesCache = await _mapMailboxDataSource[DataSourceType.local]!.getAllMailboxCache(accountId); final mailboxesCacheNotPutNotifications = mailboxesCache .map((mailbox) => mailbox.toPresentationMailbox()) .where((presentationMailbox) => presentationMailbox.pushNotificationDeactivated)