Your IP : 216.73.217.117


Current Path : /var/www/v3.cesa.co.za/src/SessionsBundle/Services/
Upload File :
Current File : /var/www/v3.cesa.co.za/src/SessionsBundle/Services/SitesManager.php

<?php

namespace App\SessionsBundle\Services;

use Symfony\Component\DependencyInjection\ContainerInterface;
use Monolog\Logger;
use Symfony\Component\HttpFoundation\Request;
use App\SessionsBundle\Entity\Sites;

/**
 * Sites manager
 *
 * @author Otto Saayman <otto@igotafrica.com>
 * @package SessionsBundle
 * @subpackage LanguagePhrases
 * @version 0.0.1
 */
final class SitesManager {

    /**
     * Service Container
     * @var object
     */
    private $container = null;

    /**
     * Entity manager
     * @var object
     */
    private $em;

    /**
     * Active site object
     * @var object
     */
    private $site;

    /**
     * Is the session in the database?
     * @var boolean
     */
    private $database_checked = false;

    /**
     * Class construct
     *
     * @param  ContainerInterface $container
     * @param  Logger             $logger
     * @return void
     */
    public function __construct(
            ContainerInterface $container) {
        $this->setContainer($container);
        $this->setEm($container->get('doctrine')->getManager('default'));

        return;
    }

    /**
     * Get Container
     *
     * @return ContainerInterface $container
     */
    public function getContainer() {
        return $this->container;
    }

    /**
     * Set Container
     *
     * @param  ContainerInterface $container
     * @return void
     */
    public function setContainer($container) {
        $this->container = $container;
    }

    /**
     * Get Entity Manager
     *
     * @return string
     */
    public function getEm() {
        return $this->em;
    }

    /**
     * Set Container
     *
     * @param  string $em
     * @return void
     */
    public function setEm($em) {
        $this->em = $em;
    }

    /**
     * Get Sites
     *
     * @param string $siteId
     * @return Sessions\Entity\Sites
     */
    public function find($siteId) {
        return $this->em->getRepository(Sites::class)->find($siteId);
    }

    /**
     * Get Sites by parameters
     *
     * @param $params
     * @return array
     */
    public function findBy($params) {
        return $this->em->getRepository(Sites::class)->findBy($params);
    }

    /**
     * Get Sites by parameters
     *
     * @param $params
     * @return array
     */
    public function getTld($hostName) {

        if (is_null($hostName) || strtolower($hostName) == 'none') {
            return 'None';
        }

        $arrHost = explode(".", $hostName);

        if (count($arrHost) <= 2) {
            return $hostName;
        }

        $arrHostRev = array_reverse($arrHost);
        $arrHostWithColon = explode(':', $arrHostRev[0]);

        if (count($arrHostWithColon) > 1) {
            $arrHostRev[0] = $arrHostWithColon[0];
        }

        if (count($arrHost) == 4 && is_numeric($arrHost[3])) {
            return $arrHostRev[3] . '.' . $arrHostRev[2] . '.' . $arrHostRev[1] . '.' . $arrHostRev[0];
        } elseif (in_array($arrHostRev[2] . '.' . $arrHostRev[1] . '.' . $arrHostRev[0], array('travel.igotafrica.com', 'rotm.igotafrica.com', 'music.igotafrica.com'))) {
            return $arrHostRev[2] . '.' . $arrHostRev[1] . '.' . $arrHostRev[0];
        } elseif ($arrHostRev[1] == 'co') {
            return $arrHostRev[2] . '.' . $arrHostRev[1] . '.' . $arrHostRev[0];
        } else {
            return $arrHostRev[1] . '.' . $arrHostRev[0];
        }
    }

    /**
     * Get Sites
     *
     * @return Sessions\Entity\Sites
     */
    public function getSite() {

        if (is_object($this->getContainer()->get('sessions.manager')->getSfSession())) {
            $this->site = $this->getContainer()->get('sessions.manager')->getSfSession()->get('siteObject');
        }

        $request = $this->getContainer()->get('sessions.manager')->getRequest();

        if (strlen($request->server->get('HTTP_HOST')) <= 0) {
            $hostName = 'None';
        } else {
            $hostName = $request->server->get('HTTP_HOST');
        }

        $hostName = $this->getTld($hostName);

        if (strlen($request->server->get('SERVER_ADDR')) <= 0) {
            $serverAddress = 'None';
        } else {
            $serverAddress = trim($request->server->get('SERVER_ADDR'));
        }

        if (strlen($request->server->get('SERVER_PORT')) <= 0) {
            $serverPort = '80';
        } else {
            $serverPort = trim($request->server->get('SERVER_PORT'));
        }

//        echo 'Looking for site: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort;
//        exit;

        if (is_object($this->site) && $this->site->getSiteHostName() == $hostName) {

            if ($this->database_checked) {
                return $this->site;
            }

            $this->site = $this->find($this->site->getId());

//            $this->getContainer()->get('error_log.manager')->error('Site found in session: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort);
            if (is_object($this->site) && $this->site->getSiteHostName() == $hostName && is_object($this->getContainer()->get('sessions.manager')->getSfSession())) {
                $this->getContainer()->get('sessions.manager')->getSfSession()->set('siteObject', $this->site);
                $this->database_checked = true;
                return $this->site;
            }
        }

        //Site does not exist - Find it in the database
//        echo 'Looking for site in database: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort;
//        exit;

        $this->site = $this->em->getRepository(Sites::class)->findOneBy(
                array(
                    'site_host_name' => $hostName,
                    'server_ip' => $serverAddress,
                    'site_port' => $serverPort,
                ),
                array('created_at' => 'ASC')
        );

//        echo 'Looked for site: ' . is_object($this->site);
//        exit;

        if (!is_object($this->site)) {
//            $this->getContainer()->get('error_log.manager')->error('Site does not exist: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort);
            $this->site = $this->em->getRepository(Sites::class)->findOneBy(array(), array('session_count' => 'Desc'));
        }

        if (!is_object($this->site) || strtolower(trim($this->site->getSiteHostName())) != $hostName) {
            //Site does not exist - Create it
//            echo 'Site does not exist, create it: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort;
//            exit;

            $this->site = new Sites();

            $this->site->setSiteHostName($hostName);
            $this->site->setServerIp(trim($serverAddress));
            $this->site->setSitePort(trim($serverPort));

            if (is_null($this->site->getSessionCount())) {
                $this->site->setSessionCount(0);
            }

            if (is_null($this->site->isBuildSiteMap())) {
                $this->site->setBuildSiteMap(false);
            }

//            echo 'Saving site: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort . ' - ';
//            exit;

            $this->save($this->site, false);

//            echo 'Saved site: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort . ' - ' . $site->getId() . ' - ';
//            exit;
//            $this->getContainer()->get('error_log.manager')->error('Adding new site: ' . $hostName . ', ' . $serverAddress . ', ' . $serverPort);
        }

        if (is_object($this->getContainer()->get('sessions.manager')->getSfSession())) {
            $this->getContainer()->get('sessions.manager')->getSfSession()->set('siteObject', $this->site);
        }

        return $this->site;
    }

    /**
     * Get Site E-Mail
     *
     * @return string
     */
    public function getSiteEMail($default = '') {
        $return = $this->getSite()->getSiteEMail();

        if (strlen($return) <= 0) {
            $return = $default;
        }

        return $return;
    }

    /**
     * Get Site Name
     *
     * @return string
     */
    public function getSiteName($default = '') {
        $return = $this->getSite()->getSiteName();

        if (strlen($return) <= 0) {
            $return = $this->getContainer()->get('system_setting.manager')->getSetting('site_name', 'CESA');
        }

        if (strlen($return) <= 0) {
            $return = $default;
        }

        return $return;
    }

    /**
     * Get Site Host Name
     *
     * @return string
     */
    public function getSiteHostName($default = '') {
        $return = $this->getSite()->getSiteHostName();

        if (strlen($return) <= 0) {
            $return = $default;
        }

        return $return;
    }

    /**
     * Get Site Template Name
     *
     * @return string
     */
    public function getSiteTemplateId($default = '') {
        $return = $this->getSite()->getTemplateId();

        if (strlen($return) <= 0) {
            $return = $default;
        }

        return $return;
    }

    /**
     * Save site object
     *
     * @param SessionsBundle:Sites $site
     * @return void
     */
    public function save(&$site, $checkUser = true) {

        if ($checkUser) {
            $user = $this->container->get('user_list.manager')->getLoggedInUser();

            if ((strlen($site->getCreatedBy()) <= 0) && (is_object($user))) {
                $site->setCreatedBy($user->getId());
            }
        }

        $this->em->persist($site);
        $this->em->flush();
    }

    /**
     * Do sessions count
     *
     * @param SessionsBundle:Sites $site
     * @return void
     */
    public function doSessionCount(Sites $site = null) {

        if (!is_object($site)) {
            return;
        }

        $site->setSessionCount($this->getContainer()->get('sessions.manager')->countBySite($site));
        $this->save($site);
    }

    /**
     * Get array for select of other sites
     *
     * @param SessionsBundle:Sites $site
     * @return array
     */
    public function getOtherSitesArray(Sites $site = null) {
        $sites = $this->em->getRepository(Sites::class)->getOtherSites($site);

        $return = [];

        foreach ($sites as $otherSite) {
            $return[$otherSite->getSiteHostName() . '(' . $otherSite->getServerIp() . ')'] = $otherSite->getId();
        }

        return $return;
    }

    /**
     * Start the process to delete and move data
     *
     * @param SessionsBundle:Sites $site
     * @param string $moveToSiteId
     * @return void
     */
    public function startDeleteMove(Sites $site, $moveToSiteId) {
        $this->getContainer()->get('batch_job.manager')->save("\$site = \$this->getContainer()->get('sites.manager')->find('" . $site->getId() . "'); "
                . "\$moveToSite = \$this->getContainer()->get('sites.manager')->find('" . $moveToSiteId . "'); "
                . "\$this->getContainer()->get('sites.manager')->deleteMove(\$site, \$moveToSite);", true, false, 150);
    }

    /**
     * Start the process to delete and move data
     *
     * @param Sites $site
     * @param Sites $moveToSite
     * @return void
     */
    public function deleteMove(Sites $site = null, Sites $moveToSite = null) {

        if (!is_object($site) || !is_object($moveToSite) || $site->getId() == $moveToSite->getId()) {
            return;
        }

        $sessionManager = $this->getContainer()->get('sessions.manager');

        $sessions = $sessionManager->getArray($site, 10000);

        $sCnt = 0;

        foreach ($sessions as $sessionArr) {

            $session = $sessionManager->find($sessionArr['id']);

            if (is_object($session)) {
                $session->setSites($moveToSite);
                $sessionManager->save($session);
            }

            $session = null;

            $sCnt++;
        }

        if ($sCnt >= 10000) {
            $this->getContainer()->get('batch_job.manager')->save("\$site = \$this->getContainer()->get('sites.manager')->find('" . $site->getId() . "'); "
                    . "\$moveToSite = \$this->getContainer()->get('sites.manager')->find('" . $moveToSite->getId() . "'); "
                    . "\$this->getContainer()->get('sites.manager')->deleteMove(\$site, \$moveToSite); /* " . time() . " on sessions */", true, false, 150);
            return;
        }

        $userListManager = $this->getContainer()->get('user_list.manager');

        $users = $userListManager->getArray($site, 10000);

        $sCnt = 0;

        foreach ($users as $userArr) {

            $user = $userListManager->find($userArr['id']);

            if (is_object($user)) {
                $user->setSite($moveToSite);
                $userListManager->save($user);
            }

            $sCnt++;
        }

        if ($sCnt >= 10000) {
            $this->getContainer()->get('batch_job.manager')->save("\$site = \$this->getContainer()->get('sites.manager')->find('" . $site->getId() . "'); "
                    . "\$moveToSite = \$this->getContainer()->get('sites.manager')->find('" . $moveToSite->getId() . "'); "
                    . "\$this->getContainer()->get('sites.manager')->deleteMove(\$site, \$moveToSite); /* " . time() . " on users */", true, false, 150);
            return;
        }

        $this->getContainer()->get('batch_job.manager')->save("\$site = \$this->getContainer()->get('sites.manager')->find('" . $moveToSite->getId() . "'); "
                . "\$this->getContainer()->get('sites.manager')->doSessionCount(\$site);", true, false);

        $this->getEm()->remove($site);
    }

    /**
     * Start the process to delete and move data
     *
     * @param Sites $site
     * @return void
     */
    public function recalculate(Sites &$site = null) {

        if (!is_object($site)) {
            return;
        }

        $categoriesManager = $this->getContainer()->get('categories.manager');
        $limitCategoryIds = json_decode($site->getLimitTravelCategories(), true);
        $calculatedCategories = array();

        if (is_array($limitCategoryIds)) {
            foreach ($limitCategoryIds as $limitCategoryId) {
                $category = $categoriesManager->find($limitCategoryId);

                if (!is_object($category)) {
                    continue;
                }

                $calculatedCategories[] = $category->getId();

                if (is_null($category->getParent())) {
                    //Top-level category, so add child categories

                    $childCats = $categoriesManager->findBy(array('parent' => $category));

                    foreach ($childCats as $childCat) {
                        $calculatedCategories[] = $childCat->getId();
                    }
                } else {
                    $calculatedCategories[] = $category->getParent()->getId();
                }
            }
        }

        $site->setLimitTravelCategoriesCalc(json_encode(array_unique($calculatedCategories)));

        $limitCategoryIds = json_decode($site->getLimitBusinessCategories(), true);
        $calculatedCategories = array();

        if (is_array($limitCategoryIds)) {
            foreach ($limitCategoryIds as $limitCategoryId) {
                $category = $categoriesManager->find($limitCategoryId);

                if (!is_object($category)) {
                    continue;
                }

                $calculatedCategories[] = $category->getId();

                if (is_null($category->getParent())) {
                    //Top-level category, so add child categories

                    $childCats = $categoriesManager->findBy(array('parent' => $category));

                    foreach ($childCats as $childCat) {
                        $calculatedCategories[] = $childCat->getId();
                    }
                } else {
                    $calculatedCategories[] = $category->getParent()->getId();
                }
            }
        }

        $site->setLimitBusinessCategoriesCalc(json_encode(array_unique($calculatedCategories)));

        $limitTravelGeoArray = array('country_ids' => array(), 'province_ids' => array(), 'city_ids' => array(), 'suburb_ids' => array());

        $travelCities = json_decode($site->getLimitTravelCities(), true);
        $citiesManager = $this->getContainer()->get('cities.manager');

        foreach ($travelCities as $travelCity) {

            $city = $citiesManager->find($travelCity);

            if (!is_object($city)) {
                continue;
            }

            $limitTravelGeoArray['country_ids'][] = $city->getCountryId();
            $limitTravelGeoArray['province_ids'][] = $city->getProvinceId();
            $limitTravelGeoArray['city_ids'][] = $city->getId();

            foreach ($city->getSuburbs() as $suburb) {
                $limitTravelGeoArray['suburb_ids'][] = $suburb->getId();
            }
        }

        $limitTravelGeoArray['country_ids'] = array_unique($limitTravelGeoArray['country_ids']);
        $limitTravelGeoArray['province_ids'] = array_unique($limitTravelGeoArray['province_ids']);
        $limitTravelGeoArray['city_ids'] = array_unique($limitTravelGeoArray['city_ids']);
        $limitTravelGeoArray['suburb_ids'] = array_unique($limitTravelGeoArray['suburb_ids']);

        $site->setLimitTravelGeoCalc(json_encode($limitTravelGeoArray));

        $limitBusinessGeoArray = array('country_ids' => array(), 'province_ids' => array(), 'city_ids' => array(), 'suburb_ids' => array());

        $businessCities = json_decode($site->getLimitBusinessCities(), true);

        foreach ($businessCities as $businessCity) {

            $city = $citiesManager->find($businessCity);

            if (!is_object($city)) {
                continue;
            }

            $limitBusinessGeoArray['country_ids'][] = $city->getCountryId();
            $limitBusinessGeoArray['province_ids'][] = $city->getProvinceId();
            $limitBusinessGeoArray['city_ids'][] = $city->getId();

            foreach ($city->getSuburbs() as $suburb) {
                $limitBusinessGeoArray['suburb_ids'][] = $suburb->getId();
            }
        }

        $limitBusinessGeoArray['country_ids'] = array_unique($limitBusinessGeoArray['country_ids']);
        $limitBusinessGeoArray['province_ids'] = array_unique($limitBusinessGeoArray['province_ids']);
        $limitBusinessGeoArray['city_ids'] = array_unique($limitBusinessGeoArray['city_ids']);
        $limitBusinessGeoArray['suburb_ids'] = array_unique($limitBusinessGeoArray['suburb_ids']);

        $site->setLimitBusinessGeoCalc(json_encode($limitBusinessGeoArray));

        $this->save($site);
    }
}