TF-233 Add mailbox name validator
This commit is contained in:
@@ -0,0 +1,33 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
abstract class VerifyNameException extends Equatable implements Exception {
|
||||
static const EmptyName = 'The name cannot be empty!';
|
||||
static const DuplicatedName = 'The name already exists!';
|
||||
static const NameContainSpecialCharacter = 'The name cannot contain special characters';
|
||||
|
||||
final String? message;
|
||||
|
||||
VerifyNameException(this.message);
|
||||
}
|
||||
|
||||
class EmptyNameException extends VerifyNameException {
|
||||
EmptyNameException() : super(VerifyNameException.EmptyName);
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class DuplicatedNameException extends VerifyNameException {
|
||||
DuplicatedNameException() : super(VerifyNameException.DuplicatedName);
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class SpecialCharacterException extends VerifyNameException {
|
||||
SpecialCharacterException() : super(VerifyNameException.NameContainSpecialCharacter);
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
@@ -0,0 +1,18 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
extension ListValidatorExtension on List<Validator> {
|
||||
Either<Failure, Success> getValidatorNameViewState(NewNameRequest newNameRequest) {
|
||||
for (var validator in this) {
|
||||
final either = validator.validate(newNameRequest);
|
||||
if (either.isLeft()) {
|
||||
return either;
|
||||
}
|
||||
}
|
||||
return Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,6 @@
|
||||
|
||||
extension NameValidatorStringExtension on String {
|
||||
bool hasSpecialCharactersInName() {
|
||||
return RegExp(r'^([@#%^$~!%&*()+=\|{}/<>:;?`])').hasMatch(this);
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/extensions/list_validator_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
class CompositeNameValidator extends Validator<NewNameRequest> {
|
||||
|
||||
final List<Validator> _listValidator;
|
||||
|
||||
CompositeNameValidator(this._listValidator);
|
||||
|
||||
@override
|
||||
Either<Failure, Success> validate(NewNameRequest newNameRequest) {
|
||||
return _listValidator.isNotEmpty
|
||||
? _listValidator.getValidatorNameViewState(newNameRequest)
|
||||
: Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,28 @@
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/exceptions/verify_name_exception.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
class DuplicateNameValidator extends Validator<NewNameRequest> {
|
||||
final List<String> _listName;
|
||||
|
||||
DuplicateNameValidator(this._listName);
|
||||
|
||||
@override
|
||||
Either<Failure, Success> validate(NewNameRequest newNameRequest) {
|
||||
if (newNameRequest.value != null) {
|
||||
final nameExist = _listName
|
||||
.map((nameItem) => nameItem.toLowerCase())
|
||||
.contains(newNameRequest.value!.toLowerCase());
|
||||
if (nameExist) {
|
||||
return Left<Failure, Success>(VerifyNameFailure(DuplicatedNameException()));
|
||||
} else {
|
||||
return Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
} else {
|
||||
return Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,19 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/exceptions/verify_name_exception.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
class EmptyNameValidator extends Validator<NewNameRequest> {
|
||||
|
||||
@override
|
||||
Either<Failure, Success> validate(NewNameRequest newNameRequest) {
|
||||
if (newNameRequest.value == null || newNameRequest.value!.isEmpty) {
|
||||
return Left<Failure, Success>(VerifyNameFailure(EmptyNameException()));
|
||||
} else {
|
||||
return Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
|
||||
import 'package:equatable/equatable.dart';
|
||||
|
||||
class NewNameRequest with EquatableMixin {
|
||||
final String? value;
|
||||
|
||||
NewNameRequest(this.value);
|
||||
|
||||
@override
|
||||
List<Object?> get props => [value];
|
||||
}
|
||||
+20
@@ -0,0 +1,20 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/exceptions/verify_name_exception.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/extensions/name_validator_string_extension.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
class SpecialCharacterValidator extends Validator<NewNameRequest> {
|
||||
|
||||
@override
|
||||
Either<Failure, Success> validate(NewNameRequest newNameRequest) {
|
||||
if (newNameRequest.value != null && newNameRequest.value!.hasSpecialCharactersInName()) {
|
||||
return Left<Failure, Success>(VerifyNameFailure(SpecialCharacterException()));
|
||||
} else {
|
||||
return Right<Failure, Success>(VerifyNameViewState());
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
|
||||
abstract class Validator<T> {
|
||||
Either<Failure, Success> validate(T value);
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
|
||||
class VerifyNameViewState extends UIState {
|
||||
VerifyNameViewState();
|
||||
|
||||
@override
|
||||
List<Object> get props => [];
|
||||
}
|
||||
|
||||
class VerifyNameFailure extends FeatureFailure {
|
||||
final exception;
|
||||
|
||||
VerifyNameFailure(this.exception);
|
||||
@override
|
||||
List<Object> get props => [exception];
|
||||
}
|
||||
@@ -0,0 +1,17 @@
|
||||
|
||||
import 'package:core/core.dart';
|
||||
import 'package:dartz/dartz.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/composite_name_validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/new_name_request.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/model/verification/validator.dart';
|
||||
import 'package:tmail_ui_user/features/mailbox_creator/domain/state/verify_name_view_state.dart';
|
||||
|
||||
class VerifyNameInteractor {
|
||||
Either<Failure, Success> execute(String? newName, List<Validator> listValidator) {
|
||||
try {
|
||||
return CompositeNameValidator(listValidator).validate(NewNameRequest(newName));
|
||||
} catch (exception) {
|
||||
return Left<Failure, Success>(VerifyNameFailure(exception));
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user