Your IP : 216.73.216.0


Current Path : /home/goldnueh/nightviewcafe.in/wp-content/plugins/demo-importer-plus/inc/
Upload File :
Current File : /home/goldnueh/nightviewcafe.in/wp-content/plugins/demo-importer-plus/inc/Ajax.php

<?php
/**
 * AJAX Class
 *
 * @since 2.0.0
 */

namespace KraftPlugins\DemoImporterPlus;

use WP_Error;
use WP_REST_Request;
use WP_REST_Server;

/**
 *
 * @since 2.0.0
 */
class Ajax {

	public static function handle_request() {
		// Get Method.
		$method = $_SERVER[ 'REQUEST_METHOD' ] ?? 'GET';

		$request = new WP_REST_Request( $method );

		if ( isset( $_SERVER[ 'HTTP_X_WP_NONCE' ] ) || isset( $_REQUEST[ '_nonce' ] ) ) {
			$request->set_header( 'X-WP-Nonce', $_SERVER[ 'HTTP_X_WP_NONCE' ] ?? $_REQUEST[ '_nonce' ] );

			if ( ! wp_verify_nonce( $request->get_header( 'x-wp-nonce' ), 'wp_rest' ) ) {
				wp_send_json_error( 'Invalid Request', 403 );
			}

			$request->set_body( file_get_contents( 'php://input' ) );
			$request->set_query_params( $_GET );
			$request->set_header( 'Content-Type', 'application/json' );
			$request->set_body_params( $_POST );

			$demo_action = $request->get_param( 'demo_action' );

			$data = array();
			switch ( $demo_action ) {
				case 'test-connection':
					$data = static::test_server_connection( $request );
					break;
				case 'check-server-config':
					$data = static::check_server_config( $request );
					break;
				case 'demos':
					if ( $request->get_param( 'id' ) ) {
						$data = static::get_demo_by_id( $request );
					} else {
						$data = static::get_demos( $request );
					}
					break;
				case 'demo-categories':
					$data = static::get_demo_categories( $request );
					break;
					break;
				case 'import-demo':
					if ( $request->get_param( 'id' ) ) {
						$data = static::import_demo_site( $request );
					} else {
						$data = new WP_Error( 'invalid_request', 'Requires Demo ID.' );
					}
					break;
				case 'update_attachment':
					$data = static::update_attachment( $request );
					break;
				case 'required-plugins':
					if ( $request->get_param( 'id' ) ) {
						$data = static::get_required_plugins( $request );
					} else {
						$data = new WP_Error( 'invalid_request', 'Requires Demo ID.' );
					}
					break;
				case 'import-page':
					if ( $request->get_param( 'id' ) && $request->get_param( 'page_id' ) ) {
						$data = static::import_page( $request );
					} else {
						$data = new WP_Error( 'invalid_request', 'Invalid Page ID and Demo ID.' );
					}
					break;
				case 'do-reinstall':
					$data = static::do_reinstall( $request );
					break;
				case 'activate-plugin':
					if ( ! current_user_can( 'activate_plugins' ) ) {
						$data = new WP_Error( 'permission_denied', 'You do not have permission to activate plugins.', 403 );
					} else if ( ! $request->get_param( 'plugin' ) ) {
						$data = new WP_Error( 'invalid_request', 'Invalid Plugin.', 400 );
					} else {
						$data = static::activate_plugin( $request );
					}
					break;
				case 'delete-site':
					if ( ! current_user_can( 'manage_options' ) ) {
						$data = new WP_Error( 'permission_denied', 'You do not have permission to delete site.', 403 );
					} else {
						$data = static::cleanup_previous_site( $request );
					}
					break;
				default:
					wp_send_json_error( 'Invalid Request' );
			}

			if ( is_wp_error( $data ) ) {
				wp_send_json_error( $data, 403 );
			}

			wp_send_json( $data );
		} else {
			wp_send_json_error( 'Invalid Request', 403 );
		}
	}

	/**
	 * Get Demos
	 *
	 * @retun WP_Error|array
	 * @since 2.0.0
	 */
	protected static function get_demos( WP_REST_Request $request ) {
		$server = new DemoServer();

		$include = $request->get_param( 'include' ) ?? DEMO_IMPORTER_PLUS_MAIN_DEMO_ID;
		if ( ! is_array( $include ) ) {
			$include = explode( ',', $include );
		}

		return $server->fetch_demos(
			array(
				'per_page' => $request->get_param( 'per_page' ) ?? 10,
				'page'     => $request->get_param( 'page' ) ?? 1,
				'include'  => $include,
				'search'   => $request->get_param( 'search' ) ?? '',
				'category' => $request->get_param( 'category' ) ?? '',
				'type'     => $request->get_param( 'type' ) ?? '',
			)
		);
	}

	/**
	 * Get Demo By ID
	 *
	 * @since 2.0.0
	 * @retun WP_Error|array
	 */
	protected static function get_demo_by_id( WP_REST_Request $request ) {
		$server = new DemoServer();

		$data = $server->fetch_demo( $request->get_param( 'id' ) );

		$demo_modal = new DemoDataModel( $data );

		$is_pro                      = $demo_modal->is_pro();
		$is_licensed                 = apply_filters( 'demo_importer_plus_pro_active', false ) === true;
		$data[ '__importer_config' ] = array(
			'is_pro'           => $is_pro,
			'is_licensed'      => $is_licensed,
			'is_pro_installed' => apply_filters( 'demo_importer_plus_is_pro', false ),
			'licensePageURL'   => apply_filters( 'demo_importer_plus_license_page', admin_url( '/' ) ),
			'is_importable'    => ! $is_pro || $is_licensed,
			'customize_url'    => admin_url( 'customize.php' ),
			'get_pro_url'      => apply_filters( 'demo_importer_plus_get_pro_url', '#' ),
			'labels'           => array(
				'get_pro'             => apply_filters( 'demo_importer_plus_get_pro_text', __( 'Get Pro', 'demo-importer-plus' ) ),
				'active_license_text' => apply_filters( 'demo_importer_plus_activate_license_text', __( 'Activate License', 'demo-importer-plus' ) ),
			),
		);

		return $data;
	}

	/**
	 * Import Demo Site.
	 *
	 * @return WP_Error|array
	 * @since 2.0.0
	 */
	protected static function import_demo_site( WP_REST_Request $request ) {
		$demo_id = $request->get_param( 'id' );
		$step    = $request->get_param( 'step' ) ?? null;

		$demo_importer       = new DemoSiteImporter( $demo_id );
		$demo_importer->step = $step;

		$result = $demo_importer->import();

		if ( is_wp_error( $result ) ) {
			return $result;
		}

		return array(
			'success' => true,
			'data'    => $result,
		);
	}

	/**
	 * Cleanup Previous Site.
	 *
	 * @return WP_Error|array
	 */
	protected static function cleanup_previous_site( $request ) {

		$method = $_SERVER[ 'REQUEST_METHOD' ] ?? 'GET';
		$step   = $request->get_param( 'step' ) ?? '';

		$steps_and_methods = [
			'prepare'                => WP_REST_Server::READABLE,
			'reset'                  => WP_REST_Server::CREATABLE,
			'delete_site_customizer' => WP_REST_Server::CREATABLE,
			'delete_site_options'    => WP_REST_Server::CREATABLE,
			'delete_site_widgets'    => WP_REST_Server::CREATABLE,
			'delete_site_content'    => WP_REST_Server::READABLE,
		];

		if ( ! isset( $steps_and_methods[ $step ] ) || $steps_and_methods[ $step ] !== $method ) {
			return new WP_Error( 'invalid_request', __( 'Invalid request.', 'demo-importer-plus' ) );
		}

		$cleanup = new PreviousSiteCleanup();

		$cleanup->step = $request->get_param( 'step' ) ?? '';
		if ( ! $cleanup->step ) {
			$cleanup->step = 'prepare';
		}

		$data = $cleanup->run();
		if ( is_wp_error( $data ) ) {
			return $data;
		}

		return array(
			'success' => true,
			'data'    => $data,
		);
	}

	/**
	 * Import Page.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 * @since 2.0.0
	 */
	protected static function import_page( WP_REST_Request $request ) {
		$demo_id = $request->get_param( 'id' );
		$page_id = $request->get_param( 'page_id' );

		$page_importer = new PageImporter( $page_id, $demo_id );

		$data = $page_importer->import();

		if ( is_wp_error( $data ) ) {
			return $data;
		}

		return array(
			'success' => true,
			'message' => __( 'Page has been imported successfully.', 'demo-importer-plus' ),
			'data'    => $data,
		);
	}

	/**
	 * Test Server Connection.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 * @since 2.0.0
	 */
	protected static function test_server_connection( WP_REST_Request $request ) {
		$server = new DemoServer();

		return $server->test_connection();
	}

	/**
	 * Check Server Config.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return array
	 * @since 2.0.0
	 */
	protected static function check_server_config( WP_REST_Request $request ): array {

		$config = array(
			'max_execution_time'  => @ini_get( 'max_execution_time' ),
			'memory_limit'        => @ini_get( 'memory_limit' ),
			'post_max_size'       => @ini_get( 'post_max_size' ),
			'upload_max_filesize' => @ini_get( 'upload_max_filesize' ),
		);

		$server = new DemoServer();

		return $server->compare_server_requirements( $config );
	}

	/**
	 * Get Required Plugins.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 * @since 2.0.0
	 */
	protected static function get_required_plugins( WP_REST_Request $request ) {
		$demo_id = $request->get_param( 'id' );

		$server = new DemoServer();

		$data = $server->fetch_demo( $demo_id );

		if ( is_wp_error( $data ) ) {
			return $data;
		}

		if ( ! function_exists( 'get_plugins' ) ) {
			require_once ABSPATH . 'wp-admin/includes/plugin.php';
		}

		$site_plugins = get_plugins();

		$demo_data_model = new DemoDataModel( $data );

		$required_plugins = $demo_data_model->get_required_plugins();

		foreach ( $required_plugins as &$required_plugin ) {
			$required_plugin[ 'installed' ] = isset( $site_plugins[ $required_plugin[ 'init' ] ] );
			$required_plugin[ 'active' ]    = is_plugin_active( $required_plugin[ 'init' ] );
		}

		return $required_plugins;
	}

	/**
	 * Reset Website.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_error|array
	 */
	protected static function do_reinstall( WP_REST_Request $request ) {
		$site_reset = new SiteReset();

		$result = $site_reset->reset();

		if ( $result ) {
			return array(
				'success' => true,
				'message' => 'Site has been reset successfully.',
			);
		} else {
			return new WP_Error( 'reset_failed', 'Failed to reset the site.' );
		}
	}

	/**
	 * Activate Plugin.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 */
	protected static function activate_plugin( WP_REST_Request $request ) {

		$plugin = $request->get_param( 'plugin' );

		wp_clean_plugins_cache();

		$activate = activate_plugin( $plugin, '', false, true );

		if ( is_wp_error( $activate ) ) {
			return $activate;
		}

		$data = get_plugin_data( WP_PLUGIN_DIR . '/' . $plugin );

		return array(
			'success' => true,
			'message' => sprintf( __( 'Plugin "%s" is Activated', 'demo-importer-plus' ), $data[ 'Name' ] ?? 'Unknown' ),
			'data'    => $data,
		);
	}

	/**
	 * Get Demos Categories.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 */
	protected static function get_demo_categories( WP_REST_Request $request ) {
		$server = new DemoServer();

		$args = array(
			'per_page' => $request->get_param( 'per_page' ) ?? 100,
			'_fields'  => $request->get_param( 'fields' ) ?? 'id,name,slug',
		);

		return $server->fetch_demos_categories( $args );
	}

	/**
	 * Update Media.
	 *
	 * @param WP_REST_Request $request
	 *
	 * @return WP_Error|array
	 */
	protected static function update_attachment( WP_REST_Request $request ) {
		$attachment = $request->get_param( 'attachment' );

		$_upload_meta = get_post_meta( $attachment, '_upload_meta', true );

		$upload = $_upload_meta[ 'upload' ];
		$result = demo_importer_plus_replace_placeholder_with_media( $_upload_meta[ 'remote_url' ], $upload );

		if ( ! is_wp_error( $result ) ) {
			$attachment_metadata = wp_generate_attachment_metadata( $attachment, $upload[ 'file' ] );
			wp_update_attachment_metadata( $attachment, $attachment_metadata );
			delete_post_meta( $attachment, '_upload_meta' );

			return array(
				'success' => true,
				'message' => 'Attachment has been updated successfully.',
				'data'    => $result,
			);
		}

		return $result;

	}

}