EventElement.php 6.2KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197
  1. <?php
  2. namespace Muzich\CoreBundle\Propagator;
  3. use Muzich\CoreBundle\Propagator\EventPropagator;
  4. use Muzich\CoreBundle\Entity\Element;
  5. use Muzich\CoreBundle\Actions\User\Event as UserEventAction;
  6. use Muzich\CoreBundle\Actions\User\Reputation as UserReputation;
  7. use Muzich\CoreBundle\Entity\Event;
  8. use Muzich\CoreBundle\Entity\User;
  9. use Muzich\CoreBundle\Managers\CommentsManager;
  10. use Muzich\CoreBundle\Entity\ElementTagsProposition;
  11. use Muzich\CoreBundle\Managers\EventArchiveManager;
  12. use Muzich\CoreBundle\Entity\EventArchive;
  13. /**
  14. * Propagateur d'événement concernant les éléments
  15. *
  16. * @author bux
  17. */
  18. class EventElement extends EventPropagator
  19. {
  20. /**
  21. * Cette procédure doit être appelé après l'ajout d'un commentaire sur un
  22. * événement. Actuellement il:
  23. * * Met a jour ou créer un objet événement (nouveau commentaire) pour le
  24. * propriétaire de l'élément.
  25. * * Met a jour ou créer un objet événement (nouveau commentaire) pour les
  26. * utilisateurs qui follow cet élément.
  27. *
  28. * @param Element $element
  29. */
  30. public function commentAdded(Element $element, User $user)
  31. {
  32. // On avertis le propriétaire si ce n'est pas lui même qui vient de commenter
  33. if ($user->getId() != $element->getOwner()->getId())
  34. {
  35. $uea = new UserEventAction($element->getOwner(), $this->container);
  36. $event = $uea->proceed(Event::TYPE_COMMENT_ADDED_ELEMENT, $element->getId());
  37. $this->container->get('doctrine')->getEntityManager()->persist($event);
  38. }
  39. // Pour chaque utilisateur qui a demandé a être avertis d'un nouveau commentaire
  40. $cm = new CommentsManager($element->getComments());
  41. $uids = $cm->getFollowersIds();
  42. if (count($uids))
  43. {
  44. $users = $this->container->get('doctrine')->getEntityManager()
  45. ->getRepository('MuzichCoreBundle:User')
  46. ->getUsersWithIds($uids)
  47. ;
  48. if (count($users))
  49. {
  50. foreach ($users as $user_c)
  51. {
  52. // On n'avertis pas l'utilisateur de son propre commentaire
  53. if ($user->getId() != $user_c->getId())
  54. {
  55. $uea = new UserEventAction($user_c, $this->container);
  56. $event = $uea->proceed(Event::TYPE_COMMENT_ADDED_ELEMENT, $element->getId());
  57. $this->container->get('doctrine')->getEntityManager()->persist($event);
  58. }
  59. }
  60. }
  61. }
  62. }
  63. /**
  64. * Un point a été ajouté par quelqu'un a cet élément
  65. * Conséquences:
  66. * * L'auteur du partage gagne x point de reputation
  67. *
  68. * @param Element $element
  69. */
  70. public function onePointAdded(Element $element)
  71. {
  72. $ur = new UserReputation($element->getOwner());
  73. $ur->addPoints(
  74. $this->container->getParameter('reputation_element_point_value')
  75. );
  76. }
  77. /**
  78. * Un point a été retiré par quelqu'un a cet élément
  79. * Conséquences:
  80. * * L'auteur du partage perd x point de reputation
  81. *
  82. * @param Element $element
  83. */
  84. public function onePointRemoved(Element $element)
  85. {
  86. $ur = new UserReputation($element->getOwner());
  87. $ur->removePoints(
  88. $this->container->getParameter('reputation_element_point_value')
  89. );
  90. }
  91. /**
  92. * L'élément a été ajouté aux favoris d'un utilisateur
  93. *
  94. * @param Element $element
  95. */
  96. public function addedToFavorites(Element $element)
  97. {
  98. $ur = new UserReputation($element->getOwner());
  99. $ur->addPoints(
  100. $this->container->getParameter('reputation_element_favorite_value')
  101. );
  102. $uea = new UserEventAction($element->getOwner(), $this->container);
  103. $event = $uea->proceed(Event::TYPE_FAV_ADDED_ELEMENT, $element->getId());
  104. $this->container->get('doctrine')->getEntityManager()->persist($event);
  105. }
  106. /**
  107. * L'élément a été retiré des favoris d'un utilisateur
  108. *
  109. * @param Element $element
  110. */
  111. public function removedFromFavorites(Element $element)
  112. {
  113. $ur = new UserReputation($element->getOwner());
  114. $ur->removePoints(
  115. $this->container->getParameter('reputation_element_favorite_value')
  116. );
  117. }
  118. /**
  119. * Des tags viennent d'être proposé a un élément
  120. *
  121. * @param Element $element
  122. */
  123. public function tagsProposed(Element $element)
  124. {
  125. $uea = new UserEventAction($element->getOwner(), $this->container);
  126. $event = $uea->proceed(Event::TYPE_TAGS_PROPOSED, $element->getId());
  127. $this->container->get('doctrine')->getEntityManager()->persist($event);
  128. }
  129. public function tagsAccepteds(ElementTagsProposition $proposition)
  130. {
  131. // On archive le fait que la proposition est été accepté
  132. $eam = new EventArchiveManager($this->container->get('doctrine')->getEntityManager());
  133. $eam->add($proposition->getUser(), EventArchive::PROP_TAGS_ELEMENT_ACCEPTED);
  134. // Et on donne des points a l'utilisateur
  135. $ur = new UserReputation($proposition->getUser());
  136. $ur->addPoints(
  137. $this->container->getParameter('reputation_element_tags_element_prop_value')
  138. );
  139. $this->container->get('doctrine')->getEntityManager()->persist($proposition->getUser());
  140. }
  141. /**
  142. * Intervien lorsque l'évènement est supprimé.
  143. * Il doit retirer au propriétaire:
  144. * * Les points de l'élément
  145. * * Les points du aux mises en favoris
  146. *
  147. * @param Element $element
  148. */
  149. public function elementRemoved(Element $element)
  150. {
  151. // L'utilisateur n'a plus droits aux points de l'élément.
  152. $ur = new UserReputation($element->getOwner());
  153. $ur->removePoints(
  154. $element->getPoints() * $this->container->getParameter('reputation_element_point_value')
  155. );
  156. // Ni aux points liés aux mises en favoris
  157. $fav = $this->container->get('doctrine')->getEntityManager()->createQuery(
  158. "SELECT COUNT(f) FROM MuzichCoreBundle:UsersElementsFavorites f"
  159. . " JOIN f.element e"
  160. . " WHERE e.owner = :uid AND f.user != :uid AND e.id = :eid"
  161. )->setParameters(array(
  162. 'uid' => $element->getOwner()->getId(),
  163. 'eid' => $element->getId()
  164. ))
  165. ->getScalarResult()
  166. ;
  167. if (count($fav))
  168. {
  169. if (count($fav[0]))
  170. {
  171. $count_favs = $fav[0][1];
  172. $ur = new UserReputation($element->getOwner());
  173. $ur->removePoints(
  174. $count_favs * $this->container->getParameter('reputation_element_favorite_value')
  175. );
  176. }
  177. }
  178. }
  179. }