| Current Path : /var/www/v3.cesa.co.za/src/SessionsBundle/Services/ |
| 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);
}
}