package fr.dcproject.component.vote import fr.dcproject.component.citizen.CitizenI import fr.dcproject.component.vote.entity.VoteForUpdateI import fr.dcproject.entity.TargetI import fr.dcproject.voter.Voter import fr.dcproject.voter.VoterResponse import fr.postgresjson.entity.EntityDeletedAt import fr.dcproject.component.vote.entity.Vote as VoteEntity class VoteVoter : Voter() { fun canCreate(subject: VoteForUpdateI, citizen: CitizenI?): VoterResponse where S : EntityDeletedAt, S : TargetI = when { citizen == null -> denied("You must be connected for vote", "vote.create.connected") subject.target.isDeleted() -> denied("You cannot vote on deleted target", "vote.create.isDeleted") else -> granted() } fun > canView(subjects: List, citizen: CitizenI?): VoterResponse = canAll(subjects) { canView(it, citizen) } fun canView(subject: VoteEntity<*>, citizen: CitizenI?): VoterResponse = when { citizen == null -> denied("You must be connected for view your votes", "vote.view.connected") subject.createdBy.id != citizen.id -> denied("You can only display your votes", "vote.view.onlyYours") else -> granted() } }