@ -0,0 +1,13 @@ | |||
# Gear - Directus PHP Client | |||
Small Libary to request Directus API. | |||
## ItemCollection | |||
**URL** | |||
**Token** | |||
```PHP | |||
$itemCollection = new ItemCollection($url, $token); | |||
$articles = $itemCollection->find('articles', ['status' => 'published']); | |||
``` |
@ -0,0 +1,19 @@ | |||
{ | |||
"name": "super-gear/directus", | |||
"version": "0.1.0", | |||
"type": "library", | |||
"license": "MIT", | |||
"authors": [ | |||
{ "name": "Björn Hase", "email": "me@tentakelfabrik.de" } | |||
], | |||
"require": { | |||
"php": "^7.0", | |||
"mikecao/flight": "^1.3", | |||
"erusev/parsedown": "^1.7" | |||
}, | |||
"autoload": { | |||
"psr-4": { | |||
"SuperGear\\": "src/" | |||
} | |||
} | |||
} |
@ -0,0 +1,114 @@ | |||
<?php | |||
namespace SuperGear\Directus\Collections; | |||
/** | |||
* send request with curl to directus instance | |||
* | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||
* | |||
*/ | |||
class AbstractCollection | |||
{ | |||
/** url */ | |||
private $url = NULL; | |||
/** token */ | |||
private $token = NULL; | |||
/** curl */ | |||
private $curl = NULL; | |||
/** endpoint */ | |||
protected $endpoint = NULL; | |||
/** | |||
* | |||
* @param string $url | |||
* @param string $token | |||
*/ | |||
public function __construct($url, $token) | |||
{ | |||
$this->url = $url; | |||
$this->token = $token; | |||
} | |||
/** | |||
* | |||
* | |||
* @param string $name | |||
* @param array $parameters | |||
* @return mixed | |||
*/ | |||
public function findOne($name, $parameters = []) | |||
{ | |||
// adding single to parameters | |||
$parameters['single'] = true; | |||
$response = $this->request($name, $this->endpoint, $parameters); | |||
return $response; | |||
} | |||
/** | |||
* | |||
* | |||
* @param string $name | |||
* @param array $parameters | |||
* @return mixed | |||
* | |||
*/ | |||
public function find($name, $parameters = []) | |||
{ | |||
return $this->request($name, $this->endpoint, $parameters); | |||
} | |||
/** | |||
* request $endpoint | |||
* | |||
* @param string $name | |||
* @param string $endpoint | |||
* @param array $parameters | |||
* @return mixed | |||
* | |||
*/ | |||
protected function request($name, $endpoint, $parameters = []) | |||
{ | |||
// init curl and setup token | |||
$curl = curl_init(); | |||
curl_setopt($curl, CURLOPT_HTTPHEADER, [ | |||
'Accept: application/json', | |||
'Content-Type: application/json', | |||
'Authorization: Bearer '.$this->token | |||
]); | |||
curl_setopt($curl, CURLOPT_RETURNTRANSFER, true); | |||
$response = []; | |||
if (count($parameters) > 0) { | |||
$query = http_build_query($parameters); | |||
} | |||
$url = $this->url.$endpoint.'/'.$name; | |||
// query parameters are set, add them to url | |||
if (isset($query)) { | |||
$url = $url.'?'.$query; | |||
} | |||
curl_setopt($curl, CURLOPT_URL, $url); | |||
$response = curl_exec($curl); | |||
$code = curl_getinfo($curl, CURLINFO_HTTP_CODE); | |||
$info = curl_getinfo($curl); | |||
curl_close($curl); | |||
$response = json_decode($response, true); | |||
return $response; | |||
} | |||
} |
@ -0,0 +1,28 @@ | |||
<?php | |||
namespace SuperGear\Directus\Collections; | |||
/** | |||
* endpoint "items" for directus | |||
* | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||
* | |||
*/ | |||
class ItemCollection extends AbstractCollection | |||
{ | |||
/** | |||
* | |||
* @param string $url | |||
* @param string $token | |||
*/ | |||
public function __construct($url, $token) | |||
{ | |||
// adding endpoint for items | |||
$this->endpoint = '/items'; | |||
parent::__construct($url, $token); | |||
} | |||
} |
@ -0,0 +1,69 @@ | |||
<?php | |||
namespace SuperGear\Directus\Controllers; | |||
use SuperGear\FlightAbstract; | |||
use Exception; | |||
/** | |||
* abstract controller to handle views and response from directus | |||
* | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||
* | |||
*/ | |||
abstract class ControllerAbstract extends FlightAbstract | |||
{ | |||
protected $defaultView = NULL; | |||
/** | |||
* if item not found | |||
* | |||
* @param string $page | |||
* @return boolean | |||
*/ | |||
protected function notFound($item) | |||
{ | |||
return (!$item || ($item && isset($item['error']) && $item['error']['code'] === 203)); | |||
} | |||
/** | |||
* | |||
* @param string $view | |||
* @return boolean | |||
*/ | |||
protected function viewExists($view) | |||
{ | |||
return file_exists($this->app->get('flight.views.path').'/'.$view.'.blade.php'); | |||
} | |||
/** | |||
* | |||
* @param [type] $page [description] | |||
* @param array $data [description] | |||
* @return [type] [description] | |||
*/ | |||
protected function render($item, $data = []) | |||
{ | |||
$view = $this->defaultView; | |||
// if view isset in page and file exists | |||
if (isset($item['data']['view'])) { | |||
if ($this->viewExists($item['data']['view'])) { | |||
$view = $item['data']['view']; | |||
} else { | |||
throw new Exception('View '.$item['data']['view'].' not exists'); | |||
} | |||
} else if (!$this->viewExists($view)) { | |||
throw new Exception('View '.$view.' not exists'); | |||
} | |||
$this->app->render($view, array_merge([ | |||
'page' => $item | |||
], | |||
$data | |||
)); | |||
} | |||
} |
@ -0,0 +1,27 @@ | |||
<?php | |||
namespace SuperGear\Directus; | |||
use Flight; | |||
/** | |||
* abstract FlightAbstract get instance of flight engine | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||
*/ | |||
abstract class FlightAbstract | |||
{ | |||
/** object of flight */ | |||
protected $app; | |||
/** | |||
* getting object of flight | |||
* | |||
*/ | |||
public function __construct() | |||
{ | |||
$this->app = Flight::app(); | |||
} | |||
} |
@ -0,0 +1,12 @@ | |||
<?php | |||
/** | |||
* fake function for blade @inject | |||
* | |||
* @param string $class | |||
* @return object | |||
*/ | |||
function app($class) | |||
{ | |||
return new $class(); | |||
} |
@ -0,0 +1,47 @@ | |||
<?php | |||
namespace SuperGear\Directus\Helpers; | |||
use Parsedown; | |||
/** | |||
* Helper to extend Parsedown | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/directus GitHub Repository | |||
*/ | |||
class MarkdownHelper extends Parsedown | |||
{ | |||
/** | |||
* | |||
* @var string | |||
*/ | |||
const EXTERNAL_LINK = "/^(http|https):\/\//"; | |||
const INNER_BRACKETS = "/\){(.*?)\}/"; | |||
const TARGET_BLANK = "_blank"; | |||
const DIVIDER_METHOD = ':'; | |||
const DIVIDER_SIZES = 'x'; | |||
/** | |||
* extend default function, if a link has http|https in url, | |||
* then handle this link as external and set target to _blank | |||
* | |||
* @param array $excerpt | |||
* @return array | |||
*/ | |||
protected function inlineLink($excerpt) | |||
{ | |||
$result = parent::inlineLink($excerpt); | |||
if (is_array($result)) { | |||
if (isset($result['element']['attributes'])) { | |||
if (preg_match(self::EXTERNAL_LINK, $result['element']['attributes']['href'])) { | |||
$result['element']['attributes']['target'] = self::TARGET_BLANK; | |||
} | |||
} | |||
return $result; | |||
} | |||
} | |||
} |
@ -0,0 +1,49 @@ | |||
<?php | |||
namespace SuperGear\Directus\Repositories; | |||
use Exception; | |||
/** | |||
* Manager Class to create Repository Objects that | |||
* are located in App\Repositories\ | |||
* | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||
*/ | |||
class Manager | |||
{ | |||
/** | |||
* naming of Repository | |||
* @var string | |||
*/ | |||
const NAMESPACE = 'App\Repositories\\'; | |||
/** | |||
* naming of Repository | |||
* @var string | |||
*/ | |||
const REPOSITORY_SUFFIX = 'Repository'; | |||
/** | |||
* getting repository object | |||
* | |||
* @param string $repositoryClass | |||
* @return AbstractRepository | |||
*/ | |||
public static function get($repositoryName) | |||
{ | |||
$repositoryClass = self::NAMESPACE.$repositoryName.self::REPOSITORY_SUFFIX; | |||
if (!class_exists($repositoryClass)) { | |||
throw new Exception('Repository Class '.$repositoryClass.' not exists!'); | |||
} | |||
// create respository object | |||
$repository = new $repositoryClass(); | |||
return $repository; | |||
} | |||
} |
@ -0,0 +1,38 @@ | |||
<?php | |||
namespace SuperGear\Repositories; | |||
use SuperGear\DirectusClient\Collections\ItemCollection; | |||
/** | |||
* Abstract Repository to wrap ItemCollection | |||
* | |||
* | |||
* @author Björn Hase | |||
* @license http://opensource.org/licenses/MIT The MIT License | |||
* @link https://gitlab.tentakelfabrik.de/super-gear/super-gear-directus GitHub Repository | |||
*/ | |||
abstract class RepositoryAbstract | |||
{ | |||
/** name of the collection */ | |||
protected $name; | |||
/** client for itemCollection */ | |||
protected $itemCollection; | |||
/** | |||
* | |||
* | |||
*/ | |||
public function __construct() | |||
{ | |||
if (!$this->name) { | |||
throw new \Exception('$name is not set!'); | |||
}; | |||
$this->itemCollection = new ItemCollection( | |||
env('DIRECTUS_API_URL'), | |||
env('DIRECTUS_API_TOKEN') | |||
); | |||
} | |||
} |