<?php
namespace App\Security\Voter\Meting;
use App\Entity\User\User;
use App\Entity\Zoom\Meeting;
use DateTime;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
class MeetingVoter extends Voter
{
public const SEND_STATEMENT = 'MEETING_SEND_STATEMENT';
public const CONDUCTIVITY = 'MEETING_CONDUCTIVITY';
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [self::SEND_STATEMENT, self::CONDUCTIVITY])
&& $subject instanceof Meeting;
}
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof UserInterface) {
return false;
}
/** @var Meeting $meeting */
$meeting = $subject;
switch ($attribute) {
case self::SEND_STATEMENT:
return $meeting->getOwner() === $user;
case self::CONDUCTIVITY:
$diff = $meeting->getDate()->diff(new DateTime());
return (
(1 === $diff->invert && 0 === $diff->h && $diff->i < 5) ||
(0 === $diff->invert && $diff->h < 5)
) && $meeting->getOwner() === $user;
}
return false;
}
}