viagogo/gogokit.php

View on GitHub
src/hal/HalClient.php

Summary

Maintainability
B
4 hrs
Test Coverage
<?php

namespace Viagogo\Hal;

use GuzzleHttp\Client;
use Viagogo\Core\HttpClient;
use Viagogo\Core\OAuthTokenStore;
use Viagogo\Core\ViagogoRequestParams;
use Viagogo\Resources\Root;
use Viagogo\Core\ViagogoConfiguration;
use Viagogo\Hal\ChangedResource;


/**
 *
 */
class HalClient {
    private $tokenStore;
    private $url;
    private $httpClient;
    private static $rootUrl = 'https://api.viagogo.net/v2/';

    function __construct(ViagogoConfiguration $configuration, OAuthTokenStore $tokenStore) {
        $this->tokenStore = $tokenStore;
        $this->url = $configuration ? $configuration->rootUrl : HalClient::$rootUrl;
        $this->httpClient = new HttpClient(new Client());

        if ($configuration && $configuration->currency) {
            $this->httpClient->setRequestHeader('Accept-Currency', $configuration->currency);
        }

        if ($configuration && $configuration->language) {
            $this->httpClient->setRequestHeader('Accept-Language', $configuration->language);
        }

        if ($configuration && $configuration->country) {
            $this->httpClient->setRequestHeader('VGG-Country', $configuration->country);
        }
    }

    public function createUrl($urlRoute) {
        return $this->url . '/' . $urlRoute;
    }

    public function getRoot(ViagogoRequestParams $params = null) {
        $params = $params ?: new ViagogoRequestParams();

        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $root = $this->httpClient->send($this->url, "GET", $params->toArray(), null);

        return new Root($root);
    }

    public function getResource($url, ViagogoRequestParams $params = null, $type = null) {
        $params = $params ?: new ViagogoRequestParams();

        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());

        $result = $this->httpClient->send($url, "GET", $params->toArray(), null);

        return $this->createResource($result, $type);
    }

    public function getBytes($url, ViagogoRequestParams $params = null, $type = null) {
        $params = $params ?: new ViagogoRequestParams();

        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());

        $result = $this->httpClient->getBytes($url, $params->toArray(), null);

        return $result;
    }

    public function getAllResources($url, ViagogoRequestParams $params = null, $type) {
        $params = $params ?: new ViagogoRequestParams();        
        $params->page = 1;
        $params->page_size = 1000;

        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());

        $result = array();
        $hasNextPage = true;

        while ($hasNextPage) {
            $page = $this->httpClient->send($url, "GET", $params->toArray(), null);

            if (isset($page->_embedded->items)) {
                foreach ($page->_embedded->items as $item) {
                    $result[] = $this->createResource($item, $type);
                }
            } 
            else {
                break;
            }

            if (!isset($page->_links->next)) {
                $hasNextPage = false;
            } else {
                $url = $page->_links->next->href;
            }
        }

        return $result;
    }

    public function getChangedResources($nextLink, ViagogoRequestParams $params = null, $type) {
        $params = $params ?: new ViagogoRequestParams();
        $params->page = 1;
        $params->page_size = 10000;

        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());

        $items = array();
        $deleted_items = array();
        $hasNextPage = true;

        while ($hasNextPage) {
            $page = $this->httpClient->send($nextLink, "GET", $params->toArray(), null);
            $has_data = false;
            if (isset($page->_embedded->items)) {
                foreach ($page->_embedded->items as $item) {
                    $has_data = true;
                    $items[] = $this->createResource($item, $type);
                }
            } 
            
            if (isset($page->_embedded->deleted_items)) {
                $has_data = true;
                foreach ($page->_embedded->deleted_items as $item) {
                    $deleted_items[] = $this->createResource($item, $type);
                }
            } 
            
            if ($has_data == false)
            {
                break;    
            }

            if (!isset($page->_links->next)) {
                $hasNextPage = false;
            } else {
                $nextLink = $page->_links->next->href;
            }
        }

        return new ChangedResource($items, array_unique($deleted_items), $nextLink, $type);
    }
    
    public function patch($url, $requestBody, $type = null) {
        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $result = $this->httpClient->send($url, "PATCH", array(), $requestBody);

        return $this->createResource($result, $type);
    }

    public function post($url, $requestBody, $type = null) {
        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $result = $this->httpClient->send($url, "POST", array(), $requestBody);

        return $this->createResource($result, $type);
    }

    public function put($url, $requestBody, $type = null) {
        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $result = $this->httpClient->send($url, "PUT", array(), $requestBody);

        return $this->createResource($result, $type);
    }

    public function postFile($url, $fileContent, $fileName, $type = null) {
        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $result = $this->httpClient->sendFile($url, $fileContent, $fileName);

        return $this->createResource($result, $type);
    }

    public function delete($url, $type = null) {
        $this->httpClient->setRequestHeader('Authorization', 'Bearer ' . $this->tokenStore->getToken()->getAccessToken());
        $this->httpClient->send($url, "DELETE", array(), null);
    }

    private function createResource($item, $type) {
        if ($type === null) {
            return $item;
        }

        $rc = new \ReflectionClass($type);
        return $rc->newInstanceArgs(array($item));
    }
}