src/EventListener/DbLoader.php line 102

Open in your IDE?
  1. <?php
  2. namespace App\EventListener;
  3. use App\Annotations\IscDbLoader;
  4. use App\Entity\TempArticle;
  5. use App\Helper\Data;
  6. use App\Helper\Token;
  7. use App\Repository\TempArticleRepository;
  8. use App\Service\Helper;
  9. use App\Service\Middleware;
  10. use App\Service\PdoManager;
  11. use Doctrine\Common\Annotations\Reader;
  12. use Doctrine\DBAL\Connection;
  13. use Doctrine\ORM\Mapping\ClassMetadata;
  14. use Psr\Log\LoggerInterface;
  15. use Symfony\Component\Debug\Debug;
  16. use Symfony\Component\DependencyInjection\ParameterBag\ParameterBagInterface;
  17. use Symfony\Component\Filesystem\Filesystem;
  18. use Symfony\Component\HttpFoundation\Session\SessionInterface;
  19. use Symfony\Component\HttpKernel\Event\FilterControllerEvent;
  20. use Symfony\Component\Routing\RouterInterface;
  21. use Symfony\Component\Security\Core\Authentication\Token\Storage\TokenStorageInterface;
  22. use Symfony\Component\Serializer\SerializerInterface;
  23. class DbLoader
  24. {
  25.     const CACHE_TIME_CREATION 0;
  26.     const CACHE_TIME_MODIFIED 1;
  27.     /** @var Reader */
  28.     protected $reader;
  29.     /** @var Helper */
  30.     protected $helper;
  31.     /** @var RouterInterface */
  32.     protected $router;
  33.     /** @var SessionInterface */
  34.     protected $session;
  35.     /** @var Middleware */
  36.     protected $middleware;
  37.     /** @var SerializerInterface */
  38.     protected $serializer;
  39.     /** @var Filesystem */
  40.     protected $fs;
  41.     /** @var ParameterBagInterface */
  42.     protected $parameters;
  43.     /** @var TokenStorageInterface */
  44.     protected $token;
  45.     /** @var LoggerInterface */
  46.     protected $logger;
  47.     /** @var PdoManager */
  48.     protected $pdoManager;
  49.     protected $loaded = [];
  50.     /**
  51.      * DbLoader constructor.
  52.      *
  53.      * @param Reader $reader
  54.      * @param Helper $helper
  55.      * @param RouterInterface $router
  56.      * @param SessionInterface $session
  57.      * @param Middleware $middleware
  58.      * @param SerializerInterface $serializer
  59.      * @param ParameterBagInterface $parameters
  60.      * @param Filesystem $fs
  61.      * @param TokenStorageInterface $token
  62.      * @param LoggerInterface $logger
  63.      * @param PdoManager $pdoManager
  64.      */
  65.     public function __construct(Reader $readerHelper $helperRouterInterface $routerSessionInterface $session,
  66.                                 Middleware $middlewareSerializerInterface $serializerParameterBagInterface $parametersFilesystem $fs,
  67.                                 TokenStorageInterface $tokenLoggerInterface $loggerPdoManager $pdoManager)
  68.     {
  69.         $this->reader   $reader;
  70.         $this->helper   $helper;
  71.         $this->router   $router;
  72.         $this->session  $session;
  73.         $this->middleware $middleware;
  74.         $this->serializer $serializer;
  75.         $this->fs         $fs;
  76.         $this->parameters $parameters;
  77.         $this->token      $token;
  78.         $this->logger     $logger;
  79.         $this->pdoManager $pdoManager;
  80.     }
  81.     /**
  82.      * @param FilterControllerEvent $event
  83.      * @throws \ReflectionException
  84.      */
  85.     public function onKernelController(FilterControllerEvent $event)
  86.     {
  87.         $controller $event->getController();
  88.         $ctlClass get_class($controller[0]);
  89.         $reflectionMethod = new \ReflectionMethod($ctlClass,$controller[1]);
  90.         $dbLoaderAnnoMethod $this->reader->getMethodAnnotation($reflectionMethodIscDbLoader::class);
  91.         $reflectionClass = new \ReflectionClass($ctlClass);
  92.         $dbLoaderAnnoClass $this->reader->getClassAnnotation($reflectionClassIscDbLoader::class);
  93.         $entities = [];
  94.         if (!is_null($dbLoaderAnnoMethod) && !is_null($dbLoaderAnnoClass))
  95.         {
  96.             $entities array_intersect($dbLoaderAnnoMethod->entityName,$dbLoaderAnnoClass->entityName);
  97.         }
  98.         elseif (!is_null($dbLoaderAnnoMethod) && is_null($dbLoaderAnnoClass))
  99.         {
  100.             $entities $dbLoaderAnnoMethod->entityName;
  101.         }
  102.         elseif (is_null($dbLoaderAnnoMethod) && !is_null($dbLoaderAnnoClass))
  103.         {
  104.             $entities $dbLoaderAnnoClass->entityName;
  105.         }
  106.         if (!empty($entities))
  107.         {
  108.             foreach ($entities as $eName)
  109.             {
  110.                 if (!class_exists($eName) || in_array($eName,$this->loaded))
  111.                 {
  112.                     continue;
  113.                 }
  114.                 ini_set('memory_limit','1G');
  115.                 set_time_limit(1800);
  116.                 $data = new Data();
  117.                 $data->setPage(0);
  118.                 $data->setType($eName);
  119.                 $this->load($data);
  120.                 $this->loaded[] = $eName;
  121.             }
  122.         }
  123.     }
  124.     protected function load(Data $data$num 0)
  125.     {
  126.         $path     null;
  127.         if (is_null($path) || !is_null($path) && !$this->cacheValid($this->pdoManager->getDbFilename(), self::CACHE_TIME_MODIFIED))
  128.         {
  129.             switch($data->getType())
  130.             {
  131.                 default:
  132.                     $result $this->loadArticlesFromMiddleware($data$this->token->getToken()->getUser()->getToken());
  133.             }
  134.             if (empty($result))
  135.             {
  136.                 $nextPage null;
  137.                 $prevPage null;
  138.                 $result   null;
  139.             }
  140.             else
  141.             {
  142.                 $nextPage $result['nextPage'] === false null $result['nextPage'];
  143.                 $prevPage $result['prevPage']  === false null $result['prevPage'];
  144.                 $result   $result['data'];
  145.             }
  146.         }
  147.         if (!empty($result))
  148.         {
  149.             $num += $this->pdoManager->insertArray($data->getType(), $result);
  150.         }
  151.         if (!is_null($nextPage))
  152.         {
  153.             $data->setPage($nextPage);
  154.             $this->load($data$num);
  155.         }
  156.         else
  157.         {
  158.             $this->logger->critical(sprintf('%d db entries for table %s inserted.',$num$this->pdoManager->getTableNameForEntity($data->getType())));
  159.         }
  160.     }
  161.     protected function loadArticlesFromFile($filename)
  162.     {
  163.         if (!$this->fs->exists($filename))
  164.         {
  165.             return false;
  166.         }
  167.         $page = @file_get_contents($filename);
  168.         if (false === $page)
  169.         {
  170.             return false;
  171.         }
  172.         $page $this->decryptData($page);
  173.         return @unserialize($page);
  174.     }
  175.     protected function loadArticlesFromMiddleware(Data $dataToken $token)
  176.     {
  177.         // Build article table
  178.         $aPage $this->middleware->getArticlePage($data->getPage() , $token);
  179.         if (empty($aPage))
  180.         {
  181.             return [];
  182.         }
  183.         return $aPage;
  184.     }
  185.     protected function cacheValid($dir$timeType self::CACHE_TIME_CREATION)
  186.     {
  187.         $cacheValid true;
  188.         if ($this->fs->exists($dir))
  189.         {
  190.             if ($timeType == self::CACHE_TIME_CREATION)
  191.             {
  192.                 $age = @filectime($dir);
  193.             }
  194.             else
  195.             {
  196.                 $age = @filemtime($dir);
  197.             }
  198.             if ($age !== false)
  199.             {
  200.                 $diff time() - $age;
  201.                 if ($diff >= 3600)
  202.                 {
  203.                     $cacheValid false;
  204.                 }
  205.             }
  206.         }
  207.         else
  208.         {
  209.             $cacheValid false;
  210.         }
  211.         return $cacheValid;
  212.     }
  213.     protected function encryptData($data)
  214.     {
  215.         $erp $this->parameters->get('erp');
  216.         $method 'aes-256-cbc';
  217.         $key hash('sha256'$erp['client']['secret']);
  218.         $iv substr(hash('sha256'$erp['client']['id']), 016);
  219. //        return base64_encode(openssl_encrypt($data, $method, $key, OPENSSL_RAW_DATA, $iv)). "<ENC>";
  220.         return openssl_encrypt($data$method$keyOPENSSL_RAW_DATA$iv);
  221.     }
  222.     protected function decryptData($data)
  223.     {
  224.         $erp $this->parameters->get('erp');
  225.         $method 'aes-256-cbc';
  226.         $key hash('sha256'$erp['client']['secret']);
  227.         $iv substr(hash('sha256'$erp['client']['id']), 016);
  228.         return openssl_decrypt($data$method$keyOPENSSL_RAW_DATA$iv);
  229. //        return openssl_decrypt(base64_decode($data), $method, $key, OPENSSL_RAW_DATA, $iv);
  230.     }
  231. }