<?phpnamespace Harmonizely\Service\Panel\AccessVoters;use Harmonizely\Model\EventInterface;use Harmonizely\Model\UserInterface;class EventVoter extends AbstractVoter{ /** * Resource name */ const RESOURCE_NAME = 'event'; /** * View event */ const EVENT_VIEW = 'event_view'; /** * Edit event */ const EVENT_EDIT = 'event_edit'; /** * Edit delete */ const EVENT_DELETE = 'event_delete'; /** * Return resource name * * @return string */ function getResourceName(): string { return self::RESOURCE_NAME; } /** * Return allowed attributes for current user * * @return array|string[] */ function getResourceAttributes(): array { return [self::EVENT_VIEW, self::EVENT_EDIT, self::EVENT_DELETE]; } /** * Return allowed attributes for current user * * @param UserInterface $user * @param $subject * @return array|string[] */ function getAllowedAttributes(UserInterface $user, $subject): array { if (!($subject instanceof EventInterface)) { return $this->getResourceAttributes(); } $allowedAttributes = []; $eventUser = $subject->getUser(); if ($eventUser->getId() === $user->getId()) { $allowedAttributes = $this->getResourceAttributes(); } else { $userDefaultOrganization = $user->getDefaultOrganization(); $eventUserOrganization = $eventUser->getDefaultOrganization(); if ($eventUserOrganization && $userDefaultOrganization && $eventUserOrganization->getId() === $userDefaultOrganization->getId()) { if ($userDefaultOrganization->isOrganizationOwner($user)) { $allowedAttributes = $this->getResourceAttributes(); } } } return $allowedAttributes; } /** * Determines if the attribute and subject are supported by this voter. * * @param string $attribute An attribute * @param mixed $subject The subject to secure, e.g. an object the user wants to access or any other PHP type * * @return bool True if the attribute and subject are supported, false otherwise */ protected function supports($attribute, $subject): bool { if (!($subject instanceof EventInterface)) { return false; } if (!in_array($attribute, $this->getResourceAttributes())) { return false; } return true; }}