PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.19.4
GiveWP – Donation Plugin and Fundraising Platform v3.19.4
4.16.2 4.16.1 4.16.0 4.15.5 4.15.4 4.15.3 4.15.2 4.15.1 4.15.0 2.3.0 2.3.1 2.3.2 2.30.0 2.31.0 2.31.1 2.32.0 2.33.0 2.33.1 2.33.2 2.33.3 2.33.4 2.33.5 2.4.0 2.4.1 2.4.2 2.4.3 2.4.4 2.4.5 2.4.6 2.4.7 2.5.0 2.5.1 2.5.10 2.5.11 2.5.12 2.5.13 2.5.2 2.5.3 2.5.4 2.5.5 2.5.6 2.5.7 2.5.8 2.5.9 2.6.0 2.6.1 2.6.2 2.6.3 2.7.0 2.7.1 2.7.2 2.7.3 2.7.4 2.7.5 2.8.0 2.8.1 2.9.0 2.9.1 2.9.2 2.9.3 2.9.4 2.9.5 2.9.6 2.9.7 3.0.0 3.0.1 3.0.2 3.0.3 3.0.4 3.1.0 3.1.1 3.1.2 3.10.0 3.11.0 3.12.0 3.12.1 3.12.2 3.12.3 3.13.0 3.14.0 3.14.1 3.14.2 3.15.0 3.15.1 3.16.0 3.16.1 3.16.2 3.16.3 3.16.4 3.16.5 3.17.0 3.17.1 3.17.2 3.18.0 3.19.0 3.19.1 3.19.2 3.19.3 3.19.4 3.2.0 3.2.1 3.2.2 3.20.0 3.21.0 3.21.1 3.22.0 3.22.1 3.22.2 3.3.0 3.3.1 3.4.0 3.4.1 3.4.2 3.5.0 3.5.1 3.6.0 3.6.1 3.6.2 3.7.0 3.8.0 3.9.0 4.0.0 4.1.0 4.1.1 4.10.0 4.10.1 4.11.0 4.12.0 4.13.0 4.13.1 4.13.2 4.14.0 4.14.1 4.14.2 4.14.3 4.14.4 4.14.5 4.14.6 4.2.0 4.2.1 4.3.0 4.3.1 4.3.2 4.4.0 4.5.0 4.6.1 4.7.0 4.7.1 4.8.0 4.8.1 4.9.0 trunk 1.9.0 2.0.0 2.0.1 2.0.2 2.0.3 2.0.4 2.0.5 2.0.6 2.0.7 2.1.0 2.1.1 2.1.2 2.1.3 2.1.4 2.1.5 2.1.6 2.1.7 2.1.8 2.10.0 2.10.1 2.10.2 2.10.3 2.10.4 2.11.0 2.11.1 2.11.2 2.11.3 2.12.0 2.12.1 2.12.2 2.12.3 2.13.0 2.13.1 2.13.2 2.13.3 2.13.4 2.14.0 2.15.0 2.16.0 2.16.1 2.17.0 2.17.1 2.17.3 2.18.0 2.18.1 2.19.1 2.19.2 2.19.3 2.19.4 2.19.5 2.19.6 2.19.7 2.19.8 2.2.0 2.2.1 2.2.2 2.2.3 2.2.4 2.2.5 2.2.6 2.20.0 2.20.1 2.20.2 2.21.0 2.21.1 2.21.2 2.21.3 2.21.4 2.22.0 2.22.1 2.22.2 2.22.3 2.23.0 2.23.1 2.23.2 2.24.0 2.24.1 2.24.2 2.25.0 2.25.1 2.25.2 2.25.3 2.26.0 2.27.0 2.27.1 2.27.2 2.27.3 2.28.0 2.29.0 2.29.1 2.29.2
give / src / Donations / Endpoints / ListDonations.php
give / src / Donations / Endpoints Last commit date
DonationActions.php 3 years ago Endpoint.php 4 years ago ListDonations.php 2 years ago SwitchDonationView.php 4 years ago
ListDonations.php
306 lines
1 <?php
2
3 namespace Give\Donations\Endpoints;
4
5 use Give\Donations\ListTable\DonationsListTable;
6 use Give\Donations\ValueObjects\DonationMetaKeys;
7 use Give\Donations\ValueObjects\DonationMode;
8 use Give\Framework\Database\DB;
9 use Give\Framework\ListTable\Exceptions\ColumnIdCollisionException;
10 use Give\Framework\QueryBuilder\QueryBuilder;
11 use Give\Framework\QueryBuilder\Types\Operator;
12 use WP_REST_Request;
13 use WP_REST_Response;
14
15 /**
16 * @since 3.4.0 The class is extendable
17 */
18 class ListDonations extends Endpoint
19 {
20 /**
21 * @var string
22 */
23 protected $endpoint = 'admin/donations';
24
25 /**
26 * @var WP_REST_Request
27 */
28 protected $request;
29
30 /**
31 * @var DonationsListTable
32 */
33 protected $listTable;
34
35 /**
36 * @since 3.4.0
37 * @access public
38 */
39 public function __construct(DonationsListTable $listTable)
40 {
41 $this->listTable = $listTable;
42 }
43
44 /**
45 * @inheritDoc
46 */
47 public function registerRoute()
48 {
49 register_rest_route(
50 'give-api/v2',
51 $this->endpoint,
52 [
53 [
54 'methods' => 'GET',
55 'callback' => [$this, 'handleRequest'],
56 'permission_callback' => [$this, 'permissionsCheck'],
57 ],
58 'args' => [
59 'page' => [
60 'type' => 'integer',
61 'required' => false,
62 'default' => 1,
63 'minimum' => 1
64 ],
65 'perPage' => [
66 'type' => 'integer',
67 'required' => false,
68 'default' => 30,
69 'minimum' => 1
70 ],
71 'form' => [
72 'type' => 'integer',
73 'required' => false,
74 'default' => 0
75 ],
76 'search' => [
77 'type' => 'string',
78 'required' => false,
79 'sanitize_callback' => 'sanitize_text_field',
80 ],
81 'start' => [
82 'type' => 'string',
83 'required' => false,
84 'validate_callback' => [$this, 'validateDate']
85 ],
86 'end' => [
87 'type' => 'string',
88 'required' => false,
89 'validate_callback' => [$this, 'validateDate']
90 ],
91 'donor' => [
92 'type' => 'string',
93 'required' => false,
94 'sanitize_callback' => 'sanitize_text_field',
95 ],
96 'sortColumn' => [
97 'type' => 'string',
98 'required' => false,
99 'sanitize_callback' => 'sanitize_text_field',
100 ],
101 'sortDirection' => [
102 'type' => 'string',
103 'required' => false,
104 'enum' => [
105 'asc',
106 'desc',
107 ],
108 ],
109 'locale' => [
110 'type' => 'string',
111 'required' => false,
112 'default' => get_locale(),
113 ],
114 'testMode' => [
115 'type' => 'boolean',
116 'required' => false,
117 'default' => give_is_test_mode(),
118 ],
119 'return' => [
120 'type' => 'string',
121 'required' => false,
122 'default' => 'columns',
123 'enum' => [
124 'model',
125 'columns',
126 ],
127 ],
128 ],
129 ]
130 );
131 }
132
133 /**
134 * @since 2.24.0 Change this to use the new ListTable class
135 * @since 2.20.0
136 *
137 * @param WP_REST_Request $request
138 *
139 * @return WP_REST_Response
140 * @throws ColumnIdCollisionException
141 */
142 public function handleRequest(WP_REST_Request $request): WP_REST_Response
143 {
144 $this->request = $request;
145
146 $donations = $this->getDonations();
147 $donationsCount = $this->getTotalDonationsCount();
148 $totalPages = (int)ceil($donationsCount / $this->request->get_param('perPage'));
149
150 if ('model' === $this->request->get_param('return')) {
151 $items = $donations;
152 } else {
153 $this->listTable->items($donations, $this->request->get_param('locale') ?? '');
154 $items = $this->listTable->getItems();
155 }
156
157 return new WP_REST_Response(
158 [
159 'items' => $items,
160 'totalItems' => $donationsCount,
161 'totalPages' => $totalPages,
162 ]
163 );
164 }
165
166 /**
167 * @since 2.24.0 Replace Query Builder with Donations model
168 * @since 2.21.0
169 *
170 * @return array
171 */
172 public function getDonations(): array
173 {
174 $page = $this->request->get_param('page');
175 $perPage = $this->request->get_param('perPage');
176 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
177 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
178
179 $query = give()->donations->prepareQuery();
180 list($query) = $this->getWhereConditions($query);
181
182 foreach ($sortColumns as $sortColumn) {
183 $query->orderBy($sortColumn, $sortDirection);
184 }
185
186 $query->limit($perPage)
187 ->offset(($page - 1) * $perPage);
188
189 $donations = $query->getAll();
190
191 if (!$donations) {
192 return [];
193 }
194
195 return $donations;
196 }
197
198 /**
199 * @since 2.24.0 Replace Query Builder with Donations model
200 * @since 2.21.0
201 *
202 * @return int
203 */
204 public function getTotalDonationsCount(): int
205 {
206 $query = DB::table('posts')
207 ->where('post_type', 'give_payment')
208 ->groupBy('mode');
209
210 list($query, $dependencies) = $this->getWhereConditions($query);
211
212 $query->attachMeta(
213 'give_donationmeta',
214 'ID',
215 'donation_id',
216 ...DonationMetaKeys::getColumnsForAttachMetaQueryFromArray($dependencies)
217 );
218
219 return $query->count();
220 }
221
222 /**
223 * @since 3.4.0 Make this method protected so it can be extended
224 * @since 3.2.0 Updated query to account for possible null and empty values for _give_payment_mode meta
225 * @since 2.24.0 Remove joins as it uses ModelQueryBuilder and change clauses to use attach_meta
226 * @since 2.21.0
227 *
228 * @param QueryBuilder $query
229 *
230 * @return array{0: QueryBuilder, 1: array<DonationMetaKeys>}
231 */
232 protected function getWhereConditions(QueryBuilder $query): array
233 {
234 $search = $this->request->get_param('search');
235 $start = $this->request->get_param('start');
236 $end = $this->request->get_param('end');
237 $form = $this->request->get_param('form');
238 $donor = $this->request->get_param('donor');
239 $testMode = $this->request->get_param('testMode');
240
241 $dependencies = [
242 DonationMetaKeys::MODE(),
243 ];
244
245 $hasWhereConditions = $search || $start || $end || $form || $donor;
246
247 if ($search) {
248 if (ctype_digit($search)) {
249 $query->where('id', $search);
250 } elseif (strpos($search, '@') !== false) {
251 $query
252 ->whereLike('give_donationmeta_attach_meta_email.meta_value', $search);
253 $dependencies[] = DonationMetaKeys::EMAIL();
254 } else {
255 $query
256 ->whereLike('give_donationmeta_attach_meta_firstName.meta_value', $search)
257 ->orWhereLike('give_donationmeta_attach_meta_lastName.meta_value', $search);
258 $dependencies[] = DonationMetaKeys::FIRST_NAME();
259 $dependencies[] = DonationMetaKeys::LAST_NAME();
260 }
261 }
262
263 if ($donor) {
264 if (ctype_digit($donor)) {
265 $query
266 ->where('give_donationmeta_attach_meta_donorId.meta_value', $donor);
267 $dependencies[] = DonationMetaKeys::DONOR_ID();
268 } else {
269 $query
270 ->whereLike('give_donationmeta_attach_meta_firstName.meta_value', $donor)
271 ->orWhereLike('give_donationmeta_attach_meta_lastName.meta_value', $donor);
272 $dependencies[] = DonationMetaKeys::FIRST_NAME();
273 $dependencies[] = DonationMetaKeys::LAST_NAME();
274 }
275 }
276
277 if ($form) {
278 $query
279 ->where('give_donationmeta_attach_meta_formId.meta_value', $form);
280 $dependencies[] = DonationMetaKeys::FORM_ID();
281 }
282
283 if ($start && $end) {
284 $query->whereBetween('post_date', $start, $end);
285 } elseif ($start) {
286 $query->where('post_date', $start, '>=');
287 } elseif ($end) {
288 $query->where('post_date', $end, '<=');
289 }
290
291 if ($hasWhereConditions) {
292 $query->havingRaw('HAVING COALESCE(give_donationmeta_attach_meta_mode.meta_value, %s) = %s', DonationMode::LIVE, $testMode ? DonationMode::TEST : DonationMode::LIVE);
293 } elseif ($testMode) {
294 $query->where('give_donationmeta_attach_meta_mode.meta_value', DonationMode::TEST);
295 } else {
296 $query->whereIsNull('give_donationmeta_attach_meta_mode.meta_value')
297 ->orWhere('give_donationmeta_attach_meta_mode.meta_value', DonationMode::TEST, '<>');
298 }
299
300 return [
301 $query,
302 $dependencies,
303 ];
304 }
305 }
306