premium->get_key(); } /** * Get license plugin_id * * @return string */ private function get_plugin_id() { return WINP_Plugin::app()->premium->get_setting( 'plugin_id' ); } /** * Get base64 token string * * @return string */ private function get_token() { return base64_encode( $this->get_key() ); } /** * Get headers * * @return array */ private function get_headers() { return [ 'Authorization' => 'Bearer ' . $this->get_token(), 'PluginId' => $this->get_plugin_id(), 'Version' => 'v2', // That tells server that the user is using SDK, not Freemius. ]; } /** * Check is key data available * * @return bool */ public function is_key() { return WINP_Plugin::app()->premium->is_active() && $this->get_key(); } /** * Make POST request with authorization headers and return response * * @param string $point * @param array $args * * @return array|bool|WP_Error */ public function post( $point, $args = [] ) { if ( ! $this->is_key() ) { return false; } $args['headers'] = $this->get_headers(); return wp_remote_post( self::WINP_REQUEST_URL . $point, $args ); } /** * Make GET request with authorization headers and return response * * @param string $point * @param array $args * * @return array|bool|WP_Error */ public function get( $point, $args = [] ) { // Allow common endpoints without authentication. $is_common_endpoint = strpos( $point, 'common' ) === 0; if ( ! $is_common_endpoint && ! $this->is_key() ) { return false; } // Add headers if user has valid license (even for common endpoints). if ( $this->is_key() ) { $args['headers'] = $this->get_headers(); } return wp_remote_get( self::WINP_REQUEST_URL . $point, $args ); } /** * Make PUT request with authorization headers and return response * * @param string $point * @param array $args * * @return array|bool|WP_Error */ public function put( $point, $args = [] ) { if ( ! $this->is_key() ) { return false; } $args['method'] = Requests::PUT; $args['headers'] = $this->get_headers(); return wp_remote_request( self::WINP_REQUEST_URL . $point, $args ); } /** * Check response * * @param $response * * @return bool */ public function check_response( $response ) { if ( empty( $response ) || $response instanceof WP_Error ) { return false; } if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) { return false; } if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) { return false; } return true; } /** * Check body * * @param $body * * @return bool */ public function check_body( $body ) { if ( empty( $body ) ) { return false; } if ( ! is_array( $body ) && ! is_object( $body ) ) { return false; } return true; } /** * Get response text error * * @param $response * * @return string */ public function get_response_error( $response ) { if ( empty( $response ) ) { return 'Empty response'; } if ( $response instanceof WP_Error ) { return $response->get_error_message(); } if ( is_array( $response ) ) { if ( ! isset( $response['body'] ) || empty( $response['body'] ) ) { return 'Empty body'; } if ( 200 != $response['response']['code'] && 201 != $response['response']['code'] ) { return $response['response']['message'] . ' [Code: ' . $response['response']['code'] . ']'; } } return 'Unknown error'; } /** * Get mapped object by name * * @param array|bool|WP_Error $json Response array from wp_remote_* functions. * @param string $object_name Class name (e.g., 'WINP_DTO_Snippet'). * * @return object|bool Object instance or false on failure. * @throws Exception If mapping fails. */ public function map_object( $json, $object_name ) { if ( ! $this->check_response( $json ) ) { return false; } if ( is_wp_error( $json ) || ! isset( $json['body'] ) ) { return false; } $body = json_decode( $json['body'], true ); if ( ! $this->check_body( $body ) ) { return false; } try { if ( ! method_exists( $object_name, 'from_array' ) ) { throw new Exception( "Class {$object_name} does not have a from_array method" ); } return $object_name::from_array( $body ); } catch ( Exception $exception ) { return false; } } /** * Get mapped objects by name * * @param array|bool|WP_Error $json Response array from wp_remote_* functions. * @param string $object_name Class name (e.g., 'WINP_DTO_Snippet'). * * @return array|bool Array of object instances or false on failure. * @throws Exception If mapping fails. */ public function map_objects( $json, $object_name ) { if ( ! $this->check_response( $json ) ) { return false; } if ( is_wp_error( $json ) || ! isset( $json['body'] ) ) { return false; } $body = json_decode( $json['body'], true ); if ( ! is_array( $body ) ) { return false; } try { if ( ! method_exists( $object_name, 'array_from_json' ) ) { throw new Exception( "Class {$object_name} does not have an array_from_json method" ); } return $object_name::array_from_json( $body ); } catch ( Exception $exception ) { return false; } } }