package fr.dcproject import fr.dcproject.entity.User import fr.dcproject.entity.UserI import io.ktor.application.* import io.ktor.auth.* import io.ktor.util.* import io.ktor.util.pipeline.* import org.koin.core.context.GlobalContext import fr.dcproject.entity.Citizen as CitizenEntity import fr.dcproject.repository.Citizen as CitizenRepository class ForbiddenException(message: String) : Exception(message) private val citizenAttributeKey = AttributeKey("CitizenContext") val ApplicationCall.citizen: CitizenEntity get() = attributes.computeIfAbsent(citizenAttributeKey) { val user = authentication.principal() ?: throw ForbiddenException("No User Connected") GlobalContext.get().koin.get().findByUser(user) ?: throw ForbiddenException("Citizen not found for this user id \"${user.id}\"") } val ApplicationCall.citizenOrNull: CitizenEntity? get() = authentication.principal()?.let { GlobalContext.get().koin.get().findByUser(it) } val PipelineContext.citizen get() = context.citizen val PipelineContext.citizenOrNull get() = context.citizenOrNull val ApplicationCall.user get() = authentication.principal()