Async option for logging user actions on item events
authorBen Wise <ben.wise@catchoftheday.com.au>
Thu, 24 Sep 2015 04:27:25 +0000 (14:27 +1000)
committerBen Wise <ben.wise@catchoftheday.com.au>
Thu, 24 Sep 2015 04:27:25 +0000 (14:27 +1000)
src/predictionio/BaseClient.php
src/predictionio/EventClient.php

index 13ef8d2..67173e0 100644 (file)
@@ -4,6 +4,7 @@ namespace predictionio;
 
 use GuzzleHttp\Client;
 use GuzzleHttp\Exception\ClientException;
+use GuzzleHttp\Promise\PromiseInterface;
 
 /**
  * Base client for Event and Engine client
@@ -43,17 +44,21 @@ abstract class BaseClient {
    * @param string $method HTTP request method
    * @param string $url Relative or absolute url
    * @param string $body HTTP request body
-   *
-   * @return array JSON response
-   * @throws PredictionIOAPIError Request error
+   * @param boolean $async Send request asynchronously and return a promise
+   * @return array|PromiseInterface JSON response
+   * @throws PredictionIOAPIError
    */
-  protected function sendRequest($method, $url, $body) {
+  protected function sendRequest($method, $url, $body, $async = false) {
     $options = ['headers' => ['Content-Type' => 'application/json'],
                 'body' => $body]; 
 
     try {
-      $response = $this->client->request($method, $url, $options);
-      return json_decode($response->getBody(), true);
+      if ($async) {
+        return $this->client->requestAsync($method, $url, $options);
+      } else {
+        $response = $this->client->request($method, $url, $options);
+        return json_decode($response->getBody(), true);
+      }
     } catch (ClientException $e) {
       throw new PredictionIOAPIError($e->getMessage()); 
     }
index df4286f..c037e38 100644 (file)
@@ -3,7 +3,8 @@
 namespace predictionio;
 use GuzzleHttp\Client;
 use \DateTime;
+use GuzzleHttp\Promise\PromiseInterface;
+
 /**
  * Client for connecting to an Event Server
  *
@@ -211,14 +212,14 @@ class EventClient extends BaseClient {
    * @param string Time of the event in ISO 8601 format
    *               (e.g. 2014-09-09T16:17:42.937-08:00).
    *               Default is the current time.
-   *
-   * @return string JSON response
+   * @param bool Send request asynchronously
+   * @return array|PromiseInterface JSON response or PromiseInterface object if async
    * 
    * @throws PredictionIOAPIError Request error
    */
    public function recordUserActionOnItem($event, $uid, $iid, 
                                          array $properties=array(),
-                                         $eventTime=null) {
+                                         $eventTime=null, $async = false) {
     $eventTime = $this->getEventTime($eventTime);
     if (empty($properties)) $properties = (object)$properties;
     $json = json_encode([
@@ -231,7 +232,7 @@ class EventClient extends BaseClient {
         'eventTime' => $eventTime,
     ]);
 
-    return $this->sendRequest('POST', $this->eventUrl, $json);
+    return $this->sendRequest('POST', $this->eventUrl, $json, $async);
   }
 
   /**