diff --git a/domain/pom.xml b/domain/pom.xml index 82f582d..08682fe 100644 --- a/domain/pom.xml +++ b/domain/pom.xml @@ -14,6 +14,11 @@ shared 1.0-SNAPSHOT + + be.simplenotes + search + 1.0-SNAPSHOT + be.simplenotes shared diff --git a/domain/src/main/kotlin/DomainModule.kt b/domain/src/main/kotlin/DomainModule.kt index 2af4176..37f3180 100644 --- a/domain/src/main/kotlin/DomainModule.kt +++ b/domain/src/main/kotlin/DomainModule.kt @@ -26,7 +26,7 @@ val domainModule = module { single { BcryptPasswordHash() } single { SimpleJwt(get()) } single { JwtPayloadExtractor(get()) } - single { NoteService(get(), get()) } + single { NoteService(get(), get(), get()) } single { MarkdownConverterImpl() } single { ExportUseCaseImpl(get()) } } diff --git a/domain/src/main/kotlin/usecases/NoteService.kt b/domain/src/main/kotlin/usecases/NoteService.kt index 196db02..6cf4748 100644 --- a/domain/src/main/kotlin/usecases/NoteService.kt +++ b/domain/src/main/kotlin/usecases/NoteService.kt @@ -1,6 +1,7 @@ package be.simplenotes.domain.usecases import arrow.core.Either +import arrow.core.extensions.fx import be.simplenotes.domain.model.Note import be.simplenotes.domain.model.PersistedNote import be.simplenotes.domain.model.PersistedNoteMetadata @@ -8,33 +9,41 @@ import be.simplenotes.domain.security.HtmlSanitizer import be.simplenotes.domain.usecases.markdown.MarkdownConverter import be.simplenotes.domain.usecases.markdown.MarkdownParsingError import be.simplenotes.domain.usecases.repositories.NoteRepository +import be.simplenotes.search.NoteSearcher import java.util.* class NoteService( private val markdownConverter: MarkdownConverter, private val noteRepository: NoteRepository, + private val searcher: NoteSearcher, ) { - fun create(userId: Int, markdownText: String): Either = - markdownConverter - .renderDocument(markdownText) + fun create(userId: Int, markdownText: String) = Either.fx { + val persistedNote = !markdownConverter.renderDocument(markdownText) .map { it.copy(html = HtmlSanitizer.sanitize(it.html)) } .map { Note(it.metadata, markdown = markdownText, html = it.html) } .map { noteRepository.create(userId, it) } - fun update(userId: Int, uuid: UUID, markdownText: String): Either = - markdownConverter - .renderDocument(markdownText) + searcher.indexNote(userId, persistedNote) + persistedNote + } + + fun update(userId: Int, uuid: UUID, markdownText: String) = Either.fx { + val persistedNote = !markdownConverter.renderDocument(markdownText) .map { it.copy(html = HtmlSanitizer.sanitize(it.html)) } .map { Note(it.metadata, markdown = markdownText, html = it.html) } .map { noteRepository.update(userId, uuid, it) } + persistedNote?.let { searcher.updateIndex(userId, it) } + persistedNote + } + fun paginatedNotes( userId: Int, page: Int, itemsPerPage: Int = 20, tag: String? = null, - deleted: Boolean = false + deleted: Boolean = false, ): PaginatedNotes { val count = noteRepository.count(userId, tag, deleted) val offset = (page - 1) * itemsPerPage @@ -44,9 +53,25 @@ class NoteService( } fun find(userId: Int, uuid: UUID) = noteRepository.find(userId, uuid) - fun trash(userId: Int, uuid: UUID) = noteRepository.delete(userId, uuid, permanent = false) - fun restore(userId: Int, uuid: UUID) = noteRepository.restore(userId, uuid) - fun delete(userId: Int, uuid: UUID) = noteRepository.delete(userId, uuid, permanent = true) + + fun trash(userId: Int, uuid: UUID): Boolean { + val res = noteRepository.delete(userId, uuid, permanent = false) + if (res) searcher.deleteIndex(userId, uuid) + return res + } + + fun restore(userId: Int, uuid: UUID): Boolean { + val res = noteRepository.restore(userId, uuid) + if (res) find(userId, uuid)?.let { note -> searcher.indexNote(userId, note) } + return res + } + + fun delete(userId: Int, uuid: UUID): Boolean { + val res = noteRepository.delete(userId, uuid, permanent = true) + if (res) searcher.deleteIndex(userId, uuid) + return res + } + fun countDeleted(userId: Int) = noteRepository.count(userId, deleted = true) } diff --git a/search/src/main/kotlin/SeachModule.kt b/search/src/main/kotlin/SeachModule.kt new file mode 100644 index 0000000..28f7f90 --- /dev/null +++ b/search/src/main/kotlin/SeachModule.kt @@ -0,0 +1,7 @@ +package be.simplenotes.search + +import org.koin.dsl.module + +val searchModule = module { + single { NoteSearcher() } +}