Linting.
This commit is contained in:
parent
26410aef0a
commit
a5b417b448
|
@ -2,7 +2,7 @@
|
|||
/**
|
||||
* Installation Manager
|
||||
*
|
||||
* @package WooCommerce\WCCom\Installation
|
||||
* @package WooCommerce\WCCom
|
||||
*/
|
||||
|
||||
use WC_REST_WCCOM_Site_Installer_Error_Codes as Installer_Error_Codes;
|
||||
|
@ -10,21 +10,37 @@ use WC_REST_WCCOM_Site_Installer_Error as Installer_Error;
|
|||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Manager class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Manager {
|
||||
|
||||
const STEPS = [
|
||||
const STEPS = array(
|
||||
'get_product_info',
|
||||
'download_product',
|
||||
'unpack_product',
|
||||
'move_product',
|
||||
'activate_product',
|
||||
];
|
||||
);
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param int $product_id The product ID.
|
||||
* @param string $idempotency_key The idempotency key.
|
||||
*/
|
||||
public function __construct( int $product_id, string $idempotency_key ) {
|
||||
$this->product_id = $product_id;
|
||||
$this->idempotency_key = $idempotency_key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the installation.
|
||||
*
|
||||
* @param string $run_until_step The step to run until.
|
||||
* @return bool
|
||||
* @throws WC_REST_WCCOM_Site_Installer_Error If installation failed to run.
|
||||
*/
|
||||
public function run_installation( string $run_until_step ): bool {
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $this->product_id );
|
||||
|
||||
|
@ -41,13 +57,22 @@ class WC_WCCOM_Site_Installation_Manager {
|
|||
$next_step = $this->get_next_step( $state );
|
||||
$installation_steps = $this->get_installation_steps( $next_step, $run_until_step );
|
||||
|
||||
array_walk( $installation_steps, function ( $step_name ) use ( $state ) {
|
||||
$this->run_step( $step_name, $state );
|
||||
} );
|
||||
array_walk(
|
||||
$installation_steps,
|
||||
function ( $step_name ) use ( $state ) {
|
||||
$this->run_step( $step_name, $state );
|
||||
}
|
||||
);
|
||||
|
||||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next step to run.
|
||||
*
|
||||
* @return bool
|
||||
* @throws WC_REST_WCCOM_Site_Installer_Error If the installation cannot be rest.
|
||||
*/
|
||||
public function reset_installation(): bool {
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $this->product_id );
|
||||
|
||||
|
@ -67,10 +92,15 @@ class WC_WCCOM_Site_Installation_Manager {
|
|||
return true;
|
||||
}
|
||||
|
||||
/**
|
||||
* Check if the installation can be run.
|
||||
*
|
||||
* @param string $run_until_step Run until this step.
|
||||
* @param WC_WCCOM_Site_Installation_State $state Installation state.
|
||||
* @return void
|
||||
* @throws WC_REST_WCCOM_Site_Installer_Error If the installation cannot be run.
|
||||
*/
|
||||
protected function can_run_installation( $run_until_step, $state ) {
|
||||
// if ( $this->already_installed( $product_id )) {
|
||||
// throw new Installer_Error(Installer_Error_Codes::PLUGIN_ALREADY_INSTALLED_MESSAGE );
|
||||
// }
|
||||
|
||||
if ( $state->get_last_step_status() === \WC_WCCOM_Site_Installation_State::STEP_STATUS_IN_PROGRESS ) {
|
||||
throw new Installer_Error( Installer_Error_Codes::INSTALLATION_ALREADY_RUNNING );
|
||||
|
@ -84,8 +114,11 @@ class WC_WCCOM_Site_Installation_Manager {
|
|||
throw new Installer_Error( Installer_Error_Codes::ALL_INSTALLATION_STEPS_RUN );
|
||||
}
|
||||
|
||||
if ( array_search( $state->get_last_step_name(), self::STEPS ) >= array_search( $run_until_step,
|
||||
self::STEPS ) ) {
|
||||
if ( array_search( $state->get_last_step_name(), self::STEPS, true ) >= array_search(
|
||||
$run_until_step,
|
||||
self::STEPS,
|
||||
true
|
||||
) ) {
|
||||
throw new Installer_Error( Installer_Error_Codes::REQUESTED_STEP_ALREADY_RUN );
|
||||
}
|
||||
|
||||
|
@ -94,6 +127,12 @@ class WC_WCCOM_Site_Installation_Manager {
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the next step to run.
|
||||
*
|
||||
* @param WC_WCCOM_Site_Installation_State $state Installation state.
|
||||
* @return string
|
||||
*/
|
||||
protected function get_next_step( $state ): string {
|
||||
$last_executed_step = $state->get_last_step_name();
|
||||
|
||||
|
@ -101,20 +140,34 @@ class WC_WCCOM_Site_Installation_Manager {
|
|||
return self::STEPS[0];
|
||||
}
|
||||
|
||||
$last_executed_step_index = array_search( $last_executed_step, self::STEPS );
|
||||
$last_executed_step_index = array_search( $last_executed_step, self::STEPS, true );
|
||||
|
||||
return self::STEPS[ $last_executed_step_index + 1 ];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the steps to run.
|
||||
*
|
||||
* @param string $start_step The step to start from.
|
||||
* @param string $end_step The step to end at.
|
||||
* @return string[]
|
||||
*/
|
||||
protected function get_installation_steps( string $start_step, string $end_step ) {
|
||||
$start_step_offset = array_search( $start_step, self::STEPS );
|
||||
$end_step_index = array_search( $end_step, self::STEPS );
|
||||
$start_step_offset = array_search( $start_step, self::STEPS, true );
|
||||
$end_step_index = array_search( $end_step, self::STEPS, true );
|
||||
$length = $end_step_index - $start_step_offset + 1;
|
||||
|
||||
return array_slice( self::STEPS, $start_step_offset, $length );
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Run the step.
|
||||
*
|
||||
* @param string $step_name Step name.
|
||||
* @param WC_WCCOM_Site_Installation_State $state Installation state.
|
||||
* @return void
|
||||
* @throws WC_REST_WCCOM_Site_Installer_Error If the step fails.
|
||||
*/
|
||||
protected function run_step( $step_name, $state ) {
|
||||
$state->initiate_step( $step_name );
|
||||
WC_WCCOM_Site_Installation_State_Storage::save_state( $state );
|
||||
|
|
|
@ -2,16 +2,25 @@
|
|||
/**
|
||||
* State storage for the WCCOM Site installation process.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation
|
||||
* @package WooCommerce\WCCOM
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_State_Storage class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_State_Storage {
|
||||
|
||||
/**
|
||||
* Get state from storage.
|
||||
*
|
||||
* @param int $product_id The product ID.
|
||||
* @return WC_WCCOM_Site_Installation_State|null
|
||||
*/
|
||||
public static function get_state( $product_id ) : ?WC_WCCOM_Site_Installation_State {
|
||||
$storage_key = self::get_storage_key( $product_id );
|
||||
$data = get_option($storage_key);
|
||||
$data = get_option( $storage_key );
|
||||
|
||||
if ( ! is_array( $data ) ) {
|
||||
return null;
|
||||
|
@ -27,44 +36,65 @@ class WC_WCCOM_Site_Installation_State_Storage {
|
|||
);
|
||||
|
||||
$installation_state->set_product_type( $data['product_type'] ?? null );
|
||||
$installation_state->set_product_name( $data['product_name'] ?? null);
|
||||
$installation_state->set_download_url( $data['download_url'] ?? null);
|
||||
$installation_state->set_download_path( $data['download_path'] ?? null);
|
||||
$installation_state->set_unpacked_path( $data['unpacked_path'] ?? null);
|
||||
$installation_state->set_product_name( $data['product_name'] ?? null );
|
||||
$installation_state->set_download_url( $data['download_url'] ?? null );
|
||||
$installation_state->set_download_path( $data['download_path'] ?? null );
|
||||
$installation_state->set_unpacked_path( $data['unpacked_path'] ?? null );
|
||||
$installation_state->set_installed_path( $data['installed_path'] ?? null );
|
||||
$installation_state->set_already_installed_plugin_info( $data['already_installed_plugin_info'] ?? null );
|
||||
|
||||
return $installation_state;
|
||||
}
|
||||
|
||||
public static function save_state( WC_WCCOM_Site_Installation_State $state) : bool {
|
||||
/**
|
||||
* Save state to storage.
|
||||
*
|
||||
* @param WC_WCCOM_Site_Installation_State $state The state to save.
|
||||
* @return bool
|
||||
*/
|
||||
public static function save_state( WC_WCCOM_Site_Installation_State $state ) : bool {
|
||||
$storage_key = self::get_storage_key( $state->get_product_id() );
|
||||
|
||||
return update_option($storage_key, [
|
||||
'product_id' => $state->get_product_id(),
|
||||
'idempotency_key' => $state->get_idempotency_key(),
|
||||
'last_step_name' => $state->get_last_step_name(),
|
||||
'last_step_status' => $state->get_last_step_status(),
|
||||
'last_step_error' => $state->get_last_step_error(),
|
||||
'product_type' => $state->get_product_type(),
|
||||
'product_name' => $state->get_product_name(),
|
||||
'download_url' => $state->get_download_url(),
|
||||
'download_path' => $state->get_download_path(),
|
||||
'unpacked_path' => $state->get_unpacked_path(),
|
||||
'installed_path' => $state->get_installed_path(),
|
||||
'already_installed_plugin_info' => $state->get_already_installed_plugin_info(),
|
||||
'started_date' => $state->get_started_date(),
|
||||
]);
|
||||
return update_option(
|
||||
$storage_key,
|
||||
array(
|
||||
'product_id' => $state->get_product_id(),
|
||||
'idempotency_key' => $state->get_idempotency_key(),
|
||||
'last_step_name' => $state->get_last_step_name(),
|
||||
'last_step_status' => $state->get_last_step_status(),
|
||||
'last_step_error' => $state->get_last_step_error(),
|
||||
'product_type' => $state->get_product_type(),
|
||||
'product_name' => $state->get_product_name(),
|
||||
'download_url' => $state->get_download_url(),
|
||||
'download_path' => $state->get_download_path(),
|
||||
'unpacked_path' => $state->get_unpacked_path(),
|
||||
'installed_path' => $state->get_installed_path(),
|
||||
'already_installed_plugin_info' => $state->get_already_installed_plugin_info(),
|
||||
'started_date' => $state->get_started_date(),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
/**
|
||||
* Delete state from storage.
|
||||
*
|
||||
* @param WC_WCCOM_Site_Installation_State $state The state to delete.
|
||||
* @return bool
|
||||
*/
|
||||
public static function delete_state( WC_WCCOM_Site_Installation_State $state ) : bool {
|
||||
$storage_key = self::get_storage_key( $state->get_product_id() );
|
||||
|
||||
return delete_option($storage_key);
|
||||
return delete_option( $storage_key );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the storage key for a product ID.
|
||||
*
|
||||
* @param int $product_id The product ID.
|
||||
* @return string
|
||||
*/
|
||||
protected static function get_storage_key( $product_id ) : string {
|
||||
return sprintf('wccom-product-installation-state-%d', $product_id);
|
||||
return sprintf( 'wccom-product-installation-state-%d', $product_id );
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -2,144 +2,341 @@
|
|||
/**
|
||||
* State for the WCCOM Site installation process.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation
|
||||
* @package WooCommerce\WCCOM
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_State class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_State {
|
||||
/**
|
||||
* The product ID.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $product_id;
|
||||
/**
|
||||
* The idempotency key.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $idempotency_key;
|
||||
/**
|
||||
* The last step name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $last_step_name;
|
||||
/**
|
||||
* The last step status.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $last_step_status;
|
||||
/**
|
||||
* The last step error.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $last_step_error;
|
||||
|
||||
/**
|
||||
* The product type.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $product_type;
|
||||
/**
|
||||
* The product name.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $product_name;
|
||||
/**
|
||||
* The product slug.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $download_url;
|
||||
/**
|
||||
* The path to the downloaded file.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $download_path;
|
||||
/**
|
||||
* The path to the unpacked file.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $unpacked_path;
|
||||
/**
|
||||
* The path to the installed file.
|
||||
*
|
||||
* @var string
|
||||
*/
|
||||
protected $installed_path;
|
||||
/**
|
||||
* The plugin info for the already installed plugin.
|
||||
*
|
||||
* @var array
|
||||
*/
|
||||
protected $already_installed_plugin_info;
|
||||
|
||||
/**
|
||||
* The timestamp of the installation start.
|
||||
*
|
||||
* @var int
|
||||
*/
|
||||
protected $started_date;
|
||||
const STEP_STATUS_IN_PROGRESS = 'in-progress';
|
||||
const STEP_STATUS_FAILED = 'failed';
|
||||
const STEP_STATUS_COMPLETED = 'completed';
|
||||
|
||||
const STEP_STATUS_IN_PROGRESS = 'in-progress';
|
||||
const STEP_STATUS_FAILED = 'failed';
|
||||
const STEP_STATUS_COMPLETED = 'completed';
|
||||
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param string $product_id The product ID.
|
||||
*/
|
||||
protected function __construct( $product_id ) {
|
||||
$this->product_id = $product_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiate an existing installation state.
|
||||
*
|
||||
* @param int $product_id The product ID.
|
||||
* @param string $idempotency_key The idempotency key.
|
||||
* @param string $last_step_name The last step name.
|
||||
* @param string $last_step_status The last step status.
|
||||
* @param string $last_step_error The last step error.
|
||||
* @param int $started_date The timestamp of the installation start.
|
||||
* @return WC_WCCOM_Site_Installation_State The instance.
|
||||
*/
|
||||
public static function initiate_existing( $product_id, $idempotency_key, $last_step_name, $last_step_status, $last_step_error, $started_date ) {
|
||||
$instance = new self( $product_id );
|
||||
$instance->idempotency_key = $idempotency_key;
|
||||
$instance->last_step_name = $last_step_name;
|
||||
$instance = new self( $product_id );
|
||||
$instance->idempotency_key = $idempotency_key;
|
||||
$instance->last_step_name = $last_step_name;
|
||||
$instance->last_step_status = $last_step_status;
|
||||
$instance->last_step_error = $last_step_error;
|
||||
$instance->started_date = $started_date;
|
||||
$instance->last_step_error = $last_step_error;
|
||||
$instance->started_date = $started_date;
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiate a new installation state.
|
||||
*
|
||||
* @param init $product_id The product ID.
|
||||
* @param string $idempotency_key The idempotency key.
|
||||
* @return WC_WCCOM_Site_Installation_State The instance.
|
||||
*/
|
||||
public static function initiate_new( $product_id, $idempotency_key ) {
|
||||
$instance = new self( $product_id );
|
||||
$instance = new self( $product_id );
|
||||
$instance->idempotency_key = $idempotency_key;
|
||||
$instance->started_date = time();
|
||||
$instance->started_date = time();
|
||||
|
||||
return $instance;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the product ID.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_product_id() {
|
||||
return $this->product_id;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the idempotency key.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_idempotency_key() {
|
||||
return $this->idempotency_key;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the timestamp of the installation start.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_last_step_name() {
|
||||
return $this->last_step_name;
|
||||
}
|
||||
|
||||
public function get_last_step_status( ) {
|
||||
/**
|
||||
* Get the last step status.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_last_step_status() {
|
||||
return $this->last_step_status;
|
||||
}
|
||||
|
||||
public function get_last_step_error( ) {
|
||||
/**
|
||||
* Get the last step error.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_last_step_error() {
|
||||
return $this->last_step_error;
|
||||
}
|
||||
|
||||
/**
|
||||
* Initiate a step.
|
||||
*
|
||||
* @param string $step_name Step name.
|
||||
* @return void
|
||||
*/
|
||||
public function initiate_step( $step_name ) {
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_status = self::STEP_STATUS_IN_PROGRESS;
|
||||
}
|
||||
|
||||
/**
|
||||
* Capture a successful installation of a step.
|
||||
*
|
||||
* @param string $step_name The step name.
|
||||
*/
|
||||
public function complete_step( $step_name ) {
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_status = self::STEP_STATUS_COMPLETED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Capture an installation failure.
|
||||
*
|
||||
* @param string $step_name The step name.
|
||||
* @param string $error_code The error code.
|
||||
*/
|
||||
public function capture_failure( $step_name, $error_code ) {
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_error = $error_code;
|
||||
$this->last_step_name = $step_name;
|
||||
$this->last_step_error = $error_code;
|
||||
$this->last_step_status = self::STEP_STATUS_FAILED;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the product type.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_product_type() {
|
||||
return $this->product_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the product type.
|
||||
*
|
||||
* @param string $product_type The product type.
|
||||
*/
|
||||
public function set_product_type( $product_type ) {
|
||||
$this->product_type = $product_type;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the product name.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_product_name() {
|
||||
return $this->product_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the product name.
|
||||
*
|
||||
* @param string $product_name The product name.
|
||||
*/
|
||||
public function set_product_name( $product_name ) {
|
||||
$this->product_name = $product_name;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the download URL.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_download_url() {
|
||||
return $this->download_url;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the download URL.
|
||||
*
|
||||
* @param string $download_url The download URL.
|
||||
*/
|
||||
public function set_download_url( $download_url ) {
|
||||
$this->download_url = $download_url;
|
||||
}
|
||||
|
||||
public function get_download_path( ) {
|
||||
/**
|
||||
* Get the path to the downloaded file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_download_path() {
|
||||
return $this->download_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path to the downloaded file.
|
||||
*
|
||||
* @param string $download_path The path to the downloaded file.
|
||||
*/
|
||||
public function set_download_path( $download_path ) {
|
||||
$this->download_path = $download_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the path to the unpacked file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_unpacked_path() {
|
||||
return $this->unpacked_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path to the unpacked file.
|
||||
*
|
||||
* @param string $unpacked_path The path to the unpacked file.
|
||||
*/
|
||||
public function set_unpacked_path( $unpacked_path ) {
|
||||
$this->unpacked_path = $unpacked_path;
|
||||
}
|
||||
|
||||
public function get_installed_path( ) {
|
||||
/**
|
||||
* Get the path to the installed file.
|
||||
*
|
||||
* @return string
|
||||
*/
|
||||
public function get_installed_path() {
|
||||
return $this->installed_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the path to the installed file.
|
||||
*
|
||||
* @param string $installed_path The path to the installed file.
|
||||
*/
|
||||
public function set_installed_path( $installed_path ) {
|
||||
$this->installed_path = $installed_path;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the plugin info for the already installed plugin.
|
||||
*
|
||||
* @return array
|
||||
*/
|
||||
public function get_already_installed_plugin_info() {
|
||||
return $this->already_installed_plugin_info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Set the plugin info for the already installed plugin.
|
||||
*
|
||||
* @param array $plugin_info The plugin info.
|
||||
*/
|
||||
public function set_already_installed_plugin_info( $plugin_info ) {
|
||||
$this->already_installed_plugin_info = $plugin_info;
|
||||
}
|
||||
|
||||
/**
|
||||
* Get the timestamp of the installation start.
|
||||
*
|
||||
* @return int
|
||||
*/
|
||||
public function get_started_date() {
|
||||
return $this->started_date;
|
||||
}
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
/**
|
||||
* Activate product step.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
use WC_REST_WCCOM_Site_Installer_Error_Codes as Installer_Error_Codes;
|
||||
|
@ -10,11 +11,22 @@ use WC_REST_WCCOM_Site_Installer_Error as Installer_Error;
|
|||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Step_Activate_Product Class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state ) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*/
|
||||
public function run() {
|
||||
$product_id = $this->state->get_product_id();
|
||||
|
||||
|
@ -27,6 +39,11 @@ class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_
|
|||
return $this->state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate plugin.
|
||||
*
|
||||
* @param int $product_id Product ID.
|
||||
*/
|
||||
private function activate_plugin( $product_id ) {
|
||||
// Clear plugins cache used in `WC_Helper::get_local_woo_plugins`.
|
||||
wp_clean_plugins_cache();
|
||||
|
@ -41,9 +58,9 @@ class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_
|
|||
if ( false === $filename ) {
|
||||
$plugins = wp_list_filter(
|
||||
WC_Helper::get_local_woo_plugins(),
|
||||
[
|
||||
array(
|
||||
'_product_id' => $product_id,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$filename = is_array( $plugins ) && ! empty( $plugins ) ? key( $plugins ) : '';
|
||||
|
@ -60,6 +77,11 @@ class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_
|
|||
}
|
||||
}
|
||||
|
||||
/**
|
||||
* Activate theme.
|
||||
*
|
||||
* @param int $product_id Product ID.
|
||||
*/
|
||||
private function activate_theme( $product_id ) {
|
||||
// Clear plugins cache used in `WC_Helper::get_local_woo_themes`.
|
||||
wp_clean_themes_cache();
|
||||
|
@ -74,9 +96,9 @@ class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_
|
|||
if ( false === $theme_slug ) {
|
||||
$themes = wp_list_filter(
|
||||
WC_Helper::get_local_woo_themes(),
|
||||
[
|
||||
array(
|
||||
'_product_id' => $product_id,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
$theme_slug = is_array( $themes ) && ! empty( $themes ) ? dirname( key( $themes ) ) : '';
|
||||
|
@ -89,6 +111,11 @@ class WC_WCCOM_Site_Installation_Step_Activate_Product implements WC_WCCOM_Site_
|
|||
switch_theme( $theme_slug );
|
||||
}
|
||||
|
||||
/**
|
||||
* Get WP.org product directory name.
|
||||
*
|
||||
* @return string|false
|
||||
*/
|
||||
private function get_wporg_product_dir_name() {
|
||||
if ( empty( $this->state->get_installed_path() ) ) {
|
||||
return false;
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
/**
|
||||
* Download product step.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
use WC_REST_WCCOM_Site_Installer_Error_Codes as Installer_Error_Codes;
|
||||
|
@ -10,11 +11,24 @@ use WC_REST_WCCOM_Site_Installer_Error as Installer_Error;
|
|||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Step_Download_Product class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Step_Download_Product implements WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state ) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*
|
||||
* @throws Installer_Error Installer Error.
|
||||
*/
|
||||
public function run() {
|
||||
$upgrader = WC_WCCOM_Site_Installer::get_wp_upgrader();
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
/**
|
||||
* Get product info step.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
use WC_REST_WCCOM_Site_Installer_Error_Codes as Installer_Error_Codes;
|
||||
|
@ -10,23 +11,37 @@ use WC_REST_WCCOM_Site_Installer_Error as Installer_Error;
|
|||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Step_Get_Product_Info class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Step_Get_Product_Info implements WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state ) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*
|
||||
* @throws Installer_Error Installer Error.
|
||||
* @return array
|
||||
*/
|
||||
public function run() {
|
||||
$product_id = $this->state->get_product_id();
|
||||
|
||||
// Get product info from woocommerce.com.
|
||||
$request = WC_Helper_API::get(
|
||||
add_query_arg(
|
||||
[ 'product_id' => $product_id ],
|
||||
array( 'product_id' => $product_id ),
|
||||
'info'
|
||||
),
|
||||
[
|
||||
array(
|
||||
'authenticated' => true,
|
||||
]
|
||||
)
|
||||
);
|
||||
|
||||
if ( 200 !== wp_remote_retrieve_response_code( $request ) ) {
|
||||
|
@ -39,7 +54,6 @@ class WC_WCCOM_Site_Installation_Step_Get_Product_Info implements WC_WCCOM_Site_
|
|||
throw new Installer_Error( Installer_Error_Codes::INVALID_PRODUCT_INFO_RESPONSE );
|
||||
}
|
||||
|
||||
|
||||
if ( ! empty( $result['_wporg_product'] ) ) {
|
||||
$download_url = $this->get_wporg_download_url( $result );
|
||||
} else {
|
||||
|
@ -53,7 +67,14 @@ class WC_WCCOM_Site_Installation_Step_Get_Product_Info implements WC_WCCOM_Site_
|
|||
return $this->state;
|
||||
}
|
||||
|
||||
|
||||
/**
|
||||
* Get download URL for wporg product.
|
||||
*
|
||||
* @param array $data Product data.
|
||||
*
|
||||
* @return string|null
|
||||
* @throws Installer_Error Installer Error.
|
||||
*/
|
||||
protected function get_wporg_download_url( $data ) {
|
||||
if ( empty( $data['_wporg_product'] ) ) {
|
||||
return null;
|
||||
|
@ -66,6 +87,14 @@ class WC_WCCOM_Site_Installation_Step_Get_Product_Info implements WC_WCCOM_Site_
|
|||
return $data['download_link'];
|
||||
}
|
||||
|
||||
/**
|
||||
* Get download URL for wccom product.
|
||||
*
|
||||
* @param int $product_id Product ID.
|
||||
*
|
||||
* @return string
|
||||
* @throws Installer_Error Installer Error.
|
||||
*/
|
||||
protected function get_wccom_download_url( $product_id ) {
|
||||
WC_Helper::_flush_subscriptions_cache();
|
||||
|
||||
|
|
|
@ -2,16 +2,28 @@
|
|||
/**
|
||||
* Move product to the correct location.
|
||||
*
|
||||
* @package @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Step_Move_Product class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Step_Move_Product implements WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state ) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*/
|
||||
public function run() {
|
||||
$upgrader = WC_WCCOM_Site_Installer::get_wp_upgrader();
|
||||
|
||||
|
|
|
@ -2,7 +2,8 @@
|
|||
/**
|
||||
* Get product info step.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
use WC_REST_WCCOM_Site_Installer_Error_Codes as Installer_Error_Codes;
|
||||
|
@ -10,11 +11,22 @@ use WC_REST_WCCOM_Site_Installer_Error as Installer_Error;
|
|||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
/**
|
||||
* WC_WCCOM_Site_Installation_Step_Unpack_Product class
|
||||
*/
|
||||
class WC_WCCOM_Site_Installation_Step_Unpack_Product implements WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state ) {
|
||||
$this->state = $state;
|
||||
}
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*/
|
||||
public function run() {
|
||||
$upgrader = WC_WCCOM_Site_Installer::get_wp_upgrader();
|
||||
$unpacked_path = $upgrader->unpack_package( $this->state->get_download_path(), true );
|
||||
|
|
|
@ -2,13 +2,22 @@
|
|||
/**
|
||||
* Interface for installation steps.
|
||||
*
|
||||
* @package WooCommerce\WCCOM\Installation\Installation_Steps
|
||||
* @package WooCommerce\WCCom
|
||||
* @since 7.7.0
|
||||
*/
|
||||
|
||||
defined( 'ABSPATH' ) || exit;
|
||||
|
||||
interface WC_WCCOM_Site_Installation_Step {
|
||||
/**
|
||||
* Constructor.
|
||||
*
|
||||
* @param array $state The current installation state.
|
||||
*/
|
||||
public function __construct( $state );
|
||||
|
||||
/**
|
||||
* Run the step installation process.
|
||||
*/
|
||||
public function run();
|
||||
}
|
||||
|
|
|
@ -15,76 +15,76 @@ defined( 'ABSPATH' ) || exit;
|
|||
*/
|
||||
class WC_REST_WCCOM_Site_Installer_Error_Codes {
|
||||
|
||||
const NOT_AUTHENTICATED = 'not_authenticated';
|
||||
const NO_ACCESS_TOKEN = 'no_access_token';
|
||||
const NO_SIGNATURE = 'no_signature';
|
||||
const SITE_NOT_CONNECTED = 'site_not_connnected';
|
||||
const INVALID_TOKEN = 'invalid_token';
|
||||
const REQUEST_VERIFICATION_FAILED = 'request_verification_failed';
|
||||
const USER_NOT_FOUND = 'user_not_found';
|
||||
const NO_PERMISSION = 'forbidden';
|
||||
const IDEMPOTENCY_KEY_MISMATCH = 'idempotency_key_mismatch';
|
||||
const NO_INITIATED_INSTALLATION_FOUND = 'no_initiated_installation_found';
|
||||
const ALL_INSTALLATION_STEPS_RUN = 'all_installation_steps_run';
|
||||
const REQUESTED_STEP_ALREADY_RUN = 'requested_step_already_run';
|
||||
const PLUGIN_ALREADY_INSTALLED = 'plugin_already_installed';
|
||||
const INSTALLATION_ALREADY_RUNNING = 'installation_already_running';
|
||||
const INSTALLATION_FAILED = 'installation_failed';
|
||||
const FILESYSTEM_REQUIREMENTS_NOT_MET = 'filesystem_requirements_not_met';
|
||||
const FAILED_GETTING_PRODUCT_INFO = 'product_info_failed';
|
||||
const INVALID_PRODUCT_INFO_RESPONSE = 'invalid_product_info_response';
|
||||
const WCCOM_PRODUCT_MISSING_SUBSCRIPTION = 'wccom_product_missing_subscription';
|
||||
const WCCOM_PRODUCT_MISSING_PACKAGE = 'wccom_product_missing_package';
|
||||
const NOT_AUTHENTICATED = 'not_authenticated';
|
||||
const NO_ACCESS_TOKEN = 'no_access_token';
|
||||
const NO_SIGNATURE = 'no_signature';
|
||||
const SITE_NOT_CONNECTED = 'site_not_connnected';
|
||||
const INVALID_TOKEN = 'invalid_token';
|
||||
const REQUEST_VERIFICATION_FAILED = 'request_verification_failed';
|
||||
const USER_NOT_FOUND = 'user_not_found';
|
||||
const NO_PERMISSION = 'forbidden';
|
||||
const IDEMPOTENCY_KEY_MISMATCH = 'idempotency_key_mismatch';
|
||||
const NO_INITIATED_INSTALLATION_FOUND = 'no_initiated_installation_found';
|
||||
const ALL_INSTALLATION_STEPS_RUN = 'all_installation_steps_run';
|
||||
const REQUESTED_STEP_ALREADY_RUN = 'requested_step_already_run';
|
||||
const PLUGIN_ALREADY_INSTALLED = 'plugin_already_installed';
|
||||
const INSTALLATION_ALREADY_RUNNING = 'installation_already_running';
|
||||
const INSTALLATION_FAILED = 'installation_failed';
|
||||
const FILESYSTEM_REQUIREMENTS_NOT_MET = 'filesystem_requirements_not_met';
|
||||
const FAILED_GETTING_PRODUCT_INFO = 'product_info_failed';
|
||||
const INVALID_PRODUCT_INFO_RESPONSE = 'invalid_product_info_response';
|
||||
const WCCOM_PRODUCT_MISSING_SUBSCRIPTION = 'wccom_product_missing_subscription';
|
||||
const WCCOM_PRODUCT_MISSING_PACKAGE = 'wccom_product_missing_package';
|
||||
const WPORG_PRODUCT_MISSING_DOWNLOAD_LINK = 'wporg_product_missing_download_link';
|
||||
const MISSING_DOWNLOAD_PATH = 'missing_download_path';
|
||||
const MISSING_UNPACKED_PATH = 'missing_unpacked_path';
|
||||
const UNKNOWN_FILENAME = 'unknown_filename';
|
||||
const PLUGIN_ACTIVATION_ERROR = 'plugin_activation_error';
|
||||
const UNEXPECTED_ERROR = 'unexpected_error';
|
||||
const FAILED_TO_RESET_INSTALLATION_STATE = 'failed_to_reset_installation_state';
|
||||
const MISSING_DOWNLOAD_PATH = 'missing_download_path';
|
||||
const MISSING_UNPACKED_PATH = 'missing_unpacked_path';
|
||||
const UNKNOWN_FILENAME = 'unknown_filename';
|
||||
const PLUGIN_ACTIVATION_ERROR = 'plugin_activation_error';
|
||||
const UNEXPECTED_ERROR = 'unexpected_error';
|
||||
const FAILED_TO_RESET_INSTALLATION_STATE = 'failed_to_reset_installation_state';
|
||||
|
||||
const ERROR_MESSAGES = [
|
||||
self::NOT_AUTHENTICATED => 'Authentication required',
|
||||
self::NO_ACCESS_TOKEN => 'No access token provided',
|
||||
self::NO_SIGNATURE => 'No signature provided',
|
||||
self::SITE_NOT_CONNECTED => 'Site not connected to WooCommerce.com',
|
||||
self::INVALID_TOKEN => 'Invalid access token provided',
|
||||
self::REQUEST_VERIFICATION_FAILED => 'Request verification by signature failed',
|
||||
self::USER_NOT_FOUND => 'Token owning user not found',
|
||||
self::NO_PERMISSION => 'You do not have permission to install plugin or theme',
|
||||
self::IDEMPOTENCY_KEY_MISMATCH => 'Idempotency key mismatch',
|
||||
self::NO_INITIATED_INSTALLATION_FOUND => 'No initiated installation for the product found',
|
||||
self::ALL_INSTALLATION_STEPS_RUN => 'All installation steps have been run',
|
||||
self::REQUESTED_STEP_ALREADY_RUN => 'Requested step has already been run',
|
||||
self::PLUGIN_ALREADY_INSTALLED => 'The plugin has already been installed',
|
||||
self::INSTALLATION_ALREADY_RUNNING => 'The installation of the plugin is already running',
|
||||
self::INSTALLATION_FAILED => 'The installation of the plugin failed',
|
||||
self::FILESYSTEM_REQUIREMENTS_NOT_MET => 'The filesystem requirements are not met',
|
||||
self::FAILED_GETTING_PRODUCT_INFO => 'Failed to retrieve product info from woocommerce.com',
|
||||
self::INVALID_PRODUCT_INFO_RESPONSE => 'Invalid product info response from woocommerce.com',
|
||||
const ERROR_MESSAGES = array(
|
||||
self::NOT_AUTHENTICATED => 'Authentication required',
|
||||
self::NO_ACCESS_TOKEN => 'No access token provided',
|
||||
self::NO_SIGNATURE => 'No signature provided',
|
||||
self::SITE_NOT_CONNECTED => 'Site not connected to WooCommerce.com',
|
||||
self::INVALID_TOKEN => 'Invalid access token provided',
|
||||
self::REQUEST_VERIFICATION_FAILED => 'Request verification by signature failed',
|
||||
self::USER_NOT_FOUND => 'Token owning user not found',
|
||||
self::NO_PERMISSION => 'You do not have permission to install plugin or theme',
|
||||
self::IDEMPOTENCY_KEY_MISMATCH => 'Idempotency key mismatch',
|
||||
self::NO_INITIATED_INSTALLATION_FOUND => 'No initiated installation for the product found',
|
||||
self::ALL_INSTALLATION_STEPS_RUN => 'All installation steps have been run',
|
||||
self::REQUESTED_STEP_ALREADY_RUN => 'Requested step has already been run',
|
||||
self::PLUGIN_ALREADY_INSTALLED => 'The plugin has already been installed',
|
||||
self::INSTALLATION_ALREADY_RUNNING => 'The installation of the plugin is already running',
|
||||
self::INSTALLATION_FAILED => 'The installation of the plugin failed',
|
||||
self::FILESYSTEM_REQUIREMENTS_NOT_MET => 'The filesystem requirements are not met',
|
||||
self::FAILED_GETTING_PRODUCT_INFO => 'Failed to retrieve product info from woocommerce.com',
|
||||
self::INVALID_PRODUCT_INFO_RESPONSE => 'Invalid product info response from woocommerce.com',
|
||||
self::WCCOM_PRODUCT_MISSING_SUBSCRIPTION => 'Product subscription is missing',
|
||||
self::WCCOM_PRODUCT_MISSING_PACKAGE => 'Could not find product package',
|
||||
self::MISSING_DOWNLOAD_PATH => 'Download path is missing',
|
||||
self::MISSING_UNPACKED_PATH => 'Unpacked path is missing',
|
||||
self::UNKNOWN_FILENAME => 'Unknown product filename',
|
||||
self::PLUGIN_ACTIVATION_ERROR => 'Plugin activation error',
|
||||
self::UNEXPECTED_ERROR => 'Unexpected error',
|
||||
self::WCCOM_PRODUCT_MISSING_PACKAGE => 'Could not find product package',
|
||||
self::MISSING_DOWNLOAD_PATH => 'Download path is missing',
|
||||
self::MISSING_UNPACKED_PATH => 'Unpacked path is missing',
|
||||
self::UNKNOWN_FILENAME => 'Unknown product filename',
|
||||
self::PLUGIN_ACTIVATION_ERROR => 'Plugin activation error',
|
||||
self::UNEXPECTED_ERROR => 'Unexpected error',
|
||||
self::FAILED_TO_RESET_INSTALLATION_STATE => 'Failed to reset installation state',
|
||||
];
|
||||
);
|
||||
|
||||
const HTTP_CODES = [
|
||||
self::NOT_AUTHENTICATED => 401,
|
||||
self::NO_ACCESS_TOKEN => 400,
|
||||
self::NO_SIGNATURE => 400,
|
||||
self::SITE_NOT_CONNECTED => 401,
|
||||
self::INVALID_TOKEN => 401,
|
||||
self::REQUEST_VERIFICATION_FAILED => 400,
|
||||
self::USER_NOT_FOUND => 401,
|
||||
self::NO_PERMISSION => 403,
|
||||
self::IDEMPOTENCY_KEY_MISMATCH => 400,
|
||||
const HTTP_CODES = array(
|
||||
self::NOT_AUTHENTICATED => 401,
|
||||
self::NO_ACCESS_TOKEN => 400,
|
||||
self::NO_SIGNATURE => 400,
|
||||
self::SITE_NOT_CONNECTED => 401,
|
||||
self::INVALID_TOKEN => 401,
|
||||
self::REQUEST_VERIFICATION_FAILED => 400,
|
||||
self::USER_NOT_FOUND => 401,
|
||||
self::NO_PERMISSION => 403,
|
||||
self::IDEMPOTENCY_KEY_MISMATCH => 400,
|
||||
self::NO_INITIATED_INSTALLATION_FOUND => 400,
|
||||
self::ALL_INSTALLATION_STEPS_RUN => 400,
|
||||
self::REQUESTED_STEP_ALREADY_RUN => 400,
|
||||
self::UNEXPECTED_ERROR => 500,
|
||||
];
|
||||
self::ALL_INSTALLATION_STEPS_RUN => 400,
|
||||
self::REQUESTED_STEP_ALREADY_RUN => 400,
|
||||
self::UNEXPECTED_ERROR => 500,
|
||||
);
|
||||
}
|
||||
|
|
|
@ -10,27 +10,42 @@ defined( 'ABSPATH' ) || exit;
|
|||
|
||||
/**
|
||||
* WCCOM Site Installer Error Class
|
||||
*
|
||||
*/
|
||||
class WC_REST_WCCOM_Site_Installer_Error extends Exception {
|
||||
|
||||
public function __construct($error_code, $error_message = null, $http_code = null) {
|
||||
$this->error_code = $error_code;
|
||||
/**
|
||||
* Constructor for the Installer Error class.
|
||||
*
|
||||
* @param string $error_code Error code.
|
||||
* @param string $error_message Error message.
|
||||
* @param int $http_code HTTP status code.
|
||||
*/
|
||||
public function __construct( $error_code, $error_message = null, $http_code = null ) {
|
||||
$this->error_code = $error_code;
|
||||
$this->error_message = $error_message ?? WC_REST_WCCOM_Site_Installer_Error_Codes::ERROR_MESSAGES[ $error_code ] ?? '';
|
||||
$this->http_code = $http_code ?? WC_REST_WCCOM_Site_Installer_Error_Codes::HTTP_CODES[ $error_code ] ?? 400;
|
||||
$this->http_code = $http_code ?? WC_REST_WCCOM_Site_Installer_Error_Codes::HTTP_CODES[ $error_code ] ?? 400;
|
||||
|
||||
parent::__construct( $error_code );
|
||||
}
|
||||
|
||||
public function get_error_code( ) {
|
||||
/**
|
||||
* Get the error code.
|
||||
*/
|
||||
public function get_error_code() {
|
||||
return $this->error_code;
|
||||
}
|
||||
|
||||
public function get_error_message( ) {
|
||||
/**
|
||||
* Get the error message.
|
||||
*/
|
||||
public function get_error_message() {
|
||||
return $this->error_message;
|
||||
}
|
||||
|
||||
public function get_http_code( ) {
|
||||
/**
|
||||
* Get the HTTP status code.
|
||||
*/
|
||||
public function get_http_code() {
|
||||
return $this->http_code;
|
||||
}
|
||||
}
|
||||
|
|
|
@ -44,43 +44,43 @@ class WC_REST_WCCOM_Site_Installer_Controller_V2 extends WC_REST_Controller {
|
|||
register_rest_route(
|
||||
$this->namespace,
|
||||
'/' . $this->rest_base,
|
||||
[
|
||||
[
|
||||
array(
|
||||
array(
|
||||
'methods' => WP_REST_Server::EDITABLE,
|
||||
'callback' => [ $this, 'install' ],
|
||||
'permission_callback' => [ $this, 'check_permission' ],
|
||||
'args' => [
|
||||
'product-id' => [
|
||||
'callback' => array( $this, 'install' ),
|
||||
'permission_callback' => array( $this, 'check_permission' ),
|
||||
'args' => array(
|
||||
'product-id' => array(
|
||||
'required' => true,
|
||||
'type' => 'integer',
|
||||
],
|
||||
'run-until-step' => [
|
||||
),
|
||||
'run-until-step' => array(
|
||||
'required' => true,
|
||||
'type' => 'string',
|
||||
'enum' => WC_WCCOM_Site_Installation_Manager::STEPS,
|
||||
],
|
||||
'idempotency-key' => [
|
||||
'enum' => WC_WCCOM_Site_Installation_Manager::STEPS,
|
||||
),
|
||||
'idempotency-key' => array(
|
||||
'required' => true,
|
||||
'type' => 'string',
|
||||
],
|
||||
],
|
||||
],
|
||||
[
|
||||
),
|
||||
),
|
||||
),
|
||||
array(
|
||||
'methods' => WP_REST_Server::DELETABLE,
|
||||
'callback' => [ $this, 'reset_install' ],
|
||||
'permission_callback' => [ $this, 'check_permission' ],
|
||||
'args' => [
|
||||
'product-id' => [
|
||||
'callback' => array( $this, 'reset_install' ),
|
||||
'permission_callback' => array( $this, 'check_permission' ),
|
||||
'args' => array(
|
||||
'product-id' => array(
|
||||
'required' => true,
|
||||
'type' => 'integer',
|
||||
],
|
||||
'idempotency-key' => [
|
||||
),
|
||||
'idempotency-key' => array(
|
||||
'required' => true,
|
||||
'type' => 'string',
|
||||
],
|
||||
],
|
||||
],
|
||||
]
|
||||
),
|
||||
),
|
||||
),
|
||||
)
|
||||
);
|
||||
}
|
||||
|
||||
|
@ -95,6 +95,11 @@ class WC_REST_WCCOM_Site_Installer_Controller_V2 extends WC_REST_Controller {
|
|||
$current_user = wp_get_current_user();
|
||||
|
||||
if ( empty( $current_user ) || ( $current_user instanceof WP_User && ! $current_user->exists() ) ) {
|
||||
/**
|
||||
* This filter allows to provide a custom error message when the user is not authenticated.
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
$error = apply_filters(
|
||||
WC_WCCOM_Site::AUTH_ERROR_FILTER_NAME,
|
||||
new Installer_Error( Installer_Error_Codes::NOT_AUTHENTICATED )
|
||||
|
@ -123,22 +128,21 @@ class WC_REST_WCCOM_Site_Installer_Controller_V2 extends WC_REST_Controller {
|
|||
*
|
||||
* @since 7.7.0
|
||||
* @param WP_REST_Request $request Full details about the request.
|
||||
* @return bool|WP_Error
|
||||
* @return WP_REST_Response|WP_Error
|
||||
*/
|
||||
public function install( $request ) {
|
||||
|
||||
try {
|
||||
$product_id = $request['product-id'];
|
||||
$run_until_step = $request['run-until-step'];
|
||||
$product_id = $request['product-id'];
|
||||
$run_until_step = $request['run-until-step'];
|
||||
$idempotency_key = $request['idempotency-key'];
|
||||
|
||||
$installation_manager = new WC_WCCOM_Site_Installation_Manager( $product_id, $idempotency_key );
|
||||
$installation_manager->run_installation( $run_until_step );
|
||||
|
||||
$response = $this->success_response($product_id);
|
||||
$response = $this->success_response( $product_id );
|
||||
|
||||
} catch (Installer_Error $exception) {
|
||||
$response = $this->failure_response($product_id, $exception);
|
||||
} catch ( Installer_Error $exception ) {
|
||||
$response = $this->failure_response( $product_id, $exception );
|
||||
}
|
||||
|
||||
return $response;
|
||||
|
@ -153,55 +157,78 @@ class WC_REST_WCCOM_Site_Installer_Controller_V2 extends WC_REST_Controller {
|
|||
*/
|
||||
public function reset_install( $request ) {
|
||||
try {
|
||||
$product_id = $request['product-id'];
|
||||
$product_id = $request['product-id'];
|
||||
$idempotency_key = $request['idempotency-key'];
|
||||
|
||||
$installation_manager = new WC_WCCOM_Site_Installation_Manager($product_id, $idempotency_key);
|
||||
$installation_manager = new WC_WCCOM_Site_Installation_Manager( $product_id, $idempotency_key );
|
||||
$installation_manager->reset_installation();
|
||||
|
||||
$response = $this->success_response($product_id);
|
||||
$response = $this->success_response( $product_id );
|
||||
|
||||
} catch (Installer_Error $exception) {
|
||||
$response = $this->failure_response($product_id, $exception);
|
||||
} catch ( Installer_Error $exception ) {
|
||||
$response = $this->failure_response( $product_id, $exception );
|
||||
}
|
||||
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a standardized response for a successful request.
|
||||
*
|
||||
* @param int $product_id Product ID.
|
||||
* @return WP_REST_Response|WP_Error
|
||||
*/
|
||||
protected function success_response( $product_id ) {
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $product_id );
|
||||
$response = rest_ensure_response([
|
||||
'success' => true,
|
||||
'state' => $state ? $this->map_state_to_response( $state ) : null,
|
||||
]);
|
||||
$response->set_status(200);
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $product_id );
|
||||
$response = rest_ensure_response(
|
||||
array(
|
||||
'success' => true,
|
||||
'state' => $state ? $this->map_state_to_response( $state ) : null,
|
||||
)
|
||||
);
|
||||
$response->set_status( 200 );
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Generate a standardized response for a failed request.
|
||||
*
|
||||
* @param int $product_id Product ID.
|
||||
* @param Installer_Error $exception The exception.
|
||||
* @return WP_REST_Response|WP_Error
|
||||
*/
|
||||
protected function failure_response( $product_id, $exception ) {
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $product_id );
|
||||
$response = rest_ensure_response([
|
||||
'success' => false,
|
||||
'error_code' => $exception->get_error_code(),
|
||||
'error_message' => $exception->get_error_message(),
|
||||
'state' => $state ? $this->map_state_to_response( $state ) : null,
|
||||
]);
|
||||
$state = WC_WCCOM_Site_Installation_State_Storage::get_state( $product_id );
|
||||
$response = rest_ensure_response(
|
||||
array(
|
||||
'success' => false,
|
||||
'error_code' => $exception->get_error_code(),
|
||||
'error_message' => $exception->get_error_message(),
|
||||
'state' => $state ? $this->map_state_to_response( $state ) : null,
|
||||
)
|
||||
);
|
||||
$response->set_status( $exception->get_http_code() );
|
||||
return $response;
|
||||
}
|
||||
|
||||
/**
|
||||
* Map the installation state to a response.
|
||||
*
|
||||
* @param WC_WCCOM_Site_Installation_State $state The installation state.
|
||||
* @return array
|
||||
*/
|
||||
protected function map_state_to_response( $state ) {
|
||||
return [
|
||||
'product_id' => $state->get_product_id(),
|
||||
'idempotency_key' => $state->get_idempotency_key(),
|
||||
'last_step_name' => $state->get_last_step_name(),
|
||||
'last_step_status' => $state->get_last_step_status(),
|
||||
'last_step_error' => $state->get_last_step_error(),
|
||||
'product_type' => $state->get_product_type(),
|
||||
'product_name' => $state->get_product_name(),
|
||||
return array(
|
||||
'product_id' => $state->get_product_id(),
|
||||
'idempotency_key' => $state->get_idempotency_key(),
|
||||
'last_step_name' => $state->get_last_step_name(),
|
||||
'last_step_status' => $state->get_last_step_status(),
|
||||
'last_step_error' => $state->get_last_step_error(),
|
||||
'product_type' => $state->get_product_type(),
|
||||
'product_name' => $state->get_product_name(),
|
||||
'already_installed_plugin_info' => $state->get_already_installed_plugin_info(),
|
||||
'started_seconds_ago' => time() - $state->get_started_date(),
|
||||
];
|
||||
'started_seconds_ago' => time() - $state->get_started_date(),
|
||||
);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
|
@ -80,6 +80,11 @@ class WC_REST_WCCOM_Site_Installer_Controller extends WC_REST_Controller {
|
|||
$current_user = wp_get_current_user();
|
||||
|
||||
if ( empty( $current_user ) || ( $current_user instanceof WP_User && ! $current_user->exists() ) ) {
|
||||
/**
|
||||
* This filter allows to provide a custom error message when the user is not authenticated.
|
||||
*
|
||||
* @since 3.7.0
|
||||
*/
|
||||
$error = apply_filters(
|
||||
WC_WCCOM_Site::AUTH_ERROR_FILTER_NAME,
|
||||
new Installer_Error( Installer_Error_Codes::NOT_AUTHENTICATED )
|
||||
|
|
Loading…
Reference in New Issue