<?php
namespace App\Security\Voter;
use Oz\ApiNvl\Model\User;
use Oz\ApiNvl\Model\Context;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\Voter\Voter;
use Symfony\Component\Security\Core\User\UserInterface;
/**
*
*/
class ContextVoter extends Voter
{
// TODO: Numy ?
public const HAS_COMMANDES = 'HAS_COMMANDES';
public const HAS_LIVRAISON = 'HAS_LIVRAISON';
public const HAS_FACTURES = 'HAS_FACTURES';
public const HAS_CONTRATS = 'HAS_CONTRATS';
public const HAS_TICKET = 'HAS_TICKET';
public const HAS_OS = 'HAS_OS';
public const HAS_DETAIL_CONSO_TELEPHONE = 'HAS_DETAIL_CONSO_TELEPHONE';
public const HAS_DEVIS = 'HAS_DEVIS';
public const HAS_CONTRAT_ASSISTANCE = 'HAS_CONTRAT_ASSISTANCE';
public const HAS_MAILS = 'HAS_MAILS';
// public const IVELEM = 'IVELEM';
public const NOVENCI = 'NOVENCI';
public const IDLINE = 'IDLINE';
public const VAELIA = 'VAELIA';
// public const EXPERT_COM = 'EXPERT_COM';
// public const MVUE = 'MVUE';
/**
* 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
*/
protected function supports(string $attribute, $subject): bool
{
return in_array($attribute, [
self::HAS_COMMANDES,
self::HAS_LIVRAISON,
self::HAS_FACTURES,
self::HAS_CONTRATS,
self::HAS_TICKET,
self::HAS_OS,
self::HAS_DETAIL_CONSO_TELEPHONE,
self::HAS_CONTRAT_ASSISTANCE,
self::HAS_DEVIS,
// self::IVELEM,
self::NOVENCI,
self::IDLINE,
self::VAELIA,
// self::EXPERT_COM,
// self::MVUE,
self::HAS_MAILS,
]);
}
/**
* Perform a single access check operation on a given attribute, subject and token.
* It is safe to assume that $attribute and $subject already passed the "supports()" method check.
*
* @param string $attribute
* @param mixed $subject
* @param TokenInterface $token
*
* @return bool
*/
protected function voteOnAttribute(string $attribute, $subject, TokenInterface $token): bool
{
/** @var User $user */
$user = $token->getUser();
if (!$user instanceof User) {
return false;
}
$selectedContextSlug = array_map(function (Context $context) {
return $context->getSlug();
}, $user->getContexts() ?? []);
switch ($attribute) {
case self::HAS_COMMANDES:
case self::HAS_LIVRAISON:
return count(array_intersect(['ivelem', 'novenci', 'idline', 'expertcom', 'mvue', 'expertcom-gedimat'], $selectedContextSlug));
case self::HAS_FACTURES:
return count(array_intersect(['ivelem', 'novenci', 'idline', 'vaelia', 'expertcom', 'expertcom-gedimat', 'mvue'], $selectedContextSlug));
case self::HAS_MAILS:
case self::HAS_DETAIL_CONSO_TELEPHONE:
return count(array_intersect(['idline'], $selectedContextSlug));
case self::HAS_CONTRATS:
case self::HAS_TICKET:
case self::HAS_OS:
case self::HAS_DEVIS:
return true;
// case self::IVELEM:
// return in_array('ivelem', $selectedContextSlug);
case self::NOVENCI:
return in_array('novenci', $selectedContextSlug);
case self::IDLINE:
return in_array('idline', $selectedContextSlug);
case self::VAELIA:
return in_array('vaelia', $selectedContextSlug);
case self::HAS_CONTRAT_ASSISTANCE:
return !count(array_intersect(['expertcom', 'expertcom-gedimat'], $selectedContextSlug));
// case self::EXPERT_COM:
// return count(array_intersect(['expertcom', 'expertcom-gedimat'], $selectedContextSlug));
// case self::MVUE:
// return in_array('mvue', $selectedContextSlug);
}
return false;
}
}