package be.simplenotes.domain.usecases.users.delete import arrow.core.Either import arrow.core.extensions.fx import arrow.core.rightIfNotNull import be.simplenotes.domain.security.PasswordHash import be.simplenotes.domain.usecases.repositories.UserRepository import be.simplenotes.domain.usecases.search.NoteSearcher import be.simplenotes.domain.validation.UserValidations internal class DeleteUseCaseImpl( private val userRepository: UserRepository, private val passwordHash: PasswordHash, private val searcher: NoteSearcher, ) : DeleteUseCase { override fun delete(form: DeleteForm) = Either.fx { val user = !UserValidations.validateDelete(form) val persistedUser = !userRepository.find(user.username).rightIfNotNull { DeleteError.Unregistered } !Either.cond( passwordHash.verify(user.password, persistedUser.password), { Unit }, { DeleteError.WrongPassword } ) !Either.cond(userRepository.delete(persistedUser.id), { Unit }, { DeleteError.Unregistered }) searcher.dropIndex(persistedUser.id) } }