PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 3.2.0
GiveWP – Donation Plugin and Fundraising Platform v3.2.0
4.16.3 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
294 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 class ListDonations extends Endpoint
16 {
17 /**
18 * @var string
19 */
20 protected $endpoint = 'admin/donations';
21
22 /**
23 * @var WP_REST_Request
24 */
25 protected $request;
26
27 /**
28 * @var DonationsListTable
29 */
30 protected $listTable;
31
32 /**
33 * @inheritDoc
34 */
35 public function registerRoute()
36 {
37 register_rest_route(
38 'give-api/v2',
39 $this->endpoint,
40 [
41 [
42 'methods' => 'GET',
43 'callback' => [$this, 'handleRequest'],
44 'permission_callback' => [$this, 'permissionsCheck'],
45 ],
46 'args' => [
47 'page' => [
48 'type' => 'integer',
49 'required' => false,
50 'default' => 1,
51 'minimum' => 1
52 ],
53 'perPage' => [
54 'type' => 'integer',
55 'required' => false,
56 'default' => 30,
57 'minimum' => 1
58 ],
59 'form' => [
60 'type' => 'integer',
61 'required' => false,
62 'default' => 0
63 ],
64 'search' => [
65 'type' => 'string',
66 'required' => false,
67 'sanitize_callback' => 'sanitize_text_field',
68 ],
69 'start' => [
70 'type' => 'string',
71 'required' => false,
72 'validate_callback' => [$this, 'validateDate']
73 ],
74 'end' => [
75 'type' => 'string',
76 'required' => false,
77 'validate_callback' => [$this, 'validateDate']
78 ],
79 'donor' => [
80 'type' => 'string',
81 'required' => false,
82 'sanitize_callback' => 'sanitize_text_field',
83 ],
84 'sortColumn' => [
85 'type' => 'string',
86 'required' => false,
87 'sanitize_callback' => 'sanitize_text_field',
88 ],
89 'sortDirection' => [
90 'type' => 'string',
91 'required' => false,
92 'enum' => [
93 'asc',
94 'desc',
95 ],
96 ],
97 'locale' => [
98 'type' => 'string',
99 'required' => false,
100 'default' => get_locale(),
101 ],
102 'testMode' => [
103 'type' => 'boolean',
104 'required' => false,
105 'default' => give_is_test_mode(),
106 ],
107 'return' => [
108 'type' => 'string',
109 'required' => false,
110 'default' => 'columns',
111 'enum' => [
112 'model',
113 'columns',
114 ],
115 ],
116 ],
117 ]
118 );
119 }
120
121 /**
122 * @since 2.24.0 Change this to use the new ListTable class
123 * @since 2.20.0
124 *
125 * @param WP_REST_Request $request
126 *
127 * @return WP_REST_Response
128 * @throws ColumnIdCollisionException
129 */
130 public function handleRequest(WP_REST_Request $request): WP_REST_Response
131 {
132 $this->request = $request;
133 $this->listTable = give(DonationsListTable::class);
134
135 $donations = $this->getDonations();
136 $donationsCount = $this->getTotalDonationsCount();
137 $totalPages = (int)ceil($donationsCount / $this->request->get_param('perPage'));
138
139 if ('model' === $this->request->get_param('return')) {
140 $items = $donations;
141 } else {
142 $this->listTable->items($donations, $this->request->get_param('locale') ?? '');
143 $items = $this->listTable->getItems();
144 }
145
146 return new WP_REST_Response(
147 [
148 'items' => $items,
149 'totalItems' => $donationsCount,
150 'totalPages' => $totalPages,
151 ]
152 );
153 }
154
155 /**
156 * @since 2.24.0 Replace Query Builder with Donations model
157 * @since 2.21.0
158 *
159 * @return array
160 */
161 public function getDonations(): array
162 {
163 $page = $this->request->get_param('page');
164 $perPage = $this->request->get_param('perPage');
165 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
166 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
167
168 $query = give()->donations->prepareQuery();
169 list($query) = $this->getWhereConditions($query);
170
171 foreach ($sortColumns as $sortColumn) {
172 $query->orderBy($sortColumn, $sortDirection);
173 }
174
175 $query->limit($perPage)
176 ->offset(($page - 1) * $perPage);
177
178 $donations = $query->getAll();
179
180 if (!$donations) {
181 return [];
182 }
183
184 return $donations;
185 }
186
187 /**
188 * @since 2.24.0 Replace Query Builder with Donations model
189 * @since 2.21.0
190 *
191 * @return int
192 */
193 public function getTotalDonationsCount(): int
194 {
195 $query = DB::table('posts')
196 ->where('post_type', 'give_payment')
197 ->groupBy('mode');
198
199 list($query, $dependencies) = $this->getWhereConditions($query);
200
201 $query->attachMeta(
202 'give_donationmeta',
203 'ID',
204 'donation_id',
205 ...DonationMetaKeys::getColumnsForAttachMetaQueryFromArray($dependencies)
206 );
207
208 return $query->count();
209 }
210
211 /**
212 * @since 3.2.0 Updated query to account for possible null and empty values for _give_payment_mode meta
213 * @since 2.24.0 Remove joins as it uses ModelQueryBuilder and change clauses to use attach_meta
214 * @since 2.21.0
215 *
216 * @param QueryBuilder $query
217 *
218 * @return array{0: QueryBuilder, 1: array<DonationMetaKeys>}
219 */
220 private function getWhereConditions(QueryBuilder $query): array
221 {
222 $search = $this->request->get_param('search');
223 $start = $this->request->get_param('start');
224 $end = $this->request->get_param('end');
225 $form = $this->request->get_param('form');
226 $donor = $this->request->get_param('donor');
227 $testMode = $this->request->get_param('testMode');
228
229 $dependencies = [
230 DonationMetaKeys::MODE(),
231 ];
232
233 $hasWhereConditions = $search || $start || $end || $form || $donor;
234
235 if ($search) {
236 if (ctype_digit($search)) {
237 $query->where('id', $search);
238 } elseif (strpos($search, '@') !== false) {
239 $query
240 ->whereLike('give_donationmeta_attach_meta_email.meta_value', $search);
241 $dependencies[] = DonationMetaKeys::EMAIL();
242 } else {
243 $query
244 ->whereLike('give_donationmeta_attach_meta_firstName.meta_value', $search)
245 ->orWhereLike('give_donationmeta_attach_meta_lastName.meta_value', $search);
246 $dependencies[] = DonationMetaKeys::FIRST_NAME();
247 $dependencies[] = DonationMetaKeys::LAST_NAME();
248 }
249 }
250
251 if ($donor) {
252 if (ctype_digit($donor)) {
253 $query
254 ->where('give_donationmeta_attach_meta_donorId.meta_value', $donor);
255 $dependencies[] = DonationMetaKeys::DONOR_ID();
256 } else {
257 $query
258 ->whereLike('give_donationmeta_attach_meta_firstName.meta_value', $donor)
259 ->orWhereLike('give_donationmeta_attach_meta_lastName.meta_value', $donor);
260 $dependencies[] = DonationMetaKeys::FIRST_NAME();
261 $dependencies[] = DonationMetaKeys::LAST_NAME();
262 }
263 }
264
265 if ($form) {
266 $query
267 ->where('give_donationmeta_attach_meta_formId.meta_value', $form);
268 $dependencies[] = DonationMetaKeys::FORM_ID();
269 }
270
271 if ($start && $end) {
272 $query->whereBetween('post_date', $start, $end);
273 } elseif ($start) {
274 $query->where('post_date', $start, '>=');
275 } elseif ($end) {
276 $query->where('post_date', $end, '<=');
277 }
278
279 if ($hasWhereConditions) {
280 $query->havingRaw('HAVING COALESCE(give_donationmeta_attach_meta_mode.meta_value, %s) = %s', DonationMode::LIVE, $testMode ? DonationMode::TEST : DonationMode::LIVE);
281 } elseif ($testMode) {
282 $query->where('give_donationmeta_attach_meta_mode.meta_value', DonationMode::TEST);
283 } else {
284 $query->whereIsNull('give_donationmeta_attach_meta_mode.meta_value')
285 ->orWhere('give_donationmeta_attach_meta_mode.meta_value', DonationMode::TEST, '<>');
286 }
287
288 return [
289 $query,
290 $dependencies,
291 ];
292 }
293 }
294