PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.9.2
GiveWP – Donation Plugin and Fundraising Platform v2.9.2
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 / API / Endpoints / Reports / Endpoint.php
give / src / API / Endpoints / Reports Last commit date
AverageDonation.php 5 years ago DonationsVsIncome.php 5 years ago Endpoint.php 5 years ago FormPerformance.php 5 years ago Income.php 5 years ago IncomeBreakdown.php 5 years ago PaymentMethods.php 5 years ago PaymentStatuses.php 5 years ago RecentDonations.php 5 years ago TopDonors.php 5 years ago TotalDonors.php 5 years ago TotalIncome.php 5 years ago TotalRefunds.php 5 years ago
Endpoint.php
437 lines
1 <?php
2
3 /**
4 * Reports base endpoint
5 *
6 * @package Give
7 */
8
9 namespace Give\API\Endpoints\Reports;
10
11 use DateInterval;
12 use DateTime;
13 use Give\API\RestRoute;
14 use \Give_Cache;
15 use Give_Payment;
16 use WP_Error;
17 use WP_REST_Request;
18 use WP_REST_Response;
19
20 abstract class Endpoint implements RestRoute {
21 /**
22 * @since 2.6.1
23 * @var WP_REST_Request
24 */
25 protected $request;
26
27 /**
28 * @var DateTime
29 */
30 protected $startDate;
31
32 /**
33 * @var DateTime
34 */
35 protected $endDate;
36
37 /**
38 * @var DateInterval
39 */
40 protected $dateDiff;
41
42 /**
43 * @var string
44 */
45 protected $endpoint;
46
47 /**
48 * @var boolean
49 */
50 protected $testMode;
51
52 /**
53 * @var string
54 */
55 protected $currency;
56
57 /**
58 * @inheritDoc
59 */
60 public function registerRoute() {
61 register_rest_route(
62 'give-api/v2',
63 '/reports/' . $this->endpoint,
64 [
65 // Here we register the readable endpoint
66 [
67 'methods' => 'GET',
68 'callback' => [ $this, 'handleRequest' ],
69 'permission_callback' => [ $this, 'permissionsCheck' ],
70 'args' => [
71 'start' => [
72 'type' => 'string',
73 'required' => true,
74 'validate_callback' => [ $this, 'validateDate' ],
75 'sanitize_callback' => [ $this, 'sanitizeDate' ],
76 ],
77 'end' => [
78 'type' => 'string',
79 'required' => true,
80 'validate_callback' => [ $this, 'validateDate' ],
81 'sanitize_callback' => [ $this, 'sanitizeDate' ],
82 ],
83 'currency' => [
84 'type' => 'string',
85 'required' => true,
86 'validate_callback' => [ $this, 'validateCurrency' ],
87 ],
88 'testMode' => [
89 'type' => 'boolean',
90 'required' => true,
91 'sanitize_callback' => [ $this, 'sanitizeTestMode' ],
92 ],
93 ],
94 ],
95 // Register our schema callback.
96 'schema' => [ $this, 'getReportSchema' ],
97 ]
98 );
99 }
100
101 /**
102 * Handle rest request.
103 *
104 * @since 2.6.1
105 *
106 * @param WP_REST_Request $request
107 *
108 * @return WP_REST_Response
109 */
110 public function handleRequest( $request ) {
111 // Check if a cached version exists
112 $cached_report = $this->getCachedReport( $request );
113 if ( $cached_report !== null ) {
114 // Bail and return the cached version
115 return new WP_REST_Response( $cached_report );
116 }
117
118 $this->setupProperties( $request );
119
120 $responseData = [
121 'status' => $this->getGiveStatus(),
122 'data' => $this->getReport( $request ),
123 ];
124
125 $this->cacheReport( $request, $responseData );
126
127 return new WP_REST_Response( $responseData );
128 }
129
130 /**
131 * Setup properties
132 *
133 * @since 2.6.1
134 *
135 * @param WP_REST_Request $request
136 */
137 private function setupProperties( $request ) {
138 $this->request = $request;
139 $this->startDate = date_create( $request->get_param( 'start' ) );
140 $this->endDate = date_create( $request->get_param( 'end' ) );
141 $this->currency = $request->get_param( 'currency' );
142 $this->testMode = $request->get_param( 'testMode' );
143 $this->dateDiff = date_diff( $this->startDate, $this->endDate );
144 }
145
146 public function validateDate( $param, $request, $key ) {
147 // Check that date is valid, and formatted YYYY-MM-DD
148 $exploded = explode( '-', $param );
149 $valid = checkdate( $exploded[1], $exploded[2], $exploded[0] );
150
151 // If checking end date, check that it is after start date
152 if ( $key === 'end' ) {
153 $start = date_create( $request->get_param( 'start' ) );
154 $end = date_create( $request->get_param( 'end' ) );
155 $valid = $start <= $end ? $valid : false;
156 }
157
158 return $valid;
159 }
160
161 /**
162 * @since 2.9.0 Restrict appended time to only the end date.
163 * @since 2.6.1
164 */
165 public function sanitizeDate( $param, $request, $key ) {
166 // Return Date object from parameter
167 $exploded = explode( '-', $param );
168
169 $sanitizedDate = "{$exploded[0]}-{$exploded[1]}-{$exploded[2]}";
170
171 if ( 'end' === $key ) {
172 /**
173 * For the end date manually specify an end time.
174 */
175 $sanitizedDate .= ' 24:00:00';
176 }
177
178 return $sanitizedDate;
179 }
180
181 /**
182 * Validate currency string
183 * Check if currency code provided to REST APi is valid
184 *
185 * @param string $param Currency parameter provided in REST API request
186 * @param WP_REST_Request $request REST API Request object
187 * @param string $key REST API Request key being validated (in this case currency)
188 *
189 * @return bool
190 */
191 public function validateCurrency( $param, $request, $key ) {
192 return in_array( $param, array_keys( give_get_currencies_list() ) );
193 }
194
195 /**
196 * Sanitize test mode parameter
197 * Uses filter_var to cast string to variable
198 *
199 * @param string $param Validated test mode parameter provided in REST API request
200 * @param WP_REST_Request $request REST API Request object
201 * @param string $key REST API Request key being validated (in this case test mode)
202 */
203 public function sanitizeTestMode( $param, $request, $key ) {
204 return filter_var( $param, FILTER_VALIDATE_BOOLEAN );
205 }
206
207 /**
208 * Check permissions
209 *
210 * @param WP_REST_Request $request Current request.
211 *
212 * @return bool|WP_Error
213 */
214 public function permissionsCheck( $request ) {
215 if ( ! current_user_can( 'read' ) ) {
216 return new WP_Error(
217 'rest_forbidden',
218 esc_html__( 'You cannot view the reports resource.', 'give' ),
219 [ 'status' => $this->authorizationStatusCode() ]
220 );
221 }
222
223 return true;
224 }
225
226 /**
227 * Get report callback
228 *
229 * @param WP_REST_Request $request Current request.
230 *
231 * @return array
232 */
233 public function getReport( $request ) {
234 return [
235 'data' => [
236 'labels' => [ 'a', 'b', 'c' ],
237 'data' => [ '1', '4', '3' ],
238 ],
239 ];
240 }
241
242 /**
243 * Get our sample schema for a report
244 */
245 public function getReportSchema() {
246
247 if ( $this->schema ) {
248 // Since WordPress 5.3, the schema can be cached in the $schema property.
249 return $this->schema;
250 }
251
252 $this->schema = [
253 // This tells the spec of JSON Schema we are using which is draft 4.
254 '$schema' => 'http://json-schema.org/draft-04/schema#',
255 // The title property marks the identity of the resource.
256 'title' => 'report',
257 'type' => 'object',
258 // In JSON Schema you can specify object properties in the properties attribute.
259 'properties' => [
260 'data' => [
261 'description' => esc_html__( 'The data for the report.', 'give' ),
262 'type' => 'object',
263 ],
264 ],
265 ];
266
267 return $this->schema;
268 }
269
270 // Sets up the proper HTTP status code for authorization.
271 public function authorizationStatusCode() {
272
273 $status = 401;
274 if ( is_user_logged_in() ) {
275 $status = 403;
276 }
277
278 return $status;
279
280 }
281
282 /**
283 * Get cached report
284 *
285 * @param WP_REST_Request $request Current request.
286 *
287 * @return mixed
288 */
289 public function getCachedReport( $request ) {
290 $cache_key = Give_Cache::get_key( "api_get_report_{$this->endpoint}", $request->get_params() );
291
292 $cached = Give_Cache::get_db_query( $cache_key );
293
294 if ( $cached ) {
295 return $cached;
296 }
297
298 return null;
299
300 }
301
302 /**
303 * Cache report
304 *
305 * @param WP_REST_Request $request Current request.
306 * @param array $report
307 *
308 * @return bool
309 */
310 public function cacheReport( $request, $report ) {
311 $cache_key = Give_Cache::get_key( "api_get_report_{$this->endpoint}", $request->get_params() );
312
313 return Give_Cache::set_db_query( $cache_key, $report );
314
315 }
316
317 /**
318 * Cache report
319 *
320 * @param array $args Query arguments.
321 * @param Give_Payment[] $payments Payments.
322 *
323 * @return bool
324 */
325 private function cachePayments( $args, $payments ) {
326 $cache_key = Give_Cache::get_key( 'api_report_payments', $args );
327
328 return Give_Cache::set_db_query( $cache_key, $payments );
329
330 }
331
332 /**
333 * Get cached report
334 *
335 * @param array $args Query arguments.
336 *
337 * @return mixed
338 */
339 private function getCachedPayments( $args ) {
340
341 $cache_key = Give_Cache::get_key( 'api_report_payments', $args );
342
343 $cached = Give_Cache::get_db_query( $cache_key );
344
345 if ( $cached ) {
346 return $cached;
347 }
348
349 return null;
350
351 }
352
353
354 /**
355 * Get payment.
356 *
357 * @param string $startStr
358 * @param string $endStr
359 * @param string $orderBy
360 * @param int $number
361 *
362 * @return mixed
363 */
364 public function getPayments( $startStr, $endStr, $orderBy = 'date', $number = - 1 ) {
365
366 $gatewayObjects = give_get_payment_gateways();
367 $paymentModeKeyCompare = '!=';
368
369 if ( $this->testMode === false ) {
370 unset( $gatewayObjects['manual'] );
371 $paymentModeKeyCompare = '=';
372 }
373
374 $gateway = array_keys( $gatewayObjects );
375
376 $args = [
377 'post_status' => [
378 'publish',
379 'give_subscription',
380 ],
381 'number' => $number,
382 'paged' => 1,
383 'orderby' => $orderBy,
384 'order' => 'DESC',
385 'start_date' => strtotime( $startStr ),
386 'end_date' => strtotime( $endStr ),
387 'gateway' => $gateway,
388 'meta_query' => [
389 [
390 'key' => '_give_payment_currency',
391 'value' => $this->currency,
392 'compare' => '=',
393 ],
394 [
395 'key' => '_give_payment_mode',
396 'value' => 'live',
397 'compare' => $paymentModeKeyCompare,
398 ],
399 ],
400 ];
401
402 // Check if a cached payments exists
403 $cached_payments = $this->getCachedPayments( $args );
404
405 if ( $cached_payments !== null ) {
406 // Bail and return the cached payments
407 return $cached_payments;
408 }
409
410 $payments = new \Give_Payments_Query( $args );
411 $payments = $payments->get_payments();
412
413 // Cache the report data
414 $this->cachePayments( $args, $payments );
415
416 return $payments;
417
418 }
419
420 public function getGiveStatus() {
421
422 $donations = get_posts(
423 [
424 'post_type' => [ 'give_payment' ],
425 'post_status' => 'publish',
426 'numberposts' => 1,
427 ]
428 );
429
430 if ( count( $donations ) > 0 ) {
431 return 'donations_found';
432 }
433
434 return 'no_donations_found';
435 }
436 }
437