Skip to content
Snippets Groups Projects
Url.php 4.24 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Url controller class.
     *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @since 5.25
    
     */
    
    namespace CiviCRM_WP_REST\Controller;
    
    class Url extends Base {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
      /**
       * @var string
       * The base route.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      protected $rest_base = 'url';
    
      /**
       * Registers routes.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function register_routes() {
    
        register_rest_route($this->get_namespace(), $this->get_rest_base(), [
          [
            'methods' => \WP_REST_Server::READABLE,
            'callback' => [$this, 'get_item'],
            'permission_callback' => '__return_true',
            'args' => $this->get_item_args(),
          ],
          'schema' => [$this, 'get_item_schema'],
        ]);
    
      }
    
      /**
       * Get items.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param WP_REST_Request $request
       */
      public function get_item($request) {
    
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Filter formatted API params.
         *
         * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * @param array $params
         * @param WP_REST_Request $request
         */
        $params = apply_filters('civi_wp_rest/controller/url/params', $this->get_formatted_params($request), $request);
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Track URL.
    
        $url = \CRM_Mailing_Event_BAO_MailingEventTrackableURLOpen::track($params['queue_id'], $params['url_id']);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
        /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         * Filter URL.
         *
         * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
         *
         * @param string $url
         * @param array $params
         * @param WP_REST_Request $request
         */
        $url = apply_filters('civi_wp_rest/controller/url/before_parse_url', $url, $params, $request);
    
        // parse url
        $url = $this->parse_url($url, $params);
    
        $this->do_redirect($url);
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Get formatted API params.
       *
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * @param WP_REST_Resquest $request
       * @return array $params
       */
      protected function get_formatted_params($request) {
    
        $args = $request->get_params();
    
        $params = [
          'queue_id' => isset($args['qid']) ? $args['qid'] ?? '' : $args['q'] ?? '',
          'url_id' => $args['u'],
        ];
    
        // unset unnecessary args
        unset($args['qid'], $args['u'], $args['q']);
    
        if (!empty($args)) {
    
          $params['query'] = http_build_query($args);
    
        }
    
        return $params;
    
      }
    
      /**
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * Parses the URL.
       *
       * @since 5.25
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       *
       * @param string $url
       * @param array $params
       * @return string $url
       */
      protected function parse_url($url, $params) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // CRM-18320 - Fix encoded ampersands.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $url = str_replace('&amp;', '&', $url);
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // CRM-7103 - Look for additional query variables and append them.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        if (isset($params['query']) && strpos($url, '?')) {
          $url .= '&' . $params['query'];
        }
        elseif (isset($params['query'])) {
          $url .= '?' . $params['query'];
        }
    
        if (strpos($url, 'mailto')) {
          $url = strstr($url, 'mailto');
        }
    
        return apply_filters('civi_wp_rest/controller/url/parsed_url', $url, $params);
    
      }
    
      /**
       * Do redirect.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param string $url
       */
      protected function do_redirect($url) {
    
        wp_redirect($url);
    
        exit;
    
      }
    
      /**
       * Item schema.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return array $schema
       */
      public function get_item_schema() {
    
        return [
          '$schema' => 'http://json-schema.org/draft-04/schema#',
          'title' => 'civicrm_api3/v3/url',
          'description' => __('CiviCRM API3 wrapper', 'civicrm'),
          'type' => 'object',
          'required' => ['qid', 'u'],
          'properties' => [
            'qid' => [
              'type' => 'integer',
            ],
            'q' => [
              'type' => 'integer',
            ],
            'u' => [
              'type' => 'integer',
            ],
          ],
        ];
    
      }
    
      /**
       * Item arguments.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return array $arguments
       */
      public function get_item_args() {
    
        return [
          'qid' => [
            'type' => ['integer', 'string'],
            'required' => FALSE,
            'validate_callback' => function($value, $request, $key) {
              return is_numeric($value) || empty($value);
            },
          ],
          'q' => [
            'type' => ['integer', 'string'],
            'required' => FALSE,
            'validate_callback' => function($value, $request, $key) {
              return is_numeric($value) || empty($value);
            },
          ],
          'u' => [
            'type' => 'integer',
            'required' => TRUE,
            'validate_callback' => function($value, $request, $key) {
              return is_numeric($value);
            },
          ],
        ];
    
      }