145 lines
4.2 KiB
PHP
145 lines
4.2 KiB
PHP
|
<?php
|
||
|
|
||
|
namespace dominion\api;
|
||
|
|
||
|
use GraphQL\Type\Definition\Type;
|
||
|
|
||
|
class GraphQLPagination
|
||
|
{
|
||
|
public $parentRoot;
|
||
|
public $page = 1;
|
||
|
public $perPage = 25;
|
||
|
public $offset = 0;
|
||
|
public $totalCount = 0;
|
||
|
public $pageCount = 0;
|
||
|
public $currentPage = 0;
|
||
|
public $sort = '';
|
||
|
public $data = [];
|
||
|
public $addArgs = [];
|
||
|
|
||
|
|
||
|
public static $arPrefix = [
|
||
|
'<' => 'lt',
|
||
|
'>' => 'gt',
|
||
|
'<=' => 'lte',
|
||
|
'>=' => 'gte',
|
||
|
'!=' => 'neq',
|
||
|
'IN' => 'in',
|
||
|
'NOT IN' => 'nin',
|
||
|
// 'LIKE' => 'like',
|
||
|
];
|
||
|
|
||
|
public function setMeta($totalCount, $perPage)
|
||
|
{
|
||
|
$this->totalCount = $totalCount - $this->offset;
|
||
|
$this->perPage = $perPage;
|
||
|
$this->currentPage = $this->page;
|
||
|
$this->pageCount = ceil($this->totalCount/ $this->perPage);
|
||
|
}
|
||
|
|
||
|
public function setMetaByQuery($query)
|
||
|
{
|
||
|
$this->setMeta($query->count(), $this->perPage);
|
||
|
}
|
||
|
|
||
|
|
||
|
public function andWhere($query, $params, $fields, $prefix = '')
|
||
|
{
|
||
|
$prefix = empty($prefix) ? '' : ($prefix . '.');
|
||
|
foreach($fields as $item)
|
||
|
{
|
||
|
if(isset($params[$item]))
|
||
|
{
|
||
|
$query->andWhere([$prefix . $item => is_bool($params[$item]) ? (int)$params[$item] : $params[$item]]);
|
||
|
}
|
||
|
foreach (self::$arPrefix as $key => $pref)
|
||
|
{
|
||
|
$newKey = "{$pref}_{$item}";
|
||
|
if(isset($params[$newKey]))
|
||
|
{
|
||
|
$query->andWhere([$key, $prefix . $item, $params[$newKey]]);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $query;
|
||
|
}
|
||
|
|
||
|
public function andWhereLike($query, $params, $fields, $prefix = '')
|
||
|
{
|
||
|
$prefix = empty($prefix) ? '' : ($prefix . '.');
|
||
|
foreach($fields as $item)
|
||
|
{
|
||
|
if(isset($params[$item]))
|
||
|
{
|
||
|
$query->andWhere(['like', $prefix . $item, $params[$item]]);
|
||
|
}
|
||
|
}
|
||
|
return $query;
|
||
|
}
|
||
|
|
||
|
public function orderBy($query, $params, $fields, $sortParam = 'sort', $prefix = '')
|
||
|
{
|
||
|
$prefix = empty($prefix) ? '' : ($prefix . '.');
|
||
|
$sort = isset($params[$sortParam]) ? $params[$sortParam] : (isset($params['in_'.$sortParam]) ? $params['in_'.$sortParam] : []);
|
||
|
if(!empty($sort))
|
||
|
{
|
||
|
$sort = is_array($sort) ? $sort : (array)$sort;
|
||
|
$orderBy = [];
|
||
|
foreach($sort as $item)
|
||
|
{
|
||
|
$value = explode('_', $item);
|
||
|
if(count($value) == 2 && in_array($value[0], $fields) && in_array($value[1], ['asc', 'desc']))
|
||
|
{
|
||
|
$orderBy[$prefix . $value[0]] = $value[1] == 'asc' ? SORT_ASC : SORT_DESC;
|
||
|
}
|
||
|
elseif($item == 'rand')
|
||
|
{
|
||
|
$orderBy['RAND()'] = SORT_ASC;
|
||
|
}
|
||
|
}
|
||
|
if(!empty($orderBy))
|
||
|
{
|
||
|
$query->orderBy($orderBy);
|
||
|
}
|
||
|
|
||
|
}
|
||
|
return $query;
|
||
|
}
|
||
|
|
||
|
public function getItemsByPage($query)
|
||
|
{
|
||
|
$offset = $this->perPage * ($this->page -1);
|
||
|
$offset += $this->offset;
|
||
|
return $query->limit($this->perPage)->offset($offset)->all();
|
||
|
}
|
||
|
|
||
|
public static function argumentModify($args = [])
|
||
|
{
|
||
|
foreach ($args as $key=> $value)
|
||
|
{
|
||
|
if(isset($value['type']) && /*in_array($value['type'], [Type::int()]) &&*/ isset($value['modify']) && $value['modify'])
|
||
|
{
|
||
|
$arPrefix = isset($value['modifyOption']) ? (array)$value['modifyOption'] : self::$arPrefix;
|
||
|
if(str_replace($arPrefix, '', $key) == $key)
|
||
|
{
|
||
|
foreach ($arPrefix as $prefix)
|
||
|
{
|
||
|
$newKey = "{$prefix}_{$key}";
|
||
|
if (!isset($args[$newKey]))
|
||
|
{
|
||
|
$args[$newKey] = $value;
|
||
|
if(in_array($prefix, ['in', 'nin']))
|
||
|
{
|
||
|
$args[$newKey]['type'] = Type::listOf($args[$newKey]['type']);
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return $args;
|
||
|
}
|
||
|
|
||
|
|
||
|
}
|