diff --git a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/NoteService.kt b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/NoteService.kt index 498768d..ceb940e 100644 --- a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/NoteService.kt +++ b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/NoteService.kt @@ -1,10 +1,6 @@ package be.simplenotes.domain.usecases -import arrow.core.Either -import arrow.core.extensions.fx -import be.simplenotes.types.Note -import be.simplenotes.types.PersistedNote -import be.simplenotes.types.PersistedNoteMetadata +import arrow.core.computations.either import be.simplenotes.domain.security.HtmlSanitizer import be.simplenotes.domain.usecases.markdown.MarkdownConverter import be.simplenotes.domain.usecases.markdown.MarkdownParsingError @@ -12,6 +8,9 @@ import be.simplenotes.persistance.repositories.NoteRepository import be.simplenotes.persistance.repositories.UserRepository import be.simplenotes.search.NoteSearcher import be.simplenotes.search.SearchTerms +import be.simplenotes.types.Note +import be.simplenotes.types.PersistedNote +import be.simplenotes.types.PersistedNoteMetadata import java.util.* class NoteService( @@ -21,7 +20,7 @@ class NoteService( private val searcher: NoteSearcher, ) { - fun create(userId: Int, markdownText: String) = Either.fx { + fun create(userId: Int, markdownText: String) = either.eager { val persistedNote = !markdownConverter.renderDocument(markdownText) .map { it.copy(html = HtmlSanitizer.sanitize(it.html)) } .map { Note(it.metadata, markdown = markdownText, html = it.html) } @@ -31,7 +30,7 @@ class NoteService( persistedNote } - fun update(userId: Int, uuid: UUID, markdownText: String) = Either.fx { + fun update(userId: Int, uuid: UUID, markdownText: String) = either.eager { val persistedNote = !markdownConverter.renderDocument(markdownText) .map { it.copy(html = HtmlSanitizer.sanitize(it.html)) } .map { Note(it.metadata, markdown = markdownText, html = it.html) } diff --git a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/markdown/MarkdownConverter.kt b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/markdown/MarkdownConverter.kt index a0b28a5..85bdc0e 100644 --- a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/markdown/MarkdownConverter.kt +++ b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/markdown/MarkdownConverter.kt @@ -1,11 +1,11 @@ package be.simplenotes.domain.usecases.markdown import arrow.core.Either -import arrow.core.extensions.fx +import arrow.core.computations.either import arrow.core.left import arrow.core.right -import be.simplenotes.types.NoteMetadata import be.simplenotes.domain.validation.NoteValidations +import be.simplenotes.types.NoteMetadata import com.vladsch.flexmark.ext.gfm.tasklist.TaskListExtension import com.vladsch.flexmark.html.HtmlRenderer import com.vladsch.flexmark.parser.Parser @@ -73,10 +73,10 @@ internal class MarkdownConverterImpl : MarkdownConverter { private fun renderMarkdown(markdown: String) = parser.parse(markdown).run(renderer::render) - override fun renderDocument(input: String) = Either.fx { + override fun renderDocument(input: String) = either.eager { val (meta, md) = !splitMetaFromDocument(input) val parsedMeta = !parseMeta(meta) - !NoteValidations.validateMetadata(parsedMeta).toEither { }.swap() + !Either.fromNullable(NoteValidations.validateMetadata(parsedMeta)).swap() val html = renderMarkdown(md) Document(parsedMeta, html) } diff --git a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/delete/DeleteUseCaseImpl.kt b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/delete/DeleteUseCaseImpl.kt index 037f4d4..cf8cd52 100644 --- a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/delete/DeleteUseCaseImpl.kt +++ b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/delete/DeleteUseCaseImpl.kt @@ -1,11 +1,11 @@ package be.simplenotes.domain.usecases.users.delete import arrow.core.Either -import arrow.core.extensions.fx +import arrow.core.computations.either import arrow.core.rightIfNotNull import be.simplenotes.domain.security.PasswordHash -import be.simplenotes.persistance.repositories.UserRepository import be.simplenotes.domain.validation.UserValidations +import be.simplenotes.persistance.repositories.UserRepository import be.simplenotes.search.NoteSearcher internal class DeleteUseCaseImpl( @@ -13,15 +13,14 @@ internal class DeleteUseCaseImpl( private val passwordHash: PasswordHash, private val searcher: NoteSearcher, ) : DeleteUseCase { - override fun delete(form: DeleteForm) = Either.fx { + override fun delete(form: DeleteForm) = either.eager { val user = !UserValidations.validateDelete(form) val persistedUser = !userRepository.find(user.username).rightIfNotNull { DeleteError.Unregistered } - !Either.cond( + !Either.conditionally( passwordHash.verify(user.password, persistedUser.password), - { Unit }, - { DeleteError.WrongPassword } - ) - !Either.cond(userRepository.delete(persistedUser.id), { Unit }, { DeleteError.Unregistered }) + { DeleteError.WrongPassword }, + { Unit }) + !Either.conditionally(userRepository.delete(persistedUser.id), { DeleteError.Unregistered }, { Unit }) searcher.dropIndex(persistedUser.id) } } diff --git a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/login/LoginUseCaseImpl.kt b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/login/LoginUseCaseImpl.kt index 2190dac..19f4f4b 100644 --- a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/login/LoginUseCaseImpl.kt +++ b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/usecases/users/login/LoginUseCaseImpl.kt @@ -1,7 +1,6 @@ package be.simplenotes.domain.usecases.users.login -import arrow.core.Either -import arrow.core.extensions.fx +import arrow.core.computations.either import arrow.core.filterOrElse import arrow.core.rightIfNotNull import be.simplenotes.domain.security.PasswordHash @@ -15,7 +14,7 @@ internal class LoginUseCaseImpl( private val passwordHash: PasswordHash, private val jwt: SimpleJwt ) : LoginUseCase { - override fun login(form: LoginForm) = Either.fx { + override fun login(form: LoginForm) = either.eager { val user = !UserValidations.validateLogin(form) !userRepository.find(user.username) .rightIfNotNull { Unregistered } diff --git a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/validation/NoteValidations.kt b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/validation/NoteValidations.kt index 0a25b0a..1f5c043 100644 --- a/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/validation/NoteValidations.kt +++ b/simplenotes-domain/src/main/kotlin/be/simplenotes/domain/validation/NoteValidations.kt @@ -1,8 +1,7 @@ package be.simplenotes.domain.validation -import arrow.core.* -import be.simplenotes.types.NoteMetadata import be.simplenotes.domain.usecases.markdown.ValidationError +import be.simplenotes.types.NoteMetadata import io.konform.validation.Validation import io.konform.validation.jsonschema.maxItems import io.konform.validation.jsonschema.maxLength @@ -28,9 +27,9 @@ internal object NoteValidations { } } - fun validateMetadata(meta: NoteMetadata): Option { + fun validateMetadata(meta: NoteMetadata): ValidationError? { val errors = metaValidator.validate(meta).errors - return if (errors.isEmpty()) none() - else return ValidationError(errors).some() + return if (errors.isEmpty()) null + else return ValidationError(errors) } }