1 | <?php |
||
12 | class InstagramRequest |
||
13 | { |
||
14 | /** @var string $path */ |
||
15 | private $path; |
||
16 | |||
17 | /** @var array $params */ |
||
18 | private $params; |
||
19 | |||
20 | /** @var string $method */ |
||
21 | private $method; |
||
22 | |||
23 | /* |
||
24 | * Remaining Rate Limit |
||
25 | * Sandbox = 500 |
||
26 | * Live = 5000 |
||
27 | * @var array $x_rate_limit_remaining |
||
28 | */ |
||
29 | private $xRateLimitRemaining = 500; |
||
30 | |||
31 | /** @var InstagramResponse $response */ |
||
32 | protected $response; |
||
33 | |||
34 | /** @var Instagram $instagram */ |
||
35 | protected $instagram; |
||
36 | |||
37 | /* |
||
38 | * Create the request and execute it to get the response |
||
39 | * @param Instagram $instagram |
||
40 | * @param string $path |
||
41 | * @param array $params |
||
42 | * @param string $method |
||
43 | */ |
||
44 | public function __construct(Instagram $instagram, $path, array $params = array(), $method = 'GET') |
||
45 | { |
||
46 | $this->instagram = $instagram; |
||
47 | $this->path = $path; |
||
48 | $this->params = $params; |
||
49 | $this->method = $method; |
||
50 | } |
||
51 | |||
52 | /* |
||
53 | * Execute the Instagram Request |
||
54 | * @param void |
||
55 | * @return InstagramResponse |
||
56 | */ |
||
57 | protected function execute() |
||
58 | { |
||
59 | $authentication_method = '?access_token='.$this->params['access_token']; |
||
60 | $endpoint = Constants::API_VERSION.$this->path.(('GET' === $this->method) ? '?'.http_build_query($this->params) : $authentication_method); |
||
61 | $endpoint .= (strstr($endpoint, '?') ? '&' : '?').'sig='.static::generateSignature($this->instagram->getClientSecret(), $this->path, $this->params); |
||
62 | |||
63 | $request = HelperFactory::request($this->instagram->getHttpClient(), $endpoint, $this->params, $this->method); |
||
64 | if ($request !== null) { |
||
65 | $this->response = new InstagramResponse($request); |
||
66 | $this->xRateLimitRemaining = $this->response->getHeader('X-Ratelimit-Remaining'); |
||
67 | } else { |
||
68 | throw new InstagramResponseException("400 Bad Request: instanceof InstagramResponse cannot be null", 400); |
||
69 | } |
||
70 | } |
||
71 | |||
72 | /* |
||
73 | * Check Access Token is present. If not throw InstagramRequestException |
||
74 | * @throws InstagramRequestException |
||
75 | */ |
||
76 | protected function isAccessTokenPresent() |
||
82 | |||
83 | /* |
||
84 | * Get Response |
||
85 | * @return InstagramResponse |
||
86 | */ |
||
87 | public function getResponse() |
||
88 | { |
||
89 | $this->isRateLimitReached(); |
||
90 | $this->isAccessTokenPresent(); |
||
91 | $oauth = $this->instagram->getOAuth(); |
||
92 | if (!$oauth->isAccessTokenSet()) { |
||
93 | $oauth->setAccessToken($this->params['access_token']); |
||
94 | } |
||
95 | $this->execute(); |
||
96 | return $this->response; |
||
97 | } |
||
98 | |||
99 | /* |
||
100 | * Check whether api rate limit is reached or not |
||
101 | * @throws InstagramThrottleException |
||
102 | */ |
||
103 | private function isRateLimitReached() |
||
109 | |||
110 | /* |
||
111 | * Secure API Request by using endpoint, paramters and API secret |
||
112 | * copy from Instagram API Documentation: https://www.instagram.com/developer/secure-api-requests/ |
||
113 | * |
||
114 | * @param string $secret |
||
115 | * @param string $endpoint |
||
116 | * @param array $params |
||
117 | * |
||
118 | * @return string (Signature) |
||
119 | */ |
||
120 | public static function generateSignature($secret, $endpoint, $params) |
||
129 | |||
130 | /* |
||
131 | * @return int |
||
132 | */ |
||
133 | public function getRateLimit() |
||
137 | } |
||
138 |