package fr.dcproject.routes import fr.dcproject.component.auth.citizen import fr.dcproject.component.auth.citizenOrNull import fr.dcproject.component.citizen.CitizenRef import fr.dcproject.entity.ConstitutionRef import fr.dcproject.entity.FollowForUpdate import fr.dcproject.security.voter.FollowVoter import fr.dcproject.voter.assert import io.ktor.application.* import io.ktor.http.* import io.ktor.locations.* import io.ktor.response.* import io.ktor.routing.* import fr.dcproject.repository.FollowConstitution as FollowConstitutionRepository @KtorExperimentalLocationsAPI object FollowConstitutionPaths { @Location("/constitutions/{constitution}/follows") class ConstitutionFollowRequest(val constitution: ConstitutionRef) @Location("/citizens/{citizen}/follows/constitutions") class CitizenFollowConstitutionRequest(val citizen: CitizenRef) } @KtorExperimentalLocationsAPI fun Route.followConstitution(repo: FollowConstitutionRepository, voter: FollowVoter) { post { val follow = FollowForUpdate(target = it.constitution, createdBy = this.citizen) voter.assert { canCreate(follow, citizenOrNull) } repo.follow(follow) call.respond(HttpStatusCode.Created) } delete { val follow = FollowForUpdate(target = it.constitution, createdBy = this.citizen) voter.assert { canDelete(follow, citizenOrNull) } repo.unfollow(follow) call.respond(HttpStatusCode.NoContent) } get { repo.findFollow(citizen, it.constitution)?.let { follow -> voter.assert { canView(follow, citizenOrNull) } call.respond(follow) } ?: call.respond(HttpStatusCode.NotFound) } get { val follows = repo.findByCitizen(it.citizen) voter.assert { canView(follows.result, citizenOrNull) } call.respond(follows) } }