newscoop/plugin-NewscoopPaywallBundle

View on GitHub
Entity/Repository/SubscriptionRepository.php

Summary

Maintainability
A
2 hrs
Test Coverage
<?php

/**
 * @author Rafał Muszyński <rafal.muszynski@sourcefabric.org>
 * @copyright 2015 Sourcefabric z.ú.
 * @license http://www.gnu.org/licenses/gpl-3.0.txt
 */
namespace Newscoop\PaywallBundle\Entity\Repository;

use Newscoop\ListResult;

/**
 * Subscription repository.
 */
class SubscriptionRepository extends TranslationRepository
{
    /**
     * Gets all available subscriptions by criteria.
     *
     * @param SubscriptionCriteria $criteria
     * @param bool                 $returnQuery
     *
     * @return ListResult|Doctrine\ORM\Query
     */
    public function getListByCriteria($criteria, $returnQuery = false)
    {
        $qb = $this->createQueryBuilder('s');

        $qb->select('s', 'r', 'd')
            ->andWhere('s.is_active = :is_active')
            ->leftJoin('s.ranges', 'r')
            ->leftJoin('r.discount', 'd')
            ->setParameter('is_active', true);

        if ($criteria->name) {
            $qb->andWhere('s.name = :name')
                ->setParameter('name', $criteria->name);
        }

        if ($criteria->currency) {
            $qb->andWhere('s.currency = :currency')
                ->setParameter('currency', $criteria->currency);
        }

        if ($criteria->type) {
            $qb->andWhere('s.type = :type')
                ->setParameter('type', $criteria->type);
        }

        foreach ($criteria->perametersOperators as $key => $operator) {
            $qb->andWhere('s.'.$key.' = :'.$key)
                ->setParameter($key, $criteria->$key);
        }

        $metadata = $this->getClassMetadata();
        foreach ($criteria->orderBy as $key => $order) {
            if (array_key_exists($key, $metadata->columnNames)) {
                $key = 's.'.$key;
            }

            $qb->orderBy($key, $order);
        }

        $list = new ListResult();
        $countBuilder = clone $qb;
        $query = $this->setTranslatableHints($qb->getQuery(), $criteria->locale);
        if ($returnQuery) {
            return $query;
        }

        $list->count = (int) $countBuilder->select('COUNT(s)')->getQuery()->getSingleScalarResult();
        $list->items = $query;

        return $list;
    }

    /**
     * Gets active Subscriptions by the specification and type.
     *
     * @param string $locale Current language code (e.g. "en")
     * @param array  $specs  Subscription specification
     *                       (e.g. publication id, section number etc.)
     *
     * @return array
     */
    public function findActiveBy($locale = null, $specs = array())
    {
        $queryBuilder = $this
            ->createQueryBuilder('s')
            ->select('s', 'r')
            ->leftJoin('s.ranges', 'r')
            ->join('s.specification', 'sp')
            ->where('s.is_active = true');

        if (!empty($specs)) {
            foreach ($specs as $key => $value) {
                if (!$value) {
                    $queryBuilder
                        ->andWhere('sp.'.$key.' IS NULL');
                } else {
                    $queryBuilder
                        ->andWhere('sp.'.$key.' = :'.$key)
                        ->setParameter($key, $value);
                }
            }
        }

        $query = $queryBuilder->getQuery();

        return $this->setTranslatableHints($query, $locale)
            ->getArrayResult();
    }

    public function findActiveOneBy($id, $locale = null)
    {
        $query = $this
            ->createQueryBuilder('s')
            ->where('s.id = :id')
            ->andWhere('s.is_active = true')
            ->setParameter('id', $id)
            ->getQuery()
        ;

        return $this->setTranslatableHints($query, $locale)
            ->getOneOrNullResult()
        ;
    }

    public function findActive($locale = null)
    {
        $query = $this
            ->createQueryBuilder('s')
            ->andWhere('s.is_active = true')
            ->getQuery()
        ;

        return $this->setTranslatableHints($query, $locale);
    }

    public function getReference($id)
    {
        return $this->getEntityManager()->getReference($this->getEntityName(), $id);
    }

    public function findTemplates($type = null, $locale = null)
    {
        $queryBuilder = $this
            ->createQueryBuilder('s')
            ->where('s.isTemplate = true')
            ->andWhere('s.is_active = true')
        ;

        if ($type) {
            $queryBuilder
                ->andWhere('s.type = :type')
                ->setParameter('type', $type);
        }

        $query = $queryBuilder->getQuery();

        return $this->setTranslatableHints($query, $locale);
    }
}