diff --git a/lib/features/cleanup/data/datasource/cleanup_datasource.dart b/lib/features/cleanup/data/datasource/cleanup_datasource.dart index 1b7885c1c..e2b87cddf 100644 --- a/lib/features/cleanup/data/datasource/cleanup_datasource.dart +++ b/lib/features/cleanup/data/datasource/cleanup_datasource.dart @@ -1,6 +1,7 @@ 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_login_username_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; abstract class CleanupDataSource { @@ -9,4 +10,6 @@ abstract class CleanupDataSource { Future cleanRecentSearchCache(RecentSearchCleanupRule cleanupRule); Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule); + + Future cleanRecentLoginUsernameCache(RecentLoginUsernameCleanupRule 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 bc3b28c87..f8bc1e1b0 100644 --- a/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart +++ b/lib/features/cleanup/data/datasource_impl/cleanup_datasource_impl.dart @@ -1,9 +1,11 @@ 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_login_username_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_login_username_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'; @@ -12,11 +14,13 @@ class CleanupDataSourceImpl extends CleanupDataSource { final EmailCacheManager emailCacheManager; final RecentSearchCacheManager recentSearchCacheManager; final RecentLoginUrlCacheManager recentLoginUrlCacheManager; + final RecentLoginUsernameCacheManager recentLoginUsernameCacheManager; CleanupDataSourceImpl( this.emailCacheManager, this.recentSearchCacheManager, - this.recentLoginUrlCacheManager + this.recentLoginUrlCacheManager, + this.recentLoginUsernameCacheManager ); @override @@ -45,4 +49,13 @@ class CleanupDataSourceImpl extends CleanupDataSource { throw error; }); } + + @override + Future cleanRecentLoginUsernameCache(RecentLoginUsernameCleanupRule cleanupRule) { + return Future.sync(() async { + return await recentLoginUsernameCacheManager.clean(cleanupRule); + }).catchError((error) { + throw error; + }); + } } \ No newline at end of file diff --git a/lib/features/cleanup/data/local/recent_login_username_cache_manager.dart b/lib/features/cleanup/data/local/recent_login_username_cache_manager.dart new file mode 100644 index 000000000..25c75e3f6 --- /dev/null +++ b/lib/features/cleanup/data/local/recent_login_username_cache_manager.dart @@ -0,0 +1,27 @@ + +import 'package:tmail_ui_user/features/caching/recent_login_username_cache_client.dart'; +import 'package:tmail_ui_user/features/cleanup/domain/model/recent_login_username_cleanup_rule.dart'; +import 'package:tmail_ui_user/features/login/data/model/recent_login_username_cache.dart'; + +class RecentLoginUsernameCacheManager { + + final RecentLoginUsernameCacheClient _recentLoginUsernameCacheClient; + + RecentLoginUsernameCacheManager(this._recentLoginUsernameCacheClient); + + Future clean(RecentLoginUsernameCleanupRule cleanupRule) async { + final recentCacheExist = await _recentLoginUsernameCacheClient.isExistTable(); + if (recentCacheExist) { + final listRecentUsernameCache = await _recentLoginUsernameCacheClient.getAll(); + listRecentUsernameCache.sortByCreationDate(); + + if (listRecentUsernameCache.length > cleanupRule.storageLimit) { + final newListKeyRecent = listRecentUsernameCache + .sublist(cleanupRule.storageLimit) + .map((recent) => recent.username) + .toList(); + await _recentLoginUsernameCacheClient.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 a1a143cf6..20ac616a0 100644 --- a/lib/features/cleanup/data/repository/cleanup_repository_impl.dart +++ b/lib/features/cleanup/data/repository/cleanup_repository_impl.dart @@ -2,6 +2,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_login_username_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'; @@ -25,4 +26,9 @@ class CleanupRepositoryImpl extends CleanupRepository { Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule) { return cleanupDataSource.cleanRecentLoginUrlCache(cleanupRule); } + + @override + Future cleanRecentLoginUsernameCache(RecentLoginUsernameCleanupRule cleanupRule) { + return cleanupDataSource.cleanRecentLoginUsernameCache(cleanupRule); + } } \ No newline at end of file diff --git a/lib/features/cleanup/domain/model/recent_login_username_cleanup_rule.dart b/lib/features/cleanup/domain/model/recent_login_username_cleanup_rule.dart new file mode 100644 index 000000000..c901cb713 --- /dev/null +++ b/lib/features/cleanup/domain/model/recent_login_username_cleanup_rule.dart @@ -0,0 +1,10 @@ +import 'package:tmail_ui_user/features/cleanup/domain/model/cleanup_rule.dart'; + +class RecentLoginUsernameCleanupRule extends CleanupRule { + final int storageLimit; + + RecentLoginUsernameCleanupRule({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 65eaa24e5..9d02cb194 100644 --- a/lib/features/cleanup/domain/repository/cleanup_repository.dart +++ b/lib/features/cleanup/domain/repository/cleanup_repository.dart @@ -1,5 +1,6 @@ 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_login_username_cleanup_rule.dart'; import 'package:tmail_ui_user/features/cleanup/domain/model/recent_search_cleanup_rule.dart'; abstract class CleanupRepository { @@ -8,4 +9,6 @@ abstract class CleanupRepository { Future cleanRecentSearchCache(RecentSearchCleanupRule cleanupRule); Future cleanRecentLoginUrlCache(RecentLoginUrlCleanupRule cleanupRule); + + Future cleanRecentLoginUsernameCache(RecentLoginUsernameCleanupRule cleanupRule); } diff --git a/lib/features/cleanup/domain/state/cleanup_recent_login_username_cache_state.dart b/lib/features/cleanup/domain/state/cleanup_recent_login_username_cache_state.dart new file mode 100644 index 000000000..dcba4cb28 --- /dev/null +++ b/lib/features/cleanup/domain/state/cleanup_recent_login_username_cache_state.dart @@ -0,0 +1,18 @@ +import 'package:core/core.dart'; + +class CleanupRecentLoginUsernameCacheSuccess extends UIState { + + CleanupRecentLoginUsernameCacheSuccess(); + + @override + List get props => []; +} + +class CleanupRecentLoginUsernameCacheFailure extends FeatureFailure { + final dynamic exception; + + CleanupRecentLoginUsernameCacheFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart b/lib/features/cleanup/domain/usecases/cleanup_recent_login_username_interactor.dart new file mode 100644 index 000000000..8cc9cbbd3 --- /dev/null +++ b/lib/features/cleanup/domain/usecases/cleanup_recent_login_username_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_username_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_username_cache_state.dart'; + +class CleanupRecentLoginUsernameCacheInteractor { + final CleanupRepository cleanupRepository; + + CleanupRecentLoginUsernameCacheInteractor(this.cleanupRepository); + + Future> execute(RecentLoginUsernameCleanupRule cleanupRule) async { + try { + await cleanupRepository.cleanRecentLoginUsernameCache(cleanupRule); + return Right(CleanupRecentLoginUsernameCacheSuccess()); + } catch (e) { + return Left(CleanupRecentLoginUsernameCacheFailure(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 a73d78ec7..d5f862805 100644 --- a/lib/features/home/presentation/home_bindings.dart +++ b/lib/features/home/presentation/home_bindings.dart @@ -11,6 +11,7 @@ import 'package:tmail_ui_user/features/cleanup/data/repository/cleanup_repositor 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_login_username_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'; @@ -51,6 +52,7 @@ class HomeBindings extends BaseBindings { Get.find(), Get.find(), Get.find(), + Get.find(), Get.find(), Get.find(), Get.find(), @@ -98,6 +100,7 @@ class HomeBindings extends BaseBindings { Get.lazyPut(() => CleanupEmailCacheInteractor(Get.find())); Get.lazyPut(() => CleanupRecentSearchCacheInteractor(Get.find())); Get.lazyPut(() => CleanupRecentLoginUrlCacheInteractor(Get.find())); + Get.lazyPut(() => CleanupRecentLoginUsernameCacheInteractor(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 a7e2ff4ac..183d6cfc7 100644 --- a/lib/features/home/presentation/home_controller.dart +++ b/lib/features/home/presentation/home_controller.dart @@ -11,9 +11,11 @@ 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_login_username_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_login_username_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'; @@ -39,6 +41,7 @@ class HomeController extends BaseController { final EmailReceiveManager _emailReceiveManager; final CleanupRecentSearchCacheInteractor _cleanupRecentSearchCacheInteractor; final CleanupRecentLoginUrlCacheInteractor _cleanupRecentLoginUrlCacheInteractor; + final CleanupRecentLoginUsernameCacheInteractor _cleanupRecentLoginUsernameCacheInteractor; final DeleteCredentialInteractor _deleteCredentialInteractor; final CachingManager _cachingManager; final DeleteAuthorityOidcInteractor _deleteAuthorityOidcInteractor; @@ -53,6 +56,7 @@ class HomeController extends BaseController { this._emailReceiveManager, this._cleanupRecentSearchCacheInteractor, this._cleanupRecentLoginUrlCacheInteractor, + this._cleanupRecentLoginUsernameCacheInteractor, this._deleteCredentialInteractor, this._cachingManager, this._deleteAuthorityOidcInteractor, @@ -90,7 +94,8 @@ class HomeController extends BaseController { await Future.wait([ _cleanupEmailCacheInteractor.execute(EmailCleanupRule(Duration.defaultCacheInternal)), _cleanupRecentSearchCacheInteractor.execute(RecentSearchCleanupRule()), - _cleanupRecentLoginUrlCacheInteractor.execute(RecentLoginUrlCleanupRule()) + _cleanupRecentLoginUrlCacheInteractor.execute(RecentLoginUrlCleanupRule()), + _cleanupRecentLoginUsernameCacheInteractor.execute(RecentLoginUsernameCleanupRule()), ]).then((value) => _getAuthenticatedAccount()); }