X-Git-Url: https://git.immae.eu/?a=blobdiff_plain;f=src%2FWallabag%2FCoreBundle%2FRepository%2FEntryRepository.php;h=45366623d23204e8d8a1ffd3bfd9b1fd1c2ca832;hb=091bafeb4c4da9af8ea1201d5371887062f03f2e;hp=a31f97b5a5c95660f9b99f49764d5e4d0c105645;hpb=0636697289b7ad50bfaa33c93ce4593543d435b5;p=github%2Fwallabag%2Fwallabag.git diff --git a/src/Wallabag/CoreBundle/Repository/EntryRepository.php b/src/Wallabag/CoreBundle/Repository/EntryRepository.php index a31f97b5..45366623 100644 --- a/src/Wallabag/CoreBundle/Repository/EntryRepository.php +++ b/src/Wallabag/CoreBundle/Repository/EntryRepository.php @@ -3,6 +3,7 @@ namespace Wallabag\CoreBundle\Repository; use Doctrine\ORM\EntityRepository; +use Doctrine\ORM\NoResultException; use Doctrine\ORM\QueryBuilder; use Pagerfanta\Adapter\DoctrineORMAdapter; use Pagerfanta\Pagerfanta; @@ -50,7 +51,7 @@ class EntryRepository extends EntityRepository public function getBuilderForArchiveByUser($userId) { return $this - ->getSortedQueryBuilderByUser($userId) + ->getSortedQueryBuilderByUser($userId, 'archivedAt', 'desc') ->andWhere('e.isArchived = true') ; } @@ -110,15 +111,14 @@ class EntryRepository extends EntityRepository */ public function getBuilderForUntaggedByUser($userId) { - return $this - ->sortQueryBuilder($this->getRawBuilderForUntaggedByUser($userId)); + return $this->sortQueryBuilder($this->getRawBuilderForUntaggedByUser($userId)); } /** * Retrieve untagged entries for a user. - * + * * @param int $userId - * + * * @return QueryBuilder */ public function getRawBuilderForUntaggedByUser($userId) @@ -142,7 +142,7 @@ class EntryRepository extends EntityRepository * * @return Pagerfanta */ - public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'ASC', $since = 0, $tags = '') + public function findEntries($userId, $isArchived = null, $isStarred = null, $isPublic = null, $sort = 'created', $order = 'asc', $since = 0, $tags = '') { $qb = $this->createQueryBuilder('e') ->leftJoin('e.tags', 't') @@ -185,10 +185,16 @@ class EntryRepository extends EntityRepository } } + if (!\in_array(strtolower($order), ['asc', 'desc'], true)) { + throw new \Exception('Order "' . $order . '" parameter is wrong, allowed: asc or desc'); + } + if ('created' === $sort) { $qb->orderBy('e.id', $order); } elseif ('updated' === $sort) { $qb->orderBy('e.updatedAt', $order); + } elseif ('archived' === $sort) { + $qb->orderBy('e.archivedAt', $order); } $pagerAdapter = new DoctrineORMAdapter($qb, true, false); @@ -320,8 +326,8 @@ class EntryRepository extends EntityRepository * Find an entry by its url and its owner. * If it exists, return the entry otherwise return false. * - * @param $url - * @param $userId + * @param string $url + * @param int $userId * * @return Entry|bool */ @@ -412,8 +418,8 @@ class EntryRepository extends EntityRepository /** * Find all entries by url and owner. * - * @param $url - * @param $userId + * @param string $url + * @param int $userId * * @return array */ @@ -427,9 +433,52 @@ class EntryRepository extends EntityRepository } /** - * Return a query builder to be used by other getBuilderFor* method. + * Returns a random entry, filtering by status. * * @param int $userId + * @param string $type Can be unread, archive, starred, etc + * + * @throws NoResultException + * + * @return Entry + */ + public function getRandomEntry($userId, $type = '') + { + $qb = $this->getQueryBuilderByUser($userId) + ->select('e.id'); + + switch ($type) { + case 'unread': + $qb->andWhere('e.isArchived = false'); + break; + case 'archive': + $qb->andWhere('e.isArchived = true'); + break; + case 'starred': + $qb->andWhere('e.isStarred = true'); + break; + case 'untagged': + $qb->leftJoin('e.tags', 't'); + $qb->andWhere('t.id is null'); + break; + } + + $ids = $qb->getQuery()->getArrayResult(); + + if (empty($ids)) { + throw new NoResultException(); + } + + // random select one in the list + $randomId = $ids[mt_rand(0, \count($ids) - 1)]['id']; + + return $this->find($randomId); + } + + /** + * Return a query builder to be used by other getBuilderFor* method. + * + * @param int $userId * * @return QueryBuilder */ @@ -450,21 +499,20 @@ class EntryRepository extends EntityRepository */ private function getSortedQueryBuilderByUser($userId, $sortBy = 'createdAt', $direction = 'desc') { - return $this->sortQueryBuilder($this->getQueryBuilderByUser($userId)); + return $this->sortQueryBuilder($this->getQueryBuilderByUser($userId), $sortBy, $direction); } /** - * Return the given QueryBuilder with an orderBy() call - * + * Return the given QueryBuilder with an orderBy() call. + * * @param QueryBuilder $qb - * @param string $sortBy - * @param string $direction + * @param string $sortBy + * @param string $direction * * @return QueryBuilder */ private function sortQueryBuilder(QueryBuilder $qb, $sortBy = 'createdAt', $direction = 'desc') { - return $qb - ->orderBy(sprintf('e.%s', $sortBy), $direction); + return $qb->orderBy(sprintf('e.%s', $sortBy), $direction); } }