package be.simplenotes.domain.usecases.users.delete import arrow.core.Either import arrow.core.computations.either import arrow.core.rightIfNotNull import be.simplenotes.domain.security.PasswordHash import be.simplenotes.domain.validation.UserValidations import be.simplenotes.persistance.repositories.UserRepository import be.simplenotes.persistance.transactions.TransactionService import be.simplenotes.search.NoteSearcher import io.micronaut.context.annotation.Primary import javax.inject.Singleton @Primary @Singleton internal class DeleteUseCaseImpl( private val userRepository: UserRepository, private val passwordHash: PasswordHash, private val searcher: NoteSearcher, private val transactionService: TransactionService, ) : DeleteUseCase { override fun delete(form: DeleteForm) = transactionService.use { either.eager { val user = !UserValidations.validateDelete(form) val persistedUser = !userRepository.find(user.username).rightIfNotNull { DeleteError.Unregistered } !Either.conditionally( passwordHash.verify(user.password, persistedUser.password), { DeleteError.WrongPassword }, { Unit } ) !Either.conditionally(userRepository.delete(persistedUser.id), { DeleteError.Unregistered }, { Unit }) searcher.dropIndex(persistedUser.id) } } }