open-orchestra/open-orchestra-cms-bundle

View on GitHub
Backoffice/Context/ContextBackOfficeManager.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

namespace OpenOrchestra\Backoffice\Context;

use FOS\UserBundle\Model\GroupableInterface;
use OpenOrchestra\Backoffice\Security\ContributionRoleInterface;
use OpenOrchestra\ModelInterface\Model\SiteInterface;
use OpenOrchestra\ModelInterface\Repository\SiteRepositoryInterface;
use OpenOrchestra\UserBundle\Model\UserInterface;
use Symfony\Component\HttpFoundation\Session\Session;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Security\Core\Authentication\Token\TokenInterface;
use Symfony\Component\Security\Core\Authorization\AuthorizationCheckerInterface;

/**
 * Class ContextBackOfficeManager
 */
class ContextBackOfficeManager implements ContextBackOfficeInterface
{
    protected $siteId;
    protected $session;
    protected $tokenStorage;
    protected $currentLanguage;
    protected $currentSiteLanguages = array();
    protected $defaultLocale;
    protected $siteRepository;
    protected $authorizationChecker;

    /**
     * Constructor
     *
     * @param Session                       $session
     * @param TokenStorageInterface         $tokenStorage
     * @param string                        $defaultLocale
     * @param SiteRepositoryInterface       $siteRepository
     * @param AuthorizationCheckerInterface $authorizationChecker
     */
    public function __construct(
        Session $session,
        TokenStorageInterface $tokenStorage,
        $defaultLocale,
        SiteRepositoryInterface $siteRepository,
        AuthorizationCheckerInterface $authorizationChecker
    ) {
        $this->session = $session;
        $this->tokenStorage = $tokenStorage;
        $this->defaultLocale = $defaultLocale;
        $this->siteRepository = $siteRepository;
        $this->authorizationChecker = $authorizationChecker;
    }

    /**
     * Get current back office language
     *
     * @return string
     */
    public function getBackOfficeLanguage()
    {
        $currentLanguage = $this->session->get(self::KEY_LOCALE);

        if (!$currentLanguage) {
            $currentLanguage = $this->defaultLocale;
            $token = $this->tokenStorage->getToken();
            if ($token && ($user = $token->getUser()) instanceof UserInterface) {
                if (null !== $user->getLanguage()) {
                    $currentLanguage = $user->getLanguage();
                }
                $this->setBackOfficeLanguage($currentLanguage);
            }
        }

        return $currentLanguage;

    }

    /**
     * Get availables sites on platform
     *
     * @return array<SiteInterface>
     */
    public function getAvailableSites()
    {
        $sites = array();
        $token = $this->tokenStorage->getToken();
        if ($token instanceof TokenInterface) {
            if ($this->authorizationChecker->isGranted(ContributionRoleInterface::PLATFORM_ADMIN)) {
                return $this->siteRepository->findByDeleted(false);
            }

            if (($user = $token->getUser()) instanceof GroupableInterface) {
                foreach ($user->getGroups() as $group) {
                    /** @var SiteInterface $site */
                    $site = $group->getSite();
                    if (null !== $site && !$group->isDeleted() && !$site->isDeleted()) {
                        $sites[$site->getId()] = $site;
                    }
                }
            }
        }

        return $sites;
    }

    /**
     * Get the current site id
     *
     * @return string
     */
    public function getSiteId()
    {
        if (is_null($this->siteId)) {
            $this->siteId = $this->getSite()['siteId'];
        }

        return $this->siteId;
    }

    /**
     * Get the current domain
     *
     * @return string
     */
    public function getSiteName()
    {
        $site = $this->getSite();

        return $site['name'];
    }

    /**
     * Get the default language of the current site
     *
     * @return string
     */
    public function getSiteDefaultLanguage()
    {
        if (is_null($this->currentLanguage)) {
            $this->currentLanguage = $this->getSite()['defaultLanguage'];
        }

        return $this->currentLanguage;
    }

    /**
     * Get languages of the current site
     *
     * @return array
     */
    public function getSiteLanguages()
    {
        if (empty($this->currentSiteLanguages)) {
            $this->currentSiteLanguages = $this->getSite()['languages'];
        }

        return $this->currentSiteLanguages;
    }

    /**
     * Get the contribution language setted by the user for the current site
     *
     * @return string
     */
    public function getSiteContributionLanguage()
    {
        $currentLanguage = $this->getSite()['defaultLanguage'];

        $token = $this->tokenStorage->getToken();
        if ($token instanceof TokenInterface) {
            if (($user = $token->getUser()) instanceof UserInterface && $user->hasLanguageBySite($this->getSiteId())) {
                $currentLanguage = $user->getLanguageBySite($this->getSiteId());
            }
        }

        return $currentLanguage;
    }

    /**
     * Clear saved context
     */
    public function clearContext()
    {
        $this->session->remove(self::KEY_SITE);
        $this->session->remove(self::KEY_LOCALE);
        $this->tokenStorage->getToken()->setAuthenticated(false);
    }

    /**
     * Set current back office language
     *
     * @param string $language
     */
    public function setBackOfficeLanguage($language)
    {
        $this->session->set(self::KEY_LOCALE, $language);
    }

    /**
     * Set current site
     *
     * @param string $siteId
     * @param string $siteName
     * @param string $siteDefaultLanguage
     * @param array $languages
     */
    public function setSite($siteId, $siteName, $siteDefaultLanguage, array $languages)
    {
        $this->siteId = $siteId;
        $this->session->set(
            self::KEY_SITE,
            array(
                'siteId' => $siteId,
                'name' => $siteName,
                'defaultLanguage' => $siteDefaultLanguage,
                'languages' => $languages,
            )
        );
    }

    /**
     * Get current selected site
     *
     * @return array
     */
    protected function getSite()
    {
        $currentSite = $this->session->get(self::KEY_SITE);

        if (!$currentSite || (is_integer($currentSite['siteId']) && $currentSite['siteId'] == 0)) {
            $sites = $this->getAvailableSites();
            if (count($sites) > 0) {
                $site = array_shift($sites);
                $siteId = $site->getSiteId();
                $siteName = $site->getName();
                $locale = $site->getDefaultLanguage();
                $languages = $site->getLanguages();
                $this->setSite($siteId, $siteName, $locale, $languages);
                $currentSite = $this->session->get(self::KEY_SITE);
            }
        }

        return $currentSite;
    }
}