diff --git a/lib/features/login/data/extensions/account_cache_extensions.dart b/lib/features/login/data/extensions/account_cache_extensions.dart index 20c61ed71..1217c03b0 100644 --- a/lib/features/login/data/extensions/account_cache_extensions.dart +++ b/lib/features/login/data/extensions/account_cache_extensions.dart @@ -26,4 +26,26 @@ extension AccountCacheExtension on AccountCache { apiUrl: apiUrl, userName: userName != null ? UserName(userName!) : null); } + + AccountCache unselected() { + return AccountCache( + id, + authenticationType, + isSelected: false, + accountId: accountId, + apiUrl: apiUrl, + userName: userName + ); + } + + AccountCache emptyId() { + return AccountCache( + '', + authenticationType, + isSelected: false, + accountId: accountId, + apiUrl: apiUrl, + userName: userName + ); + } } \ No newline at end of file diff --git a/lib/features/login/data/extensions/list_account_cache_extensions.dart b/lib/features/login/data/extensions/list_account_cache_extensions.dart new file mode 100644 index 000000000..fa31cc2f4 --- /dev/null +++ b/lib/features/login/data/extensions/list_account_cache_extensions.dart @@ -0,0 +1,23 @@ +import 'package:collection/collection.dart'; +import 'package:core/utils/app_logger.dart'; +import 'package:tmail_ui_user/features/login/data/extensions/account_cache_extensions.dart'; +import 'package:tmail_ui_user/features/login/data/model/account_cache.dart'; + +extension ListAccountCacheExtension on List { + List unselected() => map((account) => account.unselected()).toList(); + + List removeDuplicated() { + final listAccountId = map((account) => account.accountId).whereNotNull().toSet(); + log('ListAccountCacheExtension::removeDuplicated:listAccountId: $listAccountId'); + retainWhere((account) => listAccountId.remove(account.accountId)); + log('ListAccountCacheExtension::removeDuplicated:listAccount: $this'); + return this; + } + + Map toMap() { + return { + for (var account in this) + account.id: account + }; + } +} \ No newline at end of file diff --git a/lib/features/login/data/local/account_cache_manager.dart b/lib/features/login/data/local/account_cache_manager.dart index e6515644d..3448272f1 100644 --- a/lib/features/login/data/local/account_cache_manager.dart +++ b/lib/features/login/data/local/account_cache_manager.dart @@ -3,6 +3,7 @@ import 'package:core/utils/app_logger.dart'; import 'package:model/account/personal_account.dart'; import 'package:tmail_ui_user/features/caching/clients/account_cache_client.dart'; import 'package:tmail_ui_user/features/login/data/extensions/account_cache_extensions.dart'; +import 'package:tmail_ui_user/features/login/data/extensions/list_account_cache_extensions.dart'; import 'package:tmail_ui_user/features/login/data/extensions/personal_account_extension.dart'; import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; @@ -23,15 +24,26 @@ class AccountCacheManager { } } - Future setCurrentAccount(PersonalAccount account) async { - log('AccountCacheManager::setCurrentAccount(): $account'); - final accountCacheExist = await _accountCacheClient.isExistTable(); - if (accountCacheExist) { - await _accountCacheClient.clearAllData(); + Future setCurrentAccount(PersonalAccount newAccount) async { + log('AccountCacheManager::setCurrentAccount(): $newAccount'); + final newAccountCache = newAccount.toCache(); + final allAccounts = await _accountCacheClient.getAll(); + log('AccountCacheManager::setCurrentAccount::allAccounts(): $allAccounts'); + if (allAccounts.isNotEmpty) { + final newAllAccounts = allAccounts + .unselected() + .removeDuplicated() + .whereNot((account) => account.accountId == newAccountCache.accountId) + .toList(); + if (newAllAccounts.isNotEmpty) { + await _accountCacheClient.clearAllData(); + await _accountCacheClient.updateMultipleItem(newAllAccounts.toMap()); + } } - return _accountCacheClient.insertItem(account.id, account.toCache()); + return _accountCacheClient.insertItem(newAccountCache.id, newAccountCache); } + Future deleteCurrentAccount(String hashId) { log('AccountCacheManager::deleteCurrentAccount(): $hashId'); return _accountCacheClient.deleteItem(hashId); diff --git a/test/features/caching/accountl_cache_test.dart b/test/features/caching/accountl_cache_test.dart new file mode 100644 index 000000000..7e75f126a --- /dev/null +++ b/test/features/caching/accountl_cache_test.dart @@ -0,0 +1,46 @@ + +import 'package:flutter_test/flutter_test.dart'; +import 'package:tmail_ui_user/features/login/data/extensions/list_account_cache_extensions.dart'; +import 'package:tmail_ui_user/features/login/data/model/account_cache.dart'; + +void main() { + group('AccountCache test', () { + test('removeDuplicated should remove duplicate accountId', () async { + final account1 = AccountCache( + '1', + 'oidc', + isSelected: true, + accountId: '1', + userName: '1', + apiUrl: 'https://example.com/jmap' + ); + final account2 = AccountCache( + '2', + 'oidc', + isSelected: true, + accountId: '1', + userName: '1', + apiUrl: 'https://example.com/jmap' + ); + final account3 = AccountCache( + '3', + 'basic', + isSelected: true, + accountId: '2', + userName: '2', + apiUrl: 'https://example.com/jmap' + ); + final account4 = AccountCache( + '4', + 'basic', + isSelected: true, + accountId: '2', + userName: '2', + apiUrl: 'https://example.com/jmap' + ); + + final result = [account1, account2, account3, account4].removeDuplicated(); + expect(result, equals([account1, account3])); + }); + }); +} \ No newline at end of file