Skip to content
Snippets Groups Projects
Open.php 2.67 KiB
Newer Older
  • Learn to ignore specific revisions
  • <?php
    /**
     * Open controller class.
     *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
     * @since 5.25
    
     */
    
    namespace CiviCRM_WP_REST\Controller;
    
    class Open 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 = 'open';
    
      /**
       * 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 item.
       *
    
    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) {
    
        $queue_id = $request->get_param('q');
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Track open.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        \CRM_Mailing_Event_BAO_MailingEventOpened::open($queue_id);
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Serve tracker file.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        add_filter('rest_pre_serve_request', [$this, 'serve_tracker_file'], 10, 4);
    
      }
    
      /**
       * Serves the tracker gif file.
       *
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @since 5.25
       *
       * @param bool $served Whether the request has been served.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @param WP_REST_Response $result
       * @param WP_REST_Request $request
       * @param WP_REST_Server $server
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       * @return bool $served Whether the request has been served.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
       */
      public function serve_tracker_file($served, $result, $request, $server) {
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Tracker file path.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $file = CIVICRM_PLUGIN_DIR . 'civicrm/i/tracker.gif';
    
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        // Set headers.
    
    Kevin Cristiano's avatar
    Kevin Cristiano committed
        $server->send_header('Content-type', 'image/gif');
        $server->send_header('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
        $server->send_header('Content-Description', 'File Transfer');
        $server->send_header('Content-Disposition', 'inline; filename=tracker.gif');
        $server->send_header('Content-Length', filesize($file));
    
        $buffer = readfile($file);
    
        return TRUE;
    
      }
    
      /**
       * 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/v3/open',
          'description' => __('CiviCRM Open endpoint', 'civicrm'),
          'type' => 'object',
          'required' => ['q'],
          'properties' => [
            'q' => [
              '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 [
          'q' => [
            'type' => 'integer',
            'required' => TRUE,
            'validate_callback' => function($value, $request, $key) {
              return is_numeric($value);
            },
          ],
        ];
    
      }