Skip to content

Commit f87a38e

Browse files
committed
Add: SubscriberFilter options
1 parent ca374e4 commit f87a38e

File tree

2 files changed

+85
-11
lines changed

2 files changed

+85
-11
lines changed

src/Domain/Subscription/Model/Filter/SubscriberFilter.php

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,7 @@
77
use DateTimeImmutable;
88
use PhpList\Core\Domain\Common\Model\Filter\FilterRequestInterface;
99

10+
/** @SuppressWarnings("ExcessiveParameterList") */
1011
class SubscriberFilter implements FilterRequestInterface
1112
{
1213
private ?int $listId;
@@ -16,7 +17,13 @@ class SubscriberFilter implements FilterRequestInterface
1617
private ?DateTimeImmutable $createdDateTo;
1718
private ?DateTimeImmutable $updatedDateFrom;
1819
private ?DateTimeImmutable $updatedDateTo;
20+
private ?bool $isConfirmed;
21+
private ?bool $isBlacklisted;
1922
private array $columns;
23+
private ?string $sortBy;
24+
private ?string $sortDirection;
25+
private ?string $findColumn;
26+
private ?string $findValue;
2027

2128
public function __construct(
2229
?int $listId = null,
@@ -26,7 +33,13 @@ public function __construct(
2633
?DateTimeImmutable $createdDateTo = null,
2734
?DateTimeImmutable $updatedDateFrom = null,
2835
?DateTimeImmutable $updatedDateTo = null,
36+
?bool $isConfirmed = null,
37+
?bool $isBlacklisted = null,
2938
array $columns = [],
39+
?string $sortBy = null,
40+
?string $sortDirection = null,
41+
?string $findColumn = null,
42+
?string $findValue = null,
3043
) {
3144
$this->listId = $listId;
3245
$this->subscribedDateFrom = $subscribedDateFrom;
@@ -35,7 +48,13 @@ public function __construct(
3548
$this->createdDateTo = $createdDateTo;
3649
$this->updatedDateFrom = $updatedDateFrom;
3750
$this->updatedDateTo = $updatedDateTo;
51+
$this->isConfirmed = $isConfirmed;
52+
$this->isBlacklisted = $isBlacklisted;
3853
$this->columns = $columns;
54+
$this->sortBy = $sortBy;
55+
$this->sortDirection = $sortDirection;
56+
$this->findColumn = $findColumn;
57+
$this->findValue = $findValue;
3958
}
4059

4160
public function getListId(): ?int
@@ -73,8 +92,38 @@ public function getUpdatedDateTo(): ?DateTimeImmutable
7392
return $this->updatedDateTo;
7493
}
7594

95+
public function getIsConfirmed(): ?bool
96+
{
97+
return $this->isConfirmed;
98+
}
99+
100+
public function getIsBlacklisted(): ?bool
101+
{
102+
return $this->isBlacklisted;
103+
}
104+
76105
public function getColumns(): array
77106
{
78107
return $this->columns;
79108
}
109+
110+
public function getSortBy(): ?string
111+
{
112+
return $this->sortBy;
113+
}
114+
115+
public function getSortDirection(): ?string
116+
{
117+
return $this->sortDirection;
118+
}
119+
120+
public function getFindColumn(): ?string
121+
{
122+
return $this->findColumn;
123+
}
124+
125+
public function getFindValue(): ?string
126+
{
127+
return $this->findValue;
128+
}
80129
}

src/Domain/Subscription/Repository/SubscriberRepository.php

Lines changed: 36 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,7 @@
44

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

7+
use Doctrine\ORM\QueryBuilder;
78
use InvalidArgumentException;
89
use PhpList\Core\Domain\Common\Model\Filter\FilterRequestInterface;
910
use PhpList\Core\Domain\Common\Repository\AbstractRepository;
@@ -73,6 +74,8 @@ public function getSubscribersBySubscribedListId(int $listId): array
7374
/**
7475
* @return Subscriber[]
7576
* @throws InvalidArgumentException
77+
* @SuppressWarnings("CyclomaticComplexity")
78+
* @SuppressWarnings("NPathComplexity")
7679
*/
7780
public function getFilteredAfterId(int $lastId, int $limit, ?FilterRequestInterface $filter = null): array
7881
{
@@ -96,29 +99,51 @@ public function getFilteredAfterId(int $lastId, int $limit, ?FilterRequestInterf
9699
->setParameter('subscribedAtTo', $filter->getSubscribedDateTo());
97100
}
98101
}
102+
103+
$this->applyTimeFilter($filter, $queryBuilder);
104+
105+
if ($filter->getIsConfirmed() !== null) {
106+
$queryBuilder->andWhere('subscriber.isConfirmed = :isConfirmed')
107+
->setParameter('isConfirmed', $filter->getIsConfirmed());
108+
}
109+
if ($filter->getIsBlacklisted() !== null) {
110+
$queryBuilder->andWhere('subscriber.isBlacklisted = :isBlacklisted')
111+
->setParameter('isBlacklisted', $filter->getIsBlacklisted());
112+
}
113+
if ($filter->getSortBy() !== null) {
114+
$queryBuilder->orderBy('subscriber.' . $filter->getSortBy(), $filter->getSortDirection() ?? 'ASC');
115+
}
116+
if ($filter->getFindColumn() && $filter->getFindValue()) {
117+
$queryBuilder->andWhere('subscriber.' . $filter->getFindColumn() . ' LIKE :search')
118+
->setParameter('search', '%' . $filter->getFindValue() . '%');
119+
}
120+
121+
return $queryBuilder->andWhere('subscriber.id > :lastId')
122+
->setParameter('lastId', $lastId)
123+
->orderBy('subscriber.id', 'ASC')
124+
->setMaxResults($limit)
125+
->getQuery()
126+
->getResult();
127+
}
128+
129+
private function applyTimeFilter(SubscriberFilter $filter, QueryBuilder $queryBuilder): void
130+
{
99131
if ($filter->getCreatedDateFrom() !== null) {
100-
$queryBuilder->where('subscriber.createdAt > :createdAtFrom')
132+
$queryBuilder->andWhere('subscriber.createdAt > :createdAtFrom')
101133
->setParameter('createdAtFrom', $filter->getCreatedDateFrom());
102134
}
103135
if ($filter->getCreatedDateTo() !== null) {
104-
$queryBuilder->where('subscriber.createdAt < :createdAtTo')
136+
$queryBuilder->andWhere('subscriber.createdAt < :createdAtTo')
105137
->setParameter('createdAtTo', $filter->getCreatedDateTo());
106138
}
107139
if ($filter->getUpdatedDateFrom() !== null) {
108-
$queryBuilder->where('subscriber.updatedAt > :updatedAtFrom')
140+
$queryBuilder->andWhere('subscriber.updatedAt > :updatedAtFrom')
109141
->setParameter('updatedAtFrom', $filter->getUpdatedDateFrom());
110142
}
111143
if ($filter->getUpdatedDateTo() !== null) {
112-
$queryBuilder->where('subscriber.updatedAt < :updatedAtTo')
144+
$queryBuilder->andWhere('subscriber.updatedAt < :updatedAtTo')
113145
->setParameter('updatedAtTo', $filter->getUpdatedDateTo());
114146
}
115-
116-
return $queryBuilder->andWhere('subscriber.id > :lastId')
117-
->setParameter('lastId', $lastId)
118-
->orderBy('subscriber.id', 'ASC')
119-
->setMaxResults($limit)
120-
->getQuery()
121-
->getResult();
122147
}
123148

124149
public function findSubscriberWithSubscriptions(int $id): ?Subscriber

0 commit comments

Comments
 (0)