214 lines
5.4 KiB
PHP
214 lines
5.4 KiB
PHP
<?php
|
|
/**
|
|
* Created by PhpStorm.
|
|
* User: alex
|
|
* Date: 7/18/18
|
|
* Time: 10:48 AM
|
|
*/
|
|
|
|
|
|
class Brizy_Admin_Cloud_Api extends Brizy_Admin_AbstractApi {
|
|
|
|
use Brizy_Admin_Cloud_SyncAware;
|
|
|
|
const nonce = 'brizy-api';
|
|
|
|
const AJAX_SIGNIN_ACTION = '-cloud-signin';
|
|
const AJAX_SIGNUP_ACTION = '-cloud-signup';
|
|
const AJAX_SIGNOUT_ACTION = '-cloud-signout';
|
|
const AJAX_RESET_PASSWORD_ACTION = '-cloud-resetpassword';
|
|
const AJAX_TRIGGER_SYNC_ACTION = '-cloud-sync';
|
|
const AJAX_SYNC_ALLOWED = '-cloud-sync-allowed';
|
|
|
|
/**
|
|
* @var Brizy_Editor_Project
|
|
*/
|
|
private $project;
|
|
|
|
/**
|
|
* @var Brizy_Admin_Cloud_Client
|
|
*/
|
|
private $cloudClient;
|
|
|
|
/**
|
|
* Brizy_Admin_Cloud_Api constructor.
|
|
*
|
|
* @param Brizy_Editor_Project $project
|
|
*/
|
|
public function __construct( $project ) {
|
|
|
|
$this->project = $project;
|
|
$this->setClient( Brizy_Admin_Cloud_Client::instance( $project, new WP_Http() ) );
|
|
parent::__construct();
|
|
}
|
|
|
|
/**
|
|
* @param Brizy_Editor_Project $project
|
|
*
|
|
* @return Brizy_Admin_Cloud_Api
|
|
* @throws Exception
|
|
*/
|
|
public static function _init( $project ) {
|
|
static $instance;
|
|
|
|
if ( ! $instance ) {
|
|
$instance = new self( $project );
|
|
}
|
|
|
|
return $instance;
|
|
}
|
|
|
|
|
|
protected function initializeApiActions() {
|
|
$pref = 'wp_ajax_' . Brizy_Editor::prefix();
|
|
add_action( $pref . self::AJAX_SIGNIN_ACTION, array( $this, 'actionSignIn' ) );
|
|
add_action( $pref . self::AJAX_SIGNUP_ACTION, array( $this, 'actionSignUp' ) );
|
|
add_action( $pref . self::AJAX_SIGNOUT_ACTION, array( $this, 'actionSignOut' ) );
|
|
add_action( $pref . self::AJAX_RESET_PASSWORD_ACTION, array( $this, 'actionResetPassword' ) );
|
|
add_action( $pref . self::AJAX_TRIGGER_SYNC_ACTION, array( $this, 'actionSync' ) );
|
|
add_action( $pref . self::AJAX_SYNC_ALLOWED, array( $this, 'actionSyncAllowed' ) );
|
|
}
|
|
|
|
public function actionSignIn() {
|
|
|
|
$this->verifyNonce( self::nonce );
|
|
|
|
$data = file_get_contents( "php://input" );
|
|
|
|
if ( ( $data = json_decode( $data ) ) === false ) {
|
|
$this->error( 400, 'Bad request' );
|
|
}
|
|
|
|
if ( $token = $this->getClient()->signIn( $data->email, $data->password ) ) {
|
|
|
|
// this is important when you delete block from cloud the local blocks
|
|
// will be deleted based on this valued
|
|
$this->project->setCloudAccountId( $token );
|
|
$this->project->setCloudToken( $token );
|
|
|
|
$containers = $this->getClient()->getContainers();
|
|
|
|
if ( isset( $containers[0] ) ) {
|
|
$this->project->setCloudContainer( $containers[0]->id );
|
|
} else {
|
|
$this->error( 400, 'SingIn failed. Invalid container.' );
|
|
}
|
|
|
|
$this->project->saveStorage();
|
|
|
|
$this->success( [] );
|
|
} else {
|
|
$this->error( 400, 'SingIn failed' );
|
|
}
|
|
}
|
|
|
|
public function actionSignUp() {
|
|
|
|
$this->verifyNonce( self::nonce );
|
|
|
|
$data = file_get_contents( "php://input" );
|
|
|
|
if ( ( $data = json_decode( $data ) ) === false ) {
|
|
$this->error( 400, 'Bad request' );
|
|
}
|
|
|
|
if ( $token = $this->getClient()->signUp( $data->firstName, $data->lastName, $data->email, $data->password, $data->confirmPassword ) ) {
|
|
|
|
// this is important when you delete block from cloud the local blocks
|
|
// will be deleted based on this valued
|
|
$this->project->setCloudAccountId( $token );
|
|
$this->project->setCloudToken( $token );
|
|
|
|
$containers = $this->getClient()->getContainers();
|
|
|
|
if ( isset( $containers[0] ) ) {
|
|
$this->project->setCloudContainer( $containers[0]->id );
|
|
} else {
|
|
$this->error( 400, 'Unable to obtain the container.' );
|
|
}
|
|
|
|
$this->project->saveStorage();
|
|
$this->success( [] );
|
|
} else {
|
|
$this->error( 400, 'Sing Up failed' );
|
|
}
|
|
}
|
|
|
|
public function actionSignOut() {
|
|
|
|
$this->verifyNonce( self::nonce );
|
|
|
|
// clear version in case something gets wonrg.
|
|
Brizy_Admin_Cloud_Client::clearVersionCache();
|
|
|
|
// this is important when you delete block from cloud the local blocks
|
|
// will be deleted based on this valued
|
|
$this->project->setCloudAccountId( null );
|
|
$this->project->setCloudToken( null );
|
|
$this->project->saveStorage();
|
|
|
|
wp_clear_scheduled_hook( Brizy_Admin_Cloud_Cron::BRIZY_CLOUD_CRON_KEY );
|
|
|
|
$this->success( [] );
|
|
}
|
|
|
|
public function actionResetPassword() {
|
|
|
|
$this->verifyNonce( self::nonce );
|
|
|
|
$data = file_get_contents( "php://input" );
|
|
|
|
if ( ( $data = json_decode( $data ) ) === false ) {
|
|
$this->error( 400, 'Bad request' );
|
|
}
|
|
|
|
if ( ! $data->email ) {
|
|
$this->error( 400, 'Invalid email' );
|
|
}
|
|
|
|
if ( $token = $this->getClient()->resetPassword( $data->email ) ) {
|
|
$this->success( [] );
|
|
} else {
|
|
$this->error( 400, 'Reset password failed' );
|
|
}
|
|
}
|
|
|
|
public function actionSync() {
|
|
try {
|
|
|
|
if ( ! $this->project->getCloudToken() ) {
|
|
$this->error( 400, 'Unauthorized' );
|
|
}
|
|
|
|
$merged = array_merge( $this->syncLayouts(0, true ), $this->syncBlocks(0, true ) );
|
|
|
|
return $this->success( [ 'synchronized' => count( $merged ) ] );
|
|
} catch ( Exception $e ) {
|
|
Brizy_Logger::instance()->critical( 'Sync failed', [ $e ] );
|
|
$this->error( 500, 'Sync failed' );
|
|
|
|
}
|
|
}
|
|
|
|
public function actionSyncAllowed() {
|
|
|
|
try {
|
|
$versions = $this->getClient()->getCloudEditorVersions();
|
|
$response = [];
|
|
$response['isSyncAllowed'] = $versions['sync'] == BRIZY_SYNC_VERSION;
|
|
|
|
return $this->success( $response );
|
|
} catch ( Exception $e ) {
|
|
Brizy_Logger::instance()->critical( 'Sync failed', [ $e ] );
|
|
$this->error( 400, 'Sync unauthorized.' );
|
|
}
|
|
}
|
|
|
|
/**
|
|
* @return null
|
|
*/
|
|
protected function getRequestNonce() {
|
|
return $this->param( 'hash' );
|
|
}
|
|
}
|