Files
doitinpoland.com/wp-content/plugins/sitepress-multilingual-cms/classes/editor/ATEDetailedErrorMessage.php
2023-09-12 21:41:04 +02:00

137 lines
3.4 KiB
PHP

<?php
namespace WPML\TM\Editor;
use WPML\FP\Str;
use WPML\FP\Cast;
use WPML\FP\Obj;
use WPML\FP\Relation;
use WPML\LIB\WP\Option;
use WPML\TM\ATE\ClonedSites\ApiCommunication;
use WPML\UIPage;
use function WPML\FP\pipe;
class ATEDetailedErrorMessage {
const ERROR_DETAILS_OPTION = 'wpml_ate_error_details';
/**
* Parses error data and saves it to options table.
*
* @param $errorResponse
*
* @return void
*/
public static function saveDetailedError( $errorResponse ) {
$errorCode = $errorResponse->get_error_code();
$errorMessage = $errorResponse->get_error_message();
$errorData = $errorResponse->get_error_data( $errorCode );
$errorDetails = [
'code' => $errorCode,
'message' => $errorMessage,
'error_data' => $errorData,
];
self::saveErrorDetailsInOptions( $errorDetails );
}
/**
* Returns single or multiple formatted error message depending on errors array existence in response.
*
* @param string $appendText
*
* @return string|null
*/
public static function readDetailedError( $appendText = null ) {
$errorDetails = Option::getOr( self::ERROR_DETAILS_OPTION, [] );
$detailedError = self::hasValidExplainedMessage( $errorDetails )
? self::formattedDetailedErrors( $errorDetails, $appendText )
: (
self::isSiteMigrationError( $errorDetails )
? self::formattedSiteMigrationError( $errorDetails )
: null
);
self::deleteErrorDetailsFromOptions(); // deleting the option after message is ready to be displayed.
return $detailedError;
}
/**
* Checks if valid explained message exists in error response.
*
* @param array $errorDetails
*
* @return mixed
*/
private static function hasValidExplainedMessage( $errorDetails ) {
$hasExplainedMessage = pipe(
Obj::path( [ 'error_data', 0, 'explained_message' ] ),
Str::len(),
Cast::toBool()
);
return $hasExplainedMessage( $errorDetails );
}
/**
* Checks if error is "Site moved or copied" (Happens when error code is 426)
*
* @param array $errorDetails
*
* @return mixed
*/
private static function isSiteMigrationError( $errorDetails ) {
$isSiteMigrationError = pipe(
Obj::prop( 'code' ),
Cast::toInt(),
Relation::equals( ApiCommunication::SITE_CLONED_ERROR )
);
return $isSiteMigrationError( $errorDetails );
}
/**
* The purpose of this function is to avoid the case when redirect is happened and data saved in this static class is lost
*
* @return void
*/
private static function saveErrorDetailsInOptions( $errorDetails ) {
Option::updateWithoutAutoLoad( self::ERROR_DETAILS_OPTION, $errorDetails );
}
/**
* Deletes the error details from options.
*
* @return void
*/
private static function deleteErrorDetailsFromOptions() {
Option::delete( self::ERROR_DETAILS_OPTION );
}
/**
* Returns multiple formatted error messages from errors array.
*
* @param array $errorDetails
* @param string $appendText
*
* @return string
*/
private static function formattedDetailedErrors( array $errorDetails, $appendText ) {
$appendText = $appendText ? '<div>' . $appendText . '</div>' : '';
$allErrors = '<div>';
foreach ( Obj::prop( 'error_data', $errorDetails ) as $error ) {
$allErrors .= '<div>' . Obj::propOr( '', 'explained_message', $error ) . '</div>';
}
return $allErrors . $appendText . '</div>';
}
private static function formattedSiteMigrationError( $errorDetails ) {
return '<div>' . Obj::prop( 'message', $errorDetails ) . '</div>';
}
}