Spaces:
No application file
No application file
namespace Mautic\CoreBundle\Entity; | |
/** | |
* @extends CommonRepository<Notification> | |
*/ | |
class NotificationRepository extends CommonRepository | |
{ | |
public function getTableAlias(): string | |
{ | |
return 'n'; | |
} | |
public function getDefaultOrder(): array | |
{ | |
return [ | |
['n.dateAdded', 'DESC'], | |
]; | |
} | |
/** | |
* Mark user notifications as read. | |
*/ | |
public function markAllReadForUser($userId): void | |
{ | |
$this->_em->getConnection()->update(MAUTIC_TABLE_PREFIX.'notifications', ['is_read' => 1], ['user_id' => (int) $userId]); | |
} | |
/** | |
* Clear notifications for a user. | |
* | |
* @throws \Doctrine\DBAL\Exception\InvalidArgumentException | |
*/ | |
public function clearNotificationsForUser($userId, $id = null, $limit = null): void | |
{ | |
if (!empty($id)) { | |
$this->getEntityManager()->getConnection()->update( | |
MAUTIC_TABLE_PREFIX.'notifications', | |
[ | |
'is_read' => 1, | |
], | |
[ | |
'user_id' => (int) $userId, | |
'id' => $id, | |
] | |
); | |
} else { | |
// Only mark the first 30 read | |
$qb = $this->getEntityManager()->getConnection()->createQueryBuilder(); | |
$qb->update(MAUTIC_TABLE_PREFIX.'notifications') | |
->set('is_read', 1) | |
->where('user_id = '.(int) $userId.' AND is_read = 0') | |
->orderBy('id'); | |
if ($limit) { | |
// Doctrine API doesn't support updates with limits | |
$this->getEntityManager()->getConnection()->executeStatement( | |
$qb->getSQL()." LIMIT $limit" | |
); | |
} else { | |
$qb->executeStatement(); | |
} | |
} | |
} | |
/** | |
* @return mixed|null | |
*/ | |
public function getUpstreamLastDate() | |
{ | |
$qb = $this->createQueryBuilder('n') | |
->select('partial n.{id, dateAdded}') | |
->where('n.type = :type') | |
->setParameter('type', 'upstream') | |
->setMaxResults(1); | |
/** @var Notification $result */ | |
$result = $qb->getQuery()->getOneOrNullResult(); | |
return null === $result ? null : $result->getDateAdded(); | |
} | |
/** | |
* Fetch notifications for this user. | |
* | |
* @param bool $includeRead | |
* | |
* @return array | |
*/ | |
public function getNotifications($userId, $afterId = null, $includeRead = false, $type = null, $limit = null) | |
{ | |
$qb = $this->createQueryBuilder('n'); | |
$expr = $qb->expr()->andX( | |
$qb->expr()->eq('IDENTITY(n.user)', (int) $userId) | |
); | |
if ($afterId) { | |
$expr->add( | |
$qb->expr()->gt('n.id', (int) $afterId) | |
); | |
} | |
if (!$includeRead) { | |
$expr->add( | |
$qb->expr()->eq('n.isRead', 0) | |
); | |
} | |
if (null !== $type) { | |
$expr->add( | |
$qb->expr()->eq('n.type', ':type') | |
); | |
$qb->setParameter('type', $type); | |
} | |
$qb->where($expr) | |
->orderBy('n.dateAdded', \Doctrine\Common\Collections\Criteria::DESC); | |
if ($limit) { | |
$qb->setMaxResults($limit); | |
} | |
return $qb->getQuery()->getArrayResult(); | |
} | |
public function isDuplicate(int $userId, string $deduplicate, \DateTime $from): bool | |
{ | |
$qb = $this->getEntityManager() | |
->getConnection() | |
->createQueryBuilder(); | |
$qb->select('1') | |
->from(MAUTIC_TABLE_PREFIX.'notifications') | |
->where('user_id = :userId') | |
->andWhere('deduplicate = :deduplicate') | |
->andWhere('date_added >= :from') | |
->setParameter('userId', $userId) | |
->setParameter('deduplicate', $deduplicate) | |
->setParameter('from', $from->format('Y-m-d H:i:s')) | |
->setMaxResults(1); | |
return (bool) $qb->executeQuery() | |
->fetchOne(); | |
} | |
} | |