Skip to content

Commit 8111113

Browse files
committed
ISSUE-345: subscriber filter
1 parent 2775986 commit 8111113

5 files changed

Lines changed: 56 additions & 4 deletions

File tree

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,21 @@
1+
<?php
2+
3+
declare(strict_types=1);
4+
5+
namespace PhpList\Core\Domain\Filter;
6+
7+
class SubscriberFilter
8+
{
9+
private ?int $listId = null;
10+
11+
public function setListId(?int $listId): self
12+
{
13+
$this->listId = $listId;
14+
return $this;
15+
}
16+
17+
public function getListId(): ?int
18+
{
19+
return $this->listId;
20+
}
21+
}

src/Domain/Repository/CursorPaginationTrait.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,9 +28,9 @@ public function getAfterId(QueryBuilder $queryBuilder, int $lastId, int $limit):
2828
$alias = $this->getAlias();
2929

3030
return $queryBuilder
31-
->andWhere("$alias.id > :lastId")
31+
->andWhere($alias . '.id > :lastId')
3232
->setParameter('lastId', $lastId)
33-
->orderBy("$alias.id", 'ASC')
33+
->orderBy($alias . '.id', 'ASC')
3434
->setMaxResults($limit)
3535
->getQuery()
3636
->getResult();

src/Domain/Repository/Messaging/MessageRepository.php

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -28,10 +28,10 @@ public function getByOwnerId(int $ownerId): array
2828

2929
public function getFilteredAfterId(int $lastId, int $limit, ?FilterRequestInterface $filter = null): array
3030
{
31-
$queryBuilder = $this->createQueryBuilder($this->getAlias());;
31+
$queryBuilder = $this->createQueryBuilder($this->getAlias());
3232

3333
if ($filter instanceof MessageFilter && $filter->getOwner() !== null) {
34-
$queryBuilder->andWhere("IDENTITY({$this->getAlias()}.owner) = :ownerId")
34+
$queryBuilder->andWhere('IDENTITY(' . $this->getAlias() . '.owner) = :ownerId')
3535
->setParameter('ownerId', $filter->getOwner()->getId());
3636
}
3737

src/Domain/Repository/Subscription/SubscriberRepository.php

Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,9 @@
44

55
namespace PhpList\Core\Domain\Repository\Subscription;
66

7+
use InvalidArgumentException;
8+
use PhpList\Core\Domain\Filter\FilterRequestInterface;
9+
use PhpList\Core\Domain\Filter\SubscriberFilter;
710
use PhpList\Core\Domain\Model\Subscription\Subscriber;
811
use PhpList\Core\Domain\Repository\AbstractRepository;
912
use PhpList\Core\Domain\Repository\CursorPaginationTrait;
@@ -44,6 +47,29 @@ public function getSubscribersBySubscribedListId(int $listId): array
4447
->getResult();
4548
}
4649

50+
/**
51+
* @return Subscriber[]
52+
* @throws InvalidArgumentException
53+
*/
54+
public function getFilteredAfterId(int $lastId, int $limit, ?FilterRequestInterface $filter = null): array
55+
{
56+
if (!$filter instanceof SubscriberFilter) {
57+
throw new InvalidArgumentException('Expected SubscriberFilterRequest.');
58+
}
59+
60+
$alias = $this->getAlias();
61+
62+
$queryBuilder = $this->createQueryBuilder($alias)
63+
->innerJoin($alias . '.subscriptions', 'subscription')
64+
->innerJoin('subscription.subscriberList', 'list');
65+
if ($filter->getListId() !== null) {
66+
$queryBuilder->where('list.id = :listId')
67+
->setParameter('listId', $filter->getListId());
68+
}
69+
70+
return $this->getAfterId($queryBuilder, $lastId, $limit);
71+
}
72+
4773
public function findSubscriberWithSubscriptions(int $id): ?Subscriber
4874
{
4975
return $this->createQueryBuilder('s')

tests/Unit/Domain/Repository/DummyRepository.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,11 @@ public function __construct(private readonly QueryBuilder $queryBuilder)
1818
{
1919
}
2020

21+
public function getAlias(): string
22+
{
23+
return 'dummy';
24+
}
25+
2126
/** Doctrine normally injects the QB through $this->createQueryBuilder(). */
2227
protected function createQueryBuilder(string $alias): QueryBuilder
2328
{

0 commit comments

Comments
 (0)