EventElement.php 9.5KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270
  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. use Muzich\CoreBundle\Entity\Playlist;
  15. /**
  16. * Propagateur d'événement concernant les éléments
  17. *
  18. * @author bux
  19. */
  20. class EventElement extends EventPropagator
  21. {
  22. /**
  23. * Cette procédure doit être appelé après l'ajout d'un commentaire sur un
  24. * événement. Actuellement il:
  25. * * Met a jour ou créer un objet événement (nouveau commentaire) pour le
  26. * propriétaire de l'élément.
  27. * * Met a jour ou créer un objet événement (nouveau commentaire) pour les
  28. * utilisateurs qui follow cet élément.
  29. *
  30. * @param Element $element
  31. */
  32. public function commentAdded(Element $element, User $user)
  33. {
  34. // On avertis le propriétaire si ce n'est pas lui même qui vient de commenter
  35. if ($user->getId() != $element->getOwner()->getId())
  36. {
  37. $uea = new UserEventAction($element->getOwner(), $this->container);
  38. $event = $uea->proceed(Event::TYPE_COMMENT_ADDED_ELEMENT, $element->getId());
  39. $this->container->get('doctrine')->getEntityManager()->persist($event);
  40. }
  41. // Pour chaque utilisateur qui a demandé a être avertis d'un nouveau commentaire
  42. $cm = new CommentsManager($element->getComments());
  43. $uids = $cm->getFollowersIds();
  44. if (count($uids))
  45. {
  46. $users = $this->container->get('doctrine')->getEntityManager()
  47. ->getRepository('MuzichCoreBundle:User')
  48. ->getUsersWithIds($uids)
  49. ;
  50. if (count($users))
  51. {
  52. foreach ($users as $user_c)
  53. {
  54. // On n'avertis pas l'utilisateur de son propre commentaire
  55. if ($user->getId() != $user_c->getId())
  56. {
  57. $uea = new UserEventAction($user_c, $this->container);
  58. $event = $uea->proceed(Event::TYPE_COMMENT_ADDED_ELEMENT, $element->getId());
  59. $this->container->get('doctrine')->getEntityManager()->persist($event);
  60. }
  61. }
  62. }
  63. }
  64. }
  65. /**
  66. * Un point a été ajouté par quelqu'un a cet élément
  67. * Conséquences:
  68. * * L'auteur du partage gagne x point de reputation
  69. *
  70. * @param Element $element
  71. */
  72. public function onePointAdded(Element $element)
  73. {
  74. $ur = new UserReputation($element->getOwner());
  75. $ur->addPoints(
  76. $this->container->getParameter('reputation_element_point_value')
  77. );
  78. }
  79. /**
  80. * Un point a été retiré par quelqu'un a cet élément
  81. * Conséquences:
  82. * * L'auteur du partage perd x point de reputation
  83. *
  84. * @param Element $element
  85. */
  86. public function onePointRemoved(Element $element)
  87. {
  88. $ur = new UserReputation($element->getOwner());
  89. $ur->removePoints(
  90. $this->container->getParameter('reputation_element_point_value')
  91. );
  92. }
  93. /**
  94. * L'élément a été ajouté aux favoris d'un utilisateur
  95. *
  96. * @param Element $element
  97. */
  98. public function addedToFavorites(Element $element, User $added_by_user)
  99. {
  100. $ur = new UserReputation($element->getOwner());
  101. $security_context = new SecurityContext($added_by_user);
  102. if (!$security_context->actionIsAffectedBy(SecurityContext::AFFECT_NO_SCORING, SecurityContext::ACTION_ELEMENT_ADD_TO_FAVORITES))
  103. {
  104. $score_action = $this->container->getParameter('reputation_element_favorite_value');
  105. $ur->addPoints($score_action);
  106. $element->addPoints($score_action);
  107. $element->increaseCountFavorited();
  108. }
  109. $uea = new UserEventAction($element->getOwner(), $this->container);
  110. $event = $uea->proceed(Event::TYPE_FAV_ADDED_ELEMENT, $element->getId());
  111. $this->container->get('doctrine')->getEntityManager()->persist($event);
  112. }
  113. /**
  114. * L'élément a été retiré des favoris d'un utilisateur
  115. *
  116. * @param Element $element
  117. */
  118. public function removedFromFavorites(Element $element, User $removed_by_user)
  119. {
  120. $ur = new UserReputation($element->getOwner());
  121. $security_context = new SecurityContext($removed_by_user);
  122. if (!$security_context->actionIsAffectedBy(SecurityContext::AFFECT_NO_SCORING, SecurityContext::ACTION_ELEMENT_ADD_TO_FAVORITES))
  123. {
  124. $score_action = $this->container->getParameter('reputation_element_favorite_value');
  125. $ur->removePoints($score_action);
  126. $element->removePoints($score_action);
  127. $element->uncreaseCountFavorited();
  128. }
  129. }
  130. public function addedToPlaylist(Element $element, User $added_by_user, Playlist $playlist)
  131. {
  132. // On persiste les modifs pour compter correctement
  133. $this->getEntityManager()->persist($playlist);
  134. $this->getEntityManager()->flush();
  135. $ur = new UserReputation($element->getOwner());
  136. $security_context = new SecurityContext($added_by_user);
  137. if (
  138. !$security_context->actionIsAffectedBy(SecurityContext::AFFECT_NO_SCORING, SecurityContext::ACTION_PLAYLIST_ADD_ELEMENT)
  139. // Qu'une seule fois dans la playlist
  140. && $playlist->getCountElement($element) == 1
  141. // Element dans une seule playlist (par la suite ca ne rapporte plus de points)
  142. && $this->countUserPlaylistWithElement($added_by_user, $element) == 1
  143. && $element->getOwner()->getId() != $added_by_user->getId()
  144. )
  145. {
  146. $score_action = $this->container->getParameter('reputation_element_added_to_playlist');
  147. $ur->addPoints($score_action);
  148. $element->addPoints($score_action);
  149. $element->increaseCountPlaylisted();
  150. }
  151. }
  152. protected function countUserPlaylistWithElement(User $user, Element $element)
  153. {
  154. return $this->getEntityManager()->createQueryBuilder()
  155. ->select('COUNT(p)')
  156. ->from('MuzichCoreBundle:Playlist', 'p')
  157. ->where('p.elements LIKE :element_id AND p.owner = :owner_id')
  158. ->setParameter('owner_id', $user->getId())
  159. ->setParameter('element_id', '%"id":"'.$element->getId().'"%')
  160. ->getQuery()
  161. ->getSingleScalarResult()
  162. ;
  163. }
  164. public function removedFromPlaylist(Element $element, User $removed_by_user, Playlist $playlist)
  165. {
  166. // On persiste les modifs pour compter correctement
  167. $this->getEntityManager()->persist($playlist);
  168. $this->getEntityManager()->flush();
  169. $ur = new UserReputation($element->getOwner());
  170. $security_context = new SecurityContext($removed_by_user);
  171. if (
  172. !$security_context->actionIsAffectedBy(SecurityContext::AFFECT_NO_SCORING, SecurityContext::ACTION_PLAYLIST_REMOVE_ELEMENT)
  173. // L'element n'est plus dans la playlist
  174. && $playlist->getCountElement($element) == 0
  175. // On ne trouve plus l'element dans ses playlists
  176. && $this->countUserPlaylistWithElement($removed_by_user, $element) == 0
  177. && $element->getOwner()->getId() != $removed_by_user->getId()
  178. )
  179. {
  180. $score_action = $this->container->getParameter('reputation_element_added_to_playlist');
  181. $ur->removePoints($score_action);
  182. $element->removePoints($score_action);
  183. $element->uncreaseCountPlaylisted();
  184. }
  185. }
  186. /**
  187. * Des tags viennent d'être proposé a un élément
  188. *
  189. * @param Element $element
  190. */
  191. public function tagsProposed(Element $element)
  192. {
  193. $uea = new UserEventAction($element->getOwner(), $this->container);
  194. $event = $uea->proceed(Event::TYPE_TAGS_PROPOSED, $element->getId());
  195. $this->container->get('doctrine')->getEntityManager()->persist($event);
  196. }
  197. public function tagsAccepteds(ElementTagsProposition $proposition)
  198. {
  199. // On archive le fait que la proposition est été accepté
  200. $eam = new EventArchiveManager($this->container->get('doctrine')->getEntityManager());
  201. $eam->add($proposition->getUser(), EventArchive::PROP_TAGS_ELEMENT_ACCEPTED);
  202. // Et on donne des points a l'utilisateur
  203. $ur = new UserReputation($proposition->getUser());
  204. $ur->addPoints(
  205. $this->container->getParameter('reputation_element_tags_element_prop_value')
  206. );
  207. $this->container->get('doctrine')->getEntityManager()->persist($proposition->getUser());
  208. }
  209. /**
  210. * Intervien lorsque l'évènement est supprimé.
  211. * Il doit retirer au propriétaire:
  212. * * Les points de l'élément
  213. * * Les points du aux mises en favoris
  214. *
  215. * @param Element $element
  216. */
  217. public function elementRemoved(Element $element)
  218. {
  219. // L'utilisateur n'a plus droits aux points de l'élément.
  220. $ur = new UserReputation($element->getOwner());
  221. $ur->removePoints(
  222. $element->getPoints() * $this->container->getParameter('reputation_element_point_value')
  223. );
  224. // Ni aux points liés aux mises en favoris
  225. $fav = $this->container->get('doctrine')->getEntityManager()->createQuery(
  226. "SELECT COUNT(f) FROM MuzichCoreBundle:UsersElementsFavorites f"
  227. . " JOIN f.element e"
  228. . " WHERE e.owner = :uid AND f.user != :uid AND e.id = :eid"
  229. )->setParameters(array(
  230. 'uid' => $element->getOwner()->getId(),
  231. 'eid' => $element->getId()
  232. ))
  233. ->getScalarResult()
  234. ;
  235. if (count($fav))
  236. {
  237. if (count($fav[0]))
  238. {
  239. $count_favs = $fav[0][1];
  240. $ur = new UserReputation($element->getOwner());
  241. $ur->removePoints(
  242. $count_favs * $this->container->getParameter('reputation_element_favorite_value')
  243. );
  244. }
  245. }
  246. }
  247. }