From 03edb5a0f8c5c2ffb4b1c43aaf82d6601202622e Mon Sep 17 00:00:00 2001 From: lawcus Date: Sun, 13 Sep 2015 00:34:41 -0700 Subject: [PATCH 1/7] Added functions for Deltas Added function getDeltas, getDeltaCursor and createAuthHeader --- src/Nylas.php | 215 ++++++++++++++++++++++++++++++++------------------ 1 file changed, 138 insertions(+), 77 deletions(-) diff --git a/src/Nylas.php b/src/Nylas.php index 3cf271a..3ab1bc6 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -3,57 +3,71 @@ namespace Nylas; -use Nylas\Models; use GuzzleHttp\Client as GuzzleClient; +use Nylas\Models; -class Nylas { +class Nylas +{ protected $apiServer = 'https://api.nylas.com'; protected $apiClient; protected $apiToken; public $apiRoot = 'n'; - public function __construct($appID, $appSecret, $token=NULL, $apiServer=NULL) { - $this->appID = $appID; + public function __construct($appID, $appSecret, $token = NULL, $apiServer = NULL) + { + $this->appID = $appID; $this->appSecret = $appSecret; - $this->apiToken = $token; + $this->apiToken = $token; $this->apiClient = $this->createApiClient(); - if($apiServer) { + if ($apiServer) { $this->apiServer = $apiServer; } } - protected function createHeaders() { - $token = 'Basic '.base64_encode($this->apiToken.':'); + protected function createHeaders() + { + $token = 'Basic ' . base64_encode($this->apiToken . ':'); $headers = array('headers' => ['Authorization' => $token, - 'X-Nylas-API-Wrapper' => 'php']); + 'X-Nylas-API-Wrapper' => 'php']); return $headers; } - private function createApiClient() { + private function createApiClient() + { return new GuzzleClient(['base_url' => $this->apiServer]); } - public function createAuthURL($redirect_uri, $login_hint=NULL) { + private function createAuthHeader($token) + { + $Authtoken = 'Basic ' . base64_encode($token . ':'); + $headers = array('headers' => ['Authorization' => $Authtoken, + 'X-Nylas-API-Wrapper' => 'php']); + return $headers; + } + + public function createAuthURL($redirect_uri, $login_hint = NULL) + { $args = array("client_id" => $this->appID, - "redirect_uri" => $redirect_uri, - "response_type" => "code", - "scope" => "email", - "login_hint" => $login_hint, - "state" => $this->generateId()); + "redirect_uri" => $redirect_uri, + "response_type" => "code", + "scope" => "email", + "login_hint" => $login_hint, + "state" => $this->generateId()); - return $this->apiServer.'/oauth/authorize?'.http_build_query($args); + return $this->apiServer . '/oauth/authorize?' . http_build_query($args); } - public function getAuthToken($code) { + public function getAuthToken($code) + { $args = array("client_id" => $this->appID, - "client_secret" => $this->appSecret, - "grant_type" => "authorization_code", - "code" => $code); + "client_secret" => $this->appSecret, + "grant_type" => "authorization_code", + "code" => $code); - $url = $this->apiServer.'/oauth/token'; + $url = $this->apiServer . '/oauth/token'; $payload = array(); $payload['headers']['Content-Type'] = 'application/x-www-form-urlencoded'; $payload['headers']['Accept'] = 'text/plain'; @@ -61,23 +75,47 @@ public function getAuthToken($code) { $response = $this->apiClient->post($url, $payload)->json(); - if(array_key_exists('access_token', $response)) { + if (array_key_exists('access_token', $response)) { $this->apiToken = $response['access_token']; } return $this->apiToken; } - public function namespaces() { + public function getDeltaCursor($token, $namespace) + { + + $url = $this->apiServer . '/n/' . $namespace->id . '/delta/latest_cursor'; + $headers = $this->createAuthHeader($token); + $response = $this->apiClient->post($url, $headers)->json(); + if (array_key_exists('cursor', $response)) { + $this->cursor = $response['cursor']; + } + + return $this->cursor; + } + + public function getDeltas($cursor, $token, $namespace) + { + + $url = $this->apiServer . '/delta?cursor=' . $cursor; + $headers = $this->createAuthHeader($token); + $response = $this->apiClient->get($url, $headers)->json(); + return $response; + } + + public function namespaces() + { $nsObj = new Models\Namespaces($this, NULL); return new NylasModelCollection($nsObj, $this, NULL); } // filter should be filters - public function getResources($namespace, $klass, $filter) { - $suffix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $url = $this->apiServer.$suffix.'/'.$klass->collectionName; - $url = $url.'?'.http_build_query($filter); + public function getResources($namespace, $klass, $filter) + { + $suffix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $url = $this->apiServer . $suffix . '/' . $klass->collectionName; + $url = $url . '?' . http_build_query($filter); $data = $this->apiClient->get($url, $this->createHeaders())->json(); $mapped = array(); @@ -87,9 +125,10 @@ public function getResources($namespace, $klass, $filter) { return $mapped; } - public function getResource($namespace, $klass, $id, $filters) { + public function getResource($namespace, $klass, $id, $filters) + { $extra = ''; - if(array_key_exists('extra', $filters)) { + if (array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } @@ -97,40 +136,43 @@ public function getResource($namespace, $klass, $id, $filters) { return $klass->_createObject($this, $namespace, $response); } - public function getResourceRaw($namespace, $klass, $id, $filters) { + public function getResourceRaw($namespace, $klass, $id, $filters) + { $extra = ''; - if(array_key_exists('extra', $filters)) { + if (array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } - $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $postfix = ($extra) ? '/'.$extra : ''; - $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id.$postfix; - $url = $url.'?'.http_build_query($filters); + $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $postfix = ($extra) ? '/' . $extra : ''; + $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id . $postfix; + $url = $url . '?' . http_build_query($filters); $data = $this->apiClient->get($url, $this->createHeaders())->json(); return $data; } - public function getResourceData($namespace, $klass, $id, $filters) { + public function getResourceData($namespace, $klass, $id, $filters) + { $extra = ''; - if(array_key_exists('extra', $filters)) { + if (array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } - $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $postfix = ($extra) ? '/'.$extra : ''; - $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id.$postfix; - $url = $url.'?'.http_build_query($filters); + $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $postfix = ($extra) ? '/' . $extra : ''; + $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id . $postfix; + $url = $url . '?' . http_build_query($filters); $data = $this->apiClient->get($url, $this->createHeaders())->getBody(); return $data; } - public function _createResource($namespace, $klass, $data) { - $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $url = $this->apiServer.$prefix.'/'.$klass->collectionName; + public function _createResource($namespace, $klass, $data) + { + $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $url = $this->apiServer . $prefix . '/' . $klass->collectionName; $payload = $this->createHeaders(); - if($klass->collectionName == 'files') { + if ($klass->collectionName == 'files') { $payload['headers']['Content-Type'] = 'multipart/form-data'; $payload['body'] = $data; } else { @@ -142,11 +184,12 @@ public function _createResource($namespace, $klass, $data) { return $klass->_createObject($this, $namespace, $response); } - public function _updateResource($namespace, $klass, $id, $data) { - $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id; + public function _updateResource($namespace, $klass, $id, $data) + { + $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id; - if($klass->collectionName == 'files') { + if ($klass->collectionName == 'files') { $payload['headers']['Content-Type'] = 'multipart/form-data'; $payload['body'] = $data; } else { @@ -157,16 +200,18 @@ public function _updateResource($namespace, $klass, $id, $data) { } } - public function _deleteResource($namespace, $klass, $id) { - $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; - $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id; + public function _deleteResource($namespace, $klass, $id) + { + $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; + $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id; $payload = $this->createHeaders(); $response = $this->apiClient->delete($url, $payload)->json(); return $response; } - private function generateId() { + private function generateId() + { // Generates unique UUID return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), @@ -178,32 +223,35 @@ private function generateId() { mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); -} + } } -class NylasModelCollection { +class NylasModelCollection +{ private $chunkSize = 50; - public function __construct($klass, $api, $namespace=NULL, $filter=array(), $offset=0, $filters=array()) { + public function __construct($klass, $api, $namespace = NULL, $filter = array(), $offset = 0, $filters = array()) + { $this->klass = $klass; $this->api = $api; $this->namespace = $namespace; $this->filter = $filter; $this->filters = $filters; - if(!array_key_exists('offset', $filter)) { + if (!array_key_exists('offset', $filter)) { $this->filter['offset'] = 0; } } - public function items() { + public function items() + { $offset = 0; while (True) { $items = $this->_getModelCollection($offset, $this->chunkSize); - if(!$items) { + if (!$items) { break; } foreach ($items as $item) { @@ -216,7 +264,8 @@ public function items() { } } - public function first() { + public function first() + { $results = $this->_getModelCollection(0, 1); if ($results) { return $results[0]; @@ -224,11 +273,13 @@ public function first() { return NULL; } - public function all($limit=INF) { + public function all($limit = INF) + { return $this->_range($this->filter['offset'], $limit); } - public function where($filter, $filters=array()) { + public function where($filter, $filters = array()) + { $this->filter = array_merge($this->filter, $filter); $this->filter['offset'] = 0; $collection = clone $this; @@ -236,34 +287,39 @@ public function where($filter, $filters=array()) { return $collection; } - public function find($id) { + public function find($id) + { return $this->_getModel($id); } - public function create($data) { + public function create($data) + { return $this->klass->create($data, $this); } - private function _range($offset, $limit) { + private function _range($offset, $limit) + { $result = array(); while (count($result) < $limit) { $to_fetch = min($limit - count($result), $this->chunkSize); - $data = $this->_getModelCollection($offset+count($result), $to_fetch); + $data = $this->_getModelCollection($offset + count($result), $to_fetch); $result = array_merge($result, $data); - if(!$data || count($data) < $to_fetch) { + if (!$data || count($data) < $to_fetch) { break; } } return $result; } - private function _getModel($id) { + private function _getModel($id) + { // make filter a kwarg filters return $this->api->getResource($this->namespace, $this->klass, $id, $this->filter); } - private function _getModelCollection($offset, $limit) { + private function _getModelCollection($offset, $limit) + { $this->filter['offset'] = $offset; $this->filter['limit'] = $limit; return $this->api->getResources($this->namespace, $this->klass, $this->filter); @@ -272,26 +328,31 @@ private function _getModelCollection($offset, $limit) { } -class NylasAPIObject { +class NylasAPIObject +{ public $apiRoot; - public function __construct() { + public function __construct() + { $this->apiRoot = 'n'; } - public function json() { + public function json() + { return $this->data; } - public function _createObject($klass, $namespace, $objects) { + public function _createObject($klass, $namespace, $objects) + { $this->data = $objects; $this->klass = $klass; return $this; } - public function __get($key) { - if(array_key_exists($key, $this->data)) { + public function __get($key) + { + if (array_key_exists($key, $this->data)) { return $this->data[$key]; } return NULL; @@ -299,4 +360,4 @@ public function __get($key) { } -?> \ No newline at end of file +?> From 1e9d1755443607f8e52ff007f3245d9e5352a1f5 Mon Sep 17 00:00:00 2001 From: lawcus Date: Sat, 3 Oct 2015 23:19:42 -0700 Subject: [PATCH 2/7] Fixed the braces as required by Nylas --- src/Nylas.php | 196 +++++++++++++++++++++----------------------------- 1 file changed, 81 insertions(+), 115 deletions(-) diff --git a/src/Nylas.php b/src/Nylas.php index 3ab1bc6..03d4903 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -3,71 +3,64 @@ namespace Nylas; -use GuzzleHttp\Client as GuzzleClient; use Nylas\Models; +use GuzzleHttp\Client as GuzzleClient; -class Nylas -{ +class Nylas { protected $apiServer = 'https://api.nylas.com'; protected $apiClient; protected $apiToken; public $apiRoot = 'n'; - public function __construct($appID, $appSecret, $token = NULL, $apiServer = NULL) - { - $this->appID = $appID; + public function __construct($appID, $appSecret, $token=NULL, $apiServer=NULL) { + $this->appID = $appID; $this->appSecret = $appSecret; - $this->apiToken = $token; + $this->apiToken = $token; $this->apiClient = $this->createApiClient(); - if ($apiServer) { + if($apiServer) { $this->apiServer = $apiServer; } } - protected function createHeaders() - { - $token = 'Basic ' . base64_encode($this->apiToken . ':'); + protected function createHeaders() { + $token = 'Basic '.base64_encode($this->apiToken.':'); $headers = array('headers' => ['Authorization' => $token, - 'X-Nylas-API-Wrapper' => 'php']); + 'X-Nylas-API-Wrapper' => 'php']); return $headers; } - private function createApiClient() - { + private function createApiClient() { return new GuzzleClient(['base_url' => $this->apiServer]); } - - private function createAuthHeader($token) - { + + private function createAuthHeader($token) { $Authtoken = 'Basic ' . base64_encode($token . ':'); $headers = array('headers' => ['Authorization' => $Authtoken, 'X-Nylas-API-Wrapper' => 'php']); return $headers; } - public function createAuthURL($redirect_uri, $login_hint = NULL) - { + public function createAuthURL($redirect_uri, $login_hint=NULL) { $args = array("client_id" => $this->appID, - "redirect_uri" => $redirect_uri, - "response_type" => "code", - "scope" => "email", - "login_hint" => $login_hint, - "state" => $this->generateId()); + "redirect_uri" => $redirect_uri, + "response_type" => "code", + "scope" => "email", + "login_hint" => $login_hint, + "state" => $this->generateId()); - return $this->apiServer . '/oauth/authorize?' . http_build_query($args); + return $this->apiServer.'/oauth/authorize?'.http_build_query($args); } - public function getAuthToken($code) - { + public function getAuthToken($code) { $args = array("client_id" => $this->appID, - "client_secret" => $this->appSecret, - "grant_type" => "authorization_code", - "code" => $code); + "client_secret" => $this->appSecret, + "grant_type" => "authorization_code", + "code" => $code); - $url = $this->apiServer . '/oauth/token'; + $url = $this->apiServer.'/oauth/token'; $payload = array(); $payload['headers']['Content-Type'] = 'application/x-www-form-urlencoded'; $payload['headers']['Accept'] = 'text/plain'; @@ -75,15 +68,14 @@ public function getAuthToken($code) $response = $this->apiClient->post($url, $payload)->json(); - if (array_key_exists('access_token', $response)) { + if(array_key_exists('access_token', $response)) { $this->apiToken = $response['access_token']; } return $this->apiToken; } - - public function getDeltaCursor($token, $namespace) - { + + public function getDeltaCursor($token, $namespace) { $url = $this->apiServer . '/n/' . $namespace->id . '/delta/latest_cursor'; $headers = $this->createAuthHeader($token); @@ -95,8 +87,7 @@ public function getDeltaCursor($token, $namespace) return $this->cursor; } - public function getDeltas($cursor, $token, $namespace) - { + public function getDeltas($cursor, $token, $namespace) { $url = $this->apiServer . '/delta?cursor=' . $cursor; $headers = $this->createAuthHeader($token); @@ -104,18 +95,16 @@ public function getDeltas($cursor, $token, $namespace) return $response; } - public function namespaces() - { + public function namespaces() { $nsObj = new Models\Namespaces($this, NULL); return new NylasModelCollection($nsObj, $this, NULL); } // filter should be filters - public function getResources($namespace, $klass, $filter) - { - $suffix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $url = $this->apiServer . $suffix . '/' . $klass->collectionName; - $url = $url . '?' . http_build_query($filter); + public function getResources($namespace, $klass, $filter) { + $suffix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $url = $this->apiServer.$suffix.'/'.$klass->collectionName; + $url = $url.'?'.http_build_query($filter); $data = $this->apiClient->get($url, $this->createHeaders())->json(); $mapped = array(); @@ -125,10 +114,9 @@ public function getResources($namespace, $klass, $filter) return $mapped; } - public function getResource($namespace, $klass, $id, $filters) - { + public function getResource($namespace, $klass, $id, $filters) { $extra = ''; - if (array_key_exists('extra', $filters)) { + if(array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } @@ -136,43 +124,40 @@ public function getResource($namespace, $klass, $id, $filters) return $klass->_createObject($this, $namespace, $response); } - public function getResourceRaw($namespace, $klass, $id, $filters) - { + public function getResourceRaw($namespace, $klass, $id, $filters) { $extra = ''; - if (array_key_exists('extra', $filters)) { + if(array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } - $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $postfix = ($extra) ? '/' . $extra : ''; - $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id . $postfix; - $url = $url . '?' . http_build_query($filters); + $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $postfix = ($extra) ? '/'.$extra : ''; + $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id.$postfix; + $url = $url.'?'.http_build_query($filters); $data = $this->apiClient->get($url, $this->createHeaders())->json(); return $data; } - public function getResourceData($namespace, $klass, $id, $filters) - { + public function getResourceData($namespace, $klass, $id, $filters) { $extra = ''; - if (array_key_exists('extra', $filters)) { + if(array_key_exists('extra', $filters)) { $extra = $filters['extra']; unset($filters['extra']); } - $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $postfix = ($extra) ? '/' . $extra : ''; - $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id . $postfix; - $url = $url . '?' . http_build_query($filters); + $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $postfix = ($extra) ? '/'.$extra : ''; + $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id.$postfix; + $url = $url.'?'.http_build_query($filters); $data = $this->apiClient->get($url, $this->createHeaders())->getBody(); return $data; } - public function _createResource($namespace, $klass, $data) - { - $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $url = $this->apiServer . $prefix . '/' . $klass->collectionName; + public function _createResource($namespace, $klass, $data) { + $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $url = $this->apiServer.$prefix.'/'.$klass->collectionName; $payload = $this->createHeaders(); - if ($klass->collectionName == 'files') { + if($klass->collectionName == 'files') { $payload['headers']['Content-Type'] = 'multipart/form-data'; $payload['body'] = $data; } else { @@ -184,12 +169,11 @@ public function _createResource($namespace, $klass, $data) return $klass->_createObject($this, $namespace, $response); } - public function _updateResource($namespace, $klass, $id, $data) - { - $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id; + public function _updateResource($namespace, $klass, $id, $data) { + $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id; - if ($klass->collectionName == 'files') { + if($klass->collectionName == 'files') { $payload['headers']['Content-Type'] = 'multipart/form-data'; $payload['body'] = $data; } else { @@ -200,18 +184,16 @@ public function _updateResource($namespace, $klass, $id, $data) } } - public function _deleteResource($namespace, $klass, $id) - { - $prefix = ($namespace) ? '/' . $klass->apiRoot . '/' . $namespace : ''; - $url = $this->apiServer . $prefix . '/' . $klass->collectionName . '/' . $id; + public function _deleteResource($namespace, $klass, $id) { + $prefix = ($namespace) ? '/'.$klass->apiRoot.'/'.$namespace : ''; + $url = $this->apiServer.$prefix.'/'.$klass->collectionName.'/'.$id; $payload = $this->createHeaders(); $response = $this->apiClient->delete($url, $payload)->json(); return $response; } - private function generateId() - { + private function generateId() { // Generates unique UUID return sprintf('%04x%04x-%04x-%04x-%04x-%04x%04x%04x', mt_rand(0, 0xffff), @@ -223,35 +205,32 @@ private function generateId() mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); - } +} } -class NylasModelCollection -{ +class NylasModelCollection { private $chunkSize = 50; - public function __construct($klass, $api, $namespace = NULL, $filter = array(), $offset = 0, $filters = array()) - { + public function __construct($klass, $api, $namespace=NULL, $filter=array(), $offset=0, $filters=array()) { $this->klass = $klass; $this->api = $api; $this->namespace = $namespace; $this->filter = $filter; $this->filters = $filters; - if (!array_key_exists('offset', $filter)) { + if(!array_key_exists('offset', $filter)) { $this->filter['offset'] = 0; } } - public function items() - { + public function items() { $offset = 0; while (True) { $items = $this->_getModelCollection($offset, $this->chunkSize); - if (!$items) { + if(!$items) { break; } foreach ($items as $item) { @@ -264,8 +243,7 @@ public function items() } } - public function first() - { + public function first() { $results = $this->_getModelCollection(0, 1); if ($results) { return $results[0]; @@ -273,13 +251,11 @@ public function first() return NULL; } - public function all($limit = INF) - { + public function all($limit=INF) { return $this->_range($this->filter['offset'], $limit); } - public function where($filter, $filters = array()) - { + public function where($filter, $filters=array()) { $this->filter = array_merge($this->filter, $filter); $this->filter['offset'] = 0; $collection = clone $this; @@ -287,39 +263,34 @@ public function where($filter, $filters = array()) return $collection; } - public function find($id) - { + public function find($id) { return $this->_getModel($id); } - public function create($data) - { + public function create($data) { return $this->klass->create($data, $this); } - private function _range($offset, $limit) - { + private function _range($offset, $limit) { $result = array(); while (count($result) < $limit) { $to_fetch = min($limit - count($result), $this->chunkSize); - $data = $this->_getModelCollection($offset + count($result), $to_fetch); + $data = $this->_getModelCollection($offset+count($result), $to_fetch); $result = array_merge($result, $data); - if (!$data || count($data) < $to_fetch) { + if(!$data || count($data) < $to_fetch) { break; } } return $result; } - private function _getModel($id) - { + private function _getModel($id) { // make filter a kwarg filters return $this->api->getResource($this->namespace, $this->klass, $id, $this->filter); } - private function _getModelCollection($offset, $limit) - { + private function _getModelCollection($offset, $limit) { $this->filter['offset'] = $offset; $this->filter['limit'] = $limit; return $this->api->getResources($this->namespace, $this->klass, $this->filter); @@ -328,31 +299,26 @@ private function _getModelCollection($offset, $limit) } -class NylasAPIObject -{ +class NylasAPIObject { public $apiRoot; - public function __construct() - { + public function __construct() { $this->apiRoot = 'n'; } - public function json() - { + public function json() { return $this->data; } - public function _createObject($klass, $namespace, $objects) - { + public function _createObject($klass, $namespace, $objects) { $this->data = $objects; $this->klass = $klass; return $this; } - public function __get($key) - { - if (array_key_exists($key, $this->data)) { + public function __get($key) { + if(array_key_exists($key, $this->data)) { return $this->data[$key]; } return NULL; From 1538adb26d1914913f407dcd5132de2797fe5324 Mon Sep 17 00:00:00 2001 From: lawcus Date: Tue, 13 Oct 2015 22:21:18 -0700 Subject: [PATCH 3/7] Removed namespace --- src/Nylas.php | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/Nylas.php b/src/Nylas.php index 03d4903..8977bac 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -77,7 +77,7 @@ public function getAuthToken($code) { public function getDeltaCursor($token, $namespace) { - $url = $this->apiServer . '/n/' . $namespace->id . '/delta/latest_cursor'; + $url = $this->apiServer . '/delta/latest_cursor'; $headers = $this->createAuthHeader($token); $response = $this->apiClient->post($url, $headers)->json(); if (array_key_exists('cursor', $response)) { From 3f02424fbe3dd4aa6ffac9a65dbc842fb1b92d99 Mon Sep 17 00:00:00 2001 From: lawcus Date: Sat, 5 Dec 2015 01:48:45 -0800 Subject: [PATCH 4/7] Removed namespace for delta cursor and deltas --- src/Nylas.php | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/Nylas.php b/src/Nylas.php index 43d45e3..6baad28 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -75,7 +75,7 @@ public function getAuthToken($code) { return $this->apiToken; } - public function getDeltaCursor($token, $namespace) { + public function getDeltaCursor($token) { $url = $this->apiServer . '/delta/latest_cursor'; $headers = $this->createAuthHeader($token); @@ -87,7 +87,7 @@ public function getDeltaCursor($token, $namespace) { return $this->cursor; } - public function getDeltas($cursor, $token, $namespace) { + public function getDeltas($cursor, $token) { $url = $this->apiServer . '/delta?cursor=' . $cursor; $headers = $this->createAuthHeader($token); From 3bb497de736f248b6fe28fce312f1cccc0ba1829 Mon Sep 17 00:00:00 2001 From: Lawcus Date: Tue, 23 Feb 2016 12:05:09 +0500 Subject: [PATCH 5/7] Added stream functions to enhance the API. --- src/Nylas.php | 134 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 92 insertions(+), 42 deletions(-) diff --git a/src/Nylas.php b/src/Nylas.php index 6baad28..6ba79b5 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -2,10 +2,10 @@ namespace Nylas; - use Nylas\Models; use GuzzleHttp\Client as GuzzleClient; - +use GuzzleHttp\Psr7\Request; +use GuzzleHttp\Stream\Stream; class Nylas { @@ -28,37 +28,30 @@ public function __construct($appID, $appSecret, $token=NULL, $apiServer=NULL) { protected function createHeaders() { $token = 'Basic '.base64_encode($this->apiToken.':'); $headers = array('headers' => ['Authorization' => $token, - 'X-Nylas-API-Wrapper' => 'php']); + 'X-Nylas-API-Wrapper' => 'php']); return $headers; } private function createApiClient() { return new GuzzleClient(['base_url' => $this->apiServer]); } - - private function createAuthHeader($token) { - $Authtoken = 'Basic ' . base64_encode($token . ':'); - $headers = array('headers' => ['Authorization' => $Authtoken, - 'X-Nylas-API-Wrapper' => 'php']); - return $headers; - } public function createAuthURL($redirect_uri, $login_hint=NULL) { $args = array("client_id" => $this->appID, - "redirect_uri" => $redirect_uri, - "response_type" => "code", - "scope" => "email", - "login_hint" => $login_hint, - "state" => $this->generateId()); + "redirect_uri" => $redirect_uri, + "response_type" => "code", + "scope" => "email", + "login_hint" => $login_hint, + "state" => $this->generateId()); return $this->apiServer.'/oauth/authorize?'.http_build_query($args); } public function getAuthToken($code) { $args = array("client_id" => $this->appID, - "client_secret" => $this->appSecret, - "grant_type" => "authorization_code", - "code" => $code); + "client_secret" => $this->appSecret, + "grant_type" => "authorization_code", + "code" => $code); $url = $this->apiServer.'/oauth/token'; $payload = array(); @@ -74,26 +67,6 @@ public function getAuthToken($code) { return $this->apiToken; } - - public function getDeltaCursor($token) { - - $url = $this->apiServer . '/delta/latest_cursor'; - $headers = $this->createAuthHeader($token); - $response = $this->apiClient->post($url, $headers)->json(); - if (array_key_exists('cursor', $response)) { - $this->cursor = $response['cursor']; - } - - return $this->cursor; - } - - public function getDeltas($cursor, $token) { - - $url = $this->apiServer . '/delta?cursor=' . $cursor; - $headers = $this->createAuthHeader($token); - $response = $this->apiClient->get($url, $headers)->json(); - return $response; - } public function account() { $apiObj = new NylasAPIObject(); @@ -254,7 +227,86 @@ private function generateId() { mt_rand(0, 0xffff), mt_rand(0, 0xffff) ); -} + } + + private function setApiClientOptions() { + $this->apiClient->setDefaultOption('config/curl/'.CURLOPT_TIMEOUT, 0); + $this->apiClient->setDefaultOption('config/curl/'.CURLOPT_TIMEOUT_MS, 0); + $this->apiClient->setDefaultOption('config/curl/'.CURLOPT_CONNECTTIMEOUT, 0); + $this->apiClient->setDefaultOption('config/curl/'.CURLOPT_RETURNTRANSFER, true); + } + + private function createAuthHeader($token) { + $Authtoken = 'Basic ' . base64_encode($token . ':'); + $headers = array('headers' => ['Authorization' => $Authtoken, + 'X-Nylas-API-Wrapper' => 'php']); + return $headers; + } + + public function getDeltaCursor($token) { + $url = $this->apiServer . '/delta/latest_cursor'; + $headers = $this->createAuthHeader($token); + $response = $this->apiClient->post($url, $headers)->json(); + if (array_key_exists('cursor', $response)) { + $this->cursor = $response['cursor']; + } + return $this->cursor; + } + + public function getDeltas($cursor, $token) { + $url = $this->apiServer . '/delta?cursor=' . $cursor; + $headers = $this->createAuthHeader($token); + $response = $this->apiClient->get($url, $headers)->json(); + return $response; + } + + public function getCalendars($cursor, $token) { + $url = $this->apiServer . '/calendars'; + $headers = $this->createAuthHeader($token); + $response = $this->apiClient->get($url, $headers)->json(); + return $response; + } + + public function getDeltaStream($cursor, $token, $includeTypes='') { + $this->setApiClientOptions(); + $headers = $this->createAuthHeader($token); + $url = $this->apiServer . '/delta/streaming?cursor=' . $cursor.$includeTypes; + $request = $this->apiClient->get($url, $headers); + $stream = Stream::factory($request); + + $data = strstr($stream, '{'); + $data = explode("\r\n",$data); + $data = explode("\n",$data[0]); + + $results = array(); + foreach($data as $datum) { + $decodedData = json_decode($datum, true); + if (!empty($decodedData)) { + $results[] = $decodedData; + } + } + return $results; + } + + public function getContacts($token) { + $this->setApiClientOptions(); + $headers = $this->createAuthHeader($token); + $url = $this->apiServer . '/contacts'; + $request = $this->apiClient->get($url, $headers); + + $data = strstr($request, '{'); + $data = explode("\r\n",$data); + $data = explode("\n",$data[0]); + + $results = array(); + foreach ($data as $datum) { + if ((strpos($datum, '"email":') !== false) && (strpos($datum, 'reply@') === false)) { + + $results[] = $datum; + } + } + return $results; + } } @@ -372,6 +424,4 @@ public function __get($key) { return NULL; } -} - -?> +} \ No newline at end of file From 85e9d99a4fa1f8b5bb9011b3c0c26e96a48c4de4 Mon Sep 17 00:00:00 2001 From: Lawcus Date: Wed, 2 Mar 2016 19:08:40 +0500 Subject: [PATCH 6/7] Added custom written curl function due to Guzzle connectivity issue with Nylas API. It will be improved latter on properly. --- src/Nylas.php | 52 +++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 52 insertions(+) diff --git a/src/Nylas.php b/src/Nylas.php index 6ba79b5..6a7d2f0 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -308,6 +308,58 @@ public function getContacts($token) { return $results; } + public function handleCalendarEvent($token, $data, $methodType){ + $uri = $this->apiServer . '/events'; + if($methodType !== 'POST' && $methodType !== 'GET'){ + $uri = $this->apiServer . '/events/'.$data['intevent_id']; + } + + $headers = array( + "Content-type: application/json", + "Accept: application/json", + 'Authorization: Basic '. base64_encode($token . ':') + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $uri); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_VERBOSE, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + if($methodType == 'POST'){ + curl_setopt($ch, CURLOPT_POST, 1); + } else { + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $methodType); + } + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + + $response = curl_exec($ch); + + $data = strstr($response, '{'); + $data = explode("\r\n",$data); + $data = explode("\n",$data[0]); + + $eventId = null; + foreach($data as $datum) { + if (strpos($datum, '"id":')) { + $eventId = $datum; + break; + } + } + + $parseEventIdStr = explode(':', $eventId); + if(isset($parseEventIdStr[1])){ + $parseEventIdStr = explode('"', $parseEventIdStr[1]); + $parseEventIdStr = $parseEventIdStr[1]; + } + else { + $parseEventIdStr = $parseEventIdStr[0]; + } + return $parseEventIdStr; + } + } From 889770df5411c045fe9e2128e9b272ccc3807a42 Mon Sep 17 00:00:00 2001 From: Lawcus Date: Wed, 9 Mar 2016 12:51:00 +0500 Subject: [PATCH 7/7] Improved get contacts method to return list of filtered emails with name Added another temporary function to get calendar events results by native curl request. --- src/Nylas.php | 77 +++++++++++++++++++++++++++++++++++++++++++++++---- 1 file changed, 71 insertions(+), 6 deletions(-) diff --git a/src/Nylas.php b/src/Nylas.php index 6a7d2f0..1523e60 100644 --- a/src/Nylas.php +++ b/src/Nylas.php @@ -288,21 +288,86 @@ public function getDeltaStream($cursor, $token, $includeTypes='') { return $results; } - public function getContacts($token) { + public function getContacts($token, $blockedKeywords = array()) { $this->setApiClientOptions(); $headers = $this->createAuthHeader($token); $url = $this->apiServer . '/contacts'; $request = $this->apiClient->get($url, $headers); - $data = strstr($request, '{'); + // Convert string response into JSON + $stream = strstr($request, '{'); + $stream = explode("\r\n",$stream); + $stream = rtrim($stream[0], ','); + $stream = "[" . trim($stream) ; + $stream = json_decode($stream, true); + + $results = array(); + foreach ($stream as $value) { + $email = $value['email']; + $name = $value['name']; + // Filter emails + $current = array(); + if (!empty($email)) { + if (filter_var($email, FILTER_VALIDATE_EMAIL)) { + $splitEmail = explode('@', $email); + for ($i = 0; $i <= count($blockedKeywords); $i++) { + // Emails + if (!empty($blockedKeywords[$i]) && !in_array($splitEmail[0], $blockedKeywords) && + !empty($splitEmail[1]) && !in_array($splitEmail[1], $blockedKeywords) + ) { + $current['email'] = $email; + // Once authentic emails found then also add name for each one if exists + if(!empty($name)){ + if (!empty($blockedKeywords[$i]) && !in_array($name, $blockedKeywords) && + !empty($name) && !in_array($name, $blockedKeywords) + ) { + $current['name'] = $name; + } + } + } + } + } + } + $results[] = $current; + // Remove empty indexes + $results = array_filter($results); + } + return $results; + } + + public function getCalendarEvents($token, $data){ + $uri = $this->apiServer . '/events'; + + $headers = array( + "Content-type: application/json", + "Accept: application/json", + 'Authorization: Basic '. base64_encode($token . ':') + ); + + $ch = curl_init(); + curl_setopt($ch, CURLOPT_URL, $uri); + curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); + curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); + curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, 0); + curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, 0); + curl_setopt($ch, CURLOPT_VERBOSE, 1); + curl_setopt($ch, CURLOPT_HEADER, 1); + curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET'); + curl_setopt($ch, CURLOPT_POSTFIELDS, json_encode($data)); + + $response = curl_exec($ch); + + $stream = Stream::factory($response); + + $data = strstr($stream, '{'); $data = explode("\r\n",$data); $data = explode("\n",$data[0]); $results = array(); - foreach ($data as $datum) { - if ((strpos($datum, '"email":') !== false) && (strpos($datum, 'reply@') === false)) { - - $results[] = $datum; + foreach($data as $datum) { + $decodedData = json_decode($datum, true); + if (!empty($decodedData)) { + $results[] = $decodedData; } } return $results;