package be.simplenotes.domain.usecases.users.register import arrow.core.Either import arrow.core.filterOrElse import arrow.core.leftIfNull import be.simplenotes.types.PersistedUser import be.simplenotes.domain.security.PasswordHash import be.simplenotes.domain.usecases.repositories.UserRepository import be.simplenotes.domain.validation.UserValidations internal class RegisterUseCaseImpl( private val userRepository: UserRepository, private val passwordHash: PasswordHash ) : RegisterUseCase { override fun register(form: RegisterForm): Either { return UserValidations.validateRegister(form) .filterOrElse({ !userRepository.exists(it.username) }, { UserExists }) .map { it.copy(password = passwordHash.crypt(it.password)) } .map { userRepository.create(it) } .leftIfNull { UserExists } } }