PlaylistRepository.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233
  1. <?php
  2. namespace Muzich\CoreBundle\Repository;
  3. use Doctrine\ORM\EntityRepository;
  4. use Doctrine\ORM\Mapping as ORM;
  5. use Muzich\CoreBundle\Entity\User;
  6. class PlaylistRepository extends EntityRepository
  7. {
  8. protected function getPlaylistsQueryBuilder()
  9. {
  10. return $this->getEntityManager()->createQueryBuilder()
  11. ->select('p')
  12. ->from('MuzichCoreBundle:Playlist', 'p')
  13. ;
  14. }
  15. public function getPublicPlaylistsQueryBuilder()
  16. {
  17. return $this->getPlaylistsQueryBuilder()
  18. ->andWhere('p.public = 1')
  19. ;
  20. }
  21. public function getUserPublicPlaylistsQueryBuilder(User $user)
  22. {
  23. return $this->getPublicPlaylistsQueryBuilder()
  24. ->andWhere('p.owner = :owner_id')
  25. ->setParameter('owner_id', $user->getId())
  26. ;
  27. }
  28. public function getUserPublicPlaylistsOrOwnedQueryBuilder(User $viewed_user, User $current_user = null)
  29. {
  30. if (!$current_user)
  31. {
  32. return $this->getUserPublicPlaylistsQueryBuilder($viewed_user);
  33. }
  34. if ($viewed_user->getId() != $current_user->getId())
  35. {
  36. return $this->getUserPublicPlaylistsQueryBuilder($viewed_user);
  37. }
  38. return $this->getPlaylistsQueryBuilder()
  39. ->where('p.owner = :owner_id')
  40. ->setParameter('owner_id', $current_user->getId())
  41. ;
  42. }
  43. public function getUserPublicPlaylistsOrOwnedOrPickedQueryBuilder(User $viewed_user, User $current_user = null)
  44. {
  45. if ($current_user)
  46. {
  47. if ($viewed_user->getId() == $current_user->getId())
  48. {
  49. return $this->getUserPublicPlaylistsOrOwnedQueryBuilder($viewed_user, $current_user)
  50. ->leftJoin('p.user_playlists_pickeds', 'pickers')
  51. ->orWhere('pickers.user = :picker_id')
  52. ->setParameter('picker_id', $current_user->getId())
  53. ;
  54. }
  55. }
  56. return $this->getUserPublicPlaylistsOrOwnedQueryBuilder($viewed_user, $current_user);
  57. }
  58. public function findOnePlaylistOwned($playlist_id, User $user)
  59. {
  60. return $this->getPlaylistsQueryBuilder()
  61. ->andWhere('p.owner = :owner_id AND p.id = :playlist_id')
  62. ->setParameters(array(
  63. 'owner_id' => $user->getId(),
  64. 'playlist_id' => $playlist_id
  65. ))
  66. ;
  67. }
  68. public function findOnePlaylistOwnedOrPublic($playlist_id, User $user = null)
  69. {
  70. $query_builder = $this->getPlaylistsQueryBuilder()
  71. ->andWhere('p.id = :playlist_id');
  72. if ($user)
  73. {
  74. $query_builder->andWhere('p.public = 1 OR p.owner = :owner_id');
  75. $query_builder->setParameters(array(
  76. 'playlist_id' => $playlist_id,
  77. 'owner_id' => $user->getId()
  78. ));
  79. }
  80. else
  81. {
  82. $query_builder->andWhere('p.public = 1');
  83. $query_builder->setParameters(array(
  84. 'playlist_id' => $playlist_id
  85. ));
  86. }
  87. return $query_builder;
  88. }
  89. /**
  90. * Retourne un tableau de groupe correspondant a un chaine de caractère
  91. * La recherche est effectué sur le name.
  92. *
  93. * @param type $string
  94. * @return Doctrine\ORM\Query
  95. */
  96. public function findByString($string)
  97. {
  98. return $this->getEntityManager()
  99. ->createQuery("
  100. SELECT g FROM MuzichCoreBundle:Group g
  101. WHERE UPPER(g.name) LIKE :str
  102. ORDER BY g.name ASC"
  103. )
  104. ->setParameters(array(
  105. 'str' => '%'.strtoupper(trim($string)).'%'
  106. ))
  107. ;
  108. }
  109. /**
  110. * Retourne une Query sleectionnant un Group par son slug
  111. *
  112. * @param type string
  113. * @return Doctrine\ORM\Query
  114. */
  115. public function findOneBySlug($slug)
  116. {
  117. return $this->getEntityManager()
  118. ->createQuery("
  119. SELECT g FROM MuzichCoreBundle:Group g
  120. LEFT JOIN g.tags tr
  121. LEFT JOIN tr.tag t
  122. WHERE g.slug = :str
  123. ")
  124. ->setParameters(array(
  125. 'str' => $slug
  126. ))
  127. ;
  128. }
  129. /**
  130. * Retourne un tableau de groupes étant publics, ou possédé par l'user
  131. *
  132. * @param int $user_id
  133. * @return array id => name
  134. */
  135. public function getPublicAndOwnedArray($user_id)
  136. {
  137. $group_array = array();
  138. foreach ($this->getEntityManager()
  139. ->createQuery('
  140. SELECT g.id, g.name FROM MuzichCoreBundle:Group g
  141. LEFT JOIN g.owner o
  142. WHERE g.open = \'1\' OR o.id = :uid'
  143. )->setParameter('uid', $user_id)
  144. ->getArrayResult() as $group)
  145. {
  146. $group_array[$group['id']] = $group['name'];
  147. }
  148. return $group_array;
  149. }
  150. /**
  151. * Retourne tous les tags des elements postés
  152. *
  153. * @return doctrine_collection
  154. */
  155. public function getElementsTags($group_id, $current_user_id)
  156. {
  157. $parameters = array('gid' => $group_id);
  158. $current_user_sql = '';
  159. if ($current_user_id)
  160. {
  161. $parameters['uidt'] = '%"'.$current_user_id.'"%';
  162. $current_user_sql = 'OR t.privateids LIKE :uidt';
  163. }
  164. return $this->getEntityManager()
  165. ->createQuery('
  166. SELECT t FROM MuzichCoreBundle:Tag t
  167. LEFT JOIN t.elements e
  168. WHERE e.group = :gid
  169. AND (t.tomoderate = \'FALSE\' OR t.tomoderate IS NULL
  170. '.$current_user_sql.')
  171. ORDER BY t.name ASC'
  172. )
  173. ->setParameters($parameters)
  174. ->getResult()
  175. ;
  176. }
  177. public function getElementIdsOwned($group_id)
  178. {
  179. $ids = array();
  180. foreach ($this->getEntityManager()
  181. ->createQuery('SELECT e.id FROM MuzichCoreBundle:Element e
  182. WHERE e.group = :gid')
  183. ->setParameter('gid', $group_id)
  184. ->getScalarResult() as $row)
  185. {
  186. $ids[] = $row['id'];
  187. }
  188. return $ids;
  189. }
  190. public function countFollowers($group_id)
  191. {
  192. $data = $this->getEntityManager()
  193. ->createQuery('SELECT COUNT(f) FROM MuzichCoreBundle:FollowGroup f
  194. WHERE f.group = :gid')
  195. ->setParameter('gid', $group_id)
  196. ->getScalarResult()
  197. ;
  198. if (count($data))
  199. {
  200. if (count($data[0]))
  201. {
  202. return $data[0][1];
  203. }
  204. }
  205. return 0;
  206. }
  207. }