MigrationUpgradeCommand.php 4.9KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142
  1. <?php
  2. namespace Muzich\CoreBundle\Command;
  3. use Symfony\Bundle\FrameworkBundle\Command\ContainerAwareCommand;
  4. use Symfony\Component\Console\Input\InputArgument;
  5. use Symfony\Component\Console\Input\InputInterface;
  6. use Symfony\Component\Console\Input\InputOption;
  7. use Symfony\Component\Console\Output\OutputInterface;
  8. //use Muzich\CoreBundle\Managers\CommentsManager;
  9. use Muzich\CoreBundle\Util\StrictCanonicalizer;
  10. use Muzich\CoreBundle\Entity\Element;
  11. class MigrationUpgradeCommand extends ContainerAwareCommand
  12. {
  13. protected function configure()
  14. {
  15. $this
  16. ->setName('migration:upgrade')
  17. ->setDescription('Mise a jour de données nécéssaire pour migrations')
  18. ->addArgument('from', InputArgument::REQUIRED, 'version de départ')
  19. ->addArgument('to', InputArgument::REQUIRED, 'version visé')
  20. ;
  21. }
  22. protected function execute(InputInterface $input, OutputInterface $output)
  23. {
  24. $doctrine = $this->getContainer()->get('doctrine');
  25. $em = $doctrine->getEntityManager();
  26. $output->writeln('#');
  27. $output->writeln('## Outil de migration ##');
  28. $output->writeln('#');
  29. $proceeded = false;
  30. if ($input->getArgument('from') == '0.6' && $input->getArgument('to') == '0.7')
  31. {
  32. $proceeded = true;
  33. $output->writeln('<info>Mise a jour des données "commentaires" pour migration 0.6 => 0.7</info>');
  34. /**
  35. * Pour cette migration on a besoin de rajouter une valeur aux données
  36. * de commentaire d'éléments.
  37. */
  38. $elements = $em->getRepository('MuzichCoreBundle:Element')->findAll();
  39. foreach ($elements as $element)
  40. {
  41. if (count(($comments = $element->getComments())))
  42. {
  43. // Oui un for serai plus performant ...
  44. foreach ($comments as $i => $comment)
  45. {
  46. // Si il n'y as pas d'enregistrement 'a' dans le commentaire
  47. if (!array_key_exists('a', $comment))
  48. {
  49. // Il faut le rajouter
  50. $comments[$i]['a'] = array();
  51. }
  52. }
  53. $element->setComments($comments);
  54. $em->persist($element);
  55. }
  56. }
  57. $em->flush();
  58. $output->writeln('<info>Terminé !</info>');
  59. }
  60. if ($input->getArgument('from') == '0.9.8.1' && $input->getArgument('to') == '0.9.8.2')
  61. {
  62. $proceeded = true;
  63. $canonicalizer = new StrictCanonicalizer();
  64. $elements = $em->getRepository('MuzichCoreBundle:Element')->findAll();
  65. foreach ($elements as $element)
  66. {
  67. $element->setSlug($canonicalizer->canonicalize_stricter($element->getName()));
  68. $this->updateCountFavorited($element);
  69. $this->updateCountPlaylisted($element);
  70. $output->writeln('<info>Element '.$element->getName().' favorited ...'.$element->getCountFavorited().'</info>');
  71. $output->writeln('<info>Element '.$element->getName().' playlisted ...'.$element->getCountPlaylisted().'</info>');
  72. //$output->write('.');
  73. $em->persist($element);
  74. }
  75. $output->writeln('');
  76. $output->writeln('<info>Save in Database ...</info>');
  77. $em->flush();
  78. $output->writeln('<info>Terminé !</info>');
  79. }
  80. if (!$proceeded)
  81. {
  82. $output->writeln('<error>Versions saisies non prises en charges</error>');
  83. }
  84. }
  85. protected function updateCountFavorited(Element $element)
  86. {
  87. $em = $this->getContainer()->get('doctrine')->getEntityManager();
  88. // Compter le nombre de favoris de cet élement
  89. // + Effectué par un autre que le proprio
  90. // + Qui ont l'email confirmé
  91. $count = $em->createQueryBuilder()
  92. ->select('COUNT(DISTINCT element)')
  93. ->from('MuzichCoreBundle:UsersElementsFavorites', 'fav')
  94. ->join('fav.user', 'owner')
  95. ->join('fav.element', 'element')
  96. ->where('fav.user != :element_owner_id AND owner.email_confirmed = 1')
  97. ->andWhere('fav.element = :element_id')
  98. ->setParameter('element_owner_id', $element->getOwner()->getId())
  99. ->setParameter('element_id', $element->getId())
  100. ->getQuery()
  101. ->getSingleScalarResult()
  102. ;
  103. $element->setCountFavorited($count);
  104. }
  105. protected function updateCountPlaylisted(Element $element)
  106. {
  107. $em = $this->getContainer()->get('doctrine')->getEntityManager();
  108. // Compter le nombre d'user qui ont l'element dans une playlist
  109. // + Effectué par un user différent que le proprio
  110. // + Qui ont l'email confirmé
  111. $count = $em->createQueryBuilder()
  112. ->select('COUNT(DISTINCT user)')
  113. ->from('MuzichCoreBundle:Playlist', 'playlist')
  114. ->join('playlist.owner', 'user')
  115. ->where('playlist.elements LIKE :element_id AND playlist.owner != :element_owner_id AND user.email_confirmed = 1')
  116. ->setParameter('element_owner_id', $element->getOwner()->getId())
  117. ->setParameter('element_id', '%"id":"'.$element->getId().'"%')
  118. ->getQuery()
  119. ->getSingleScalarResult()
  120. ;
  121. $element->setCountPlaylisted($count);
  122. }
  123. }