PlaylistRepository.php 5.7KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230
  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 OR pickers.user = :picker_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. return $this->getUserPublicPlaylistsOrOwnedQueryBuilder($viewed_user, $current_user);
  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. public function findOnePlaylistOwned($playlist_id, User $user)
  56. {
  57. return $this->getPlaylistsQueryBuilder()
  58. ->andWhere('p.owner = :owner_id AND p.id = :playlist_id')
  59. ->setParameters(array(
  60. 'owner_id' => $user->getId(),
  61. 'playlist_id' => $playlist_id
  62. ))
  63. ;
  64. }
  65. public function findOnePlaylistOwnedOrPublic($playlist_id, User $user = null)
  66. {
  67. $query_builder = $this->getPlaylistsQueryBuilder()
  68. ->andWhere('p.id = :playlist_id');
  69. if ($user)
  70. {
  71. $query_builder->andWhere('p.public = 1 OR p.owner = :owner_id');
  72. $query_builder->setParameters(array(
  73. 'playlist_id' => $playlist_id,
  74. 'owner_id' => $user->getId()
  75. ));
  76. }
  77. else
  78. {
  79. $query_builder->andWhere('p.public = 1');
  80. $query_builder->setParameters(array(
  81. 'playlist_id' => $playlist_id
  82. ));
  83. }
  84. return $query_builder;
  85. }
  86. /**
  87. * Retourne un tableau de groupe correspondant a un chaine de caractère
  88. * La recherche est effectué sur le name.
  89. *
  90. * @param type $string
  91. * @return Doctrine\ORM\Query
  92. */
  93. public function findByString($string)
  94. {
  95. return $this->getEntityManager()
  96. ->createQuery("
  97. SELECT g FROM MuzichCoreBundle:Group g
  98. WHERE UPPER(g.name) LIKE :str
  99. ORDER BY g.name ASC"
  100. )
  101. ->setParameters(array(
  102. 'str' => '%'.strtoupper(trim($string)).'%'
  103. ))
  104. ;
  105. }
  106. /**
  107. * Retourne une Query sleectionnant un Group par son slug
  108. *
  109. * @param type string
  110. * @return Doctrine\ORM\Query
  111. */
  112. public function findOneBySlug($slug)
  113. {
  114. return $this->getEntityManager()
  115. ->createQuery("
  116. SELECT g FROM MuzichCoreBundle:Group g
  117. LEFT JOIN g.tags tr
  118. LEFT JOIN tr.tag t
  119. WHERE g.slug = :str
  120. ")
  121. ->setParameters(array(
  122. 'str' => $slug
  123. ))
  124. ;
  125. }
  126. /**
  127. * Retourne un tableau de groupes étant publics, ou possédé par l'user
  128. *
  129. * @param int $user_id
  130. * @return array id => name
  131. */
  132. public function getPublicAndOwnedArray($user_id)
  133. {
  134. $group_array = array();
  135. foreach ($this->getEntityManager()
  136. ->createQuery('
  137. SELECT g.id, g.name FROM MuzichCoreBundle:Group g
  138. LEFT JOIN g.owner o
  139. WHERE g.open = \'1\' OR o.id = :uid'
  140. )->setParameter('uid', $user_id)
  141. ->getArrayResult() as $group)
  142. {
  143. $group_array[$group['id']] = $group['name'];
  144. }
  145. return $group_array;
  146. }
  147. /**
  148. * Retourne tous les tags des elements postés
  149. *
  150. * @return doctrine_collection
  151. */
  152. public function getElementsTags($group_id, $current_user_id)
  153. {
  154. $parameters = array('gid' => $group_id);
  155. $current_user_sql = '';
  156. if ($current_user_id)
  157. {
  158. $parameters['uidt'] = '%"'.$current_user_id.'"%';
  159. $current_user_sql = 'OR t.privateids LIKE :uidt';
  160. }
  161. return $this->getEntityManager()
  162. ->createQuery('
  163. SELECT t FROM MuzichCoreBundle:Tag t
  164. LEFT JOIN t.elements e
  165. WHERE e.group = :gid
  166. AND (t.tomoderate = \'FALSE\' OR t.tomoderate IS NULL
  167. '.$current_user_sql.')
  168. ORDER BY t.name ASC'
  169. )
  170. ->setParameters($parameters)
  171. ->getResult()
  172. ;
  173. }
  174. public function getElementIdsOwned($group_id)
  175. {
  176. $ids = array();
  177. foreach ($this->getEntityManager()
  178. ->createQuery('SELECT e.id FROM MuzichCoreBundle:Element e
  179. WHERE e.group = :gid')
  180. ->setParameter('gid', $group_id)
  181. ->getScalarResult() as $row)
  182. {
  183. $ids[] = $row['id'];
  184. }
  185. return $ids;
  186. }
  187. public function countFollowers($group_id)
  188. {
  189. $data = $this->getEntityManager()
  190. ->createQuery('SELECT COUNT(f) FROM MuzichCoreBundle:FollowGroup f
  191. WHERE f.group = :gid')
  192. ->setParameter('gid', $group_id)
  193. ->getScalarResult()
  194. ;
  195. if (count($data))
  196. {
  197. if (count($data[0]))
  198. {
  199. return $data[0][1];
  200. }
  201. }
  202. return 0;
  203. }
  204. }