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() }
+}