Server IP : 192.158.238.246 / Your IP : 18.222.135.39 Web Server : LiteSpeed System : Linux uniform.iwebfusion.net 4.18.0-553.27.1.lve.1.el8.x86_64 #1 SMP Wed Nov 20 15:58:00 UTC 2024 x86_64 User : jenniferflocom ( 1321) PHP Version : 8.1.32 Disable Function : NONE MySQL : OFF | cURL : ON | WGET : ON | Perl : ON | Python : ON | Sudo : OFF | Pkexec : OFF Directory : /proc/7779/task/7779/cwd/plugins/give/src/API/Endpoints/Reports/ |
Upload File : |
<?php /** * Reports base endpoint * * @package Give */ namespace Give\API\Endpoints\Reports; use DateInterval; use DateTime; use Give\API\RestRoute; use Give_Cache; use Give_Payment; use WP_Error; use WP_REST_Request; use WP_REST_Response; abstract class Endpoint implements RestRoute { /** * @since 2.6.1 * @var WP_REST_Request */ protected $request; /** * @var DateTime */ protected $startDate; /** * @var DateTime */ protected $endDate; /** * @var DateInterval */ protected $dateDiff; /** * @var string */ protected $endpoint; /** * @var boolean */ protected $testMode; /** * @var string */ protected $currency; /** * @var array */ protected $schema; /** * @inheritDoc */ public function registerRoute() { register_rest_route( 'give-api/v2', '/reports/' . $this->endpoint, [ // Here we register the readable endpoint [ 'methods' => 'GET', 'callback' => [$this, 'handleRequest'], 'permission_callback' => [$this, 'permissionsCheck'], 'args' => [ 'start' => [ 'type' => 'string', 'required' => true, 'validate_callback' => [$this, 'validateDate'], 'sanitize_callback' => [$this, 'sanitizeDate'], ], 'end' => [ 'type' => 'string', 'required' => true, 'validate_callback' => [$this, 'validateDate'], 'sanitize_callback' => [$this, 'sanitizeDate'], ], 'currency' => [ 'type' => 'string', 'required' => true, 'validate_callback' => [$this, 'validateCurrency'], ], 'testMode' => [ 'type' => 'boolean', 'required' => true, 'sanitize_callback' => [$this, 'sanitizeTestMode'], ], ], ], // Register our schema callback. 'schema' => [$this, 'getReportSchema'], ] ); } /** * Handle rest request. * * @since 2.6.1 * * @param WP_REST_Request $request * * @return WP_REST_Response */ public function handleRequest($request) { // Check if a cached version exists $cached_report = $this->getCachedReport($request); if ($cached_report !== null) { // Bail and return the cached version return new WP_REST_Response($cached_report); } $this->setupProperties($request); $responseData = [ 'status' => $this->getGiveStatus(), 'data' => $this->getReport($request), ]; $this->cacheReport($request, $responseData); return new WP_REST_Response($responseData); } /** * Setup properties * * @since 2.6.1 * * @param WP_REST_Request $request */ private function setupProperties($request) { $this->request = $request; $this->startDate = date_create($request->get_param('start')); $this->endDate = date_create($request->get_param('end')); $this->currency = $request->get_param('currency'); $this->testMode = $request->get_param('testMode'); $this->dateDiff = date_diff($this->startDate, $this->endDate); } public function validateDate($param, $request, $key) { // Check that date is valid, and formatted YYYY-MM-DD $exploded = explode('-', $param); $valid = checkdate($exploded[1], $exploded[2], $exploded[0]); // If checking end date, check that it is after start date if ($key === 'end') { $start = date_create($request->get_param('start')); $end = date_create($request->get_param('end')); $valid = $start <= $end ? $valid : false; } return $valid; } /** * @since 2.9.0 Restrict appended time to only the end date. * @since 2.6.1 */ public function sanitizeDate($param, $request, $key) { // Return Date object from parameter $exploded = explode('-', $param); $sanitizedDate = "{$exploded[0]}-{$exploded[1]}-{$exploded[2]}"; if ('end' === $key) { /** * For the end date manually specify an end time. */ $sanitizedDate .= ' 24:00:00'; } return $sanitizedDate; } /** * Validate currency string * Check if currency code provided to REST APi is valid * * @param string $param Currency parameter provided in REST API request * @param WP_REST_Request $request REST API Request object * @param string $key REST API Request key being validated (in this case currency) * * @return bool */ public function validateCurrency($param, $request, $key) { return in_array($param, array_keys(give_get_currencies_list())); } /** * Sanitize test mode parameter * Uses filter_var to cast string to variable * * @param string $param Validated test mode parameter provided in REST API request * @param WP_REST_Request $request REST API Request object * @param string $key REST API Request key being validated (in this case test mode) */ public function sanitizeTestMode($param, $request, $key) { return filter_var($param, FILTER_VALIDATE_BOOLEAN); } /** * Check permissions * * @param WP_REST_Request $request Current request. * * @return bool|WP_Error */ public function permissionsCheck($request) { if ( ! current_user_can('read')) { return new WP_Error( 'rest_forbidden', esc_html__('You cannot view the reports resource.', 'give'), ['status' => $this->authorizationStatusCode()] ); } return true; } /** * Get report callback * * @param WP_REST_Request $request Current request. * * @return array */ public function getReport($request) { return [ 'data' => [ 'labels' => ['a', 'b', 'c'], 'data' => ['1', '4', '3'], ], ]; } /** * Get our sample schema for a report */ public function getReportSchema() { if ($this->schema) { // Since WordPress 5.3, the schema can be cached in the $schema property. return $this->schema; } $this->schema = [ // This tells the spec of JSON Schema we are using which is draft 4. '$schema' => 'http://json-schema.org/draft-04/schema#', // The title property marks the identity of the resource. 'title' => 'report', 'type' => 'object', // In JSON Schema you can specify object properties in the properties attribute. 'properties' => [ 'data' => [ 'description' => esc_html__('The data for the report.', 'give'), 'type' => 'object', ], ], ]; return $this->schema; } // Sets up the proper HTTP status code for authorization. public function authorizationStatusCode() { $status = 401; if (is_user_logged_in()) { $status = 403; } return $status; } /** * Get cached report * * @param WP_REST_Request $request Current request. * * @return mixed */ public function getCachedReport($request) { $cache_key = Give_Cache::get_key("api_get_report_{$this->endpoint}", $request->get_params()); $cached = Give_Cache::get_db_query($cache_key); if ($cached) { return $cached; } return null; } /** * Cache report * * @param WP_REST_Request $request Current request. * @param array $report * * @return bool */ public function cacheReport($request, $report) { $cache_key = Give_Cache::get_key("api_get_report_{$this->endpoint}", $request->get_params()); return Give_Cache::set_db_query($cache_key, $report); } /** * Cache report * * @param array $args Query arguments. * @param Give_Payment[] $payments Payments. * * @return bool */ private function cachePayments($args, $payments) { $cache_key = Give_Cache::get_key('api_report_payments', $args); return Give_Cache::set_db_query($cache_key, $payments); } /** * Get cached report * * @param array $args Query arguments. * * @return mixed */ private function getCachedPayments($args) { $cache_key = Give_Cache::get_key('api_report_payments', $args); $cached = Give_Cache::get_db_query($cache_key); if ($cached) { return $cached; } return null; } /** * Get payment. * * @param string $startStr * @param string $endStr * @param string $orderBy * @param int $number * * @return mixed */ public function getPayments($startStr, $endStr, $orderBy = 'date', $number = -1) { $gatewayObjects = give_get_payment_gateways(); $paymentModeKeyCompare = '!='; if ($this->testMode === false) { unset($gatewayObjects['manual']); $paymentModeKeyCompare = '='; } $gateway = array_keys($gatewayObjects); $args = [ 'post_status' => [ 'publish', 'give_subscription', ], 'number' => $number, 'paged' => 1, 'orderby' => $orderBy, 'order' => 'DESC', 'start_date' => strtotime($startStr), 'end_date' => strtotime($endStr), 'gateway' => $gateway, 'meta_query' => [ [ 'key' => '_give_payment_currency', 'value' => $this->currency, 'compare' => '=', ], [ 'key' => '_give_payment_mode', 'value' => 'live', 'compare' => $paymentModeKeyCompare, ], ], ]; // Check if a cached payments exists $cached_payments = $this->getCachedPayments($args); if ($cached_payments !== null) { // Bail and return the cached payments return $cached_payments; } $payments = new \Give_Payments_Query($args); $payments = $payments->get_payments(); // Cache the report data $this->cachePayments($args, $payments); return $payments; } public function getGiveStatus() { $donations = get_posts( [ 'post_type' => ['give_payment'], 'post_status' => 'publish', 'numberposts' => 1, ] ); if (count($donations) > 0) { return 'donations_found'; } return 'no_donations_found'; } }