File: /var/www/html/ielts-store/wp-content/plugins/automatewoo/admin/ajax.php
<?php
// phpcs:ignoreFile
namespace AutomateWoo;
use AutomateWoo\Admin\JSON_Search;
use AutomateWoo\Exceptions\InvalidPreviewData;
use AutomateWoo\Workflows\Factory;
use WP_Error;
/**
 * @class Admin_Ajax
 */
class Admin_Ajax {
	/**
	 * Hook in methods
	 */
	static function init() {
		$ajax_events = [
			'fill_trigger_fields',
			'fill_action_fields',
			'json_search_workflows',
			'json_search_coupons',
			'json_search_attribute_terms',
			'json_search_taxonomy_terms',
			'json_search_customers',
			'json_search_products_and_variations_not_variable',
			'json_search_products_not_variations_not_variable',
			'activate',
			'deactivate',
			'email_preview_iframe',
			'test_sms',
			'database_update',
			'database_update_items_to_process_count',
			'save_preview_data',
			'send_test_email',
			'dismiss_system_error_notice',
			'get_rule_select_choices',
			'toggle_workflow_status',
			'modal_log_info',
			'modal_queue_info',
			'modal_variable_info',
			'modal_cart_info',
			'update_dynamic_action_select',
		];
		foreach ( $ajax_events as $ajax_event ) {
			add_action( 'wp_ajax_aw_' . $ajax_event, [ __CLASS__, $ajax_event ] );
		}
	}
	/**
	 *
	 */
	static function fill_trigger_fields() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		$trigger_name = Clean::string( aw_request('trigger_name') );
		$workflow_id = absint( aw_request('workflow_id') );
		$is_new_workflow = aw_request('is_new_workflow');
		$workflow = false;
		$trigger = Triggers::get( $trigger_name );
		if ( ! $trigger )
			die;
		if ( ! $is_new_workflow ) {
			$workflow = new Workflow( $workflow_id );
		}
		ob_start();
		Admin::get_view('trigger-fields', [
			'trigger' => $trigger,
			'workflow' => $workflow,
		]);
		$fields = ob_get_clean();
		wp_send_json_success([
			'fields' => $fields,
			'trigger' => Admin_Workflow_Edit::get_trigger_data( $trigger ),
		]);
	}
	/**
	 * Retrieve action fields and echo JSON.
	 */
	public static function fill_action_fields() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$action_name   = Clean::string( aw_request( 'action_name' ) );
		$action_number = Clean::string( aw_request( 'action_number' ) );
		if ( '' === $action_name ) {
			wp_send_json_success(
				[
					'fields'      => '',
					'title'       => 'New Action',
					'description' => '',
				]
			);
		}
		$action = Actions::get( $action_name );
		ob_start();
		Admin::get_view(
			'action-fields',
			[
				'action'        => $action,
				'action_number' => $action_number,
			]
		);
		$fields = ob_get_clean();
		wp_send_json_success(
			[
				'fields'      => $fields,
				'title'       => $action->get_title( true ),
				'description' => $action->get_description_html(),
			]
		);
	}
	/**
	 * Search for workflows and echo JSON.
	 */
	public static function json_search_workflows() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		ob_start();
		$term = Clean::string( wp_unslash( aw_get_url_var( 'term' ) ) );
		JSON_Search::workflows( $term );
	}
	/**
	 * Search customers, includes guests customers
	 */
	static function json_search_customers() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		ob_start();
		$term = Clean::string( wp_unslash( aw_get_url_var( 'term' ) ) );
		JSON_Search::customers( $term );
	}
	/**
	 * Search for products and variations, but not variable products.
	 */
	static function json_search_products_and_variations_not_variable() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$term = Clean::string( wp_unslash( aw_get_url_var( 'term' ) ) );
		JSON_Search::products( $term, true, false );
	}
	/**
	 * Search for products excluding variable and variation products.
	 */
	static function json_search_products_not_variations_not_variable() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$term = Clean::string( wp_unslash( aw_get_url_var( 'term' ) ) );
		JSON_Search::products( $term, false, false );
	}
	/**
	 * Search for products and echo json
	 */
	public static function json_search_attribute_terms() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		if ( empty( $_GET['term'] ) || empty( $_GET['sibling'] ) ) {
			die;
		}
		$search = Clean::string( stripslashes( $_GET['term'] ) );
		$sibling = Clean::string( stripslashes( $_GET['sibling'] ) );
		$terms = get_terms( 'pa_' . $sibling, [
			'hide_empty' => false,
			'search' => $search
		]);
		$found = [];
		if ( ! $terms || is_wp_error($terms)  )
			die();
		foreach ( $terms as $term ) {
			$found[ $term->term_id . '|' . $term->taxonomy  ] = rawurldecode( $term->name );
		}
		wp_send_json( $found );
	}
	/**
	 * Search for products and echo json
	 */
	public static function json_search_taxonomy_terms() {
		if ( ! Permissions::can_manage() ) {
			die;
		}
		ob_start();
		$search  = Clean::string( stripslashes( aw_get_url_var( 'term' ) ) );
		$sibling = Clean::string( stripslashes( aw_get_url_var( 'sibling' ) ) );
		if ( empty( $search ) || empty($sibling) ) {
			die;
		}
		$terms = get_terms(
			$sibling,
			[
				'hide_empty' => false,
				'search'     => $search
			]
		);
		$found = [];
		if ( ! $terms || is_wp_error($terms)  )
			die;
		foreach ( $terms as $term ) {
			$found[ $term->term_id . '|' . $term->taxonomy  ] = rawurldecode( $term->name );
		}
		wp_send_json( $found );
	}
	/**
	 * Search for coupons and echo JSON.
	 */
	public static function json_search_coupons() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$term = Clean::string( wp_unslash( aw_get_url_var( 'term' ) ) );
		JSON_Search::coupons( $term, true );
	}
	static function email_preview_iframe() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$type = Clean::string( aw_request('type') );
		$args = Clean::recursive( aw_request('args') );
		switch ( $type ) {
			case 'workflow_action':
				try {
					$action = Preview_Data::generate_preview_action( $args['workflow_id'], $args['action_number'] );
				} catch ( InvalidPreviewData $e ) {
					return wp_die( $e->getMessage() );
				}
				do_action( 'automatewoo/action/before_preview', $action );
				$action->workflow->setup();
				echo $action->get_preview();
				$action->workflow->cleanup();
				do_action( 'automatewoo/action/after_preview', $action );
				break;
			default:
				do_action( 'automatewoo/email_preview/html', $type, $args );
		}
		exit();
	}
	/**
	 * Sends a test to supplied emails
	 */
	static function send_test_email() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$type = Clean::string( aw_request('type') );
		$args = Clean::recursive( aw_request('args') );
		$to = Clean::string( aw_request('to_emails') );
		// save the to field
		update_user_meta( get_current_user_id(), 'automatewoo_email_preview_test_emails', $to );
		$to = Emails::parse_multi_email_field( $to );
		switch ( $type ) {
			case 'workflow_action':
				try {
					$action = Preview_Data::generate_preview_action( $args['workflow_id'], $args['action_number'], 'test' );
				} catch ( InvalidPreviewData $e ) {
					return wp_die( $e->getMessage() );
				}
				$action->workflow->setup();
				$current_user = get_current_user_id();
				// Temporarily remove the current user since no current user is typically exists when running a workflow
				wp_set_current_user( 0 );
				$result = $action->run_test( [ 'recipients' => $to ] );
				wp_set_current_user( $current_user );
				$action->workflow->cleanup();
				break;
			default:
				do_action( 'automatewoo/email_preview/send_test', $type, $to, $args );
				$result = false;
		}
		if ( $result instanceof WP_Error ) {
			wp_send_json_error(
				[
					/* translators: %s: Error message */
					'message' => sprintf( __( 'Error: %s', 'automatewoo' ), $result->get_error_message() ),
				]
			);
		}
		wp_send_json_success([
			'message' => sprintf(
				__( 'Success! %s email%s sent.', 'automatewoo' ),
				count($to),
				count($to) == 1 ? '' : 's'
			)
		]);
	}
	static function test_sms() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$from = Clean::string( aw_request('from') );
		$auth_id = Clean::string( aw_request('auth_id') );
		$auth_token = Clean::string( aw_request('auth_token') );
		$test_message = Clean::string( aw_request('test_message') );
		$test_recipient = Clean::string( aw_request('test_recipient') );
		$twilio = new Integration_Twilio( $from, $auth_id, $auth_token );
		$twilio->log_errors = false; // errors will be visible
		$request = $twilio->send_sms( $test_recipient, $test_message, $from );
		if ( $request->is_successful() ) {
			wp_send_json_success( [
				'message' => __('Message sent.','automatewoo')
			] );
		}
		else {
			wp_send_json_error( [
				'message' => $twilio->get_request_error_message( $request )
			] );
		}
	}
	static function database_update() {
		$verify = wp_verify_nonce( $_REQUEST['nonce'], 'automatewoo_database_upgrade' );
		$plugin_slug = Clean::string( aw_request('plugin_slug') );
		if ( ! $verify ) {
			wp_send_json_error( __( 'Permission error.', 'automatewoo' ) );
		}
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		if ( $plugin_slug == AW()->plugin_slug ) {
			// updating the primary plugin
			$complete = Installer::run_database_updates();
			wp_send_json_success([
				'complete' => $complete,
				'items_processed' => Installer::$db_update_items_processed
			]);
		}
		else {
			// updating an addon
			$addon = Addons::get( $plugin_slug );
			if ( ! $addon ) {
				wp_send_json_error(__( 'Add-on could not be updated', 'automatewoo' ) );
			}
			$addon->do_database_update();
			wp_send_json_success([
				'complete' => true
			]);
		}
	}
	static function database_update_items_to_process_count() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$plugin_slug = Clean::string( aw_request('plugin_slug') );
		if ( $plugin_slug == AW()->plugin_slug ) {
			$count = Installer::get_database_update_items_to_process_count();
		}
		else {
			$count = 0; // batch processor not yet supported for addons
		}
		wp_send_json_success([
			'items_to_process' => $count
		]);
	}
	/**
	 * To preview an action save temporarily in the options table.
	 */
	static function save_preview_data() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$workflow = Factory::get( aw_get_post_var( 'workflow_id' ) );
		$trigger_name = Clean::string( aw_get_post_var( 'trigger_name' ) );
		$action_fields = $workflow->sanitize_action_fields( aw_get_post_var( 'action_fields' ) );
		if ( ! $trigger_name || ! is_array( $action_fields ) || ! $workflow ) {
			wp_send_json_error();
		}
		$preview_data = [
			'trigger_name' => $trigger_name,
			'action_fields' => $action_fields,
		];
		update_option( 'aw_wf_preview_data_' . $workflow->get_id(), $preview_data, false );
		wp_send_json_success();
	}
	/**
	 *
	 */
	static function dismiss_system_error_notice() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		delete_transient('automatewoo_background_system_check_errors');
		wp_send_json_success();
	}
	static function get_rule_select_choices() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		if ( ! $rule_name = Clean::string( aw_request('rule_name') ) )
			die;
		$rule_object = Rules::get( $rule_name );
		if ( $rule_object->type == 'select' ) {
			wp_send_json_success([
				'select_choices' => $rule_object->get_select_choices()
			]);
		}
		die;
	}
	/**
	 * Display content for log details modal
	 */
	static function modal_log_info() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		if ( $log = Log_Factory::get( absint( aw_request('log_id') ) ) ) {
			Admin::get_view( 'modal-log-info', [ 'log' => $log ] );
			die;
		}
		die( __( 'No log found.', 'automatewoo' ) );
	}
	static function modal_queue_info() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		if ( $event = Queued_Event_Factory::get( absint( aw_request('queued_event_id') ) ) ) {
			Admin::get_view( 'modal-queued-event-info', [ 'event' => $event ] );
			die;
		}
		die( __( 'No queued event found.', 'automatewoo' ) );
	}
	static function modal_variable_info() {
		if ( ! current_user_can( 'manage_woocommerce' ) ) {
			die;
		}
		$variable = Variables::get_variable( Clean::string( aw_request( 'variable' ) ) );
		if ( $variable ) {
			Admin::get_view( 'modal-variable-info', [
				'variable' => $variable
			]);
			die;
		}
		wp_die( __( 'Variable not found.', 'automatewoo' ) );
	}
	static function modal_cart_info() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		if ( $cart = Cart_Factory::get( absint( aw_request('cart_id') ) ) ) {
			Admin::get_view( 'modal-cart-info', [ 'cart' => $cart ] );
			die;
		}
		die( __( 'No cart found.', 'automatewoo' ) );
	}
	static function toggle_workflow_status() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		$workflow = Factory::get( aw_request( 'workflow_id' ) );
		$new_state = Clean::string( aw_request( 'new_state' ) );
		if ( ! $workflow || ! $new_state )
			die;
		$workflow->update_status( $new_state === 'on' ? 'active' : 'disabled' );
		wp_send_json_success();
	}
	
	static function update_dynamic_action_select() {
		if ( ! current_user_can( 'manage_woocommerce' ) )
			die;
		$action_name = Clean::string( aw_request( 'action_name' ) );
		$target_field_name = Clean::string( aw_request( 'target_field_name' ) );
		$reference_field_value = Clean::string( aw_request( 'reference_field_value' ) );
		$options = [];
		if ( $reference_field_value ) {
			$action = Actions::get( $action_name );
			$options = $action->get_dynamic_field_options( $target_field_name, $reference_field_value );
		}
		wp_send_json_success( $options );
	}
}