add citizen in ApplicationCall
This commit is contained in:
24
src/main/kotlin/fr/dcproject/ApplicationContext.kt
Normal file
24
src/main/kotlin/fr/dcproject/ApplicationContext.kt
Normal 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
|
||||||
@@ -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>()
|
||||||
|
|
||||||
|
|||||||
Reference in New Issue
Block a user