blob: 7a31bc7406a1da3c98ca7cf68fa608dc3b4e8102 [file] [log] [blame]
<?php
/**
* Licensed to the Apache Software Foundation (ASF) under one or more
* contributor license agreements. See the NOTICE file distributed with
* this work for additional information regarding copyright ownership.
* The ASF licenses this file to You under the Apache License, Version 2.0
* (the "License"); you may not use this file except in compliance with
* the License. You may obtain a copy of the License at
* http://www.apache.org/licenses/LICENSE-2.0
* Unless required by applicable law or agreed to in writing, software
* distributed under the License is distributed on an "AS IS" BASIS,
* WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
* See the License for the specific language governing permissions and
* limitations under the License.
*/
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",
''
);
}
}