DigitalState/Platform-Notification-Bundle

View on GitHub
Criterion/NotificationCriterion.php

Summary

Maintainability
A
0 mins
Test Coverage
<?php

namespace Ds\Bundle\NotificationBundle\Criterion;

use Ds\Bundle\CommunicationBundle\Criterion\Criterion;
use Doctrine\ORM\EntityManager;
use Ds\Bundle\CommunicationBundle\Entity;
use Doctrine\ORM\QueryBuilder;

/**
 * Class NotificationCriterion
 */
class NotificationCriterion implements Criterion
{
    /**
     * @var \Doctrine\ORM\EntityManager
     */
    protected $entityManager;

    /**
     * Constructor
     *
     * @param \Doctrine\ORM\EntityManager $entityManager
     */
    public function __construct(EntityManager $entityManager)
    {
        $this->entityManager = $entityManager;
    }

    /**
     * {@inheritdoc}
     */
    public function aggregate(QueryBuilder $query, Entity\Criterion $criterion, Entity\Channel $channel = null)
    {
        // @todo use query builder with join/subquery
//        $subQuery = $this->entityManager->createQueryBuilder();
//        $subQuery
//            ->select([ 's.user' ])
//            ->from('\\Ds\\Bundle\\NotificationBundle\\Entity\\Subscription', 's');

        $statement = $this->entityManager->getConnection()->prepare('
                      SELECT
                          `ns`.`user_id`
                      FROM
                          `ds_notification_subscription` `ns`
                      INNER JOIN
                          `ds_notification_subscription_channel` `nsc` ON `nsc`.`subscription_id` = `ns`.`id`' . ($channel ? ' AND `nsc`.`channel_id` = :channel' : '') . '
                      WHERE
                          `ns`.`notification_id` = :notification'
        );

        $parameters = [ 'notification' => $criterion->getOperand2() ];

        if ($channel) {
            $parameters['channel'] = $channel->getId();
        }

        $statement->execute($parameters);

        $users = array_map(function($item) {
            return $item['user_id'];
        }, $statement->fetchAll());

        $query->andWhere($query->expr()->in('u.id', $users ?: [ '' ]));

        return $this;
    }
}