VersionRepository.php 5.9 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  1. <?php
  2. /*
  3. * This file is part of Packagist.
  4. *
  5. * (c) Jordi Boggiano <j.boggiano@seld.be>
  6. * Nils Adermann <naderman@naderman.de>
  7. *
  8. * For the full copyright and license information, please view the LICENSE
  9. * file that was distributed with this source code.
  10. */
  11. namespace Packagist\WebBundle\Entity;
  12. use Doctrine\ORM\EntityRepository;
  13. use Doctrine\DBAL\Connection;
  14. use Predis\Client;
  15. /**
  16. * @author Jordi Boggiano <j.boggiano@seld.be>
  17. */
  18. class VersionRepository extends EntityRepository
  19. {
  20. private $redis;
  21. protected $supportedLinkTypes = array(
  22. 'require',
  23. 'conflict',
  24. 'provide',
  25. 'replace',
  26. 'devRequire',
  27. 'suggest',
  28. );
  29. public function setRedis(Client $client)
  30. {
  31. $this->redis = $client;
  32. }
  33. public function remove(Version $version)
  34. {
  35. $em = $this->getEntityManager();
  36. $version->getPackage()->getVersions()->removeElement($version);
  37. $version->getPackage()->setCrawledAt(new \DateTime);
  38. $version->getPackage()->setUpdatedAt(new \DateTime);
  39. $em->getConnection()->executeQuery('DELETE FROM version_author WHERE version_id=:id', array('id' => $version->getId()));
  40. $em->getConnection()->executeQuery('DELETE FROM version_tag WHERE version_id=:id', array('id' => $version->getId()));
  41. $em->getConnection()->executeQuery('DELETE FROM link_suggest WHERE version_id=:id', array('id' => $version->getId()));
  42. $em->getConnection()->executeQuery('DELETE FROM link_conflict WHERE version_id=:id', array('id' => $version->getId()));
  43. $em->getConnection()->executeQuery('DELETE FROM link_replace WHERE version_id=:id', array('id' => $version->getId()));
  44. $em->getConnection()->executeQuery('DELETE FROM link_provide WHERE version_id=:id', array('id' => $version->getId()));
  45. $em->getConnection()->executeQuery('DELETE FROM link_require_dev WHERE version_id=:id', array('id' => $version->getId()));
  46. $em->getConnection()->executeQuery('DELETE FROM link_require WHERE version_id=:id', array('id' => $version->getId()));
  47. $em->remove($version);
  48. }
  49. public function getVersionData(array $versionIds)
  50. {
  51. $links = [
  52. 'require' => 'link_require',
  53. 'devRequire' => 'link_require_dev',
  54. 'suggest' => 'link_suggest',
  55. 'conflict' => 'link_conflict',
  56. 'provide' => 'link_provide',
  57. 'replace' => 'link_replace',
  58. ];
  59. $result = [];
  60. foreach ($versionIds as $id) {
  61. $result[$id] = [
  62. 'require' => [],
  63. 'devRequire' => [],
  64. 'suggest' => [],
  65. 'conflict' => [],
  66. 'provide' => [],
  67. 'replace' => [],
  68. ];
  69. }
  70. foreach ($links as $link => $table) {
  71. $rows = $this->getEntityManager()->getConnection()->fetchAll(
  72. 'SELECT version_id, packageName name, packageVersion version FROM '.$table.' WHERE version_id IN (:ids)',
  73. ['ids' => $versionIds],
  74. ['ids' => Connection::PARAM_INT_ARRAY]
  75. );
  76. foreach ($rows as $row) {
  77. $result[$row['version_id']][$link][] = $row;
  78. }
  79. }
  80. $rows = $this->getEntityManager()->getConnection()->fetchAll(
  81. 'SELECT va.version_id, name, email, homepage, role FROM author a JOIN version_author va ON va.author_id = a.id WHERE va.version_id IN (:ids)',
  82. ['ids' => $versionIds],
  83. ['ids' => Connection::PARAM_INT_ARRAY]
  84. );
  85. foreach ($rows as $row) {
  86. $versionId = $row['version_id'];
  87. unset($row['version_id']);
  88. $result[$versionId]['authors'][] = array_filter($row);
  89. }
  90. return $result;
  91. }
  92. public function getFullVersion($versionId)
  93. {
  94. $qb = $this->getEntityManager()->createQueryBuilder();
  95. $qb->select('v', 't', 'a')
  96. ->from('Packagist\WebBundle\Entity\Version', 'v')
  97. ->leftJoin('v.tags', 't')
  98. ->leftJoin('v.authors', 'a')
  99. ->where('v.id = :id')
  100. ->setParameter('id', $versionId);
  101. return $qb->getQuery()->getSingleResult();
  102. }
  103. /**
  104. * Returns the latest versions released
  105. *
  106. * @param string $vendor optional vendor filter
  107. * @param string $package optional vendor/package filter
  108. * @return \Doctrine\ORM\QueryBuilder
  109. */
  110. public function getQueryBuilderForLatestVersionWithPackage($vendor = null, $package = null)
  111. {
  112. $qb = $this->getEntityManager()->createQueryBuilder();
  113. $qb->select('v')
  114. ->from('Packagist\WebBundle\Entity\Version', 'v')
  115. ->where('v.development = false')
  116. ->andWhere('v.releasedAt <= ?0')
  117. ->orderBy('v.releasedAt', 'DESC');
  118. $qb->setParameter(0, date('Y-m-d H:i:s'));
  119. if ($vendor || $package) {
  120. $qb->innerJoin('v.package', 'p')
  121. ->addSelect('p');
  122. }
  123. if ($vendor) {
  124. $qb->andWhere('p.name LIKE ?1');
  125. $qb->setParameter(1, $vendor.'/%');
  126. } elseif ($package) {
  127. $qb->andWhere('p.name = ?1')
  128. ->setParameter(1, $package);
  129. }
  130. return $qb;
  131. }
  132. public function getLatestReleases($count = 10)
  133. {
  134. if ($cached = $this->redis->get('new_releases')) {
  135. return json_decode($cached, true);
  136. }
  137. $qb = $this->getEntityManager()->createQueryBuilder();
  138. $qb->select('v.name, v.version, v.description')
  139. ->from('Packagist\WebBundle\Entity\Version', 'v')
  140. ->where('v.development = false')
  141. ->andWhere('v.releasedAt < :now')
  142. ->orderBy('v.releasedAt', 'DESC')
  143. ->setMaxResults($count)
  144. ->setParameter('now', date('Y-m-d H:i:s'));
  145. $res = $qb->getQuery()->getResult();
  146. $this->redis->setex('new_releases', 600, json_encode($res));
  147. return $res;
  148. }
  149. }