PlaylistManager.php 9.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313
  1. <?php
  2. namespace Muzich\CoreBundle\Managers;
  3. use Doctrine\ORM\EntityManager;
  4. use Muzich\CoreBundle\Entity\Playlist;
  5. use Muzich\CoreBundle\Entity\User;
  6. use Muzich\CoreBundle\Entity\Element;
  7. use Muzich\CoreBundle\Entity\UserPlaylistPicked;
  8. use \Doctrine\Common\Collections\ArrayCollection;
  9. use Muzich\CoreBundle\lib\Tag as TagLib;
  10. use Muzich\CoreBundle\Managers\ElementManager;
  11. use Symfony\Component\DependencyInjection\Container;
  12. class PlaylistManager
  13. {
  14. protected $entity_manager;
  15. protected $user;
  16. public function __construct(EntityManager $entity_manager)
  17. {
  18. $this->entity_manager = $entity_manager;
  19. }
  20. public function getUserPublicsOrOwnedPlaylists(User $user_viewed, User $user = null)
  21. {
  22. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  23. ->getUserPublicPlaylistsOrOwnedQueryBuilder($user_viewed, $user)
  24. ->getQuery()->getResult()
  25. ;
  26. }
  27. public function getUserPublicsOrOwnedOrPickedPlaylists(User $user_viewed, User $user = null)
  28. {
  29. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  30. ->getUserPublicPlaylistsOrOwnedOrPickedQueryBuilder($user_viewed, $user)
  31. ->getQuery()->getResult()
  32. ;
  33. }
  34. public function getOwnedsPlaylists(User $user)
  35. {
  36. return $this->getUserPublicsOrOwnedPlaylists($user, $user);
  37. }
  38. public function getOwnedsOrPickedsPlaylists(User $user)
  39. {
  40. return $this->getUserPublicsOrOwnedOrPickedPlaylists($user, $user);
  41. }
  42. /** @return Playlist */
  43. public function findOneAccessiblePlaylistWithId($playlist_id, User $user = null)
  44. {
  45. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  46. ->findOnePlaylistOwnedOrPublic($playlist_id, $user)
  47. ->getQuery()->getOneOrNullResult()
  48. ;
  49. }
  50. /** @return Playlist */
  51. public function findOwnedPlaylistWithId($playlist_id, User $user)
  52. {
  53. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  54. ->findOnePlaylistOwned($playlist_id, $user)
  55. ->getQuery()->getOneOrNullResult()
  56. ;
  57. }
  58. /** @return Playlist */
  59. public function findPlaylistWithId($playlist_id, User $user)
  60. {
  61. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  62. ->findOneById($playlist_id)
  63. ;
  64. }
  65. public function getPlaylistElements(Playlist $playlist, $offset = null, $user_id = null)
  66. {
  67. $element_ids = $playlist->getElementsIds();
  68. $query_builder = $this->entity_manager->getRepository('MuzichCoreBundle:Element')
  69. ->getElementsWithIdsOrderingQueryBuilder($element_ids, true, $user_id)
  70. ;
  71. if ($offset)
  72. {
  73. $query_builder->setFirstResult( $offset )
  74. ->setMaxResults( count($element_ids) );
  75. }
  76. return $query_builder->getQuery()->getResult();
  77. }
  78. public function getNewPlaylist(User $owner = null)
  79. {
  80. $playlist = new Playlist();
  81. $playlist->setOwner($owner);
  82. return $playlist;
  83. }
  84. public function addPickedPlaylistToUser(User $user, Playlist $playlist)
  85. {
  86. if (!$user->havePlaylistPicked($playlist))
  87. {
  88. $user_playlist_picked = new UserPlaylistPicked();
  89. $user_playlist_picked->init($user, $playlist);
  90. $user->getUserPlaylistsPickeds()->add($user_playlist_picked);
  91. $this->entity_manager->persist($user);
  92. $this->entity_manager->persist($user_playlist_picked);
  93. }
  94. }
  95. public function removePickedPlaylistToUser(User $user, Playlist $playlist)
  96. {
  97. if ($user->havePlaylistPicked($playlist))
  98. {
  99. $user_playlists_pickeds = new ArrayCollection();
  100. foreach ($user->getUserPlaylistsPickeds() as $user_playlist_picked)
  101. {
  102. if ($user_playlist_picked->getPlaylist()->getId() == $playlist->getId())
  103. {
  104. $this->entity_manager->remove($user_playlist_picked);
  105. }
  106. else
  107. {
  108. $user_playlists_pickeds->add($user_playlist_picked);
  109. }
  110. }
  111. $user->setUserPlaylistsPickeds($user_playlists_pickeds);
  112. $this->entity_manager->persist($user);
  113. }
  114. }
  115. /** @return Playlist */
  116. public function copyPlaylist(User $user, Playlist $playlist)
  117. {
  118. $playlist_copied = new Playlist();
  119. $playlist_copied->setOwner($user);
  120. $playlist_copied->setName($playlist->getName());
  121. $playlist_copied->setPublic(false);
  122. $playlist_copied->setTags($playlist->getTags());
  123. $playlist_copied->setElements($playlist->getElements());
  124. $playlist_copied->setCopied($playlist);
  125. $playlist->addCopy($playlist_copied);
  126. $user->getPlaylistsOwneds()->add($playlist_copied);
  127. $this->entity_manager->persist($playlist_copied);
  128. $this->entity_manager->persist($user);
  129. return $playlist_copied;
  130. }
  131. public function addElementToPlaylist(Element $element, Playlist $playlist)
  132. {
  133. $playlist->addElement($element);
  134. $this->actualizePlaylistTags($playlist);
  135. $this->entity_manager->persist($playlist);
  136. }
  137. public function addElementsToPlaylist($elements, Playlist $playlist)
  138. {
  139. foreach ($elements as $element)
  140. {
  141. $playlist->addElement($element);
  142. }
  143. $this->actualizePlaylistTags($playlist);
  144. }
  145. public function removePlaylistElementWithId(Playlist $playlist, $element_id)
  146. {
  147. $playlist->removeElementWithId($element_id);
  148. $this->actualizePlaylistTags($playlist);
  149. $this->entity_manager->persist($playlist);
  150. }
  151. public function removePlaylistElementWithIndex(Playlist $playlist, $index)
  152. {
  153. $playlist->removeElementWithIndex($index);
  154. $this->actualizePlaylistTags($playlist);
  155. $this->entity_manager->persist($playlist);
  156. }
  157. protected function actualizePlaylistTags(Playlist $playlist)
  158. {
  159. $tag_lib = new TagLib();
  160. $playlist->cleanTags();
  161. foreach ($tag_lib->getOrderedEntityTagsWithElements($this->getPlaylistElements($playlist)) as $tag)
  162. {
  163. $playlist->addTag($tag);
  164. }
  165. $this->entity_manager->persist($playlist);
  166. }
  167. public function updatePlaylistElementsOrder(Playlist $playlist, $elements_ids_ordereds)
  168. {
  169. $elements_origin_order = $playlist->getElements();
  170. $elements_ordereds = array();
  171. foreach ($elements_ids_ordereds as $element_id)
  172. {
  173. if (($element_record_match = $this->findElementRecordWithId($elements_origin_order, $element_id)))
  174. {
  175. $elements_ordereds[] = $element_record_match;
  176. }
  177. }
  178. $playlist->setElements($elements_ordereds);
  179. $this->entity_manager->persist($playlist);
  180. }
  181. protected function findElementRecordWithId($elements, $searched_id)
  182. {
  183. foreach ($elements as $element_record)
  184. {
  185. if ($element_record['id'] == $searched_id)
  186. {
  187. return $element_record;
  188. }
  189. }
  190. return null;
  191. }
  192. public function deletePlaylist(Playlist $playlist)
  193. {
  194. $this->copyPlaylistForPickedUsers($playlist);
  195. $this->entity_manager->remove($playlist);
  196. }
  197. protected function copyPlaylistForPickedUsers(Playlist $playlist)
  198. {
  199. foreach ($playlist->getPickedsUsers() as $user)
  200. {
  201. $this->entity_manager->persist($this->copyPlaylist($user, $playlist));
  202. }
  203. }
  204. public function privatizePlaylist(Playlist $playlist)
  205. {
  206. $this->copyPlaylistForPickedUsers($playlist);
  207. $playlist->setPublic(false);
  208. $this->entity_manager->persist($playlist);
  209. }
  210. /** @return Element */
  211. public function getElementWithIndex(Playlist $playlist, $index)
  212. {
  213. $element_data = $playlist->getElementDataWithIndex($index);
  214. return $this->entity_manager->getRepository('MuzichCoreBundle:Element')
  215. ->findOneById($element_data['id']);
  216. }
  217. public function getElementsObjects(Playlist $playlist)
  218. {
  219. return $this->entity_manager->getRepository('MuzichCoreBundle:Element')
  220. ->findById($playlist->getElementsIds());
  221. }
  222. public function getElementsOfPlaylists($playlists)
  223. {
  224. $elements_ids = array();
  225. foreach ($playlists as $playlist)
  226. {
  227. foreach ($playlist->getElementsIds() as $element_id)
  228. {
  229. $elements_ids[] = $element_id;
  230. }
  231. }
  232. $elements_ids = array_unique($elements_ids);
  233. if ($elements_ids)
  234. return $this->entity_manager->getRepository('MuzichCoreBundle:Element')
  235. ->findById($elements_ids);
  236. return array();
  237. }
  238. public function addPrivateLinks(Playlist $playlist, User $user, $links, Container $container)
  239. {
  240. // Pour le moment on le fait ici car le ElementManager est mal pensé.
  241. $count_added = 0;
  242. if (count($links))
  243. {
  244. foreach ($links as $link)
  245. {
  246. $link = trim($link);
  247. if (filter_var($link, FILTER_VALIDATE_URL) !== false)
  248. {
  249. $element = new Element();
  250. $element->setUrl($link);
  251. $element->setType('none');
  252. $element->setPrivate(true);
  253. $factory = new ElementManager($element, $this->entity_manager, $container);
  254. $factory->proceedFill($user);
  255. $element->setNameWithData(true);
  256. $this->entity_manager->persist($element);
  257. $this->entity_manager->flush();
  258. $this->addElementToPlaylist($element, $playlist);
  259. $count_added += 1;
  260. }
  261. }
  262. }
  263. $this->entity_manager->persist($playlist);
  264. $this->entity_manager->flush();
  265. return $count_added;
  266. }
  267. }