PlaylistManager.php 7.1KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249
  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-1 )
  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(true);
  120. $playlist_copied->setTags($playlist->getTags());
  121. $playlist_copied->setElements($playlist->getElements());
  122. $playlist_copied->setCopied($playlist);
  123. $playlist->addCopy($playlist_copied);
  124. //foreach ($user->getPlaylistsOwneds() as $fuck)
  125. //{
  126. // var_dump($fuck->getName());
  127. //}
  128. //
  129. $user->getPlaylistsOwneds()->add($playlist_copied);
  130. //
  131. //var_dump($playlist_copied->getOwner()->getUsername());
  132. //
  133. //foreach ($user->getPlaylistsOwneds() as $fuck)
  134. //{
  135. // var_dump($fuck->getName());
  136. //}
  137. //die();
  138. $this->entity_manager->persist($playlist_copied);
  139. $this->entity_manager->persist($user);
  140. return $playlist_copied;
  141. }
  142. public function addElementToPlaylist(Element $element, Playlist $playlist)
  143. {
  144. $playlist->addElement($element);
  145. $this->actualizePlaylistTags($playlist);
  146. $this->entity_manager->persist($playlist);
  147. }
  148. public function addElementsToPlaylist($elements, Playlist $playlist)
  149. {
  150. foreach ($elements as $element)
  151. {
  152. $playlist->addElement($element);
  153. }
  154. $this->actualizePlaylistTags($playlist);
  155. }
  156. public function removePlaylistElementWithId(Playlist $playlist, $element_id)
  157. {
  158. $playlist->removeElementWithId($element_id);
  159. $this->actualizePlaylistTags($playlist);
  160. $this->entity_manager->persist($playlist);
  161. }
  162. public function removePlaylistElementWithIndex(Playlist $playlist, $index)
  163. {
  164. $playlist->removeElementWithIndex($index);
  165. $this->actualizePlaylistTags($playlist);
  166. $this->entity_manager->persist($playlist);
  167. }
  168. protected function actualizePlaylistTags(Playlist $playlist)
  169. {
  170. $tag_lib = new TagLib();
  171. $playlist->cleanTags();
  172. foreach ($tag_lib->getOrderedEntityTagsWithElements($this->getPlaylistElements($playlist)) as $tag)
  173. {
  174. $playlist->addTag($tag);
  175. }
  176. $this->entity_manager->persist($playlist);
  177. }
  178. public function updatePlaylistElementsOrder(Playlist $playlist, $elements_ids_ordereds)
  179. {
  180. $elements_origin_order = $playlist->getElements();
  181. $elements_ordereds = array();
  182. foreach ($elements_ids_ordereds as $element_id)
  183. {
  184. if (($element_record_match = $this->findElementRecordWithId($elements_origin_order, $element_id)))
  185. {
  186. $elements_ordereds[] = $element_record_match;
  187. }
  188. }
  189. $playlist->setElements($elements_ordereds);
  190. $this->entity_manager->persist($playlist);
  191. }
  192. protected function findElementRecordWithId($elements, $searched_id)
  193. {
  194. foreach ($elements as $element_record)
  195. {
  196. if ($element_record['id'] == $searched_id)
  197. {
  198. return $element_record;
  199. }
  200. }
  201. return null;
  202. }
  203. public function deletePlaylist(Playlist $playlist)
  204. {
  205. $this->copyPlaylistForPickedUsers($playlist);
  206. $this->entity_manager->remove($playlist);
  207. }
  208. protected function copyPlaylistForPickedUsers(Playlist $playlist)
  209. {
  210. foreach ($playlist->getPickedsUsers() as $user)
  211. {
  212. $this->entity_manager->persist($this->copyPlaylist($user, $playlist));
  213. }
  214. }
  215. }