From d6e2f9690fc3997c2a65ddfe3fdb0d8d55b80296 Mon Sep 17 00:00:00 2001 From: dab246 Date: Fri, 21 Oct 2022 12:34:33 +0700 Subject: [PATCH] TF-1068 Cleanup recent list login url when exceeding --- .../data/datasource/cleanup_datasource.dart | 3 +++ .../cleanup_datasource_impl.dart | 18 ++++++++++++- .../local/recent_login_url_cache_manager.dart | 27 +++++++++++++++++++ .../repository/cleanup_repository_impl.dart | 6 +++++ .../model/recent_login_url_cleanup_rule.dart | 11 ++++++++ .../domain/repository/cleanup_repository.dart | 3 +++ .../cleanup_recent_login_url_cache_state.dart | 18 +++++++++++++ ...nup_recent_login_url_cache_interactor.dart | 21 +++++++++++++++ .../home/presentation/home_bindings.dart | 5 ++++ .../home/presentation/home_controller.dart | 7 ++++- .../data/model/recent_login_url_cache.dart | 10 +++++++ lib/main/bindings/local/local_bindings.dart | 2 ++ 12 files changed, 129 insertions(+), 2 deletions(-) create mode 100644 lib/features/cleanup/data/local/recent_login_url_cache_manager.dart create mode 100644 lib/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart create mode 100644 lib/features/cleanup/domain/state/cleanup_recent_login_url_cache_state.dart create mode 100644 lib/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart diff --git a/lib/features/cleanup/data/datasource/cleanup_datasource.dart b/lib/features/cleanup/data/datasource/cleanup_datasource.dart index 05674bdfa..1b7885c1c 100644 --- a/lib/features/cleanup/data/datasource/cleanup_datasource.dart +++ b/lib/features/cleanup/data/datasource/cleanup_datasource.dart @@ -1,9 +1,12 @@ import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; abstract class CleanupDataSource { Future cleanEmailCache(EmailCleanupRule cleanupRule); Future cleanRecentSearchCache(RecentSearchCleanupRule cleanupRule); + + Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule); } \ No newline at end of file diff --git a/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart b/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart index b2167b76a..bc3b28c87 100644 --- a/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart +++ b/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart @@ -1,7 +1,9 @@ import 'package:tmail_ui_user/features/cleanup/data/datasource/cleanup_datasource.dart'; +import 'package:tmail_ui_user/features/cleanup/data/local/recent_login_url_cache_manager.dart'; import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; import 'package:tmail_ui_user/features/thread/data/local/email_cache_manager.dart'; @@ -9,8 +11,13 @@ class CleanupDataSourceImpl extends CleanupDataSource { final EmailCacheManager emailCacheManager; final RecentSearchCacheManager recentSearchCacheManager; + final RecentLoginUrlCacheManager recentLoginUrlCacheManager; - CleanupDataSourceImpl(this.emailCacheManager, this.recentSearchCacheManager); + CleanupDataSourceImpl( + this.emailCacheManager, + this.recentSearchCacheManager, + this.recentLoginUrlCacheManager + ); @override Future cleanEmailCache(EmailCleanupRule cleanupRule) { @@ -29,4 +36,13 @@ class CleanupDataSourceImpl extends CleanupDataSource { throw error; }); } + + @override + Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule) { + return Future.sync(() async { + return await recentLoginUrlCacheManager.clean(cleanupRule); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/cleanup/data/local/recent_login_url_cache_manager.dart b/lib/features/cleanup/data/local/recent_login_url_cache_manager.dart new file mode 100644 index 000000000..8b32cecb2 --- /dev/null +++ b/lib/features/cleanup/data/local/recent_login_url_cache_manager.dart @@ -0,0 +1,27 @@ + +import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart'; + +class RecentLoginUrlCacheManager { + + final RecentLoginUrlCacheClient _recentLoginUrlCacheClient; + + RecentLoginUrlCacheManager(this._recentLoginUrlCacheClient); + + Future clean(RecentLoginUrlCleanupRule cleanupRule) async { + final recentCacheExist = await _recentLoginUrlCacheClient.isExistTable(); + if (recentCacheExist) { + final listRecentUrlCache = await _recentLoginUrlCacheClient.getAll(); + listRecentUrlCache.sortByCreationDate(); + + if (listRecentUrlCache.length > cleanupRule.storageLimit) { + final newListKeyRecent = listRecentUrlCache + .sublist(cleanupRule.storageLimit) + .map((recent) => recent.url) + .toList(); + await _recentLoginUrlCacheClient.deleteMultipleItem(newListKeyRecent); + } + } + } +} \ No newline at end of file diff --git a/lib/features/cleanup/data/repository/cleanup_repository_impl.dart b/lib/features/cleanup/data/repository/cleanup_repository_impl.dart index 58d919970..a1a143cf6 100644 --- a/lib/features/cleanup/data/repository/cleanup_repository_impl.dart +++ b/lib/features/cleanup/data/repository/cleanup_repository_impl.dart @@ -1,6 +1,7 @@ import 'package:tmail_ui_user/features/cleanup/data/datasource/cleanup_datasource.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/repository/cleanup_repository.dart'; @@ -19,4 +20,9 @@ class CleanupRepositoryImpl extends CleanupRepository { Future cleanRecentSearchCache(RecentSearchCleanupRule cleanupRule) { return cleanupDataSource.cleanRecentSearchCache(cleanupRule); } + + @override + Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule) { + return cleanupDataSource.cleanRecentLoginUrlCache(cleanupRule); + } } \ No newline at end of file diff --git a/lib/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart b/lib/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart new file mode 100644 index 000000000..6d8a68cb1 --- /dev/null +++ b/lib/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart @@ -0,0 +1,11 @@ + +import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; + +class RecentLoginUrlCleanupRule extends CleanupRule { + final int storageLimit; + + RecentLoginUrlCleanupRule({this.storageLimit = 10}) : super(); + + @override + List get props => [storageLimit]; +} \ No newline at end of file diff --git a/lib/features/cleanup/domain/repository/cleanup_repository.dart b/lib/features/cleanup/domain/repository/cleanup_repository.dart index 6411709ba..65eaa24e5 100644 --- a/lib/features/cleanup/domain/repository/cleanup_repository.dart +++ b/lib/features/cleanup/domain/repository/cleanup_repository.dart @@ -1,8 +1,11 @@ import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; abstract class CleanupRepository { Future cleanEmailCache(EmailCleanupRule cleanupRule); Future cleanRecentSearchCache(RecentSearchCleanupRule cleanupRule); + + Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule); } diff --git a/lib/features/cleanup/domain/state/cleanup_recent_login_url_cache_state.dart b/lib/features/cleanup/domain/state/cleanup_recent_login_url_cache_state.dart new file mode 100644 index 000000000..6d5c0105c --- /dev/null +++ b/lib/features/cleanup/domain/state/cleanup_recent_login_url_cache_state.dart @@ -0,0 +1,18 @@ +import 'package:core/core.dart'; + +class CleanupRecentLoginUrlCacheSuccess extends UIState { + + CleanupRecentLoginUrlCacheSuccess(); + + @override + List get props => []; +} + +class CleanupRecentLoginUrlCacheFailure extends FeatureFailure { + final dynamic exception; + + CleanupRecentLoginUrlCacheFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart b/lib/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart new file mode 100644 index 000000000..4b2c49b51 --- /dev/null +++ b/lib/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart @@ -0,0 +1,21 @@ +import 'package:core/presentation/state/failure.dart'; +import 'package:core/presentation/state/success.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/repository/cleanup_repository.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/state/cleanup_recent_login_url_cache_state.dart'; + +class CleanupRecentLoginUrlCacheInteractor { + final CleanupRepository cleanupRepository; + + CleanupRecentLoginUrlCacheInteractor(this.cleanupRepository); + + Future> execute(RecentLoginUrlCleanupRule cleanupRule) async { + try { + await cleanupRepository.cleanRecentLoginUrlCache(cleanupRule); + return Right(CleanupRecentLoginUrlCacheSuccess()); + } catch (e) { + return Left(CleanupRecentLoginUrlCacheFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/home/presentation/home_bindings.dart b/lib/features/home/presentation/home_bindings.dart index 7191b1ed5..856a5edd3 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -4,10 +4,12 @@ import 'package:tmail_ui_user/features/base/base_bindings.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/cleanup/data/datasource/cleanup_datasource.dart'; import 'package:tmail_ui_user/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart'; +import 'package:tmail_ui_user/features/cleanup/data/local/recent_login_url_cache_manager.dart'; import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart'; import 'package:tmail_ui_user/features/cleanup/data/repository/cleanup_repository_impl.dart'; import 'package:tmail_ui_user/features/cleanup/domain/repository/cleanup_repository.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cache_interactor.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart'; import 'package:tmail_ui_user/features/home/presentation/home_controller.dart'; import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart'; @@ -47,6 +49,7 @@ class HomeBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -66,6 +69,7 @@ class HomeBindings extends BaseBindings { Get.lazyPut(() => CleanupDataSourceImpl( Get.find(), Get.find(), + Get.find(), )); Get.lazyPut(() => HiveAccountDatasourceImpl( Get.find() @@ -91,6 +95,7 @@ class HomeBindings extends BaseBindings { )); Get.lazyPut(() => CleanupEmailCacheInteractor(Get.find())); Get.lazyPut(() => CleanupRecentSearchCacheInteractor(Get.find())); + Get.lazyPut(() => CleanupRecentLoginUrlCacheInteractor(Get.find())); Get.lazyPut(() => DeleteAuthorityOidcInteractor( Get.find(), Get.find())); diff --git a/lib/features/home/presentation/home_controller.dart b/lib/features/home/presentation/home_controller.dart index 44ee7d921..a7e2ff4ac 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -10,8 +10,10 @@ import 'package:tmail_ui_user/features/base/base_controller.dart'; import 'package:tmail_ui_user/features/caching/caching_manager.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/email_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_url_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_email_cache_interactor.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_login_url_cache_interactor.dart'; import 'package:tmail_ui_user/features/cleanup/domain/usecases/cleanup_recent_search_cache_interactor.dart'; import 'package:tmail_ui_user/features/login/data/network/config/authorization_interceptors.dart'; import 'package:tmail_ui_user/features/login/domain/state/check_oidc_is_available_state.dart'; @@ -36,6 +38,7 @@ class HomeController extends BaseController { final CleanupEmailCacheInteractor _cleanupEmailCacheInteractor; final EmailReceiveManager _emailReceiveManager; final CleanupRecentSearchCacheInteractor _cleanupRecentSearchCacheInteractor; + final CleanupRecentLoginUrlCacheInteractor _cleanupRecentLoginUrlCacheInteractor; final DeleteCredentialInteractor _deleteCredentialInteractor; final CachingManager _cachingManager; final DeleteAuthorityOidcInteractor _deleteAuthorityOidcInteractor; @@ -49,6 +52,7 @@ class HomeController extends BaseController { this._cleanupEmailCacheInteractor, this._emailReceiveManager, this._cleanupRecentSearchCacheInteractor, + this._cleanupRecentLoginUrlCacheInteractor, this._deleteCredentialInteractor, this._cachingManager, this._deleteAuthorityOidcInteractor, @@ -85,7 +89,8 @@ class HomeController extends BaseController { void _cleanupCache() async { await Future.wait([ _cleanupEmailCacheInteractor.execute(EmailCleanupRule(Duration.defaultCacheInternal)), - _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()) + _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()), + _cleanupRecentLoginUrlCacheInteractor.execute(RecentLoginUrlCleanupRule()) ]).then((value) => _getAuthenticatedAccount()); } diff --git a/lib/features/login/data/model/recent_login_url_cache.dart b/lib/features/login/data/model/recent_login_url_cache.dart index 496ebe758..ade8336b5 100644 --- a/lib/features/login/data/model/recent_login_url_cache.dart +++ b/lib/features/login/data/model/recent_login_url_cache.dart @@ -1,5 +1,6 @@ import 'package:equatable/equatable.dart'; import 'package:hive/hive.dart'; +import 'package:jmap_dart_client/jmap/core/extensions/date_time_extension.dart'; import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart'; import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart'; @@ -36,3 +37,12 @@ extension RecentLoginUrlCacheExtension on RecentLoginUrlCache { } } +extension ListRecentLoginUrlCacheExtension on List { + + void sortByCreationDate() { + sort((recentUrl1, recentUrl2) { + return recentUrl1.creationDate.compareToSort(recentUrl2.creationDate, false); + }); + } +} + diff --git a/lib/main/bindings/local/local_bindings.dart b/lib/main/bindings/local/local_bindings.dart index 1c9e6dd2d..72d8ac62c 100644 --- a/lib/main/bindings/local/local_bindings.dart +++ b/lib/main/bindings/local/local_bindings.dart @@ -12,6 +12,7 @@ import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dar import 'package:tmail_ui_user/features/caching/recent_search_cache_client.dart'; import 'package:tmail_ui_user/features/caching/state_cache_client.dart'; import 'package:tmail_ui_user/features/caching/token_oidc_cache_client.dart'; +import 'package:tmail_ui_user/features/cleanup/data/local/recent_login_url_cache_manager.dart'; import 'package:tmail_ui_user/features/cleanup/data/local/recent_search_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart'; import 'package:tmail_ui_user/features/login/data/local/authentication_info_cache_manager.dart'; @@ -53,6 +54,7 @@ class LocalBindings extends Bindings { Get.put(OidcConfigurationCacheManager(Get.find())); Get.put(LanguageCacheManager(Get.find())); Get.put(RecentLoginUrlCacheClient()); + Get.put(RecentLoginUrlCacheManager((Get.find()))); Get.put(CachingManager( Get.find(), Get.find(),