PackageManager.php 4.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136
  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\Model;
  12. use Symfony\Bridge\Doctrine\RegistryInterface;
  13. use Packagist\WebBundle\Entity\Package;
  14. use Psr\Log\LoggerInterface;
  15. use AlgoliaSearch\Client as AlgoliaClient;
  16. /**
  17. * @author Jordi Boggiano <j.boggiano@seld.be>
  18. */
  19. class PackageManager
  20. {
  21. protected $doctrine;
  22. protected $mailer;
  23. protected $twig;
  24. protected $logger;
  25. protected $options;
  26. protected $providerManager;
  27. protected $algoliaClient;
  28. protected $algoliaIndexName;
  29. public function __construct(RegistryInterface $doctrine, \Swift_Mailer $mailer, \Twig_Environment $twig, LoggerInterface $logger, array $options, ProviderManager $providerManager, AlgoliaClient $algoliaClient, string $algoliaIndexName)
  30. {
  31. $this->doctrine = $doctrine;
  32. $this->mailer = $mailer;
  33. $this->twig = $twig;
  34. $this->logger = $logger;
  35. $this->options = $options;
  36. $this->providerManager = $providerManager;
  37. $this->algoliaClient = $algoliaClient;
  38. $this->algoliaIndexName = $algoliaIndexName;
  39. }
  40. public function deletePackage(Package $package)
  41. {
  42. /** @var VersionRepository $versionRepo */
  43. $versionRepo = $this->doctrine->getRepository('PackagistWebBundle:Version');
  44. foreach ($package->getVersions() as $version) {
  45. $versionRepo->remove($version);
  46. }
  47. $this->providerManager->deletePackage($package);
  48. $packageName = $package->getName();
  49. $em = $this->doctrine->getManager();
  50. $em->remove($package);
  51. $em->flush();
  52. // attempt search index cleanup
  53. try {
  54. $indexName = $this->algoliaIndexName;
  55. $algolia = $this->algoliaClient;
  56. $index = $algolia->initIndex($indexName);
  57. $index->deleteObject($packageName);
  58. } catch (\AlgoliaSearch\AlgoliaException $e) {
  59. }
  60. }
  61. public function notifyUpdateFailure(Package $package, \Exception $e, $details = null)
  62. {
  63. if (!$package->isUpdateFailureNotified()) {
  64. $recipients = array();
  65. foreach ($package->getMaintainers() as $maintainer) {
  66. if ($maintainer->isNotifiableForFailures()) {
  67. $recipients[$maintainer->getEmail()] = $maintainer->getUsername();
  68. }
  69. }
  70. if ($recipients) {
  71. $body = $this->twig->render('PackagistWebBundle:Email:update_failed.txt.twig', array(
  72. 'package' => $package,
  73. 'exception' => get_class($e),
  74. 'exceptionMessage' => $e->getMessage(),
  75. 'details' => strip_tags($details),
  76. ));
  77. $message = \Swift_Message::newInstance()
  78. ->setSubject($package->getName().' failed to update, invalid composer.json data')
  79. ->setFrom($this->options['from'], $this->options['fromName'])
  80. ->setTo($recipients)
  81. ->setBody($body)
  82. ;
  83. try {
  84. $this->mailer->send($message);
  85. } catch (\Swift_TransportException $e) {
  86. $this->logger->error('['.get_class($e).'] '.$e->getMessage());
  87. return false;
  88. }
  89. }
  90. $package->setUpdateFailureNotified(true);
  91. $this->doctrine->getEntityManager()->flush();
  92. }
  93. return true;
  94. }
  95. public function notifyNewMaintainer($user, $package)
  96. {
  97. $body = $this->twig->render('PackagistWebBundle:Email:maintainer_added.txt.twig', array(
  98. 'package_name' => $package->getName()
  99. ));
  100. $message = \Swift_Message::newInstance()
  101. ->setSubject('You have been added to ' . $package->getName() . ' as a maintainer')
  102. ->setFrom($this->options['from'], $this->options['fromName'])
  103. ->setTo($user->getEmail())
  104. ->setBody($body)
  105. ;
  106. try {
  107. $this->mailer->send($message);
  108. } catch (\Swift_TransportException $e) {
  109. $this->logger->error('['.get_class($e).'] '.$e->getMessage());
  110. return false;
  111. }
  112. return true;
  113. }
  114. }