%PDF- %PDF-
Mini Shell

Mini Shell

Direktori : /var/www/tif-dev/wp-content/plugins/instapage/
Upload File :
Create Path :
Current File : //var/www/tif-dev/wp-content/plugins/instapage/InstapageCmsPluginAjaxController.php

<?php

/**
 * Main controller for AJAX actions. Results are returned as encoded JSON objects. Data for actions are stored in $_POST['data'] table.
 */
class InstapageCmsPluginAjaxController {

  /**
   * @var object Controller object for Singleton implementation.
   */
  private static $ajaxController = null;

  /**
   * Gets an instance of the object.
   */
  public static function getInstance() {

    if (self::$ajaxController === null) {
      self::$ajaxController = new InstapageCmsPluginAjaxController();
    }

    return self::$ajaxController;
  }

  /**
   * Executes an action set in the request.
   *
   * @param string $action Action to execute.
   * @param mixed $data Data passed to action.
   */
  public function doAction($action, $data = null) {
    InstapageCmsPluginHelper::writeDiagnostics($action, 'AJAX Action');

    if (!InstapageCmsPluginConnector::currentUserCanManage()) {
      echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('You don\'t have permission to perform that action.'), 'ERROR');
      exit;
    }

    switch ($action) {
      case 'loginUser':
        $this->loginUser();
      break;

      case 'getApiTokens':
        $this->getApiTokens();
      break;

      case 'connectSubAccounts':
        $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
        $subaccount->setSubAccountsStatus('connect');
      break;

      case 'disconnectSubAccounts':
        $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
        $subaccount->setSubAccountsStatus('disconnect');
      break;

      case 'disconnectAccountBoundSubaccounts':
        $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
        $subaccount->disconnectAccountBoundSubaccounts();
      break;

      case 'getAccountBoundSubAccounts':
        $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
        $subaccount->getAccountBoundSubAccounts();
      break;

      case 'updateOptions':
        if (InstapageCmsPluginHelper::updateOptions($data) !== false) {
          echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('Configuration updated'), 'OK');
        } else {
          echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('There was an error during configuration save'), 'ERROR');
        }
      break;

      case 'getOptions':
        echo json_encode((object) array(
          'status' => 'OK',
          'data' => InstapageCmsPluginHelper::getOptions()
       ));
      break;

      case 'getLog':
        $this->getLog();
      break;

      case 'clearLog':
        $log = InstapageCmsPluginDebugLogModel::getInstance();
        $log->clear();
        echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('Log cleared'), 'OK');
      break;

      case 'getMasterToken':
        $this->getMasterToken();
      break;

      case 'loadListPages':
        $this->loadListPages();
      break;

      case 'loadEditPage':
        $this->loadEditPage();
      break;

      case 'getLandingPages':
        $this->getLandingPages();
      break;

      case 'getStats':
        $this->getStats();
      break;

      case 'publishPage':
        $this->publishPage();
      break;

      case 'deletePage':
        $this->deletePage();
      break;

      case 'loadSettings':
        echo json_encode((object) array(
          'status' => 'OK',
          'html' => InstapageCmsPluginHelper::loadTemplate('settings', false),
          'initialData' => InstapageCmsPluginHelper::getOptions()
       ));
      break;

      case 'getProhibitedSlugs':
        $data = InstapageCmsPluginConnector::getSelectedConnector()->getProhibitedSlugs();
        echo json_encode((object) array(
          'status' => 'OK',
          'data' => $data
       ));
      break;

      case 'isProhibitedSlug':
        $data = InstapageCmsPluginConnector::getSelectedConnector()->isProhibitedSlug($data);
        echo json_encode((object) array(
          'status' => 'OK',
          'data' => $data
       ));
      break;

      case 'validateToken':
        $this->validateToken();
      break;

      case 'migrateDeprecatedData':
        $data = InstapageCmsPluginConnector::getSelectedConnector()->getDeprecatedData();
        $page = InstapageCmsPluginPageModel::getInstance();
        $raport = $page->migrateDeprecatedData($data);
        $raportStr = implode('<br />', $raport);
        echo InstapageCmsPluginHelper::formatJsonMessage($raportStr);
      break;

      default:
        echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('Unsupported InstapageCmsPluginAjaxController action'), 'ERROR');
    }
  }

  /**
   * Performs login by email and password in Instapage APP.
   */
  private function loginUser() {
    $api = InstapageCmsPluginAPIModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    $email = urldecode(isset($post->data->email) ? $post->data->email : '');
    $password = urldecode(isset($post->data->password) ? $post->data->password : '');
    $response = json_decode($api->authorise($email, $password));

    if (!InstapageCmsPluginHelper::checkResponse($response, null, false) || !$response->success) {
      $message = isset($response->message) ? $response->message : '';
      echo InstapageCmsPluginHelper::formatJsonMessage($message, 'ERROR');

      return false;
    } else {
      echo json_encode((object) array(
        'status' => 'OK',
        'data' => (object) $response->data
     ));
    }
  }

  /**
   * Validates tokens stored in the DB.
   */
  private function validateToken() {
    $api = InstapageCmsPluginAPIModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    $token = isset($post->data->token) ? $post->data->token : null;
    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader(array($token)));
    $response = json_decode($api->apiCall('page/get-sub-accounts-list', null, $headers));
    $subAccount = isset($response->data) ? $response->data : null;

    if (!InstapageCmsPluginHelper::checkResponse($response, null, false) || !$response->success || count($subAccount) == 0) {
      echo json_encode((object) array(
        'status' => 'OK',
        'valid' => false
     ));
    } else {
      echo json_encode((object) array(
        'status' => 'OK',
        'valid' => true
     ));
    }
  }

  /**
   * Gets the debug log stored in the DB.
   */
  private function getLog() {
    $log = InstapageCmsPluginDebugLogModel::getInstance();
    $sitenameSanitized = InstapageCmsPluginConnector::getSitename(true);

    try {
      $data = $log->getLogHTML();
      echo json_encode((object) array(
        'status' => 'OK',
        'data' => $data,
        'sitename' => $sitenameSanitized
     ));
    } catch (Exception $e) {
      echo InstapageCmsPluginHelper::formatJsonMessage($e->getMessage(), 'ERROR');
    }
  }

  /**
   * Gets the API  tokens stored in the DB.
   */
  private function getApiTokens() {
    $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
    $tokens = $subaccount->getAllTokens();
    echo json_encode((object) array(
      'status' => 'OK',
      'data' => $tokens
   ));
  }


  /**
   * Loads edit page.
   */
  private function loadEditPage() {
    $api = InstapageCmsPluginAPIModel::getInstance();
    $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    InstapageCmsPluginHelper::writeDiagnostics($post, 'Edit page POST');
    $tokens = isset($post->apiTokens) ? $post->apiTokens : false;

    if (!$tokens) {
      $tokens = $subaccount->getAllTokens();
    }

    $pageData = null;
    $subAccounts = null;
    $data = array();

    if (isset($post->data->id)) {
      $pageData = $post->data;
      $data['pages'] = array($post->data->instapage_id);
    }

    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader($tokens));
    $response = json_decode($api->apiCall('page/get-sub-accounts-list', $data, $headers));

    if (InstapageCmsPluginHelper::checkResponse($response)) {
      $subAccounts = $response->data;
    } else {
      return false;
    }

    $initialData = array('subAccounts' => $subAccounts, 'page' => $pageData);
    InstapageCmsPluginHelper::writeDiagnostics($initialData, 'Edit page initialData');

    echo json_encode((object) array(
      'status' => 'OK',
      'html' => InstapageCmsPluginHelper::loadTemplate('edit', false),
      'data' => (object) $initialData
   ));
  }

  /**
   * Loads listing page.
   */
  private function loadListPages() {
    $requestLimit = 100;
    $post = InstapageCmsPluginHelper::getPostData();
    $page = InstapageCmsPluginPageModel::getInstance();
    InstapageCmsPluginHelper::writeDiagnostics($post, 'List page POST');
    $api = InstapageCmsPluginAPIModel::getInstance();
    $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
    $localPagesArray = $page->getAll(array('id', 'instapage_id', 'slug', 'type', 'stats_cache', 'enterprise_url'));

    // WP Legacy code - automatic migration.
    $automaticMigration = InstapageCmsPluginHelper::getMetadata('automatic_migration', false);

    if (empty($automaticMigration) && !count($localPagesArray) && InstapageCmsPluginConnector::isWP() && InstapageCmsPluginConnector::getSelectedConnector()->legacyArePagesPresent()) {
      $data = InstapageCmsPluginConnector::getSelectedConnector()->getDeprecatedData();
      $page = InstapageCmsPluginPageModel::getInstance();
      $page->migrateDeprecatedData($data);
      $localPagesArray = $page->getAll(array('id', 'instapage_id', 'slug', 'type', 'stats_cache', 'enterprise_url'));
      InstapageCmsPluginHelper::updateMetadata('automatic_migration', time());
    }

    $pages = array();

    foreach ($localPagesArray as &$pageObject) {
      $pageObject->stats_cache = json_decode($pageObject->stats_cache);
      $pages[] = $pageObject->instapage_id;
    }

    $tokens = isset($post->apiTokens) ? $post->apiTokens : false;

    if (!$tokens) {
      $tokens = $subaccount->getAllTokens();
    }

    if (!count($tokens)) {
      echo json_encode((object) array(
        'status' => 'OK',
        'html' => InstapageCmsPluginHelper::loadTemplate('listing', false),
        'initialData' => $localPagesArray
     ));

      return true;
    }


    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader($tokens));
    $responses = array();

    for ($i = 0; $i * $requestLimit < count($pages); ++$i) {
      $dataSlice = array_slice($pages, $i * $requestLimit, $requestLimit);
      $data = array('pages' => $dataSlice);
      $responseJson = $api->apiCall('page/list', $data, $headers, 'GET');
      $response = json_decode($responseJson);

      if (InstapageCmsPluginHelper::checkResponse($response) && isset($response->data) && is_array($response->data)) {
        $responses[] = $response->data;
      } else {
        return false;
      }
    }

    $mergedResponse = array();

    foreach ($responses as $r) {
      $mergedResponse = array_merge($mergedResponse, $r);
    }

    $page->mergeListPagesResults($localPagesArray, $mergedResponse);
    InstapageCmsPluginHelper::writeDiagnostics($localPagesArray, 'List page array');
    echo json_encode((object) array(
      'status' => 'OK',
      'html' => InstapageCmsPluginHelper::loadTemplate('listing', false),
      'initialData' => $localPagesArray
   ));
  }

  /**
   * Gets the landing pages stored in the DB.
   */
  private function getLandingPages() {
    $api = InstapageCmsPluginAPIModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    $tokens = array($post->data->subAccountToken);
    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader($tokens));
    $responseJson = $api->apiCall('page/list', null, $headers);
    $response = json_decode($responseJson);
    $page = InstapageCmsPluginPageModel::getInstance();
    $publishedPages = $page->getAll(array('instapage_id'));
    $selfInstapageId  = isset($post->data->selfInstapageId) ? $post->data->selfInstapageId : null;

    if (InstapageCmsPluginHelper::checkResponse($response)) {
      if (is_array($response->data)) {
        foreach ($response->data as $key => $returnedPage) {
          foreach ($publishedPages as $published_page) {
            if ($returnedPage->id != $selfInstapageId  && $returnedPage->id == $published_page->instapage_id) {
              unset($response->data[$key]);
              break;
            }
          }
        }

        $response->data = array_values($response->data);
      } else {
        $response->data = array();
      }

      echo json_encode((object) array(
        'status' => 'OK',
        'data' => $response->data
     ));
    } else {
      return false;
    }
  }

  /**
   * Gets the stats of landing pages from local cache or from app, if cache is not present / invalid.
   */
  private function getStats() {
    $post = InstapageCmsPluginHelper::getPostData();
    $page = InstapageCmsPluginPageModel::getInstance();
    $api = InstapageCmsPluginAPIModel::getInstance();
    $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
    $pages = isset($post->data->pages) ? $post->data->pages : array();

    if (!count($pages)) {
      InstapageCmsPluginHelper::writeDiagnostics('Stats cond', 'No pages in request');
      echo json_encode((object) array(
        'status' => 'OK',
        'data' => array()
     ));

      return true;
    }

    $cachedStats = $page->getPageStatsCache($pages);
    InstapageCmsPluginHelper::writeDiagnostics($cachedStats, 'Cached stats');
    $pagesWithoutStats = array();

    foreach ($pages as $instapageId) {
      if (!isset($cachedStats[$instapageId])) {
        $pagesWithoutStats[] = $instapageId;
      }
    }

    if (empty($pagesWithoutStats)) {
      echo json_encode((object) array(
        'status' => 'OK',
        'data' => $cachedStats
     ));

      return true;
    }

    $tokens = isset($post->apiTokens) ? $post->apiTokens : false;

    if (!$tokens) {
      $tokens = $subaccount->getAllTokens();
    }

    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader($tokens));
    $data = array('pages' => $pagesWithoutStats);
    $responseJson = $api->apiCall('page/stats', $data, $headers);
    $response = json_decode($responseJson);

    if (InstapageCmsPluginHelper::checkResponse($response)) {
      $stats = (array)(isset($response->data) ? $response->data : array());
      $page->savePageStatsCache($stats);

      if (count($stats)) {
        $stats = array_merge($cachedStats, $stats);
      } else {
        $stats = $cachedStats;
      }

      echo json_encode((object) array(
        'status' => 'OK',
        'data' => $stats
     ));
    } else {
      return false;
    }
  }

  /**
   * Gathers data for 'publish' request.
   */
  private function publishPage() {
    $page = InstapageCmsPluginPageModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    $data = $post->data;

    echo $page->publishPage($data);
  }

  /**
   * Deletes a page from DB.
   */
  private function deletePage() {
    $page = InstapageCmsPluginPageModel::getInstance();
    $api = InstapageCmsPluginAPIModel::getInstance();
    $subaccount = InstapageCmsPluginSubaccountModel::getInstance();
    $post = InstapageCmsPluginHelper::getPostData();
    $result = $page->get($post->data->id, array('instapage_id'));
    $instapageId = $result->instapage_id;
    $tokens = isset($post->apiTokens) ? $post->apiTokens : false;

    if (!$tokens) {
      $tokens = $subaccount->getAllTokens();
    }

    $data = array(
      'page' => $instapageId,
      'url' => '',
      'publish' => 0
    );
    $headers = array('accountkeys' => InstapageCmsPluginHelper::getAuthHeader($tokens));
    $response = json_decode($api->apiCall('page/edit', $data, $headers));

    $message = '';

    if (!InstapageCmsPluginHelper::checkResponse($response, null, false) || !$response->success) {
      $message .= InstapageCmsPluginConnector::lang('Page that you are removing (Instapage ID: %s) doesn\'t exist in your Instapage application\'s dashboard. It could have been deleted from app or created by another user. Deleting this page won\'t affect Instapage application\'s dashboard.', $instapageId);

      if (isset($response->message) && $response->message !== '') {
        $message .= InstapageCmsPluginConnector::lang(' Instapage app response: ' . $response->message);
      }
    }

    if (isset($post->data->id) && $page->delete($post->data->id)) {
      if ($message) {
        echo InstapageCmsPluginHelper::formatJsonMessage($message);
      } else {
        echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('Page deleted successfully.'));
      }

      return true;
    } else {
      echo InstapageCmsPluginHelper::formatJsonMessage(InstapageCmsPluginConnector::lang('There was a database error during page delete process.'), 'ERROR');

      return false;
    }
  }
}

Zerion Mini Shell 1.0