44
55namespace PhpList \Core \Domain \Subscription \Repository ;
66
7+ use Doctrine \ORM \QueryBuilder ;
78use InvalidArgumentException ;
89use PhpList \Core \Domain \Common \Model \Filter \FilterRequestInterface ;
910use 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