PluginProbe ʕ •ᴥ•ʔ
GiveWP – Donation Plugin and Fundraising Platform / 2.7.5
GiveWP – Donation Plugin and Fundraising Platform v2.7.5
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
424 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 public function sanitizeDate( $param, $request, $key ) {
162 // Return Date object from parameter
163 $exploded = explode( '-', $param );
164
165 return "{$exploded[0]}-{$exploded[1]}-{$exploded[2]} 24:00:00";
166 }
167
168 /**
169 * Validate currency string
170 * Check if currency code provided to REST APi is valid
171 *
172 * @param string $param Currency parameter provided in REST API request
173 * @param WP_REST_Request $request REST API Request object
174 * @param string $key REST API Request key being validated (in this case currency)
175 *
176 * @return bool
177 */
178 public function validateCurrency( $param, $request, $key ) {
179 return in_array( $param, array_keys( give_get_currencies_list() ) );
180 }
181
182 /**
183 * Sanitize test mode parameter
184 * Uses filter_var to cast string to variable
185 *
186 * @param string $param Validated test mode parameter provided in REST API request
187 * @param WP_REST_Request $request REST API Request object
188 * @param string $key REST API Request key being validated (in this case test mode)
189 */
190 public function sanitizeTestMode( $param, $request, $key ) {
191 return filter_var( $param, FILTER_VALIDATE_BOOLEAN );
192 }
193
194 /**
195 * Check permissions
196 *
197 * @param WP_REST_Request $request Current request.
198 *
199 * @return bool|WP_Error
200 */
201 public function permissionsCheck( $request ) {
202 if ( ! current_user_can( 'read' ) ) {
203 return new WP_Error(
204 'rest_forbidden',
205 esc_html__( 'You cannot view the reports resource.', 'give' ),
206 [ 'status' => $this->authorizationStatusCode() ]
207 );
208 }
209
210 return true;
211 }
212
213 /**
214 * Get report callback
215 *
216 * @param WP_REST_Request $request Current request.
217 *
218 * @return array
219 */
220 public function getReport( $request ) {
221 return [
222 'data' => [
223 'labels' => [ 'a', 'b', 'c' ],
224 'data' => [ '1', '4', '3' ],
225 ],
226 ];
227 }
228
229 /**
230 * Get our sample schema for a report
231 */
232 public function getReportSchema() {
233
234 if ( $this->schema ) {
235 // Since WordPress 5.3, the schema can be cached in the $schema property.
236 return $this->schema;
237 }
238
239 $this->schema = [
240 // This tells the spec of JSON Schema we are using which is draft 4.
241 '$schema' => 'http://json-schema.org/draft-04/schema#',
242 // The title property marks the identity of the resource.
243 'title' => 'report',
244 'type' => 'object',
245 // In JSON Schema you can specify object properties in the properties attribute.
246 'properties' => [
247 'data' => [
248 'description' => esc_html__( 'The data for the report.', 'give' ),
249 'type' => 'object',
250 ],
251 ],
252 ];
253
254 return $this->schema;
255 }
256
257 // Sets up the proper HTTP status code for authorization.
258 public function authorizationStatusCode() {
259
260 $status = 401;
261 if ( is_user_logged_in() ) {
262 $status = 403;
263 }
264
265 return $status;
266
267 }
268
269 /**
270 * Get cached report
271 *
272 * @param WP_REST_Request $request Current request.
273 *
274 * @return mixed
275 */
276 public function getCachedReport( $request ) {
277 $cache_key = Give_Cache::get_key( "api_get_report_{$this->endpoint}", $request->get_params() );
278
279 $cached = Give_Cache::get_db_query( $cache_key );
280
281 if ( $cached ) {
282 return $cached;
283 }
284
285 return null;
286
287 }
288
289 /**
290 * Cache report
291 *
292 * @param WP_REST_Request $request Current request.
293 * @param array $report
294 *
295 * @return bool
296 */
297 public function cacheReport( $request, $report ) {
298 $cache_key = Give_Cache::get_key( "api_get_report_{$this->endpoint}", $request->get_params() );
299
300 return Give_Cache::set_db_query( $cache_key, $report );
301
302 }
303
304 /**
305 * Cache report
306 *
307 * @param array $args Query arguments.
308 * @param Give_Payment[] $payments Payments.
309 *
310 * @return bool
311 */
312 private function cachePayments( $args, $payments ) {
313 $cache_key = Give_Cache::get_key( 'api_report_payments', $args );
314
315 return Give_Cache::set_db_query( $cache_key, $payments );
316
317 }
318
319 /**
320 * Get cached report
321 *
322 * @param array $args Query arguments.
323 *
324 * @return mixed
325 */
326 private function getCachedPayments( $args ) {
327
328 $cache_key = Give_Cache::get_key( 'api_report_payments', $args );
329
330 $cached = Give_Cache::get_db_query( $cache_key );
331
332 if ( $cached ) {
333 return $cached;
334 }
335
336 return null;
337
338 }
339
340
341 /**
342 * Get payment.
343 *
344 * @param string $startStr
345 * @param string $endStr
346 * @param string $orderBy
347 * @param int $number
348 *
349 * @return mixed
350 */
351 public function getPayments( $startStr, $endStr, $orderBy = 'date', $number = - 1 ) {
352
353 $gatewayObjects = give_get_payment_gateways();
354 $paymentModeKeyCompare = '!=';
355
356 if ( $this->testMode === false ) {
357 unset( $gatewayObjects['manual'] );
358 $paymentModeKeyCompare = '=';
359 }
360
361 $gateway = array_keys( $gatewayObjects );
362
363 $args = [
364 'post_status' => [
365 'publish',
366 'give_subscription',
367 ],
368 'number' => $number,
369 'paged' => 1,
370 'orderby' => $orderBy,
371 'order' => 'DESC',
372 'start_date' => strtotime( $startStr ),
373 'end_date' => strtotime( $endStr ),
374 'gateway' => $gateway,
375 'meta_query' => [
376 [
377 'key' => '_give_payment_currency',
378 'value' => $this->currency,
379 'compare' => '=',
380 ],
381 [
382 'key' => '_give_payment_mode',
383 'value' => 'live',
384 'compare' => $paymentModeKeyCompare,
385 ],
386 ],
387 ];
388
389 // Check if a cached payments exists
390 $cached_payments = $this->getCachedPayments( $args );
391
392 if ( $cached_payments !== null ) {
393 // Bail and return the cached payments
394 return $cached_payments;
395 }
396
397 $payments = new \Give_Payments_Query( $args );
398 $payments = $payments->get_payments();
399
400 // Cache the report data
401 $this->cachePayments( $args, $payments );
402
403 return $payments;
404
405 }
406
407 public function getGiveStatus() {
408
409 $donations = get_posts(
410 [
411 'post_type' => [ 'give_payment' ],
412 'post_status' => 'publish',
413 'numberposts' => 1,
414 ]
415 );
416
417 if ( count( $donations ) > 0 ) {
418 return 'donations_found';
419 }
420
421 return 'no_donations_found';
422 }
423 }
424