Mam klasę AccountCreator z metodą create, która przyjmuje DTO z danymi potrzebnymi do utworzenia konta. Na początku jest próba stworzenia 2 value objectów (UserName i Password), potem walidacja unikalności user name, utworzenie encji Account, która przyjmuje w konstruktorze te 2 value objecty i zapisanie w repo. Oczywiście mogą zostać zwrócone błędy typu nieprawidłowa długość hasła itd. Użyłem do tego Eitherów i teraz pytanie czy ten kod jest ok czy może da się to jakoś lepiej zapisać?
public Either<Error, AccountDto> create(AccountCreateDto accountCreateDto) {
final var errorType = ErrorType.ACCOUNT_PERSISTENCE_ERROR;
final var errorMessage = "Not unique user name: " + accountCreateDto.userName;
final var error = new Error(errorType,errorMessage);
return UserName
.create(accountCreateDto.userName)
.flatMap(userName ->
userNameUniquenessChecker.isUnique(userName.text) ?
Password
.create(accountCreateDto.password)
.flatMap(password -> {
final var createdAccount = new Account(
userName,
password,
AccountStatus.OPEN,
LocalDateTime.now(),
new ArrayList<>());
final var addedAccount= accountRepository.add(createdAccount);
final var accountDto = new AccountDto(
addedAccount.userName.text,
addedAccount.password.text,
addedAccount.status,
addedAccount.creationDate,
(long) addedAccount.tasks.size());
return Either.right(accountDto);
}) : Either.left(error));