blob: df4286f6de0f7f46fb3bdf8eb058f5eee0e0e8ca [file] [log] [blame]
<?php
namespace predictionio;
use GuzzleHttp\Client;
use \DateTime;
/**
* Client for connecting to an Event Server
*
*/
class EventClient extends BaseClient {
const DATE_TIME_FORMAT = DateTime::ISO8601;
private $accessKey;
private $eventUrl;
/**
* @param string Access Key
* @param string Base URL to the Event Server. Default is localhost:7070.
* @param float Timeout of the request in seconds. Use 0 to wait indefinitely
* Default is 0.
* @param float Number of seconds to wait while trying to connect to a server.
* Default is 5.
*/
public function __construct($accessKey, $baseUrl='http://localhost:7070',
$timeout=0, $connectTimeout=5 ) {
parent::__construct($baseUrl, $timeout, $connectTimeout);
$this->accessKey = $accessKey;
$this->eventUrl = "/events.json?accessKey=$this->accessKey";
}
private function getEventTime($eventTime) {
$result = $eventTime;
if (!isset($eventTime)) {
$result = (new DateTime('NOW'))->format(self::DATE_TIME_FORMAT);
}
return $result;
}
/**
* Set a user entity
*
* @param int|string User Id
* @param array Properties of the user entity to set
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function setUser($uid, array $properties=array(), $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
// casting to object so that an empty array would be represented as {}
if (empty($properties)) $properties = (object)$properties;
$json = json_encode([
'event' => '$set',
'entityType' => 'user',
'entityId' => $uid,
'properties' => $properties,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Unset a user entity
*
* @param int|string User Id
* @param array Properties of the user entity to unset
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function unsetUser($uid, array $properties, $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
if (empty($properties))
throw new PredictionIOAPIError('Specify at least one property');
$json = json_encode([
'event' => '$unset',
'entityType' => 'user',
'entityId' => $uid,
'properties' => $properties,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Delete a user entity
*
* @param int|string User Id
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function deleteUser($uid, $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
$json = json_encode([
'event' => '$delete',
'entityType' => 'user',
'entityId' => $uid,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Set an item entity
*
* @param int|string Item Id
* @param array Properties of the item entity to set
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function setItem($iid, array $properties=array(), $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
if (empty($properties)) $properties = (object)$properties;
$json = json_encode([
'event' => '$set',
'entityType' => 'item',
'entityId' => $iid,
'properties' => $properties,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Unset an item entity
*
* @param int|string Item Id
* @param array Properties of the item entity to unset
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function unsetItem($iid, array $properties, $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
if (empty($properties))
throw new PredictionIOAPIError('Specify at least one property');
$json = json_encode([
'event' => '$unset',
'entityType' => 'item',
'entityId' => $iid,
'properties' => $properties,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Delete an item entity
*
* @param int|string Item Id
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function deleteItem($iid, $eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
$json = json_encode([
'event' => '$delete',
'entityType' => 'item',
'entityId' => $iid,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Record a user action on an item
*
* @param string Event name
* @param int|string User Id
* @param int|string Item Id
* @param array Properties of the event
* @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
*
* @throws PredictionIOAPIError Request error
*/
public function recordUserActionOnItem($event, $uid, $iid,
array $properties=array(),
$eventTime=null) {
$eventTime = $this->getEventTime($eventTime);
if (empty($properties)) $properties = (object)$properties;
$json = json_encode([
'event' => $event,
'entityType' => 'user',
'entityId' => $uid,
'targetEntityType' => 'item',
'targetEntityId' => $iid,
'properties' => $properties,
'eventTime' => $eventTime,
]);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Create an event
*
* @param array An array describing the event
*
* @return string JSON response
*
* @throws PredictionIOAPIError Request error
*/
public function createEvent(array $data) {
$json = json_encode($data);
return $this->sendRequest('POST', $this->eventUrl, $json);
}
/**
* Retrieve an event
*
* @param string Event ID
*
* @return string JSON response
*
* @throws PredictionIOAPIError Request error
*/
public function getEvent($eventId) {
return $this->sendRequest('GET',
"/events/$eventId.json?accessKey=$this->accessKey", '');
}
}
?>