PlaylistManager.php 7.0KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242
  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. class PlaylistManager
  11. {
  12. protected $entity_manager;
  13. protected $user;
  14. public function __construct(EntityManager $entity_manager)
  15. {
  16. $this->entity_manager = $entity_manager;
  17. }
  18. public function getUserPublicsOrOwnedPlaylists(User $user_viewed, User $user = null)
  19. {
  20. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  21. ->getUserPublicPlaylistsOrOwnedQueryBuilder($user_viewed, $user)
  22. ->getQuery()->getResult()
  23. ;
  24. }
  25. public function getUserPublicsOrOwnedOrPickedPlaylists(User $user_viewed, User $user = null)
  26. {
  27. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  28. ->getUserPublicPlaylistsOrOwnedOrPickedQueryBuilder($user_viewed, $user)
  29. ->getQuery()->getResult()
  30. ;
  31. }
  32. public function getOwnedsPlaylists(User $user)
  33. {
  34. return $this->getUserPublicsOrOwnedPlaylists($user, $user);
  35. }
  36. public function getOwnedsOrPickedsPlaylists(User $user)
  37. {
  38. return $this->getUserPublicsOrOwnedOrPickedPlaylists($user, $user);
  39. }
  40. /** @return Playlist */
  41. public function findOneAccessiblePlaylistWithId($playlist_id, User $user = null)
  42. {
  43. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  44. ->findOnePlaylistOwnedOrPublic($playlist_id, $user)
  45. ->getQuery()->getOneOrNullResult()
  46. ;
  47. }
  48. /** @return Playlist */
  49. public function findOwnedPlaylistWithId($playlist_id, User $user)
  50. {
  51. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  52. ->findOnePlaylistOwned($playlist_id, $user)
  53. ->getQuery()->getOneOrNullResult()
  54. ;
  55. }
  56. /** @return Playlist */
  57. public function findPlaylistWithId($playlist_id, User $user)
  58. {
  59. return $this->entity_manager->getRepository('MuzichCoreBundle:Playlist')
  60. ->findOneById($playlist_id)
  61. ;
  62. }
  63. public function getPlaylistElements(Playlist $playlist, $offset = null)
  64. {
  65. $element_ids = $playlist->getElementsIds();
  66. $query_builder = $this->entity_manager->getRepository('MuzichCoreBundle:Element')
  67. ->getElementsWithIdsOrderingQueryBuilder($element_ids)
  68. ;
  69. if ($offset)
  70. {
  71. $query_builder->setFirstResult( $offset )
  72. ->setMaxResults( count($element_ids) );
  73. }
  74. return $query_builder->getQuery()->getResult();
  75. }
  76. public function getNewPlaylist(User $owner = null)
  77. {
  78. $playlist = new Playlist();
  79. $playlist->setOwner($owner);
  80. return $playlist;
  81. }
  82. public function addPickedPlaylistToUser(User $user, Playlist $playlist)
  83. {
  84. if (!$user->havePlaylistPicked($playlist))
  85. {
  86. $user_playlist_picked = new UserPlaylistPicked();
  87. $user_playlist_picked->init($user, $playlist);
  88. $user->getUserPlaylistsPickeds()->add($user_playlist_picked);
  89. $this->entity_manager->persist($user);
  90. $this->entity_manager->persist($user_playlist_picked);
  91. }
  92. }
  93. public function removePickedPlaylistToUser(User $user, Playlist $playlist)
  94. {
  95. if ($user->havePlaylistPicked($playlist))
  96. {
  97. $user_playlists_pickeds = new ArrayCollection();
  98. foreach ($user->getUserPlaylistsPickeds() as $user_playlist_picked)
  99. {
  100. if ($user_playlist_picked->getPlaylist()->getId() == $playlist->getId())
  101. {
  102. $this->entity_manager->remove($user_playlist_picked);
  103. }
  104. else
  105. {
  106. $user_playlists_pickeds->add($user_playlist_picked);
  107. }
  108. }
  109. $user->setUserPlaylistsPickeds($user_playlists_pickeds);
  110. $this->entity_manager->persist($user);
  111. }
  112. }
  113. /** @return Playlist */
  114. public function copyPlaylist(User $user, Playlist $playlist)
  115. {
  116. $playlist_copied = new Playlist();
  117. $playlist_copied->setOwner($user);
  118. $playlist_copied->setName($playlist->getName());
  119. $playlist_copied->setPublic(false);
  120. $playlist_copied->setTags($playlist->getTags());
  121. $playlist_copied->setElements($playlist->getElements());
  122. $playlist_copied->setCopied($playlist);
  123. $playlist->addCopy($playlist_copied);
  124. $user->getPlaylistsOwneds()->add($playlist_copied);
  125. $this->entity_manager->persist($playlist_copied);
  126. $this->entity_manager->persist($user);
  127. return $playlist_copied;
  128. }
  129. public function addElementToPlaylist(Element $element, Playlist $playlist)
  130. {
  131. $playlist->addElement($element);
  132. $this->actualizePlaylistTags($playlist);
  133. $this->entity_manager->persist($playlist);
  134. }
  135. public function addElementsToPlaylist($elements, Playlist $playlist)
  136. {
  137. foreach ($elements as $element)
  138. {
  139. $playlist->addElement($element);
  140. }
  141. $this->actualizePlaylistTags($playlist);
  142. }
  143. public function removePlaylistElementWithId(Playlist $playlist, $element_id)
  144. {
  145. $playlist->removeElementWithId($element_id);
  146. $this->actualizePlaylistTags($playlist);
  147. $this->entity_manager->persist($playlist);
  148. }
  149. public function removePlaylistElementWithIndex(Playlist $playlist, $index)
  150. {
  151. $playlist->removeElementWithIndex($index);
  152. $this->actualizePlaylistTags($playlist);
  153. $this->entity_manager->persist($playlist);
  154. }
  155. protected function actualizePlaylistTags(Playlist $playlist)
  156. {
  157. $tag_lib = new TagLib();
  158. $playlist->cleanTags();
  159. foreach ($tag_lib->getOrderedEntityTagsWithElements($this->getPlaylistElements($playlist)) as $tag)
  160. {
  161. $playlist->addTag($tag);
  162. }
  163. $this->entity_manager->persist($playlist);
  164. }
  165. public function updatePlaylistElementsOrder(Playlist $playlist, $elements_ids_ordereds)
  166. {
  167. $elements_origin_order = $playlist->getElements();
  168. $elements_ordereds = array();
  169. foreach ($elements_ids_ordereds as $element_id)
  170. {
  171. if (($element_record_match = $this->findElementRecordWithId($elements_origin_order, $element_id)))
  172. {
  173. $elements_ordereds[] = $element_record_match;
  174. }
  175. }
  176. $playlist->setElements($elements_ordereds);
  177. $this->entity_manager->persist($playlist);
  178. }
  179. protected function findElementRecordWithId($elements, $searched_id)
  180. {
  181. foreach ($elements as $element_record)
  182. {
  183. if ($element_record['id'] == $searched_id)
  184. {
  185. return $element_record;
  186. }
  187. }
  188. return null;
  189. }
  190. public function deletePlaylist(Playlist $playlist)
  191. {
  192. $this->copyPlaylistForPickedUsers($playlist);
  193. $this->entity_manager->remove($playlist);
  194. }
  195. protected function copyPlaylistForPickedUsers(Playlist $playlist)
  196. {
  197. foreach ($playlist->getPickedsUsers() as $user)
  198. {
  199. $this->entity_manager->persist($this->copyPlaylist($user, $playlist));
  200. }
  201. }
  202. public function privatizePlaylist(Playlist $playlist)
  203. {
  204. $this->copyPlaylistForPickedUsers($playlist);
  205. $playlist->setPublic(false);
  206. $this->entity_manager->persist($playlist);
  207. }
  208. }