add citizen in ApplicationCall

This commit is contained in:
2019-08-26 17:13:47 +02:00
parent adba5a5aad
commit bfcbfee120
3 changed files with 32 additions and 1 deletions
@@ -0,0 +1,24 @@
package fr.dcproject
import fr.dcproject.security.voter.ForbiddenException
import io.ktor.application.ApplicationCall
import io.ktor.auth.authentication
import io.ktor.util.AttributeKey
import io.ktor.util.pipeline.PipelineContext
import kotlinx.coroutines.runBlocking
import org.koin.core.context.GlobalContext
import fr.dcproject.entity.Citizen as CitizenEntity
import fr.dcproject.entity.User as UserEntity
import fr.dcproject.repository.Citizen as CitizenRepository
private val citizenAttributeKey = AttributeKey<CitizenEntity>("CitizenContext")
val ApplicationCall.citizen: CitizenEntity
get() = attributes.computeIfAbsent(citizenAttributeKey) {
runBlocking {
val user = authentication.principal<UserEntity>() ?: throw ForbiddenException()
GlobalContext.get().koin.get<CitizenRepository>().findByUser(user) ?: throw ForbiddenException("Citizen not found for this user id \"${user.id}\"")
}
}
val PipelineContext<Unit, ApplicationCall>.citizen get() = context.citizen
@@ -7,6 +7,7 @@ import fr.postgresjson.repository.RepositoryI.Direction
import net.pearx.kasechange.toSnakeCase import net.pearx.kasechange.toSnakeCase
import java.util.* import java.util.*
import fr.dcproject.entity.Citizen as CitizenEntity import fr.dcproject.entity.Citizen as CitizenEntity
import fr.dcproject.entity.User as UserEntity
class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> { class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
override val entityName = CitizenEntity::class override val entityName = CitizenEntity::class
@@ -17,6 +18,12 @@ class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
.selectOne("id" to id) .selectOne("id" to id)
} }
fun findByUser(user: UserEntity): CitizenEntity? {
return requester
.getFunction("find_citizen_by_user_id")
.selectOne("user_id" to user.id)
}
fun find( fun find(
page: Int = 1, page: Int = 1,
limit: Int = 50, limit: Int = 50,
@@ -56,7 +56,7 @@ fun ApplicationCall.can(action: ActionI, subject: Any? = null): Boolean {
abstract class VoterException(message: String) : Throwable(message) abstract class VoterException(message: String) : Throwable(message)
class NoVoterException(action: ActionI) : VoterException("No voter found for action '$action'") class NoVoterException(action: ActionI) : VoterException("No voter found for action '$action'")
class UnauthorizedException(action: ActionI) : VoterException("Unauthorized for action '$action'") class UnauthorizedException(action: ActionI) : VoterException("Unauthorized for action '$action'")
class ForbiddenException : Throwable() class ForbiddenException(message: String? = null) : Throwable(message)
val ApplicationCall.user get() = authentication.principal<User>() val ApplicationCall.user get() = authentication.principal<User>()