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

View File

@@ -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

View File

@@ -7,6 +7,7 @@ import fr.postgresjson.repository.RepositoryI.Direction
import net.pearx.kasechange.toSnakeCase
import java.util.*
import fr.dcproject.entity.Citizen as CitizenEntity
import fr.dcproject.entity.User as UserEntity
class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
override val entityName = CitizenEntity::class
@@ -17,6 +18,12 @@ class Citizen(override var requester: Requester) : RepositoryI<CitizenEntity> {
.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(
page: Int = 1,
limit: Int = 50,

View File

@@ -56,7 +56,7 @@ fun ApplicationCall.can(action: ActionI, subject: Any? = null): Boolean {
abstract class VoterException(message: String) : Throwable(message)
class NoVoterException(action: ActionI) : VoterException("No voter found 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>()