<?php
namespace App\Voter\__Booking;
use App\Entity\Booking\Booking;
use App\Entity\User\User;
use App\Repository\User\UserRepository;
use App\Voter\VoterTrait;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class BookingBookingVoter extends Voter
{
use VoterTrait;
const LIST = "BOOKING_BOOKING_LIST";
const DETAILS_STATUS = "BOOKING_BOOKING_DETAILS_STATUS";
const DETAILS_BASE = "BOOKING_BOOKING_DETAILS_BASE";
const DETAILS_CABIN = "BOOKING_BOOKING_DETAILS_CABIN";
const DETAILS_PARTICIPANT = "BOOKING_BOOKING_DETAILS_PARTICIPANT";
const DETAILS_FORMALITY = "BOOKING_BOOKING_DETAILS_FORMALITY";
const DETAILS_TOTAL = "BOOKING_BOOKING_DETAILS_TOTAL";
const DETAILS_EMAIL = "BOOKING_BOOKING_DETAILS_EMAIL";
const DETAILS_TURNOVER = "BOOKING_BOOKING_DETAILS_TURNOVER";
const DETAILS_SELLER_BONUS = "BOOKING_BOOKING_DETAILS_SELLER_BONUS";
protected function supports($attribute, $subject): bool
{
return in_array($attribute, [
self::LIST,
self::DETAILS_STATUS,
self::DETAILS_BASE,
self::DETAILS_CABIN,
self::DETAILS_PARTICIPANT,
self::DETAILS_FORMALITY,
self::DETAILS_TOTAL,
self::DETAILS_EMAIL,
self::DETAILS_TURNOVER,
self::DETAILS_SELLER_BONUS,
]) && ($subject === null || $subject instanceof Booking);
}
protected function voteOnAttribute($attribute, $subject, TokenInterface $token): bool
{
$loggedUser = $token->getUser();
if (!$loggedUser instanceof UserInterface) {
return false;
}
if ($attribute !== self::LIST && $subject === null) {
return false;
}
switch ($attribute) {
case self::LIST:
return $this->voteOnList($loggedUser);
case self::DETAILS_STATUS:
return $this->voteOnDetailsStatus($subject, $loggedUser);
case self::DETAILS_BASE:
return $this->voteOnDetailsBase($subject, $loggedUser);
case self::DETAILS_CABIN:
return $this->voteOnDetailsCabin($subject, $loggedUser);
case self::DETAILS_PARTICIPANT:
return $this->voteOnDetailsParticipant($subject, $loggedUser);
case self::DETAILS_FORMALITY:
return $this->voteOnDetailsFormality($subject, $loggedUser);
case self::DETAILS_TOTAL:
return $this->voteOnDetailsTotal($subject, $loggedUser);
case self::DETAILS_EMAIL:
return $this->voteOnDetailsEmail($subject, $loggedUser);
case self::DETAILS_TURNOVER:
return $this->voteOnDetailsTurnover($subject, $loggedUser);
case self::DETAILS_SELLER_BONUS:
return $this->voteOnDetailsSellerBonus($subject, $loggedUser);
}
return false;
}
private function voteOnList(UserInterface $loggedUser): bool
{
return in_array(self::LIST, $loggedUser->getRoles());
}
private function voteOnDetailsStatus(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_STATUS, $loggedUser->getRoles());
}
private function voteOnDetailsBase(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_BASE, $loggedUser->getRoles());
}
private function voteOnDetailsCabin(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_CABIN, $loggedUser->getRoles());
}
private function voteOnDetailsParticipant(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_PARTICIPANT, $loggedUser->getRoles());
}
private function voteOnDetailsFormality(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_FORMALITY, $loggedUser->getRoles());
}
private function voteOnDetailsTotal(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_TOTAL, $loggedUser->getRoles());
}
private function voteOnDetailsEmail(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_EMAIL, $loggedUser->getRoles());
}
private function voteOnDetailsTurnover(?Booking $booking, UserInterface $loggedUser): bool
{
return in_array(self::DETAILS_TURNOVER, $loggedUser->getRoles());
}
private function voteOnDetailsSellerBonus(?Booking $booking, UserInterface $loggedUser): bool
{
/** @var User $loggedUser */
if ($this->isUserBelongToGroup($loggedUser, UserRepository::SELLER_USER_GROUP_CODE)
&& $booking->getSeller()->getId() !== $loggedUser->getId()) {
return false;
}
return in_array(self::DETAILS_SELLER_BONUS, $loggedUser->getRoles());
}
}