$method, 'timeout' => 20, 'sslverify' => true, 'headers' => [ 'Authorization' => 'Bearer ' . $key, 'Content-Type' => 'application/json', 'User-Agent' => 'tich/' . TICH_WC_VERSION, ], ]; if ($body !== null) { $args['body'] = wp_json_encode($body); } $response = wp_remote_request(self::base_url($key) . $path, $args); if (is_wp_error($response)) { return [ 'ok' => false, 'code' => 'network_error', 'message' => $response->get_error_message(), 'status' => 0, ]; } $status = wp_remote_retrieve_response_code($response); $parsed = json_decode(wp_remote_retrieve_body($response), true); if ($status >= 200 && $status < 300) { $result = ['ok' => true, 'data' => is_array($parsed) ? $parsed : []]; } else { $code = is_array($parsed) && isset($parsed['error']['code']) ? $parsed['error']['code'] : 'unknown_error'; $message = is_array($parsed) && isset($parsed['error']['message']) ? $parsed['error']['message'] : sprintf('HTTP %d', $status); $result = ['ok' => false, 'code' => $code, 'message' => $message, 'status' => $status]; } // Every response doubles as a free liveness signal for the key - see // Tich_Key_Health. Network errors above never reach here: they say // nothing about the key. Tich_Key_Health::record($key, $result); return $result; } public static function get_site($key, $bypass_cache = false) { $cache_key = 'tich_wc_site_' . md5(self::base_url($key) . $key); if (!$bypass_cache) { $cached = get_transient($cache_key); if ($cached !== false) { return $cached; } } $result = self::request($key, 'GET', '/site'); if ($result['ok']) { set_transient($cache_key, $result, self::CACHE_TTL); } return $result; } public static function get_courses($key, $bypass_cache = false) { $cache_key = 'tich_wc_courses_' . md5(self::base_url($key) . $key); if (!$bypass_cache) { $cached = get_transient($cache_key); if ($cached !== false) { return $cached; } } $result = self::request($key, 'GET', '/courses'); if ($result['ok']) { set_transient($cache_key, $result, self::CACHE_TTL); } return $result; } public static function enroll($key, $email, $course_id, $access_id = null) { $body = ['email' => $email, 'courseId' => $course_id]; if ($access_id) { $body['accessId'] = $access_id; } return self::request($key, 'POST', '/enrollments', $body); } public static function revoke($key, $email, $course_id) { return self::request($key, 'POST', '/enrollments/revoke', ['email' => $email, 'courseId' => $course_id]); } public static function clear_cache($key) { delete_transient('tich_wc_site_' . md5(self::base_url($key) . $key)); delete_transient('tich_wc_courses_' . md5(self::base_url($key) . $key)); } }