EventElement.php 6.9KB

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