<?php
namespace App\EventListener;
use App\Annotations\IscDbLoader;
use App\Entity\TempArticle;
use App\Helper\Data;
use App\Helper\Token;
use App\Repository\TempArticleRepository;
use App\Service\Helper;
use App\Service\Middleware;
use App\Service\PdoManager;
use Doctrine\Common\Annotations\Reader;
use Doctrine\DBAL\Connection;
use Doctrine\ORM\Mapping\ClassMetadata;
use Psr\Log\LoggerInterface;
use Symfony\Component\Debug\Debug;
use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
use Symfony\Component\Filesystem\Filesystem;
use Symfony\Component\HttpFoundation\Session\SessionInterface;
use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
use Symfony\Component\Routing\RouterInterface;
use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
use Symfony\Component\Serializer\SerializerInterface;
class DbLoader
{
const CACHE_TIME_CREATION = 0;
const CACHE_TIME_MODIFIED = 1;
/** @var Reader */
protected $reader;
/** @var Helper */
protected $helper;
/** @var RouterInterface */
protected $router;
/** @var SessionInterface */
protected $session;
/** @var Middleware */
protected $middleware;
/** @var SerializerInterface */
protected $serializer;
/** @var Filesystem */
protected $fs;
/** @var ParameterBagInterface */
protected $parameters;
/** @var TokenStorageInterface */
protected $token;
/** @var LoggerInterface */
protected $logger;
/** @var PdoManager */
protected $pdoManager;
protected $loaded = [];
/**
* DbLoader constructor.
*
* @param Reader $reader
* @param Helper $helper
* @param RouterInterface $router
* @param SessionInterface $session
* @param Middleware $middleware
* @param SerializerInterface $serializer
* @param ParameterBagInterface $parameters
* @param Filesystem $fs
* @param TokenStorageInterface $token
* @param LoggerInterface $logger
* @param PdoManager $pdoManager
*/
public function __construct(Reader $reader, Helper $helper, RouterInterface $router, SessionInterface $session,
Middleware $middleware, SerializerInterface $serializer, ParameterBagInterface $parameters, Filesystem $fs,
TokenStorageInterface $token, LoggerInterface $logger, PdoManager $pdoManager)
{
$this->reader = $reader;
$this->helper = $helper;
$this->router = $router;
$this->session = $session;
$this->middleware = $middleware;
$this->serializer = $serializer;
$this->fs = $fs;
$this->parameters = $parameters;
$this->token = $token;
$this->logger = $logger;
$this->pdoManager = $pdoManager;
}
/**
* @param FilterControllerEvent $event
* @throws \ReflectionException
*/
public function onKernelController(FilterControllerEvent $event)
{
$controller = $event->getController();
$ctlClass = get_class($controller[0]);
$reflectionMethod = new \ReflectionMethod($ctlClass,$controller[1]);
$dbLoaderAnnoMethod = $this->reader->getMethodAnnotation($reflectionMethod, IscDbLoader::class);
$reflectionClass = new \ReflectionClass($ctlClass);
$dbLoaderAnnoClass = $this->reader->getClassAnnotation($reflectionClass, IscDbLoader::class);
$entities = [];
if (!is_null($dbLoaderAnnoMethod) && !is_null($dbLoaderAnnoClass))
{
$entities = array_intersect($dbLoaderAnnoMethod->entityName,$dbLoaderAnnoClass->entityName);
}
elseif (!is_null($dbLoaderAnnoMethod) && is_null($dbLoaderAnnoClass))
{
$entities = $dbLoaderAnnoMethod->entityName;
}
elseif (is_null($dbLoaderAnnoMethod) && !is_null($dbLoaderAnnoClass))
{
$entities = $dbLoaderAnnoClass->entityName;
}
if (!empty($entities))
{
foreach ($entities as $eName)
{
if (!class_exists($eName) || in_array($eName,$this->loaded))
{
continue;
}
ini_set('memory_limit','1G');
set_time_limit(1800);
$data = new Data();
$data->setPage(0);
$data->setType($eName);
$this->load($data);
$this->loaded[] = $eName;
}
}
}
protected function load(Data $data, $num = 0)
{
$path = null;
if (is_null($path) || !is_null($path) && !$this->cacheValid($this->pdoManager->getDbFilename(), self::CACHE_TIME_MODIFIED))
{
switch($data->getType())
{
default:
$result = $this->loadArticlesFromMiddleware($data, $this->token->getToken()->getUser()->getToken());
}
if (empty($result))
{
$nextPage = null;
$prevPage = null;
$result = null;
}
else
{
$nextPage = $result['nextPage'] === false ? null : $result['nextPage'];
$prevPage = $result['prevPage'] === false ? null : $result['prevPage'];
$result = $result['data'];
}
}
if (!empty($result))
{
$num += $this->pdoManager->insertArray($data->getType(), $result);
}
if (!is_null($nextPage))
{
$data->setPage($nextPage);
$this->load($data, $num);
}
else
{
$this->logger->critical(sprintf('%d db entries for table %s inserted.',$num, $this->pdoManager->getTableNameForEntity($data->getType())));
}
}
protected function loadArticlesFromFile($filename)
{
if (!$this->fs->exists($filename))
{
return false;
}
$page = @file_get_contents($filename);
if (false === $page)
{
return false;
}
$page = $this->decryptData($page);
return @unserialize($page);
}
protected function loadArticlesFromMiddleware(Data $data, Token $token)
{
// Build article table
$aPage = $this->middleware->getArticlePage($data->getPage() , $token);
if (empty($aPage))
{
return [];
}
return $aPage;
}
protected function cacheValid($dir, $timeType = self::CACHE_TIME_CREATION)
{
$cacheValid = true;
if ($this->fs->exists($dir))
{
if ($timeType == self::CACHE_TIME_CREATION)
{
$age = @filectime($dir);
}
else
{
$age = @filemtime($dir);
}
if ($age !== false)
{
$diff = time() - $age;
if ($diff >= 3600)
{
$cacheValid = false;
}
}
}
else
{
$cacheValid = false;
}
return $cacheValid;
}
protected function encryptData($data)
{
$erp = $this->parameters->get('erp');
$method = 'aes-256-cbc';
$key = hash('sha256', $erp['client']['secret']);
$iv = substr(hash('sha256', $erp['client']['id']), 0, 16);
// return base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv)). "<ENC>";
return openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
}
protected function decryptData($data)
{
$erp = $this->parameters->get('erp');
$method = 'aes-256-cbc';
$key = hash('sha256', $erp['client']['secret']);
$iv = substr(hash('sha256', $erp['client']['id']), 0, 16);
return openssl_decrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv);
// return openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA, $iv);
}
}