TF-3082 Restore identity from cache

This commit is contained in:
DatDang
2024-08-22 09:13:04 +07:00
committed by Dat H. Pham
parent fdbbf855b6
commit 5a1fdbb123
20 changed files with 456 additions and 45 deletions
@@ -7,4 +7,10 @@ abstract class IdentityCreatorDataSource {
AccountId accountId,
UserName userName,
{required IdentityCache identityCache});
Future<IdentityCache> getIdentityCacheOnWeb(
AccountId accountId,
UserName userName);
Future<void> removeIdentityCacheOnWeb();
}
@@ -1,5 +1,7 @@
import 'dart:convert';
import 'package:collection/collection.dart';
import 'package:core/domain/exceptions/web_session_exception.dart';
import 'package:jmap_dart_client/jmap/account_id.dart';
import 'package:jmap_dart_client/jmap/core/user_name.dart';
import 'package:model/extensions/account_id_extensions.dart';
@@ -31,6 +33,31 @@ class LocalIdentityCreatorDataSourceImpl implements IdentityCreatorDataSource {
window.sessionStorage.addAll(entries);
}).catchError(_exceptionThrower.throwException);
}
@override
Future<IdentityCache> getIdentityCacheOnWeb(
AccountId accountId,
UserName userName
) async {
return Future.sync(() {
final cacheKey = _generateTupleKey(accountId, userName);
final result = window.sessionStorage.entries.firstWhereOrNull(
(entry) => entry.key == cacheKey);
if (result != null) {
return IdentityCacheModel.fromJson(jsonDecode(result.value));
} else {
throw NotFoundInWebSessionException();
}
}).catchError(_exceptionThrower.throwException);
}
@override
Future<void> removeIdentityCacheOnWeb() async {
return Future.sync(() {
window.sessionStorage.removeWhere(
(key, value) => key.startsWith(LocalIdentityCreatorDataSourceImpl.sessionStorageKeyword));
}).catchError(_exceptionThrower.throwException);
}
String _generateTupleKey(AccountId accountId, UserName userName) {
return TupleKey(
@@ -18,4 +18,16 @@ class IdentityCreatorRepositoryImpl implements IdentityCreatorRepository {
accountId,
userName,
identityCache: identityCache);
@override
Future<IdentityCache> getIdentityCacheOnWeb(
AccountId accountId,
UserName userName
) => _identityCreatorDataSource.getIdentityCacheOnWeb(
accountId,
userName);
@override
Future<void> removeIdentityCacheOnWeb()
=> _identityCreatorDataSource.removeIdentityCacheOnWeb();
}