From f17d6630a5f952f4363a7ec13440e9f2d9001851 Mon Sep 17 00:00:00 2001 From: dab246 Date: Tue, 27 Jul 2021 12:54:40 +0700 Subject: [PATCH] Init login feature add domain layer --- .../exceptions/authentication_exception.dart | 14 +++++++++ .../domain/extensions/uri_extension.dart | 5 +++ .../repository/authentication_repository.dart | 5 +++ .../repository/credential_repository.dart | 21 +++++++++++++ .../state/authentication_user_state.dart | 20 ++++++++++++ .../domain/state/get_credential_state.dart | 24 ++++++++++++++ .../authentication_user_interactor.dart | 27 ++++++++++++++++ .../usecases/get_credential_interactor.dart | 31 +++++++++++++++++++ 8 files changed, 147 insertions(+) create mode 100644 lib/features/login/domain/exceptions/authentication_exception.dart create mode 100644 lib/features/login/domain/extensions/uri_extension.dart create mode 100644 lib/features/login/domain/repository/authentication_repository.dart create mode 100644 lib/features/login/domain/repository/credential_repository.dart create mode 100644 lib/features/login/domain/state/authentication_user_state.dart create mode 100644 lib/features/login/domain/state/get_credential_state.dart create mode 100644 lib/features/login/domain/usecases/authentication_user_interactor.dart create mode 100644 lib/features/login/domain/usecases/get_credential_interactor.dart diff --git a/lib/features/login/domain/exceptions/authentication_exception.dart b/lib/features/login/domain/exceptions/authentication_exception.dart new file mode 100644 index 000000000..9463daa82 --- /dev/null +++ b/lib/features/login/domain/exceptions/authentication_exception.dart @@ -0,0 +1,14 @@ +import 'package:equatable/equatable.dart'; + +abstract class AuthenticationException extends Equatable { + static final wrongCredential = 'Credential is wrong'; + + AuthenticationException(String message); +} + +class BadCredentials extends AuthenticationException { + BadCredentials() : super(AuthenticationException.wrongCredential); + + @override + List get props => []; +} \ No newline at end of file diff --git a/lib/features/login/domain/extensions/uri_extension.dart b/lib/features/login/domain/extensions/uri_extension.dart new file mode 100644 index 000000000..145609682 --- /dev/null +++ b/lib/features/login/domain/extensions/uri_extension.dart @@ -0,0 +1,5 @@ +// + +extension UriExtension on Uri { + bool isBaseUrlValid() => origin.isNotEmpty; +} \ No newline at end of file diff --git a/lib/features/login/domain/repository/authentication_repository.dart b/lib/features/login/domain/repository/authentication_repository.dart new file mode 100644 index 000000000..1582de203 --- /dev/null +++ b/lib/features/login/domain/repository/authentication_repository.dart @@ -0,0 +1,5 @@ +import 'package:model/model.dart'; + +abstract class AuthenticationRepository { + Future authenticationUser(Uri baseUrl, UserName userName, Password password); +} \ No newline at end of file diff --git a/lib/features/login/domain/repository/credential_repository.dart b/lib/features/login/domain/repository/credential_repository.dart new file mode 100644 index 000000000..3b07a313e --- /dev/null +++ b/lib/features/login/domain/repository/credential_repository.dart @@ -0,0 +1,21 @@ +import 'package:model/model.dart'; + +abstract class CredentialRepository { + Future saveBaseUrl(Uri baseUrl); + + Future removeBaseUrl(); + + Future getBaseUrl(); + + Future saveUserName(UserName userName); + + Future removeUserName(); + + Future getUserName(); + + Future savePassword(Password password); + + Future removePassword(); + + Future getPassword(); +} \ No newline at end of file diff --git a/lib/features/login/domain/state/authentication_user_state.dart b/lib/features/login/domain/state/authentication_user_state.dart new file mode 100644 index 000000000..9c3d57887 --- /dev/null +++ b/lib/features/login/domain/state/authentication_user_state.dart @@ -0,0 +1,20 @@ +import 'package:core/core.dart'; +import 'package:model/model.dart'; + +class AuthenticationUserViewState extends ViewState { + final User user; + + AuthenticationUserViewState(this.user); + + @override + List get props => [user]; +} + +class AuthenticationUserFailure extends FeatureFailure { + final exception; + + AuthenticationUserFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/login/domain/state/get_credential_state.dart b/lib/features/login/domain/state/get_credential_state.dart new file mode 100644 index 000000000..1e579a2b3 --- /dev/null +++ b/lib/features/login/domain/state/get_credential_state.dart @@ -0,0 +1,24 @@ +import 'package:core/core.dart'; +import 'package:core/presentation/state/failure.dart'; +import 'package:model/account/password.dart'; +import 'package:model/account/user_name.dart'; + +class GetCredentialViewState extends ViewState { + final Uri baseUrl; + final UserName userName; + final Password password; + + GetCredentialViewState(this.baseUrl, this.userName, this.password); + + @override + List get props => [baseUrl, this.userName, this.password]; +} + +class GetCredentialFailure extends FeatureFailure { + final exception; + + GetCredentialFailure(this.exception); + + @override + List get props => [exception]; +} \ No newline at end of file diff --git a/lib/features/login/domain/usecases/authentication_user_interactor.dart b/lib/features/login/domain/usecases/authentication_user_interactor.dart new file mode 100644 index 000000000..2f3206681 --- /dev/null +++ b/lib/features/login/domain/usecases/authentication_user_interactor.dart @@ -0,0 +1,27 @@ +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:model/model.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/state/authentication_user_state.dart'; + +class AuthenticationInteractor { + final AuthenticationRepository authenticationRepository; + final CredentialRepository credentialRepository; + + AuthenticationInteractor(this.authenticationRepository, this.credentialRepository); + + Future> execute(Uri baseUrl, UserName userName, Password password) async { + try { + final user = await authenticationRepository.authenticationUser(baseUrl, userName, password); + await Future.wait([ + credentialRepository.saveBaseUrl(baseUrl), + credentialRepository.saveUserName(userName), + credentialRepository.savePassword(password) + ]); + return Right(AuthenticationUserViewState(user)); + } catch (e) { + return Left(AuthenticationUserFailure(e)); + } + } +} \ No newline at end of file diff --git a/lib/features/login/domain/usecases/get_credential_interactor.dart b/lib/features/login/domain/usecases/get_credential_interactor.dart new file mode 100644 index 000000000..1ef88d2e1 --- /dev/null +++ b/lib/features/login/domain/usecases/get_credential_interactor.dart @@ -0,0 +1,31 @@ +import 'package:core/core.dart'; +import 'package:dartz/dartz.dart'; +import 'package:tmail_ui_user/features/login/domain/exceptions/authentication_exception.dart'; +import 'dart:core'; + +import 'package:tmail_ui_user/features/login/domain/repository/credential_repository.dart'; +import 'package:tmail_ui_user/features/login/domain/extensions/uri_extension.dart'; +import 'package:tmail_ui_user/features/login/domain/state/get_credential_state.dart'; + +class GetCredentialInteractor { + final CredentialRepository credentialRepository; + + GetCredentialInteractor(this.credentialRepository); + + Future> execute() async { + try { + final baseUrl = await credentialRepository.getBaseUrl(); + final userName = await credentialRepository.getUserName(); + final password = await credentialRepository.getPassword(); + if (isCredentialValid(baseUrl)) { + return Right(GetCredentialViewState(baseUrl, userName, password)); + } else { + return Left(GetCredentialFailure(BadCredentials())); + } + } catch (exception) { + return Left(GetCredentialFailure(exception)); + } + } + + bool isCredentialValid(Uri baseUrl) => baseUrl.isBaseUrlValid(); +} \ No newline at end of file