src/Hitso/Bundle/CommonBundle/Repository/ChangeLogRepository.php line 32

Open in your IDE?
  1. <?php
  2. declare(strict_types=1);
  3. namespace Hitso\Bundle\CommonBundle\Repository;
  4. use Doctrine\Bundle\DoctrineBundle\Repository\ServiceEntityRepositoryInterface;
  5. use Doctrine\Common\Util\ClassUtils;
  6. use Doctrine\Common\Util\Debug;
  7. use Doctrine\ORM\Query;
  8. use Doctrine\ORM\Query\Expr\Join;
  9. use Doctrine\ORM\Tools\Pagination\Paginator;
  10. use Gedmo\Loggable\Entity\Repository\LogEntryRepository;
  11. use Hitso\Bundle\CommonBundle\Doctrine\Behaviours\VersionInterface;
  12. use Hitso\Bundle\CommonBundle\Entity\ChangeLog;
  13. use Hitso\Bundle\CommonBundle\Entity\EntityInterface;
  14. use Symfony\Bridge\Doctrine\RegistryInterface;
  15. /**
  16.  * Class ChangeLogRepository
  17.  *
  18.  * @package Hitso\Bundle\CommonBundle\Repository
  19.  */
  20. class ChangeLogRepository extends LogEntryRepository implements ServiceEntityRepositoryInterface
  21. {
  22.     /**
  23.      * ChangeLogRepository constructor.
  24.      *
  25.      * @param RegistryInterface $registry
  26.      * @param string            $className
  27.      */
  28.     public function __construct(RegistryInterface $registrystring $className ChangeLog::class)
  29.     {
  30.         parent::__construct($registry->getEntityManager(), $registry->getEntityManager()->getClassMetadata($className));
  31.     }
  32.     /**
  33.      * @param object $entity
  34.      * @param int    $version
  35.      */
  36.     public function revert($entity$version 1)
  37.     {
  38.         if ($entity instanceof VersionInterface) {
  39.             $entity->skipVersion(true);
  40.             /** @var ChangeLog $changeLog */
  41.             $changeLog $this->findOneBy(
  42.                 [
  43.                     'objectId'    => $entity->getId(),
  44.                     'objectClass' => ClassUtils::getClass($entity),
  45.                     'version'     => $version,
  46.                 ]
  47.             );
  48.             if ($changeLog) {
  49.                 $changeLog->setCurrent($entity->isCurrent());
  50.             }
  51.         }
  52.         parent::revert($entity$version);
  53.     }
  54.     /**
  55.      * @param ChangeLog $logEntry
  56.      *
  57.      * @return object|null
  58.      * @throws \Doctrine\ORM\ORMException
  59.      * @throws \Doctrine\ORM\OptimisticLockException
  60.      * @throws \Doctrine\ORM\TransactionRequiredException
  61.      */
  62.     public function getVersionedEntity(ChangeLog $logEntry)
  63.     {
  64.         return $this->_em->find($logEntry->getObjectClass(), $logEntry->getObjectId());
  65.     }
  66.     /**
  67.      * @param string   $className
  68.      * @param iterable $objectIds
  69.      *
  70.      * @return array
  71.      */
  72.     public function findLatest(string $classNameiterable $objectIds): array
  73.     {
  74.         return $this
  75.             ->createQueryBuilder('v''v.id')
  76.             ->leftJoin(ChangeLog::class, 'v2'Join::WITH'v.objectId = v2.objectId AND v.version < v2.version')
  77.             ->select('v')
  78.             ->andWhere('v.objectParent = :className')->orWhere('v.objectClass = :className')
  79.             ->andWhere('v2.objectId IS NULL')
  80.             ->andWhere('v.objectId IN (:objectIds)')
  81.             ->orderBy('v.version''DESC')
  82.             ->setParameters(['className' => $className'objectIds' => $objectIds])
  83.             ->getQuery()
  84.             ->getResult();
  85.     }
  86.     /**
  87.      * @param string   $className
  88.      * @param iterable $objectIds
  89.      *
  90.      * @return array
  91.      */
  92.     public function findCurrent(string $classNameiterable $objectIds): array
  93.     {
  94.         return $this
  95.             ->createQueryBuilder('v''v.id')
  96.             ->select('v')
  97.             ->andWhere('v.objectParent = :className')->orWhere('v.objectClass = :className')
  98.             ->andWhere('v.objectId IN (:objectIds)')
  99.             ->andWhere('v.current = 1')
  100.             ->orderBy('v.version''DESC')
  101.             ->setParameters(['className' => $className'objectIds' => $objectIds])
  102.             ->getQuery()
  103.             ->getResult();
  104.     }
  105.     /**
  106.      * @return int
  107.      */
  108.     public function getTotalCount(): int
  109.     {
  110.         $queryBuilder $this->createQueryBuilder('e');
  111.         $query        $queryBuilder->getQuery();
  112.         $query->useQueryCache(true);
  113.         $query->useResultCache(true);
  114.         $paginator = new Paginator($querytrue);
  115.         $paginator->setUseOutputWalkers(false);
  116.         return $paginator->count();
  117.     }
  118.     /**
  119.      * Get the query for loading of log entries
  120.      *
  121.      * @param object $entity
  122.      *
  123.      * @return Query
  124.      */
  125.     public function getLogEntriesQuery($entity)
  126.     {
  127.         $q parent::getLogEntriesQuery($entity);
  128.         $q
  129.             ->useResultCache(false)
  130.             ->useQueryCache(true);
  131.         return $q;
  132.     }
  133.     /**
  134.      * @param EntityInterface $entity
  135.      * @param int             $pending
  136.      *
  137.      * @return mixed
  138.      */
  139.     public function getPendingLogByEntity(EntityInterface $entityint $pending 1)
  140.     {
  141.         $qb $this->createQueryBuilder('c')
  142.             ->select()
  143.             ->andWhere('c.objectClass = :className')
  144.             ->setParameter('className'get_class($entity))
  145.             ->andWhere('c.objectId = :objectId')
  146.             ->setParameter('objectId'$entity->getId())
  147.             ->orderBy('c.id''DESC');
  148.         if ($pending == 1) {
  149.             $qb->andWhere('c.pending = :pending')
  150.                 ->setParameter('pending'1);
  151.         }
  152.         return $qb->getQuery()
  153.             ->getResult();
  154.     }
  155.     /**
  156.      * @param EntityInterface $entity
  157.      * @param int             $pending
  158.      *
  159.      * @return mixed
  160.      */
  161.     public function countPendingLogByEntity(EntityInterface $entityint $pending 1)
  162.     {
  163.         $qb $this->createQueryBuilder('c')
  164.             ->select('COUNT(c.id)')
  165.             ->andWhere('c.objectClass = :className')
  166.             ->setParameter('className'get_class($entity))
  167.             ->andWhere('c.objectId = :objectId')
  168.             ->setParameter('objectId'$entity->getId())
  169.             ;
  170.         if ($pending == 1) {
  171.             $qb->andWhere('c.pending = :pending')
  172.                 ->setParameter('pending'1);
  173.         }
  174.         return (int)$qb->getQuery()->getSingleScalarResult();
  175.     }
  176.     public function getEntityLogsQuery(EntityInterface $entity)
  177.     {
  178.         return $this->createQueryBuilder('c')
  179.             ->select()
  180.             ->andWhere('c.objectClass = :className')
  181.             ->setParameter('className'get_class($entity))
  182.             ->andWhere('c.objectId = :objectId')
  183.             ->setParameter('objectId'$entity->getId())
  184.             ->orderBy('c.version''DESC');
  185.     }
  186.     public function getEntityLogs(EntityInterface $entity)
  187.     {
  188.         return $this->getEntityLogsQuery($entity)->getQuery()->getResult();
  189.     }
  190.     public function getPendingLogsQuery(EntityInterface $entity)
  191.     {
  192.         $qb $this->getEntityLogsQuery($entity);
  193.         $qb->andWhere('c.pending = :pending')
  194.             ->setParameter('pending'1);
  195.         return $qb;
  196.     }
  197.     public function getNoPendingLogsQuery(EntityInterface $entity)
  198.     {
  199.         $qb $this->getEntityLogsQuery($entity);
  200.         $qb->andWhere('c.pending = :pending')
  201.             ->setParameter('pending'0);
  202.         return $qb;
  203.     }
  204.     public function getNoPendingLogs(EntityInterface $entity)
  205.     {
  206.         $qb $this->getNoPendingLogsQuery($entity);
  207.         return $qb->getQuery()
  208.             ->getResult();
  209.     }
  210.     public function getPendingLogs(EntityInterface $entity)
  211.     {
  212.         $qb $this->getPendingLogsQuery($entity);
  213.         return $qb->getQuery()
  214.             ->getResult();
  215.     }
  216.     public function getLastLog(EntityInterface $entity)
  217.     {
  218.         $qb $this->getEntityLogsQuery($entity);
  219.         $qb->setMaxResults(1);
  220.         return $qb->getQuery()
  221.             ->getOneOrNullResult();
  222.     }
  223.     public function getLastPendingLog(EntityInterface $entity)
  224.     {
  225.         $qb $this->getPendingLogsQuery($entity);
  226.         $qb->setMaxResults(1);
  227.         return $qb->getQuery()
  228.             ->getOneOrNullResult();
  229.     }
  230.     public function getLastNoPendingLog(EntityInterface $entity)
  231.     {
  232.         $qb $this->getNoPendingLogsQuery($entity);
  233.         $qb->setMaxResults(1);
  234.         return $qb->getQuery()
  235.             ->getOneOrNullResult();
  236.     }
  237.     public function setCurrentVersion(EntityInterface $entityint $value 0int $version null)
  238.     {
  239.         $queryBuilder $this->createQueryBuilder('e')
  240.             ->update()
  241.             ->set('e.current'':current')
  242.             ->setParameter('current'$value)
  243.             ->where("e.objectClass = :objectClass")
  244.             ->setParameter('objectClass'ClassUtils::getClass($entity))
  245.             ->andWhere('e.objectId = :objectId')
  246.             ->setParameter('objectId'$entity->getId());
  247.         if ($version) {
  248.             $queryBuilder->andWhere('e.version = :version')
  249.                 ->setParameter('version'$version);
  250.         }
  251.         $queryBuilder->getQuery()
  252.             ->getSingleScalarResult();
  253.     }
  254.     public function getLogByVersion(EntityInterface $entityint $version 1)
  255.     {
  256.         return $this->findOneBy(
  257.             [
  258.                 'objectId'    => $entity->getId(),
  259.                 'objectClass' => ClassUtils::getClass($entity),
  260.                 'version'     => $version,
  261.             ]
  262.         );
  263.     }
  264.     public function getCurrentVersion(EntityInterface $entity)
  265.     {
  266.         $log $this->createQueryBuilder('c')
  267.             ->select()
  268.             ->where('c.objectClass = :className AND c.objectId = :objectId AND c.current = 1')
  269.             ->setParameter('className'ClassUtils::getClass($entity))
  270.             ->setParameter('objectId'$entity->getId())
  271.             ->setMaxResults(1)
  272.             ->getQuery()
  273.             ->getOneOrNullResult();
  274.         if ($log) {
  275.             return $log->getVersion();
  276.         }
  277.         return 1;
  278.     }
  279. }