diff --git a/api/src/controllers/Controllers.kt b/api/src/controllers/Controllers.kt index b46c5b0..5be8681 100644 --- a/api/src/controllers/Controllers.kt +++ b/api/src/controllers/Controllers.kt @@ -14,4 +14,5 @@ val controllerModule = Kodein.Module(name = "Controller") { bind().inSet() with singleton { UserController(this.kodein) } bind().inSet() with singleton { HealthCheckController(this.kodein) } + bind().inSet() with singleton { NoteController(this.kodein) } } \ No newline at end of file diff --git a/api/src/controllers/NoteController.kt b/api/src/controllers/NoteController.kt new file mode 100644 index 0000000..1d8fc82 --- /dev/null +++ b/api/src/controllers/NoteController.kt @@ -0,0 +1,71 @@ +package be.vandewalleh.controllers + +import be.vandewalleh.entities.Note +import be.vandewalleh.entities.Tag +import be.vandewalleh.errors.ApiError +import be.vandewalleh.tables.Notes +import be.vandewalleh.tables.Tags +import be.vandewalleh.tables.Users +import io.ktor.application.call +import io.ktor.auth.UserIdPrincipal +import io.ktor.auth.authenticate +import io.ktor.auth.principal +import io.ktor.http.HttpStatusCode +import io.ktor.locations.Location +import io.ktor.locations.post +import io.ktor.request.receive +import io.ktor.response.respond +import io.ktor.routing.Routing +import me.liuwj.ktorm.database.Database +import me.liuwj.ktorm.dsl.eq +import me.liuwj.ktorm.entity.add +import me.liuwj.ktorm.entity.find +import me.liuwj.ktorm.entity.sequenceOf +import org.kodein.di.Kodein +import org.kodein.di.generic.instance + +class NoteController(kodein: Kodein) : KodeinController(kodein) { + private val db by instance() + + override fun Routing.registerRoutes() { + authenticate { + post { + data class Response(val message: String) + + val (email) = call.principal()!! + val body = call.receive() + + val user = db.sequenceOf(Users) + .find { Users.email eq email } + ?: return@post call.respond(HttpStatusCode.Forbidden, ApiError.DeletedUserError) + + + val note = Note { + this.title = body.title + this.content = body.content + this.user = user + } + + db.sequenceOf(Notes).add(note) + + body.tags.forEach { tagName -> + val tag = Tag { + this.name = tagName + this.note = note + } + db.sequenceOf(Tags).add(tag) + } + + return@post call.respond(Response("created")) + } + } + + } + + object Routes { + @Location("/notes") + class Notes + } +} + +data class PostNotesBody(val title: String, val content: String, val tags: List) \ No newline at end of file diff --git a/api/src/errors/Errors.kt b/api/src/errors/Errors.kt index 8f6af26..c917a24 100644 --- a/api/src/errors/Errors.kt +++ b/api/src/errors/Errors.kt @@ -3,4 +3,5 @@ package be.vandewalleh.errors sealed class ApiError(val message: String){ object InvalidCredentialError : ApiError("Invalid credentials") object ExistingUserError : ApiError("User already exists") + object DeletedUserError : ApiError("User has been deleted") }