PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / trunk
GiveWP – Donation Plugin and Fundraising Platform vtrunk
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 / Donors / Endpoints / ListDonors.php
give / src / Donors / Endpoints Last commit date
DeleteDonor.php 5 months ago Endpoint.php 5 months ago ListDonors.php 8 months ago ListDonorsStats.php 8 months ago SwitchDonorView.php 4 years ago
ListDonors.php
246 lines
1 <?php
2
3 namespace Give\Donors\Endpoints;
4
5 use Give\Donations\ValueObjects\DonationMetaKeys;
6 use Give\Donors\ListTable\DonorsListTable;
7 use Give\Framework\Database\DB;
8 use Give\Framework\QueryBuilder\QueryBuilder;
9 use WP_REST_Request;
10 use WP_REST_Response;
11
12 class ListDonors extends Endpoint
13 {
14 /**
15 * @var string
16 */
17 protected $endpoint = 'admin/donors';
18
19 /**
20 * @var WP_REST_Request
21 */
22 protected $request;
23
24 /**
25 * @var DonorsListTable
26 */
27 protected $listTable;
28
29 /**
30 * @inheritDoc
31 *
32 * @since 4.12.0 Add format parameter to start and end dates, replacing custom validation callback
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 'donations' => [
59 'type' => 'integer',
60 'required' => false,
61 'default' => 0
62 ],
63 'search' => [
64 'type' => 'string',
65 'required' => false
66 ],
67 'start' => [
68 'type' => 'string',
69 'required' => false,
70 'format' => 'date-time'
71 ],
72 'campaignId' => [
73 'type' => 'integer',
74 'required' => false,
75 'default' => 0
76 ],
77 'end' => [
78 'type' => 'string',
79 'required' => false,
80 'format' => 'date-time'
81 ],
82 'sortColumn' => [
83 'type' => 'string',
84 'required' => false,
85 'sanitize_callback' => 'sanitize_text_field',
86 ],
87 'sortDirection' => [
88 'type' => 'string',
89 'required' => false,
90 'enum' => [
91 'asc',
92 'desc'
93 ],
94 ],
95 'locale' => [
96 'type' => 'string',
97 'required' => false,
98 'default' => get_locale(),
99 ],
100 'return' => [
101 'type' => 'string',
102 'required' => false,
103 'default' => 'columns',
104 'enum' => [
105 'model',
106 'columns'
107 ],
108 ],
109 ],
110 ]
111 );
112 }
113
114 /**
115 * @since 2.24.0 Change this to use the new ListTable class
116 * @since 2.20.0
117 *
118 * @param WP_REST_Request $request
119 *
120 * @return WP_REST_Response
121 */
122 public function handleRequest(WP_REST_Request $request): WP_REST_Response
123 {
124 $this->request = $request;
125 $this->listTable = give(DonorsListTable::class);
126
127 $donors = $this->getDonors();
128 $donorsCount = $this->getTotalDonorsCount();
129 $pageCount = (int)ceil($donorsCount / $request->get_param('perPage'));
130
131 if ('model' === $this->request->get_param('return')) {
132 $items = $donors;
133 } else {
134 $this->listTable->items($donors, $this->request->get_param('locale') ?? '');
135 $items = $this->listTable->getItems();
136 }
137
138 return new WP_REST_Response(
139 [
140 'items' => $items,
141 'totalItems' => $donorsCount,
142 'totalPages' => $pageCount
143 ]
144 );
145 }
146
147 /**
148 * @since 2.24.0 Replace Query Builder with Donors model
149 * @since 2.21.0
150 *
151 * @return array
152 */
153 public function getDonors(): array
154 {
155 $page = $this->request->get_param('page');
156 $perPage = $this->request->get_param('perPage');
157 $sortColumns = $this->listTable->getSortColumnById($this->request->get_param('sortColumn') ?: 'id');
158 $sortDirection = $this->request->get_param('sortDirection') ?: 'desc';
159
160 $query = give()->donors->prepareQuery();
161 $query = $this->getWhereConditions($query);
162
163 foreach ($sortColumns as $sortColumn) {
164 $query->orderBy($sortColumn, $sortDirection);
165 }
166
167 $query->limit($perPage)
168 ->offset(($page - 1) * $perPage);
169
170 $donors = $query->getAll();
171
172 if (!$donors) {
173 return [];
174 }
175
176 return $donors;
177 }
178
179 /**
180 * @since 2.24.0 Replace Query Builder with Donors model
181 * @since 2.21.0
182 *
183 * @return int
184 */
185 public function getTotalDonorsCount(): int
186 {
187 $query = DB::table('give_donors');
188 $query = $this->getWhereConditions($query);
189
190 return $query->count();
191 }
192
193 /**
194 * @since 2.24.0 Replace Query Builder with Donors model
195 * @since 2.21.0
196 *
197 * @param QueryBuilder $query
198 *
199 * @return QueryBuilder
200 */
201 private function getWhereConditions(QueryBuilder $query): QueryBuilder
202 {
203 $search = $this->request->get_param('search');
204 $start = $this->request->get_param('start');
205 $end = $this->request->get_param('end');
206 $campaignId = $this->request->get_param('campaignId');
207
208 if ($search) {
209 if (ctype_digit($search)) {
210 $query->where('id', $search);
211 } else {
212 $query->whereLike('name', $search);
213 $query->orWhereLike('email', $search);
214 }
215 }
216
217 if ($start && $end) {
218 $query->whereBetween('date_created', $start, $end);
219 } elseif ($start) {
220 $query->where('date_created', $start, '>=');
221 } elseif ($end) {
222 $query->where('date_created', $end, '<=');
223 }
224
225 if ($campaignId) {
226 $query
227 ->whereIn('id', static function (QueryBuilder $builder) use ($campaignId) {
228 $builder
229 ->from('give_donationmeta')
230 ->distinct()
231 ->select('meta_value')
232 ->where('meta_key', '_give_payment_donor_id')
233 ->whereIn('donation_id', static function (QueryBuilder $builder) use ($campaignId) {
234 $builder
235 ->from('give_donationmeta')
236 ->select('donation_id')
237 ->where('meta_key', DonationMetaKeys::CAMPAIGN_ID)
238 ->where('meta_value', $campaignId);
239 });
240 });
241 }
242
243 return $query;
244 }
245 }
246