first commit
This commit is contained in:
391
wp-content/plugins/updraftplus/central/modules/reporting.php
Normal file
391
wp-content/plugins/updraftplus/central/modules/reporting.php
Normal file
@@ -0,0 +1,391 @@
|
||||
<?php
|
||||
|
||||
if (!defined('UPDRAFTCENTRAL_CLIENT_DIR')) die('No access.');
|
||||
|
||||
/**
|
||||
* - A container for RPC commands (white label reporting UpdraftCentral commands). Commands map exactly onto method names (and hence this class should not implement anything else, beyond the constructor, and private methods)
|
||||
* - Return format is array('response' => (string - a code), 'data' => (mixed));
|
||||
*
|
||||
* RPC commands are not allowed to begin with an underscore. So, any private methods can be prefixed with an underscore.
|
||||
*/
|
||||
class UpdraftCentral_Reporting_Commands extends UpdraftCentral_Commands {
|
||||
|
||||
private $valid_statuses = array(
|
||||
'recurring',
|
||||
'manual',
|
||||
);
|
||||
|
||||
private $max_number_of_recipients = 100;
|
||||
|
||||
/**
|
||||
* Update existing reports.
|
||||
*
|
||||
* @param array $reports Reports data which will be saved.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function _update_existing_reports($reports) {
|
||||
update_option('updraftcentral_reporting_reports', $reports);
|
||||
}
|
||||
|
||||
/**
|
||||
* Normalize email address - lowercase and sanitize.
|
||||
*
|
||||
* @param string $email Email address to normalize.
|
||||
*
|
||||
* @return string Normalized email.
|
||||
*/
|
||||
private function _normalize_email($email) {
|
||||
return strtolower(sanitize_email($email));
|
||||
}
|
||||
|
||||
/**
|
||||
* Get existing reports.
|
||||
*
|
||||
* @return array List of all reports.
|
||||
*/
|
||||
private function _get_existing_reports() {
|
||||
return (array) get_option('updraftcentral_reporting_reports', array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Update existing sent reports.
|
||||
*
|
||||
* @param array $sent_reports Sent reports data which will be saved.
|
||||
*
|
||||
* @return void
|
||||
*/
|
||||
private function _update_existing_sent_reports($sent_reports) {
|
||||
update_option('updraftcentral_reporting_sent_reports', $sent_reports);
|
||||
}
|
||||
|
||||
/**
|
||||
* Get existing sent reports.
|
||||
*
|
||||
* @return array List of all sent reports.
|
||||
*/
|
||||
private function _get_existing_sent_reports() {
|
||||
return (array) get_option('updraftcentral_reporting_sent_reports', array());
|
||||
}
|
||||
|
||||
/**
|
||||
* Get all the reports (scheduled or not scheduled).
|
||||
*
|
||||
* @param array $data Data array containing report IDs to fetch.
|
||||
*
|
||||
* @return array An array of reports.
|
||||
*/
|
||||
public function get_reports($data) {
|
||||
$all_reports = $this->_get_existing_reports();
|
||||
|
||||
$sent_reports = array_reverse($this->_get_existing_sent_reports());
|
||||
|
||||
foreach ($sent_reports as $key => $sent_report) {
|
||||
$sent_report['download_url'] = '';
|
||||
|
||||
if (!empty($sent_report['pdf_attachment_id'])) {
|
||||
$sent_report['download_url'] = wp_get_attachment_url(absint($sent_report['pdf_attachment_id']));
|
||||
}
|
||||
|
||||
$sent_reports[$key] = $sent_report;
|
||||
}
|
||||
|
||||
if (empty($data['report_ids']) || !is_array($data['report_ids'])) {
|
||||
return $this->_response(array(
|
||||
'reports' => $all_reports,
|
||||
'sent_reports' => $sent_reports,
|
||||
));
|
||||
}
|
||||
|
||||
$report_ids = array();
|
||||
|
||||
foreach ($data['report_ids'] as $report_id) {
|
||||
$report_ids[] = sanitize_key(strval($report_id));
|
||||
}
|
||||
|
||||
return $this->_response((array(
|
||||
'reports' => array_intersect_key($all_reports, array_flip($report_ids)),
|
||||
'sent_reports' => $sent_reports,
|
||||
)));
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete a report.
|
||||
*
|
||||
* @param array $data Data array containing report ID to delete.
|
||||
*
|
||||
* @return array An array containing the result of the current process
|
||||
*/
|
||||
public function delete_report($data) {
|
||||
// Permission check.
|
||||
if (!current_user_can('manage_options')) {
|
||||
$result = array("error" => true, "message" => "not_allowed");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Return early if valid data structure is not present.
|
||||
if (!is_array($data)) {
|
||||
$result = array("error" => true, "message" => "invalid_data");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$report_id = empty($data['id']) ? '' : sanitize_key(strval($data['id']));
|
||||
|
||||
// Return early if ID not supplied.
|
||||
if (empty($report_id)) {
|
||||
$result = array('error' => true, 'message' => 'missing_id');
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Get the reports from options table.
|
||||
$reports = $this->_get_existing_reports();
|
||||
|
||||
// Check if the ID to delete is present.
|
||||
if (!isset($reports[$report_id])) {
|
||||
$result = array('error' => true, 'message' => 'invalid_id');
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
unset($reports[$report_id]);
|
||||
|
||||
$this->_update_existing_reports($reports);
|
||||
|
||||
$result = array("error" => false, "message" => "reports_updated");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a new report.
|
||||
*
|
||||
* @param array $data Report information to add
|
||||
*
|
||||
* @return array An array containing the result of the current process
|
||||
*/
|
||||
public function add_report($data) {
|
||||
// Permission check.
|
||||
if (!current_user_can('manage_options')) {
|
||||
$result = array("error" => true, "message" => "not_allowed");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Return early if valid report structure is not present.
|
||||
if (!is_array($data)) {
|
||||
$result = array("error" => true, "message" => "invalid_report_data");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$report_name = isset($data['name']) ? sanitize_text_field(strval($data['name'])) : '';
|
||||
|
||||
if ('' === $report_name) {
|
||||
$result = array("error" => true, "message" => "empty_name");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$report_status = empty($data['status']) ? '' : sanitize_text_field(strval($data['status']));
|
||||
|
||||
if (!in_array($report_status, $this->valid_statuses)) {
|
||||
$result = array("error" => true, "message" => "status_invalid");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$template_id = empty($data['template_id']) ? '' : sanitize_key($data['template_id']);
|
||||
|
||||
if (empty($template_id)) {
|
||||
$result = array("error" => true, "message" => "template_id_invalid");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$recipients = (isset($data['recipients']) && is_array($data['recipients'])) ? $data['recipients'] : array();
|
||||
|
||||
if (count($recipients) > $this->max_number_of_recipients) {
|
||||
$result = array("error" => true, "message" => "max_number_of_recipients_exceeded");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$recipients = array_unique(array_map(array($this, '_normalize_email'), $recipients));
|
||||
|
||||
// Sanity check for invalid email.
|
||||
foreach ($recipients as $email) {
|
||||
if (!is_email($email)) {
|
||||
$result = array(
|
||||
"error" => true,
|
||||
"message" => "recipients_invalid",
|
||||
"values" => array(
|
||||
'invalid_email' => $email,
|
||||
)
|
||||
);
|
||||
return $this->_response($result);
|
||||
}
|
||||
}
|
||||
|
||||
if (empty($recipients)) {
|
||||
$result = array("error" => true, "message" => "no_recipients_provided");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Get existing reports from options table.
|
||||
$existing_reports = $this->_get_existing_reports();
|
||||
|
||||
// Report.
|
||||
$report = array();
|
||||
|
||||
$report_id = empty($data['id']) ? '' : sanitize_key(strval($data['id']));
|
||||
|
||||
if (empty($report_id)) {
|
||||
// First report timestamp and formatted date.
|
||||
$next_report_timestamp = strtotime("+1 month", time());
|
||||
$next_report_formatted_date = date("j M, g:i a", $next_report_timestamp);
|
||||
|
||||
$report_id = UpdraftPlus_Manipulation_Functions::generate_random_string(10);
|
||||
|
||||
$report_id_generation_loops = 0;
|
||||
|
||||
// Sanity check to check if the report ID exists.
|
||||
while (isset($existing_reports[$report_id])) {
|
||||
$report_id = UpdraftPlus_Manipulation_Functions::generate_random_string(10);
|
||||
++$report_id_generation_loops;
|
||||
|
||||
// If we somehow exceed the max generation loops then return error - which will not happen in almost any case.
|
||||
if ($report_id_generation_loops > 10) {
|
||||
$result = array("error" => true, "message" => "report_id_generation_failed");
|
||||
return $this->_response($result);
|
||||
}
|
||||
}
|
||||
|
||||
$report = array(
|
||||
'id' => $report_id,
|
||||
'name' => $report_name,
|
||||
'status' => $report_status,
|
||||
'template_id' => $template_id,
|
||||
'recipients' => $recipients,
|
||||
'last_report_timestamp' => 0,
|
||||
'last_report_formatted_date' => __('N/A', 'updraftplus'),
|
||||
'next_report_timestamp' => $next_report_timestamp,
|
||||
'next_report_formatted_date' => $next_report_formatted_date,
|
||||
);
|
||||
} elseif (!empty($existing_reports[$report_id])) {
|
||||
$report = $existing_reports[$report_id];
|
||||
|
||||
$report['name'] = $report_name;
|
||||
$report['status'] = $report_status;
|
||||
$report['template_id'] = $template_id;
|
||||
$report['recipients'] = $recipients;
|
||||
} else {
|
||||
$result = array("error" => true, "message" => "report_does_not_exist");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Add the new report.
|
||||
$existing_reports[$report_id] = $report;
|
||||
|
||||
// Update the reports.
|
||||
$this->_update_existing_reports($existing_reports);
|
||||
|
||||
$result = array(
|
||||
"error" => false,
|
||||
"message" => "reports_updated",
|
||||
"values" => array(
|
||||
'report' => $report,
|
||||
)
|
||||
);
|
||||
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
/**
|
||||
* Add a sent report.
|
||||
*
|
||||
* @param array $data Report information to add
|
||||
*
|
||||
* @return array An array containing the result of the current process
|
||||
*/
|
||||
public function add_sent_reports($data) {
|
||||
// Permission check.
|
||||
if (!current_user_can('manage_options')) {
|
||||
$result = array("error" => true, "message" => "not_allowed");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
// Return early if valid report structure is not present.
|
||||
if (!is_array($data) || empty($data['sent_reports_data'])) {
|
||||
$result = array("error" => true, "message" => "invalid_sent_report_data");
|
||||
return $this->_response($result);
|
||||
}
|
||||
|
||||
$reports = $this->_get_existing_reports();
|
||||
$sent_reports = $this->_get_existing_sent_reports();
|
||||
|
||||
$return_data = array();
|
||||
|
||||
// Loop through all the sent reports.
|
||||
foreach ($data['sent_reports_data'] as $report_data) {
|
||||
$report_id = sanitize_key(strval($report_data['report_id']));
|
||||
|
||||
// Skip if no report of this ID exists.
|
||||
if (empty($reports[$report_id])) {
|
||||
continue;
|
||||
}
|
||||
|
||||
$report_sent_at_timestamp = time();
|
||||
$report_sent_at_formatted_date = date("j M, g:i a", $report_sent_at_timestamp);
|
||||
|
||||
// Change the last report time of the report.
|
||||
$reports[$report_id]['last_report_timestamp'] = $report_sent_at_timestamp;
|
||||
$reports[$report_id]['last_report_formatted_date'] = $report_sent_at_formatted_date;
|
||||
|
||||
// Save the PDF as attachment.
|
||||
$pdf_attachment_id = 0;
|
||||
$uploads_dir = wp_upload_dir();
|
||||
$custom_upload_directory = trailingslashit($uploads_dir['basedir']) . 'updraftcentral-white-label-reporting-pdfs/';
|
||||
$custom_upload_url = trailingslashit($uploads_dir['baseurl']) . 'updraftcentral-white-label-reporting-pdfs/';
|
||||
$filename = sanitize_text_field($reports[$report_id]['name']) . '-' . $report_sent_at_timestamp . '-' . UpdraftPlus_Manipulation_Functions::generate_random_string(5) . '.pdf';
|
||||
$full_path = $custom_upload_directory . basename($filename);
|
||||
|
||||
// Sanity check to test directory exists.
|
||||
wp_mkdir_p(dirname($full_path));
|
||||
|
||||
file_put_contents($full_path, base64_decode($report_data['pdf_content']));
|
||||
|
||||
$wp_filetype = wp_check_filetype($filename, null);
|
||||
$attachment = array(
|
||||
'guid' => $custom_upload_url . basename($filename),
|
||||
'post_mime_type' => $wp_filetype['type'],
|
||||
'post_title' => sanitize_file_name(pathinfo($filename, PATHINFO_FILENAME)),
|
||||
'post_content' => '',
|
||||
'post_status' => 'inherit',
|
||||
);
|
||||
|
||||
$pdf_attachment_id = wp_insert_attachment($attachment, $full_path);
|
||||
|
||||
require_once(ABSPATH . 'wp-admin/includes/image.php');
|
||||
|
||||
$attach_data = wp_generate_attachment_metadata($pdf_attachment_id, $full_path);
|
||||
wp_update_attachment_metadata($pdf_attachment_id, $attach_data);
|
||||
|
||||
$new_sent_report = array(
|
||||
'report' => $reports[$report_id]['name'],
|
||||
'sent' => (bool) $report_data['sent'],
|
||||
'template_id_used' => sanitize_key($report_data['template_id']),
|
||||
'template_name_used' => sanitize_text_field($report_data['template_name']),
|
||||
'services' => array_map('sanitize_text_field', $report_data['services']),
|
||||
'sent_at' => $report_sent_at_formatted_date,
|
||||
'number_of_recipients' => absint($report_data['number_of_recipients']),
|
||||
'pdf_attachment_id' => $pdf_attachment_id,
|
||||
);
|
||||
|
||||
$sent_reports[] = $new_sent_report;
|
||||
$return_data[] = $new_sent_report;
|
||||
}
|
||||
|
||||
$this->_update_existing_reports($reports);
|
||||
$this->_update_existing_sent_reports($sent_reports);
|
||||
|
||||
$result = array(
|
||||
"error" => false,
|
||||
"message" => "sent_reports_updated",
|
||||
"data" => $return_data,
|
||||
);
|
||||
|
||||
return $this->_response($result);
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user