diff --git a/api/src/NotesApplication.kt b/api/src/NotesApplication.kt index 3db57fb..5d3d97f 100644 --- a/api/src/NotesApplication.kt +++ b/api/src/NotesApplication.kt @@ -9,6 +9,7 @@ import be.vandewalleh.features.features import be.vandewalleh.migrations.Migration import io.ktor.application.Application import io.ktor.application.log +import io.ktor.auth.authenticate import io.ktor.routing.routing import me.liuwj.ktorm.database.Database import org.kodein.di.Kodein diff --git a/api/src/controllers/AuthCrudController.kt b/api/src/controllers/AuthCrudController.kt new file mode 100644 index 0000000..794057c --- /dev/null +++ b/api/src/controllers/AuthCrudController.kt @@ -0,0 +1,28 @@ +package be.vandewalleh.controllers + +import io.ktor.application.ApplicationCall +import io.ktor.auth.UserIdPrincipal +import io.ktor.auth.principal +import io.ktor.routing.Route +import io.ktor.routing.Routing +import io.ktor.routing.route +import org.kodein.di.Kodein + +abstract class AuthCrudController( + private val path: String, + override val kodein: Kodein +) : + KodeinController(kodein) { + + abstract val route: Route.() -> Unit + + fun ApplicationCall.userEmail(): String = + this.principal()!!.name + + override fun Routing.registerRoutes() { + route(path) { + route() + } + } +} + diff --git a/api/src/controllers/Controllers.kt b/api/src/controllers/Controllers.kt index 5be8681..f4fc0b1 100644 --- a/api/src/controllers/Controllers.kt +++ b/api/src/controllers/Controllers.kt @@ -14,5 +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) } + bind().inSet() with singleton { NotesController(this.kodein) } } \ No newline at end of file diff --git a/api/src/controllers/KodeinController.kt b/api/src/controllers/KodeinController.kt index 85bf4d0..332feec 100644 --- a/api/src/controllers/KodeinController.kt +++ b/api/src/controllers/KodeinController.kt @@ -1,27 +1,14 @@ package be.vandewalleh.controllers -import io.ktor.application.Application -import io.ktor.locations.locations import io.ktor.routing.Routing import org.kodein.di.Kodein import org.kodein.di.KodeinAware -import org.kodein.di.generic.instance abstract class KodeinController(override val kodein: Kodein) : KodeinAware { - /** - * Injected dependency with the current [Application]. - */ - val application: Application by instance() - /** - * Shortcut to get the url of a [TypedRoute]. - */ - val TypedRoute.href get() = application.locations.href(this) /** * Method that subtypes must override to register the handled [Routing] routes. */ abstract fun Routing.registerRoutes() } - -interface TypedRoute \ No newline at end of file diff --git a/api/src/controllers/NoteController.kt b/api/src/controllers/NoteController.kt deleted file mode 100644 index 205e8aa..0000000 --- a/api/src/controllers/NoteController.kt +++ /dev/null @@ -1,73 +0,0 @@ -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 transaction = db.useTransaction { - - val note = Note { - this.title = body.title - 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) - } - 1 - } - - 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/controllers/NotesController.kt b/api/src/controllers/NotesController.kt new file mode 100644 index 0000000..d51f83a --- /dev/null +++ b/api/src/controllers/NotesController.kt @@ -0,0 +1,25 @@ +package be.vandewalleh.controllers + +import be.vandewalleh.tables.Users +import io.ktor.application.call +import io.ktor.response.respond +import io.ktor.routing.Route +import io.ktor.routing.get +import me.liuwj.ktorm.database.Database +import me.liuwj.ktorm.dsl.eq +import me.liuwj.ktorm.entity.find +import me.liuwj.ktorm.entity.sequenceOf +import org.kodein.di.Kodein +import org.kodein.di.generic.instance + +class NotesController(kodein: Kodein) : AuthCrudController("/notes", kodein) { + private val db by kodein.instance() + + override val route: Route.() -> Unit = { + get { + val email = call.userEmail() + val user = db.sequenceOf(Users).find { it.email eq email }!! // TODO + + } + } +} diff --git a/api/src/controllers/UserController.kt b/api/src/controllers/UserController.kt index 05560c5..0c69c41 100644 --- a/api/src/controllers/UserController.kt +++ b/api/src/controllers/UserController.kt @@ -26,6 +26,8 @@ class UserController(kodein: Kodein) : KodeinController(kodein) { private val db by instance() override fun Routing.registerRoutes() { + + post { data class Response(val token: String)