<?php
namespace Harmonizely\Service\Subscription\Voter;
use Harmonizely\Model\UserInterface;
use Harmonizely\Service\Panel\AccessVoters\AbstractVoter;
class SubscriptionVoter extends AbstractVoter
{
const RESOURCE_NAME = 'subscription';
const CUSTOM_DOMAIN = 'custom_domain';
const CHANGE_TEMPLATE = 'change_template';
const WHITE_LABEL = 'white_label';
const ORGANIZATION = 'organization';
const SMS = 'sms';
const SMTP = 'smtp';
const FLEXIBLE_DURATION = 'flexible_duration';
const SBPAY_PRO = 'sbpay_pro';
const MULTIPLE_MEETING = 'multiple_meeting';
const MULTIPLE_EMAIL = 'multiple_email';
const EVENT_TYPE_TAG = 'event_type_tag';
const API = 'api';
const USER_RELATION = 'user_relation';
const ROUTING_FORM = 'routing_form';
const POLL = 'poll';
const LOGIN_AS_USER = 'login_as_user';
const OKTA = 'okta';
const REMINDERS_AND_FOLLOW_UPS = 'reminders_and_follow_ups';
const INVITEE = 'invitee';
const ANALYTICS = 'analytics';
const ZAPIER = 'zapier';
const RECURRING = 'recurring';
const WIDGET = 'widget';
const QUESTION = 'question';
const CANCELLATION_POLICY = 'cancellation_policy';
const CONFIRMATION_REDIRECT = 'confirmation_redirect';
const GROUP_BOOKING = 'group_booking';
const SBPAY = 'sbpay';
const AFFILIATE = 'affiliate';
/**
* @return string
*/
function getResourceName(): string
{
return self::RESOURCE_NAME;
}
/**
* @return string[]
*/
function getResourceAttributes(): array
{
return [
self::CUSTOM_DOMAIN,
self::WHITE_LABEL,
self::CHANGE_TEMPLATE,
self::ORGANIZATION,
self::SMS,
self::SMTP,
self::FLEXIBLE_DURATION,
self::SBPAY_PRO,
self::MULTIPLE_MEETING,
self::MULTIPLE_EMAIL,
self::EVENT_TYPE_TAG,
self::API,
self::USER_RELATION,
self::ROUTING_FORM,
self::POLL,
self::LOGIN_AS_USER,
self::OKTA,
self::REMINDERS_AND_FOLLOW_UPS,
self::SBPAY,
self::INVITEE,
self::GROUP_BOOKING,
self::CANCELLATION_POLICY,
self::QUESTION,
self::CONFIRMATION_REDIRECT,
self::ANALYTICS,
self::ZAPIER,
self::RECURRING,
self::WIDGET,
self::AFFILIATE
];
}
/**
* @param UserInterface $user
* @param $subject
* @return array|string[]
*/
function getAllowedAttributes(UserInterface $user, $subject): array
{
$subscriptionAttributes = $user->getSubscriptionAttributes();
if (empty($subscriptionAttributes)) {
return $this->getOldAllowedAttributes($user);
}
return $subscriptionAttributes;
}
/**
* @param string $attribute
* @param mixed $subject
* @return bool
*/
protected function supports($attribute, $subject): bool
{
if (!in_array($attribute, $this->getResourceAttributes())) {
return false;
}
return true;
}
/**
* @param string $attribute
* @param UserInterface $user
* @return bool
*/
public static function staticVoteOnAttribute(string $attribute, UserInterface $user): bool
{
$instance = new self();
if (!in_array($attribute, $instance->getResourceAttributes())) {
return false;
}
return in_array($attribute, $instance->getAllowedAttributes($user, null));
}
/**
* @param UserInterface $user
* @return array|string[]
*/
private function getOldAllowedAttributes(UserInterface $user): array
{
$allowedAttributes = $this->getResourceAttributes();
if ($user->hasPaidSubscription(true)) {
return $allowedAttributes;
}
if ($user->hasPaidSubscription()) {
return array_values(array_diff($allowedAttributes, [
self::CHANGE_TEMPLATE,
self::AFFILIATE
]));
}
if ($user->hasCurrentSubscription()) {
return array_values(array_diff($allowedAttributes, [
self::CUSTOM_DOMAIN,
self::WHITE_LABEL,
self::CHANGE_TEMPLATE,
self::ORGANIZATION,
self::SMS,
self::SMTP,
self::FLEXIBLE_DURATION,
self::SBPAY_PRO,
self::MULTIPLE_MEETING,
self::MULTIPLE_EMAIL,
self::EVENT_TYPE_TAG,
self::USER_RELATION,
self::ROUTING_FORM,
self::AFFILIATE
]));
}
return [];
}
}