@@ -25,20 +25,13 @@ class DoctrineDatabase extends Gateway
2525 public const COLUMN_CREATED = 'created ' ;
2626 public const COLUMN_DATA = 'data ' ;
2727
28- /** @var \Doctrine\DBAL\Connection */
29- private $ connection ;
28+ private Connection $ connection ;
3029
31- /**
32- * @param \Doctrine\DBAL\Connection $connection
33- */
3430 public function __construct (Connection $ connection )
3531 {
3632 $ this ->connection = $ connection ;
3733 }
3834
39- /**
40- * {@inheritdoc}
41- */
4235 public function insert (CreateStruct $ createStruct ): int
4336 {
4437 $ query = $ this ->connection ->createQueryBuilder ();
@@ -62,9 +55,6 @@ public function insert(CreateStruct $createStruct): int
6255 return (int ) $ this ->connection ->lastInsertId ();
6356 }
6457
65- /**
66- * {@inheritdoc}
67- */
6858 public function getNotificationById (int $ notificationId ): array
6959 {
7060 $ query = $ this ->connection ->createQueryBuilder ();
@@ -78,9 +68,6 @@ public function getNotificationById(int $notificationId): array
7868 return $ query ->execute ()->fetchAll (PDO ::FETCH_ASSOC );
7969 }
8070
81- /**
82- * {@inheritdoc}
83- */
8471 public function updateNotification (Notification $ notification ): void
8572 {
8673 if (!isset ($ notification ->id ) || !is_numeric ($ notification ->id )) {
@@ -99,24 +86,52 @@ public function updateNotification(Notification $notification): void
9986 $ query ->execute ();
10087 }
10188
102- /**
103- * {@inheritdoc}
104- */
105- public function countUserNotifications (int $ userId ): int
89+ private function applyFilters ($ queryBuilder , array $ query ): void
10690 {
107- $ query = $ this ->connection ->createQueryBuilder ();
108- $ query
91+ if (isset ($ query ['type ' ])) {
92+ $ queryBuilder
93+ ->andWhere ($ queryBuilder ->expr ()->like (self ::COLUMN_TYPE , ':type ' ))
94+ ->setParameter (':type ' , '% ' . $ query ['type ' ] . '% ' );
95+ }
96+
97+ if (isset ($ query ['status ' ])) {
98+ if (in_array ('read ' , $ query ['status ' ], true )) {
99+ $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->eq (self ::COLUMN_IS_PENDING , ':status_read ' ))
100+ ->setParameter (':status_read ' , false ); // 'read' corresponds to is_pending = false
101+ }
102+ if (in_array ('unread ' , $ query ['status ' ], true )) {
103+ $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->eq (self ::COLUMN_IS_PENDING , ':status_unread ' ))
104+ ->setParameter (':status_unread ' , true ); // 'unread' corresponds to is_pending = true
105+ }
106+ }
107+
108+ if (isset ($ query ['created_from ' ])) {
109+ $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->gte (self ::COLUMN_CREATED , ':created_from ' ))
110+ ->setParameter (':created_from ' , $ query ['created_from ' ], PDO ::PARAM_INT );
111+ }
112+
113+ if (isset ($ query ['created_to ' ])) {
114+ $ queryBuilder ->andWhere ($ queryBuilder ->expr ()->lte (self ::COLUMN_CREATED , ':created_to ' ))
115+ ->setParameter (':created_to ' , $ query ['created_to ' ], PDO ::PARAM_INT );
116+ }
117+ }
118+
119+ public function countUserNotifications (int $ userId , array $ query = []): int
120+ {
121+ $ queryBuilder = $ this ->connection ->createQueryBuilder ();
122+ $ queryBuilder
109123 ->select ('COUNT( ' . self ::COLUMN_ID . ') ' )
110124 ->from (self ::TABLE_NOTIFICATION )
111- ->where ($ query ->expr ()->eq (self ::COLUMN_OWNER_ID , ':user_id ' ))
125+ ->where ($ queryBuilder ->expr ()->eq (self ::COLUMN_OWNER_ID , ':user_id ' ))
112126 ->setParameter (':user_id ' , $ userId , PDO ::PARAM_INT );
113127
114- return (int )$ query ->execute ()->fetchColumn ();
128+ if (!empty ($ query )) {
129+ $ this ->applyFilters ($ queryBuilder , $ query );
130+ }
131+
132+ return (int )$ queryBuilder ->execute ()->fetchColumn ();
115133 }
116134
117- /**
118- * {@inheritdoc}
119- */
120135 public function countUserPendingNotifications (int $ userId ): int
121136 {
122137 $ query = $ this ->connection ->createQueryBuilder ();
@@ -132,31 +147,29 @@ public function countUserPendingNotifications(int $userId): int
132147 return (int )$ query ->execute ()->fetchColumn ();
133148 }
134149
135- /**
136- * {@inheritdoc}
137- */
138- public function loadUserNotifications (int $ userId , int $ offset = 0 , int $ limit = -1 ): array
150+ public function loadUserNotifications (int $ userId , int $ offset = 0 , int $ limit = -1 , array $ query = []): array
139151 {
140- $ query = $ this ->connection ->createQueryBuilder ();
141- $ query
152+ $ queryBuilder = $ this ->connection ->createQueryBuilder ();
153+ $ queryBuilder
142154 ->select (...$ this ->getColumns ())
143155 ->from (self ::TABLE_NOTIFICATION )
144- ->where ($ query ->expr ()->eq (self ::COLUMN_OWNER_ID , ':user_id ' ))
156+ ->where ($ queryBuilder ->expr ()->eq (self ::COLUMN_OWNER_ID , ':user_id ' ))
145157 ->setFirstResult ($ offset );
146158
159+ if (!empty ($ query )) {
160+ $ this ->applyFilters ($ queryBuilder , $ query );
161+ }
162+
147163 if ($ limit > 0 ) {
148- $ query ->setMaxResults ($ limit );
164+ $ queryBuilder ->setMaxResults ($ limit );
149165 }
150166
151- $ query ->orderBy (self ::COLUMN_ID , 'DESC ' );
152- $ query ->setParameter (':user_id ' , $ userId , PDO ::PARAM_INT );
167+ $ queryBuilder ->orderBy (self ::COLUMN_ID , 'DESC ' );
168+ $ queryBuilder ->setParameter (':user_id ' , $ userId , PDO ::PARAM_INT );
153169
154- return $ query ->execute ()->fetchAll (PDO ::FETCH_ASSOC );
170+ return $ queryBuilder ->execute ()->fetchAll (PDO ::FETCH_ASSOC );
155171 }
156172
157- /**
158- * {@inheritdoc}
159- */
160173 public function delete (int $ notificationId ): void
161174 {
162175 $ query = $ this ->connection ->createQueryBuilder ();
@@ -168,9 +181,6 @@ public function delete(int $notificationId): void
168181 $ query ->execute ();
169182 }
170183
171- /**
172- * @return array
173- */
174184 private function getColumns (): array
175185 {
176186 return [
0 commit comments