added additional plugins

This commit is contained in:
Rodolfo Martinez 2025-12-12 19:05:48 -05:00
parent c85895d306
commit 00e60ec1b7
132 changed files with 27514 additions and 0 deletions

View file

@ -0,0 +1,481 @@
<?php
/**
* Admin-specific functionality.
*
* @package WPFMJ
* @subpackage WPFMJ/admin
*/
class WPFMJ_Admin {
/**
* The ID of this plugin.
*/
private $plugin_name;
/**
* The version of this plugin.
*/
private $version;
/**
* Initialize the class.
*/
public function __construct($plugin_name, $version) {
$this->plugin_name = $plugin_name;
$this->version = $version;
}
/**
* Register the stylesheets for the admin area.
*/
public function enqueue_styles() {
$screen = get_current_screen();
if ($screen && strpos($screen->id, 'wpfmj') !== false) {
wp_enqueue_style(
$this->plugin_name,
WPFMJ_PLUGIN_URL . 'admin/css/wpfmj-admin.css',
array(),
$this->version,
'all'
);
}
}
/**
* Register the JavaScript for the admin area.
*/
public function enqueue_scripts() {
$screen = get_current_screen();
if ($screen && strpos($screen->id, 'wpfmj') !== false) {
// Enqueue WordPress components
$asset_file = include(WPFMJ_PLUGIN_DIR . 'admin/js/wpfmj-wizard.asset.php');
if (!$asset_file) {
$asset_file = array(
'dependencies' => array(
'wp-element',
'wp-components',
'wp-i18n',
'wp-api-fetch',
),
'version' => $this->version
);
}
wp_enqueue_script(
$this->plugin_name,
WPFMJ_PLUGIN_URL . 'admin/js/wpfmj-wizard.js',
$asset_file['dependencies'],
$asset_file['version'],
true
);
wp_localize_script(
$this->plugin_name,
'wpfmjData',
array(
'restUrl' => rest_url(),
'nonce' => wp_create_nonce('wp_rest'),
'ajaxUrl' => admin_url('admin-ajax.php'),
'ajaxNonce' => wp_create_nonce('wpfmj_ajax'),
'editId' => isset($_GET['edit']) ? intval($_GET['edit']) : 0,
)
);
}
}
/**
* AJAX: Get all WPForms.
*/
public function ajax_get_forms() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$forms = wpforms()->form->get('', array('orderby' => 'title'));
$formatted_forms = array();
foreach ($forms as $form) {
$formatted_forms[] = array(
'id' => $form->ID,
'title' => $form->post_title,
);
}
wp_send_json_success($formatted_forms);
}
/**
* AJAX: Get form fields.
*/
public function ajax_get_form_fields() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$form_id = isset($_POST['form_id']) ? intval($_POST['form_id']) : 0;
if (!$form_id) {
wp_send_json_error('Invalid form ID');
}
$form = wpforms()->form->get($form_id);
if (!$form) {
wp_send_json_error('Form not found');
}
$form_data = wpforms_decode($form->post_content);
// Validate form_data structure
if (!is_array($form_data) || !isset($form_data['fields']) || !is_array($form_data['fields'])) {
wp_send_json_error('Invalid form data structure');
}
$fields = array();
foreach ($form_data['fields'] as $field) {
// Validate field structure
if (!is_array($field) || !isset($field['type']) || !isset($field['label'])) {
continue; // Skip invalid fields
}
$field_type = sanitize_text_field($field['type']);
$field_id = isset($field['id']) ? sanitize_text_field($field['id']) : '';
$field_label = sanitize_text_field($field['label']);
// Get choices for fields that have them
$choices = array();
if (in_array($field_type, array('checkbox', 'radio', 'select', 'payment-checkbox', 'payment-multiple', 'payment-select'))) {
if (isset($field['choices']) && is_array($field['choices'])) {
foreach ($field['choices'] as $choice) {
if (is_array($choice) && isset($choice['label'])) {
$choices[] = array(
'label' => sanitize_text_field($choice['label']),
'value' => isset($choice['value']) ? sanitize_text_field($choice['value']) : sanitize_text_field($choice['label']),
);
}
}
}
}
$fields[] = array(
'id' => $field_id,
'label' => $field_label,
'type' => $field_type,
'choices' => $choices,
);
}
wp_send_json_success($fields);
}
/**
* AJAX: Test Mailjet connection.
*/
public function ajax_test_mailjet() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$api_key = isset($_POST['api_key']) ? sanitize_text_field($_POST['api_key']) : '';
$api_secret = isset($_POST['api_secret']) ? sanitize_text_field($_POST['api_secret']) : '';
if (empty($api_key) || empty($api_secret)) {
wp_send_json_error('API credentials required');
}
$api = new WPFMJ_Mailjet_API($api_key, $api_secret);
$result = $api->test_connection();
if ($result) {
wp_send_json_success('Connection successful');
} else {
wp_send_json_error('Connection failed. Please check your credentials.');
}
}
/**
* AJAX: Get Mailjet lists.
*/
public function ajax_get_mailjet_lists() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$api_key = isset($_POST['api_key']) ? sanitize_text_field($_POST['api_key']) : '';
$api_secret = isset($_POST['api_secret']) ? sanitize_text_field($_POST['api_secret']) : '';
if (empty($api_key) || empty($api_secret)) {
wp_send_json_error('API credentials required');
}
$api = new WPFMJ_Mailjet_API($api_key, $api_secret);
$lists = $api->get_lists();
if (is_wp_error($lists)) {
wp_send_json_error($lists->get_error_message());
}
$formatted_lists = array();
foreach ($lists as $list) {
$formatted_lists[] = array(
'id' => $list['ID'],
'name' => $list['Name'],
);
}
wp_send_json_success($formatted_lists);
}
/**
* AJAX: Save automation.
*/
public function ajax_save_automation() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$data = isset($_POST['data']) ? $_POST['data'] : array();
$edit_id = isset($_POST['edit_id']) ? intval($_POST['edit_id']) : 0;
// Validate required fields
$required = array('title', 'form_id', 'field_mapping', 'trigger_field_id', 'api_key', 'api_secret', 'list_mappings', 'activate');
foreach ($required as $field) {
if (!isset($data[$field]) || (is_string($data[$field]) && empty($data[$field]))) {
wp_send_json_error("Missing required field: {$field}");
}
}
// Sanitize and validate field_mapping
if (!is_array($data['field_mapping']) || !isset($data['field_mapping']['email'])) {
wp_send_json_error('Invalid field mapping structure');
}
$field_mapping = array(
'email' => sanitize_text_field($data['field_mapping']['email']),
'firstname' => isset($data['field_mapping']['firstname']) ? sanitize_text_field($data['field_mapping']['firstname']) : '',
'lastname' => isset($data['field_mapping']['lastname']) ? sanitize_text_field($data['field_mapping']['lastname']) : '',
);
// Sanitize and validate list_mappings
if (!is_array($data['list_mappings'])) {
wp_send_json_error('Invalid list mappings structure');
}
$list_mappings = array();
foreach ($data['list_mappings'] as $key => $value) {
$list_mappings[sanitize_text_field($key)] = sanitize_text_field($value);
}
// Sanitize API credentials
$api_key = sanitize_text_field($data['api_key']);
$api_secret = sanitize_text_field($data['api_secret']);
// Encrypt API credentials
$encrypted_key = WPFMJ_Encryption::encrypt($api_key);
$encrypted_secret = WPFMJ_Encryption::encrypt($api_secret);
if (empty($encrypted_key) || empty($encrypted_secret)) {
wp_send_json_error('Failed to encrypt API credentials');
}
// Prepare config
$config = array(
'form_id' => intval($data['form_id']),
'field_mapping' => $field_mapping,
'trigger_field_id' => sanitize_text_field($data['trigger_field_id']),
'api_key' => $encrypted_key,
'api_secret' => $encrypted_secret,
'list_mappings' => $list_mappings,
);
// Create or update post
$post_data = array(
'post_title' => sanitize_text_field($data['title']),
'post_type' => 'wpfmj_automation',
'post_status' => $data['activate'] ? 'publish' : 'draft',
);
if ($edit_id) {
$post_data['ID'] = $edit_id;
$post_id = wp_update_post($post_data);
} else {
$post_id = wp_insert_post($post_data);
}
if (is_wp_error($post_id)) {
wp_send_json_error($post_id->get_error_message());
}
// Save config
update_post_meta($post_id, '_wpfmj_config', $config);
update_post_meta($post_id, '_wpfmj_form_id', $config['form_id']);
wp_send_json_success(array(
'id' => $post_id,
'message' => 'Automation saved successfully',
));
}
/**
* AJAX: Get automation.
*/
public function ajax_get_automation() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
if (!$id) {
wp_send_json_error('Invalid ID');
}
$post = get_post($id);
$config = get_post_meta($id, '_wpfmj_config', true);
if (!$post || !$config) {
wp_send_json_error('Automation not found');
}
// Decrypt API credentials
$decrypted_key = WPFMJ_Encryption::decrypt($config['api_key']);
$decrypted_secret = WPFMJ_Encryption::decrypt($config['api_secret']);
// Check for decryption failures
if ($decrypted_key === false || $decrypted_secret === false) {
wp_send_json_error('Failed to decrypt API credentials. The encryption key may have changed.');
}
$config['api_key'] = $decrypted_key;
$config['api_secret'] = $decrypted_secret;
wp_send_json_success(array(
'title' => $post->post_title,
'status' => $post->post_status,
'config' => $config,
));
}
/**
* AJAX: Toggle automation status.
*/
public function ajax_toggle_automation() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
if (!$id) {
wp_send_json_error('Invalid ID');
}
$post = get_post($id);
if (!$post) {
wp_send_json_error('Automation not found');
}
$new_status = $post->post_status === 'publish' ? 'draft' : 'publish';
wp_update_post(array(
'ID' => $id,
'post_status' => $new_status,
));
wp_send_json_success(array(
'status' => $new_status,
'message' => 'Automation ' . ($new_status === 'publish' ? 'activated' : 'paused'),
));
}
/**
* AJAX: Delete automation.
*/
public function ajax_delete_automation() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$id = isset($_POST['id']) ? intval($_POST['id']) : 0;
if (!$id) {
wp_send_json_error('Invalid ID');
}
$result = wp_delete_post($id, true);
if ($result) {
wp_send_json_success('Automation deleted');
} else {
wp_send_json_error('Failed to delete automation');
}
}
/**
* AJAX: Get dashboard data.
*/
public function ajax_get_dashboard_data() {
check_ajax_referer('wpfmj_ajax', 'nonce');
if (!current_user_can('manage_options')) {
wp_send_json_error('Permission denied');
}
$automations = get_posts(array(
'post_type' => 'wpfmj_automation',
'post_status' => array('publish', 'draft'),
'posts_per_page' => -1,
));
if (empty($automations)) {
wp_send_json_success(array());
return;
}
// Pre-load all post meta to prevent N+1 queries
$automation_ids = wp_list_pluck($automations, 'ID');
update_post_meta_cache($automation_ids);
// Pre-load all error counts in a single query to prevent N+1
$logger = new WPFMJ_Error_Logger();
$error_counts = $logger->get_error_counts_bulk($automation_ids);
$data = array();
foreach ($automations as $automation) {
$config = get_post_meta($automation->ID, '_wpfmj_config', true);
$form = wpforms()->form->get($config['form_id']);
$data[] = array(
'id' => $automation->ID,
'title' => $automation->post_title,
'form_name' => $form ? $form->post_title : 'Unknown Form',
'status' => $automation->post_status,
'error_count' => isset($error_counts[$automation->ID]) ? $error_counts[$automation->ID] : 0,
'created' => $automation->post_date,
);
}
wp_send_json_success($data);
}
}