Add create note
This commit is contained in:
parent
2a142504a5
commit
0335c1eb08
@ -12,3 +12,15 @@ Content-Type: application/json
|
||||
### Get notes
|
||||
GET http://localhost:8081/notes
|
||||
Authorization: Bearer {{token}}
|
||||
|
||||
### Create a note
|
||||
POST http://localhost:8081/notes/babar
|
||||
Content-Type: application/json
|
||||
Authorization: Bearer {{token}}
|
||||
|
||||
{
|
||||
"tags": [
|
||||
"Test",
|
||||
"Dev"
|
||||
]
|
||||
}
|
||||
@ -15,4 +15,5 @@ val controllerModule = Kodein.Module(name = "Controller") {
|
||||
bind<KodeinController>().inSet() with singleton { UserController(this.kodein) }
|
||||
bind<KodeinController>().inSet() with singleton { HealthCheckController(this.kodein) }
|
||||
bind<KodeinController>().inSet() with singleton { NotesController(this.kodein) }
|
||||
bind<KodeinController>().inSet() with singleton { NotesTitleController(this.kodein) }
|
||||
}
|
||||
@ -1,5 +1,8 @@
|
||||
package be.vandewalleh.controllers
|
||||
|
||||
import io.ktor.application.ApplicationCall
|
||||
import io.ktor.http.HttpStatusCode
|
||||
import io.ktor.response.respond
|
||||
import io.ktor.routing.Routing
|
||||
import org.kodein.di.Kodein
|
||||
import org.kodein.di.KodeinAware
|
||||
@ -11,4 +14,8 @@ abstract class KodeinController(override val kodein: Kodein) : KodeinAware {
|
||||
* Method that subtypes must override to register the handled [Routing] routes.
|
||||
*/
|
||||
abstract fun Routing.registerRoutes()
|
||||
|
||||
suspend fun ApplicationCall.respondStatus(status: HttpStatusCode) {
|
||||
this.respond(status, mapOf("message" to status.description))
|
||||
}
|
||||
}
|
||||
|
||||
70
api/src/controllers/NotesTitleController.kt
Normal file
70
api/src/controllers/NotesTitleController.kt
Normal file
@ -0,0 +1,70 @@
|
||||
package be.vandewalleh.controllers
|
||||
|
||||
import be.vandewalleh.entities.Note
|
||||
import be.vandewalleh.entities.Tag
|
||||
import be.vandewalleh.tables.Notes
|
||||
import be.vandewalleh.tables.Tags
|
||||
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.response.respond
|
||||
import io.ktor.routing.Route
|
||||
import io.ktor.routing.post
|
||||
import me.liuwj.ktorm.database.Database
|
||||
import me.liuwj.ktorm.dsl.eq
|
||||
import me.liuwj.ktorm.entity.*
|
||||
import org.kodein.di.Kodein
|
||||
import org.kodein.di.generic.instance
|
||||
import java.time.LocalDateTime
|
||||
|
||||
class NotesTitleController(kodein: Kodein) : AuthCrudController("/notes/{noteTitle}", kodein) {
|
||||
private val db by kodein.instance<Database>()
|
||||
|
||||
private fun ApplicationCall.noteTitle(): String? {
|
||||
return this.parameters["noteTitle"]!!
|
||||
}
|
||||
|
||||
private class PostRequestBody(val tags: List<String>)
|
||||
|
||||
override val route: Route.() -> Unit = {
|
||||
post {
|
||||
val title = call.noteTitle() ?: error("")
|
||||
val tags = call.receive<PostRequestBody>().tags
|
||||
|
||||
val user = db.sequenceOf(Users)
|
||||
.find { it.email eq call.userEmail() } ?: error("")
|
||||
|
||||
val exists = db.sequenceOf(Notes)
|
||||
.filter { it.userId eq user.id }
|
||||
.filter { it.title eq title }
|
||||
.firstOrNull() != null
|
||||
|
||||
if (exists) {
|
||||
return@post call.respondStatus(HttpStatusCode.Conflict)
|
||||
}
|
||||
|
||||
db.useTransaction {
|
||||
val note = Note {
|
||||
this.title = title
|
||||
this.user = user
|
||||
this.updatedAt = LocalDateTime.now()
|
||||
}
|
||||
|
||||
db.sequenceOf(Notes).add(note)
|
||||
|
||||
tags.forEach { tagName ->
|
||||
val tag = Tag {
|
||||
this.note = note
|
||||
this.name = tagName
|
||||
}
|
||||
|
||||
db.sequenceOf(Tags).add(tag)
|
||||
}
|
||||
}
|
||||
|
||||
call.respondStatus(HttpStatusCode.Created)
|
||||
}
|
||||
}
|
||||
}
|
||||
Loading…
x
Reference in New Issue
Block a user