Spaces:
No application file
No application file
namespace Mautic\SmsBundle\Entity; | |
use Doctrine\ORM\Query; | |
use Doctrine\ORM\Tools\Pagination\Paginator; | |
use Mautic\CoreBundle\Entity\CommonRepository; | |
/** | |
* @extends CommonRepository<Sms> | |
*/ | |
class SmsRepository extends CommonRepository | |
{ | |
/** | |
* Get a list of entities. | |
* | |
* @return Paginator | |
*/ | |
public function getEntities(array $args = []) | |
{ | |
$q = $this->_em | |
->createQueryBuilder() | |
->select($this->getTableAlias()) | |
->from(Sms::class, $this->getTableAlias(), $this->getTableAlias().'.id'); | |
if (empty($args['iterator_mode']) && empty($args['iterable_mode'])) { | |
$q->leftJoin($this->getTableAlias().'.category', 'c'); | |
} | |
$args['qb'] = $q; | |
return parent::getEntities($args); | |
} | |
/** | |
* @depreacated The method is replaced by getPublishedBroadcastsIterable | |
* | |
* @param numeric|null $id | |
* | |
* @return \Doctrine\ORM\Internal\Hydration\IterableResult<Sms> | |
*/ | |
public function getPublishedBroadcasts($id = null): \Doctrine\ORM\Internal\Hydration\IterableResult | |
{ | |
return $this->getPublishedBroadcastsQuery($id)->iterate(); | |
} | |
/** | |
* @return iterable<Sms> | |
*/ | |
public function getPublishedBroadcastsIterable(?int $id = null): iterable | |
{ | |
return $this->getPublishedBroadcastsQuery($id)->toIterable(); | |
} | |
private function getPublishedBroadcastsQuery(?int $id = null): Query | |
{ | |
$qb = $this->createQueryBuilder($this->getTableAlias()); | |
$expr = $this->getPublishedByDateExpression($qb, null, true, true, false); | |
$expr->add( | |
$qb->expr()->eq($this->getTableAlias().'.smsType', $qb->expr()->literal('list')) | |
); | |
if (null !== $id && 0 !== $id) { | |
$expr->add( | |
$qb->expr()->eq($this->getTableAlias().'.id', (int) $id) | |
); | |
} | |
$qb->where($expr); | |
return $qb->getQuery(); | |
} | |
/** | |
* @return \Doctrine\DBAL\Query\QueryBuilder | |
*/ | |
public function getSegmentsContactsQuery(int $smsId) | |
{ | |
// Main query | |
$q = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$q->from(MAUTIC_TABLE_PREFIX.'sms_message_list_xref', 'sml') | |
->join('sml', MAUTIC_TABLE_PREFIX.'lead_lists', 'll', 'll.id = sml.leadlist_id and ll.is_published = 1') | |
->join('ll', MAUTIC_TABLE_PREFIX.'lead_lists_leads', 'lll', 'lll.leadlist_id = sml.leadlist_id and lll.manually_removed = 0') | |
->join('lll', MAUTIC_TABLE_PREFIX.'leads', 'l', 'lll.lead_id = l.id') | |
->where( | |
$q->expr()->and( | |
$q->expr()->eq('sml.sms_id', ':smsId') | |
) | |
) | |
->setParameter('smsId', $smsId) | |
// Order by ID so we can query by greater than X contact ID when batching | |
->orderBy('lll.lead_id'); | |
return $q; | |
} | |
/** | |
* Get amounts of sent and read emails. | |
* | |
* @return array | |
*/ | |
public function getSentCount() | |
{ | |
$q = $this->_em->createQueryBuilder(); | |
$q->select('SUM(e.sentCount) as sent_count') | |
->from(Sms::class, 'e'); | |
$results = $q->getQuery()->getSingleResult(Query::HYDRATE_ARRAY); | |
if (!isset($results['sent_count'])) { | |
$results['sent_count'] = 0; | |
} | |
return $results; | |
} | |
/** | |
* @param \Doctrine\ORM\QueryBuilder|\Doctrine\DBAL\Query\QueryBuilder $q | |
*/ | |
protected function addSearchCommandWhereClause($q, $filter): array | |
{ | |
[$expr, $parameters] = $this->addStandardSearchCommandWhereClause($q, $filter); | |
if ($expr) { | |
return [$expr, $parameters]; | |
} | |
$command = $filter->command; | |
$unique = $this->generateRandomParameterName(); | |
$returnParameter = false; // returning a parameter that is not used will lead to a Doctrine error | |
switch ($command) { | |
case $this->translator->trans('mautic.core.searchcommand.lang'): | |
$langUnique = $this->generateRandomParameterName(); | |
$langValue = $filter->string.'_%'; | |
$forceParameters = [ | |
$langUnique => $langValue, | |
$unique => $filter->string, | |
]; | |
$expr = $q->expr()->orX( | |
$q->expr()->eq('e.language', ":$unique"), | |
$q->expr()->like('e.language', ":$langUnique") | |
); | |
$returnParameter = true; | |
break; | |
} | |
if ($expr && $filter->not) { | |
$expr = $q->expr()->not($expr); | |
} | |
if (!empty($forceParameters)) { | |
$parameters = $forceParameters; | |
} elseif ($returnParameter) { | |
$string = ($filter->strict) ? $filter->string : "%{$filter->string}%"; | |
$parameters = ["$unique" => $string]; | |
} | |
return [$expr, $parameters]; | |
} | |
/** | |
* @return string[] | |
*/ | |
public function getSearchCommands(): array | |
{ | |
$commands = [ | |
'mautic.core.searchcommand.ispublished', | |
'mautic.core.searchcommand.isunpublished', | |
'mautic.core.searchcommand.isuncategorized', | |
'mautic.core.searchcommand.ismine', | |
'mautic.core.searchcommand.category', | |
'mautic.core.searchcommand.lang', | |
]; | |
return array_merge($commands, parent::getSearchCommands()); | |
} | |
/** | |
* @return array<array<string>> | |
*/ | |
protected function getDefaultOrder(): array | |
{ | |
return [ | |
['e.name', 'ASC'], | |
]; | |
} | |
public function getTableAlias(): string | |
{ | |
return 'e'; | |
} | |
/** | |
* Up the click/sent counts. | |
* | |
* @param string $type | |
* @param int $increaseBy | |
*/ | |
public function upCount($id, $type = 'sent', $increaseBy = 1): void | |
{ | |
try { | |
$q = $this->_em->getConnection()->createQueryBuilder(); | |
$q->update(MAUTIC_TABLE_PREFIX.'sms_messages') | |
->set($type.'_count', $type.'_count + '.(int) $increaseBy) | |
->where('id = '.(int) $id); | |
$q->executeStatement(); | |
} catch (\Exception) { | |
// not important | |
} | |
} | |
/** | |
* @param string $search | |
* @param int $limit | |
* @param int $start | |
* @param bool $viewOther | |
* @param string $smsType | |
* | |
* @return array | |
*/ | |
public function getSmsList($search = '', $limit = 10, $start = 0, $viewOther = false, $smsType = null) | |
{ | |
$q = $this->createQueryBuilder('e'); | |
$q->select('partial e.{id, name, language}'); | |
if (!empty($search)) { | |
if (is_array($search)) { | |
$search = array_map('intval', $search); | |
$q->andWhere($q->expr()->in('e.id', ':search')) | |
->setParameter('search', $search); | |
} else { | |
$q->andWhere($q->expr()->like('e.name', ':search')) | |
->setParameter('search', "%{$search}%"); | |
} | |
} | |
if (!$viewOther) { | |
$q->andWhere($q->expr()->eq('e.createdBy', ':id')) | |
->setParameter('id', $this->currentUser->getId()); | |
} | |
if (!empty($smsType)) { | |
$q->andWhere( | |
$q->expr()->eq('e.smsType', $q->expr()->literal($smsType)) | |
); | |
} | |
$q->orderBy('e.name'); | |
if (!empty($limit)) { | |
$q->setFirstResult($start) | |
->setMaxResults($limit); | |
} | |
return $q->getQuery()->getArrayResult(); | |
} | |
} | |