diff --git a/api/src/controllers/NotesTitleController.kt b/api/src/controllers/NotesTitleController.kt index f91155a..4fc4b46 100644 --- a/api/src/controllers/NotesTitleController.kt +++ b/api/src/controllers/NotesTitleController.kt @@ -2,6 +2,8 @@ package be.vandewalleh.controllers import be.vandewalleh.entities.Note import be.vandewalleh.entities.Tag +import be.vandewalleh.entities.User +import be.vandewalleh.tables.Chapters import be.vandewalleh.tables.Notes import be.vandewalleh.tables.Tags import be.vandewalleh.tables.Users @@ -11,9 +13,10 @@ import io.ktor.http.HttpStatusCode import io.ktor.request.receive import io.ktor.response.respond import io.ktor.routing.Route +import io.ktor.routing.get import io.ktor.routing.post import me.liuwj.ktorm.database.Database -import me.liuwj.ktorm.dsl.eq +import me.liuwj.ktorm.dsl.* import me.liuwj.ktorm.entity.* import org.kodein.di.Kodein import org.kodein.di.generic.instance @@ -26,15 +29,23 @@ class NotesTitleController(kodein: Kodein) : AuthCrudController("/notes/{noteTit return this.parameters["noteTitle"]!! } + private fun ApplicationCall.user(): User { + return db.sequenceOf(Users) + .find { it.email eq this.userEmail() } + ?: error("") + } + private class PostRequestBody(val tags: List) + private class ChapterDto(val title: String, val content: String) + private class GetResponseBody(val tags: List, val chapters: List) + override val route: Route.() -> Unit = { post { val title = call.noteTitle() ?: error("") val tags = call.receive().tags - val user = db.sequenceOf(Users) - .find { it.email eq call.userEmail() } ?: error("") + val user = call.user() val exists = db.sequenceOf(Notes) .filter { it.userId eq user.id } @@ -66,5 +77,35 @@ class NotesTitleController(kodein: Kodein) : AuthCrudController("/notes/{noteTit call.respondStatus(HttpStatusCode.Created) } + + get { + val user = call.user() + val title = call.noteTitle() ?: error("title missing") + + val noteId = db.from(Notes) + .select(Notes.id) + .where { Notes.userId eq user.id and (Notes.title eq title) } + .limit(0, 1) + .map { it[Notes.id]!! } + .firstOrNull() + ?: return@get call.respondStatus(HttpStatusCode.NotFound) + + val tags = db.from(Tags) + .select(Tags.name) + .where { Tags.noteId eq noteId } + .map { it[Tags.name]!! } + .toList() + + val chapters = db.from(Chapters) + .select(Chapters.title, Chapters.content) + .where { Chapters.noteId eq noteId } + .orderBy(Chapters.number.asc()) + .map { ChapterDto(it[Chapters.title]!!, it[Chapters.content]!!) } + .toList() + + val response = GetResponseBody(tags, chapters) + + call.respond(response) + } } } \ No newline at end of file