apiURL = $clientbaseURL . "/api/dev";
$this->token = $token;
}
/**
* Получить список пользовательских таблиц
*
* @return array
*/
public function getTablesList()
{
$rawResult = $this->query("/table");
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить информацию о таблице
* @param $tableId int id таблицы
* @param $includeFields bool Получить информацию о полях таблицы
* @return stdObject
*/
public function getTable($tableId, $includeFields = false)
{
$queryParams = $includeFields ? ['include' => 'fields'] : [];
$rawResult = $this->query("/table/" . $tableId, "GET", $queryParams);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить список записей таблицы
*
* @param $tableId int id таблицы
* @param $offset int Отступ от начала списка
* @param $limit int Количество элементов
* @param $filter mixed Фильтр в виде строки или массива
* @return array
*/
public function getDataList($tableId, $offset=0, $limit=0, $filter='')
{
$queryParams = ['page' => []];
if ($offset) {
$queryParams['page']['offset'] = $offset;
}
if ($limit) {
$queryParams['page']['limit'] = $limit;
}
if ($filter) {
$queryParams['filter'] = $filter;
}
$rawResult = $this->query("/data" . $tableId, "GET", $queryParams);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить информацию о записи в таблице
*
* @param $tableId int id таблицы
* @param $lineId int id записи в таблице
* @return stdObject
*/
public function getData($tableId, $lineId)
{
$rawResult = $this->query("/data" . $tableId . "/" . $lineId);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Удалить запись из таблицы
*
* @param $tableId int id таблицы
* @param $lineId int id записи в таблице
*
*/
public function deleteData($tableId, $lineId)
{
$this->query("/data" . $tableId . "/" . $lineId, "DELETE");
}
/**
* Перевести массив с данными в формат, подходящий для отправки на сервер
*
* @param $data array Массив с данными для добавления/обновления записи в таблице
* @return stdObject
*/
public function bodyFromData($data)
{
$body = new stdClass();
$body->data = new stdClass();
$body->data->attributes = (object) $data;
return $body;
}
/**
* Добавить строку в таблицу
*
* @param $tableId int id таблицы
* @param $data array Данные для добавления
* @return stdObject
*/
public function addData($tableId, $data)
{
$body = $this->bodyFromData($data);
$body->data->type = "data" . $tableId;
$rawResult = $this->query("/data" . $tableId . "/" . $lineId, "POST", "", $body);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Обновить строку в таблице
*
* @param $tableId int id таблицы
* @param $lineId int id записи в таблице
* @param $data array Данные для обновления
* @return stdObject
*/
public function updateData($tableId, $lineId, $data)
{
$body = $this->bodyFromData($data);
$body->data->type = "data" . $tableId;
$body->data->id = $lineId;
$rawResult = $this->query("/data" . $tableId . "/" . $lineId, "PATCH", "", $body);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить список пользователей
*
* @return array
*/
public function getUsersList()
{
$rawResult = $this->query("/user");
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить информацию о пользователе
*
* @param $userId id пользователя
* @return stdObject
*/
public function getUser($userId)
{
$rawResult = $this->query("/user/" . $userId);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить список групп пользователей
*
* @return array
*/
public function getGroupsList()
{
$rawResult = $this->query("/group");
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить информацию о группе пользователей
*
* @param $groupId id группы пользователей
* @return stdObject
*/
public function getGroup($groupId)
{
$rawResult = $this->query("/group/" . $groupId);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Получить информацию о файле
*
* @param $tableId id таблицы
* @param $fieldId id поля таблицы
* @param $lineId id записи таблицы
* @param $fileName string Название файла
* @return stdObject
*/
public function getFile($tableId, $fieldId, $lineId, $fileName)
{
$rawResult = $this->query("/file/" . $tableId . "/" . $fieldId . "/" . $lineId . "/" . $fileName);
$result = $this->_rawToResult($rawResult);
return $result;
}
/**
* Произвольный запрос к API
*
* @param $path string адрес запроса
* @param $method string метод запроса
* @param $urlQuery array GET-параметры запроса в виде массива
* @param $body stdObject данные для запросов POST, PATCH
* @return stdObject
*/
public function query($path, $method="GET", $urlQuery = [], $body = null)
{
$requestURL = $this->apiURL . $path;
if ($urlQuery) {
$urlQueryLine = http_build_query($urlQuery);
$requestURL .= "?" . $urlQueryLine;
}
//echo "
URL: [" . $method . "] " . $requestURL . "
";
if ($body) {
$body = json_encode($body);
//echo $body;
}
$out = $this->_sendRequest($requestURL, $method, $body);
$result = json_decode($out);
return $result;
}
/**
* Преобразование полученных данных в удобный формат
*
* @param $rawResult stdObject Данные, полученные по API
* @return mixed
* @throws HttpException
*/
private function _rawToResult($rawResult)
{
$result = null;
if (!empty($rawResult->data)) {
$result = $rawResult->data;
if (is_array($result)) {
foreach ($result as $k => $item) {
$result[$k] = $this->_simpleData($item);
}
} else {
$result = $this->_simpleData($result);
if (!empty($rawResult->included)) {
foreach ($rawResult->included as $includedItem) {
$type = $includedItem->type;
$itemId = $includedItem->id;
if (!isset($result->$type)) {
$result->$type = [];
}
$includedItem = $this->_simpleData($includedItem);
$result->$type[$itemId] = $includedItem;
}
}
}
}
return $result;
}
/**
* Преобразование полученных данных в удобный формат
*
* @param $rawResult stdObject Данные, полученные по API
* @return mixed
* @throws HttpException
*/
private function _simpleData($data)
{
if ($data->meta) {
foreach ($data->meta as $key => $metaItem) {
$data->$key = $metaItem;
}
}
return $data;
}
/**
* Отправка запроса
*
* @param $requestURL string URL обращения к API
* @param $method string метод запроса
* @param $body mixed тело запроса
* @return mixed
* @throws HttpException
*/
private function _sendRequest($requestURL, $method="GET", $body=null)
{
if ($curl = curl_init()) {
curl_setopt($curl, CURLOPT_URL, $requestURL);
curl_setopt($curl, CURLOPT_FOLLOWLOCATION, true);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_CUSTOMREQUEST, $method);
if ($body) {
curl_setopt($curl, CURLOPT_POSTFIELDS, $body);
}
$headers = [
'Content-Type: application/vnd.api+json',
'X-Auth-Token: ' . $this->token
];
curl_setopt($curl, CURLOPT_HTTPHEADER, $headers);
$out = curl_exec($curl);
curl_close($curl);
return $out;
} else {
throw new HttpException('Can not create connection to ' . $requestURL, 404);
}
}
}