TF-1068 add recent url

This commit is contained in:
sherlockvn
2022-10-20 14:17:20 +07:00
committed by Dat H. Pham
parent 69e7715734
commit 36e3634c71
14 changed files with 312 additions and 0 deletions
@@ -0,0 +1,18 @@
import 'package:hive/hive.dart';
import 'package:tmail_ui_user/features/caching/utils/caching_constants.dart';
class UriAdapter extends TypeAdapter<Uri> {
@override
final int typeId = CachingConstants.URI_CACHE_IDENTITY;
@override
Uri read(BinaryReader reader) {
return Uri.parse(reader.readString());
}
@override
void write(BinaryWriter writer, Uri obj) {
writer.writeString(obj.toString());
}
}
@@ -6,10 +6,12 @@ import 'package:core/utils/app_logger.dart';
import 'package:get/get.dart';
import 'package:hive/hive.dart';
import 'package:path_provider/path_provider.dart' as path_provider;
import 'package:tmail_ui_user/features/caching/adapter/uri_adapter.dart';
import 'package:tmail_ui_user/features/login/data/local/encryption_key_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/model/account_cache.dart';
import 'package:tmail_ui_user/features/login/data/model/authentication_info_cache.dart';
import 'package:tmail_ui_user/features/login/data/model/encryption_key_cache.dart';
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
import 'package:tmail_ui_user/features/login/data/model/token_oidc_cache.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_cache.dart';
import 'package:tmail_ui_user/features/mailbox/data/model/mailbox_rights_cache.dart';
@@ -74,6 +76,8 @@ class HiveCacheConfig {
Hive.registerAdapter(AccountCacheAdapter());
Hive.registerAdapter(EncryptionKeyCacheAdapter());
Hive.registerAdapter(AuthenticationInfoCacheAdapter());
Hive.registerAdapter(UriAdapter());
Hive.registerAdapter(RecentLoginUrlCacheAdapter());
}
Future closeHive() async {
@@ -0,0 +1,126 @@
import 'package:hive/hive.dart';
import 'package:tmail_ui_user/features/caching/config/hive_cache_client.dart';
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
class RecentLoginUrlCacheClient extends HiveCacheClient<RecentLoginUrlCache> {
@override
String get tableName => 'RecentLoginUrlCache';
@override
Future<void> clearAllData() {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.clear();
}).catchError((error) {
throw error;
});
}
@override
Future<void> deleteItem(String key) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.delete(key);
}).catchError((error) {
throw error;
});
}
@override
Future<void> deleteMultipleItem(List<String> listKey) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.deleteAll(listKey);
}).catchError((error) {
throw error;
});
}
@override
Future<List<RecentLoginUrlCache>> getAll() {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.values.toList();
}).catchError((error) {
throw error;
});
}
@override
Future<RecentLoginUrlCache?> getItem(String key) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.get(key);
}).catchError((error) {
throw error;
});
}
@override
Future<void> insertItem(String key, RecentLoginUrlCache newObject) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.put(key, newObject);
}).catchError((error) {
throw error;
});
}
@override
Future<void> insertMultipleItem(Map<String, RecentLoginUrlCache> mapObject) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.putAll(mapObject);
}).catchError((error) {
throw error;
});
}
@override
Future<bool> isExistItem(String key) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.containsKey(key);
}).catchError((error) {
throw error;
});
}
@override
Future<bool> isExistTable() {
return Future.sync(() async {
return Hive.boxExists(tableName);
}).catchError((error) {
throw error;
});
}
@override
Future<Box<RecentLoginUrlCache>> openBox() async {
if (Hive.isBoxOpen(tableName)) {
return Hive.box<RecentLoginUrlCache>(tableName);
}
return Hive.openBox<RecentLoginUrlCache>(tableName);
}
@override
Future<void> updateItem(String key, RecentLoginUrlCache newObject) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.put(key, newObject);
}).catchError((error) {
throw error;
});
}
@override
Future<void> updateMultipleItem(Map<String, RecentLoginUrlCache> mapObject) {
return Future.sync(() async {
final boxRecent = await openBox();
return boxRecent.putAll(mapObject);
}).catchError((error) {
throw error;
});
}
}
@@ -11,4 +11,6 @@ class CachingConstants {
static const int ACCOUNT_HIVE_CACHE_IDENTIFY = 9;
static const int ENCRYPTION_KEY_HIVE_CACHE_IDENTIFY = 10;
static const int AUTHENTICATION_INFO_HIVE_CACHE_IDENTIFY = 11;
static const int URI_CACHE_IDENTITY = 12;
static const int LOGIN_URL_CACHE_IDENTITY = 13;
}
@@ -0,0 +1,5 @@
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
abstract class LoginUrlDataSource {
Future<void> saveLoginUrl(RecentLoginUrl baseUrl);
}
@@ -0,0 +1,26 @@
import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart';
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
import 'package:tmail_ui_user/features/login/data/model/recent_login_url_cache.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
class LoginUrlDataSourceImpl implements LoginUrlDataSource {
final RecentLoginUrlCacheClient _recentLoginUrlCacheClient;
LoginUrlDataSourceImpl(this._recentLoginUrlCacheClient);
@override
Future<void> saveLoginUrl(RecentLoginUrl recentLoginUrl) {
return Future.sync(() async {
final tmpRecentLoginUrl = recentLoginUrl.url.toString();
if(await _recentLoginUrlCacheClient.isExistItem(tmpRecentLoginUrl)){
await _recentLoginUrlCacheClient.updateItem(tmpRecentLoginUrl, recentLoginUrl.toRecentLoginUrlCache());
} else {
await _recentLoginUrlCacheClient.insertItem(tmpRecentLoginUrl, recentLoginUrl.toRecentLoginUrlCache());
}
}).catchError((error) {
throw error;
});
}
}
@@ -0,0 +1,38 @@
import 'package:equatable/equatable.dart';
import 'package:hive/hive.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';
part 'recent_login_url_cache.g.dart';
@HiveType(typeId: CachingConstants.LOGIN_URL_CACHE_IDENTITY)
class RecentLoginUrlCache extends HiveObject with EquatableMixin {
@HiveField(0)
final Uri url;
@HiveField(1)
final DateTime creationDate;
RecentLoginUrlCache(this.url, this.creationDate);
@override
List<Object?> get props => [url, creationDate];
}
extension RecentLoginUrlExtension on RecentLoginUrl {
RecentLoginUrlCache toRecentLoginUrlCache() {
return RecentLoginUrlCache(url, creationDate);
}
}
extension RecentLoginUrlCacheExtension on RecentLoginUrlCache {
RecentLoginUrl toRecentLoginUrl() {
return RecentLoginUrl(url, creationDate);
}
bool matchUrl(Uri pattern) {
return url.toString().toLowerCase().contains(pattern.toString().toLowerCase());
}
}
@@ -0,0 +1,14 @@
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
class LoginUrlRepositoryImpl implements LoginUrlRepository {
final LoginUrlDataSource loginInfoDataSource;
LoginUrlRepositoryImpl(this.loginInfoDataSource);
@override
Future<void> saveRecentLoginUrl(RecentLoginUrl recentLogin) {
return loginInfoDataSource.saveLoginUrl(recentLogin);
}
}
@@ -0,0 +1,14 @@
import 'package:equatable/equatable.dart';
class RecentLoginUrl with EquatableMixin {
final Uri url;
final DateTime creationDate;
RecentLoginUrl(this.url, this.creationDate);
factory RecentLoginUrl.now(Uri url) =>
RecentLoginUrl(url, DateTime.now());
@override
List<Object?> get props => [url, creationDate];
}
@@ -0,0 +1,5 @@
import 'package:tmail_ui_user/features/login/domain/model/recent_login_url.dart';
abstract class LoginUrlRepository {
Future<void> saveRecentLoginUrl(RecentLoginUrl recentLoginUrl);
}
@@ -0,0 +1,20 @@
import 'package:core/presentation/state/failure.dart';
import 'package:core/presentation/state/success.dart';
class SaveRecentLoginUrlSuccess extends UIState {
SaveRecentLoginUrlSuccess();
@override
List<Object> get props => [];
}
class SaveRecentLoginUrlFailed extends FeatureFailure {
final dynamic exception;
SaveRecentLoginUrlFailed(this.exception);
@override
List<Object?> get props => [exception];
}
@@ -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/login/domain/model/recent_login_url.dart';
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
import 'package:tmail_ui_user/features/login/domain/state/save_recent_login_url_state.dart';
class SaveLoginUrlOnMobileInteractor {
final LoginUrlRepository loginUrlRepository;
SaveLoginUrlOnMobileInteractor(this.loginUrlRepository);
Stream<Either<Failure, Success>> execute(RecentLoginUrl recentLoginUrl) async* {
try{
await loginUrlRepository.saveRecentLoginUrl(recentLoginUrl);
yield Right(SaveRecentLoginUrlSuccess());
} catch(e) {
yield Left(SaveRecentLoginUrlFailed(e));
}
}
}
@@ -1,12 +1,15 @@
import 'package:core/core.dart';
import 'package:get/get.dart';
import 'package:tmail_ui_user/features/base/base_bindings.dart';
import 'package:tmail_ui_user/features/caching/recent_login_url_cache_client.dart';
import 'package:tmail_ui_user/features/login/data/datasource/account_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource/authentication_oidc_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource/login_url_datasource.dart';
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_datasource_impl.dart';
import 'package:tmail_ui_user/features/login/data/datasource_impl/authentication_oidc_datasource_impl.dart';
import 'package:tmail_ui_user/features/login/data/datasource_impl/hive_account_datasource_impl.dart';
import 'package:tmail_ui_user/features/login/data/datasource_impl/login_url_datasource_impl.dart';
import 'package:tmail_ui_user/features/login/data/local/account_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/local/oidc_configuration_cache_manager.dart';
import 'package:tmail_ui_user/features/login/data/local/token_oidc_cache_manager.dart';
@@ -16,10 +19,12 @@ import 'package:tmail_ui_user/features/login/data/network/oidc_http_client.dart'
import 'package:tmail_ui_user/features/login/data/repository/account_repository_impl.dart';
import 'package:tmail_ui_user/features/login/data/repository/authentication_oidc_repository_impl.dart';
import 'package:tmail_ui_user/features/login/data/repository/authentication_repository_impl.dart';
import 'package:tmail_ui_user/features/login/data/repository/login_url_repository_impl.dart';
import 'package:tmail_ui_user/features/login/domain/repository/account_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_oidc_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/authentication_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart';
import 'package:tmail_ui_user/features/login/domain/repository/login_url_repository.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authenticate_oidc_on_browser_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/authentication_user_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/check_oidc_is_available_interactor.dart';
@@ -27,6 +32,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/presentation/login_controller.dart';
import 'package:tmail_ui_user/main/bindings/network/binding_tag.dart';
@@ -45,6 +51,7 @@ class LoginBindings extends BaseBindings {
Get.find<AuthenticateOidcOnBrowserInteractor>(),
Get.find<GetAuthenticationInfoInteractor>(),
Get.find<GetStoredOidcConfigurationInteractor>(),
Get.find<SaveLoginUrlOnMobileInteractor>(),
));
}
@@ -53,6 +60,7 @@ class LoginBindings extends BaseBindings {
Get.lazyPut<AuthenticationDataSource>(() => Get.find<AuthenticationDataSourceImpl>());
Get.lazyPut<AuthenticationOIDCDataSource>(() => Get.find<AuthenticationOIDCDataSourceImpl>());
Get.lazyPut<AccountDatasource>(() => Get.find<HiveAccountDatasourceImpl>());
Get.lazyPut<LoginUrlDataSource>(() => Get.find<LoginUrlDataSourceImpl>());
}
@override
@@ -67,6 +75,9 @@ class LoginBindings extends BaseBindings {
Get.lazyPut(() => HiveAccountDatasourceImpl(
Get.find<AccountCacheManager>()
));
Get.lazyPut(() => LoginUrlDataSourceImpl(
Get.find<RecentLoginUrlCacheClient>()
));
}
@override
@@ -96,6 +107,9 @@ class LoginBindings extends BaseBindings {
Get.lazyPut(() => GetStoredOidcConfigurationInteractor(
Get.find<AuthenticationOIDCRepository>(),
));
Get.lazyPut(() => SaveLoginUrlOnMobileInteractor(
Get.find<LoginUrlRepository>(),
));
}
@override
@@ -103,6 +117,7 @@ class LoginBindings extends BaseBindings {
Get.lazyPut<AuthenticationRepository>(() => Get.find<AuthenticationRepositoryImpl>());
Get.lazyPut<AuthenticationOIDCRepository>(() => Get.find<AuthenticationOIDCRepositoryImpl>());
Get.lazyPut<AccountRepository>(() => Get.find<AccountRepositoryImpl>());
Get.lazyPut<LoginUrlRepository>(() => Get.find<LoginUrlRepositoryImpl>());
}
@override
@@ -110,5 +125,6 @@ class LoginBindings extends BaseBindings {
Get.lazyPut(() => AuthenticationRepositoryImpl(Get.find<AuthenticationDataSource>()));
Get.lazyPut(() => AuthenticationOIDCRepositoryImpl(Get.find<AuthenticationOIDCDataSource>()));
Get.lazyPut(() => AccountRepositoryImpl(Get.find<AccountDatasource>()));
Get.lazyPut(() => LoginUrlRepositoryImpl(Get.find<LoginUrlDataSource>()));
}
}
@@ -20,6 +20,7 @@ import 'package:tmail_ui_user/features/login/domain/usecases/get_authentication_
import 'package:tmail_ui_user/features/login/domain/usecases/get_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_stored_oidc_configuration_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/get_token_oidc_interactor.dart';
import 'package:tmail_ui_user/features/login/domain/usecases/save_login_url_on_mobile_interactor.dart';
import 'package:tmail_ui_user/features/login/presentation/login_form_type.dart';
import 'package:tmail_ui_user/features/login/presentation/model/login_arguments.dart';
import 'package:tmail_ui_user/features/login/presentation/state/login_state.dart';
@@ -40,6 +41,7 @@ class LoginController extends BaseController {
final AuthenticateOidcOnBrowserInteractor _authenticateOidcOnBrowserInteractor;
final GetAuthenticationInfoInteractor _getAuthenticationInfoInteractor;
final GetStoredOidcConfigurationInteractor _getStoredOidcConfigurationInteractor;
final SaveLoginUrlOnMobileInteractor _saveLoginUrlOnMobileInteractor;
final TextEditingController urlInputController = TextEditingController();
@@ -56,6 +58,7 @@ class LoginController extends BaseController {
this._authenticateOidcOnBrowserInteractor,
this._getAuthenticationInfoInteractor,
this._getStoredOidcConfigurationInteractor,
this._saveLoginUrlOnMobileInteractor,
);
var loginState = LoginState(Right(LoginInitAction())).obs;