package be.vandewalleh.controllers import be.vandewalleh.controllers.base.AuthCrudController import be.vandewalleh.entities.User import be.vandewalleh.tables.Chapters import be.vandewalleh.tables.Notes import be.vandewalleh.tables.Users import io.ktor.application.ApplicationCall import io.ktor.application.call import io.ktor.http.HttpStatusCode import io.ktor.request.receive import io.ktor.routing.Route import io.ktor.routing.post import me.liuwj.ktorm.database.Database import me.liuwj.ktorm.dsl.* import me.liuwj.ktorm.entity.find import me.liuwj.ktorm.entity.sequenceOf import org.kodein.di.Kodein import org.kodein.di.generic.instance class ChaptersController(kodein: Kodein) : AuthCrudController("/notes/{noteTitle}/chapters/{chapterNumber}", kodein) { private val db by kodein.instance() private fun ApplicationCall.noteTitle(): String? { return this.parameters["noteTitle"]!! } private fun ApplicationCall.chapterNumber(): Int? { return this.parameters["chapterNumber"]?.toIntOrNull() } private fun ApplicationCall.chapterExists(): Boolean { val user = user() val title = noteTitle() ?: error("title missing") val noteId = requestedNoteId() ?: error("") return db.from(Chapters) .select(Chapters.id) .where { Notes.userId eq user.id and (Notes.id eq noteId) } .limit(0, 1) .map { it[Notes.id]!! } .firstOrNull() != null } private fun ApplicationCall.user(): User { return db.sequenceOf(Users) .find { it.email eq this.userEmail() } ?: error("") } /** * Method that returns a [Notes] ID from it's title and the currently logged in user. * returns null if none found */ private fun ApplicationCall.requestedNoteId(): Int? { val user = user() val title = noteTitle() ?: error("title missing") return 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() } private data class PostRequestBody(val title: String, val content: String) override val route: Route.() -> Unit = { post { val noteId = call.requestedNoteId() ?: return@post call.respondStatus(HttpStatusCode.NotFound) val chapterNumber = call.chapterNumber() ?:return@post call.respondStatus(HttpStatusCode.BadRequest) val exists = false val (title, content) = call.receive() } } }