| @ -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') | |||||
| ); | |||||
| } | |||||
| } | |||||