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