diff options
Diffstat (limited to 'lib')
-rw-r--r-- | lib/SparkPost/APIResource.php | 216 | ||||
-rw-r--r-- | lib/SparkPost/SparkPost.php | 4 | ||||
-rw-r--r-- | lib/SparkPost/Transmission.php | 145 |
3 files changed, 238 insertions, 127 deletions
diff --git a/lib/SparkPost/APIResource.php b/lib/SparkPost/APIResource.php new file mode 100644 index 0000000..469ba7e --- /dev/null +++ b/lib/SparkPost/APIResource.php @@ -0,0 +1,216 @@ +<?php +namespace SparkPost; +use Guzzle\Http\Client; +use Guzzle\Http\Exception\ClientErrorResponseException; + +/** + * @desc SDK interface for managing SparkPost API endpoints + */ +class APIResource { + + /** + * @desc name of the API endpoint, mainly used for URL construction. + * @var string + */ + public static $endpoint; + + /** + * @desc singleton holder to create a guzzle http client + * @var \GuzzleHttp\Client + */ + protected static $request; + + /** + * @desc Mapping for values passed into the send method to the values needed for the respective API + * @var array + */ + protected static $parameterMappings = array(); + + /** + * @desc Sets up default structure and default values for the model that is acceptable by the API + * @var array + */ + protected static $structure = array(); + + /** + * @desc Ensure that this class cannot be instansiated + */ + private function __construct() {} + + /** + * @desc Creates and returns a guzzle http client. + * @return \GuzzleHttp\Client + */ + protected static function getHttpClient() { + if(!isset(self::$request)) { + self::$request = new Client(); + } + return self::$request; + } + + /** + * @desc Private Method helper to get the configuration values to create the base url for the current API endpoint + * + * @return string base url for the transmissions API + */ + protected static function getBaseUrl($config) { + $baseUrl = '/api/' . $config['version'] . '/' . static::$endpoint; + return $config['protocol'] . '://' . $config['host'] . ($config['port'] ? ':' . $config['port'] : '') . $baseUrl; + } + + + /** + * @desc Private Method helper to reference parameter mappings and set the right value for the right parameter + */ + protected static function setMappedValue (&$model, $mapKey, $value) { + //get mapping + if( empty(static::$parameterMappings) ) { + // if parameterMappings is empty we can assume that no wrapper is defined + // for the current endpoint and we will use the mapKey to define the mappings directly + $mapPath = $mapKey; + }elseif(array_key_exists($mapKey, static::$parameterMappings)) { + // use only defined parameter mappings to construct $model + $mapPath = static::$parameterMappings[$mapKey]; + } else { + return; + } + + $path = explode('.', $mapPath); + $temp = &$model; + foreach( $path as $key ) { + if( !isset($temp[$key]) ){ + $temp[$key] = null; + } + $temp = &$temp[$key]; + } + $temp = $value; + + } + + protected static function buildRequestModel( $requestConfig, $model=array() ) { + foreach($requestConfig as $key=>$value) { + self::setMappedValue($model, $key, $value); + } + return $model; + } + + /** + * @desc Method for issuing POST requests + * + * @return array API repsonse represented as key-value pairs + */ + public static function sendRequest( $requestConfig ) { + $hostConfig = SparkPost::getConfig(); + $request = self::getHttpClient(); + + //create model from $transmissionConfig + $model = static::$structure; + $requestModel = self::buildRequestModel( $requestConfig, $model ); + + //send the request + try { + $response = $request->post( + self::getBaseUrl($hostConfig), + array('authorization' => $hostConfig['key']), + json_encode($requestModel), + array("verify"=>$hostConfig['strictSSL']) + )->send(); + + return $response->json(); + } + /* + * Handles 4XX responses + */ + catch (ClientErrorResponseException $exception) { + $response = $exception->getResponse(); + $responseArray = $response->json(); + throw new \Exception(json_encode($responseArray['errors'])); + } + /* + * Handles 5XX Errors, Configuration Errors, and a catch all for other errors + */ + catch (\Exception $exception) { + throw new \Exception("Unable to contact ".ucfirst(static::$endpoint)." API: ". $exception->getMessage()); + } + } + + + /** + * @desc Wrapper method for issuing GET request to current API endpoint + * + * @param string $resourcePath (optional) string resource path of specific resource + * @param array $options (optional) query string parameters + * @return array Result set of transmissions found + */ + public static function fetchResource( $resourcePath=null, $options=array() ) { + return self::callResource( 'get', $resourcePath, $options ); + } + + /** + * @desc Wrapper method for issuing DELETE request to current API endpoint + * + * @param string $resourcePath (optional) string resource path of specific resource + * @param array $options (optional) query string parameters + * @return array Result set of transmissions found + */ + public static function deleteResource( $resourcePath=null, $options=array() ) { + return self::callResource( 'delete', $resourcePath, $options ); + } + + /** + * @desc Private Method for issuing GET and DELETE request to current API endpoint + * + * This method is responsible for getting the collection _and_ + * a specific entity from the API endpoint + * + * If resourcePath parameter is omitted, then we fetch the collection + * + * @param string $action HTTP method type + * @param string $resourcePath (optional) string resource path of specific resource + * @param array $options (optional) query string parameters + * @return array Result set of action performed on resource + */ + private static function callResource( $action, $resourcePath=null, $options=array() ) { + + if( !in_array( $action, array('get', 'delete') ) ) throw new \Exception('Invalid resource action'); + + //build the url + $hostConfig = SparkPost::getConfig(); + $url = self::getBaseUrl($hostConfig); + if (!is_null($resourcePath)){ + $url .= '/'.$resourcePath; + } + + // untested: + if( !empty($options) ) { + $queryString = http_build_query($options); + $url .= '?'.$queryString; + } + + $request = self::getHttpClient(); + + //make request + try { + $response = $request->{$action}($url, array('authorization' => $hostConfig['key']), array("verify"=>$hostConfig['strictSSL']))->send(); + return $response->json(); + } + /* + * Handles 4XX responses + */ + catch (ClientErrorResponseException $exception) { + $response = $exception->getResponse(); + $statusCode = $response->getStatusCode(); + if($statusCode === 404) { + throw new \Exception("The specified resource does not exist", 404); + } + throw new \Exception("Received bad response from ".ucfirst(static::$endpoint)." API: ". $statusCode ); + } + /* + * Handles 5XX Errors, Configuration Errors, and a catch all for other errors + */ + catch (\Exception $exception) { + throw new \Exception("Unable to contact ".ucfirst(static::$endpoint)." API: ". $exception->getMessage()); + } + } + +} diff --git a/lib/SparkPost/SparkPost.php b/lib/SparkPost/SparkPost.php index 5c2a554..755df46 100644 --- a/lib/SparkPost/SparkPost.php +++ b/lib/SparkPost/SparkPost.php @@ -51,6 +51,10 @@ class SparkPost { } return self::$config; } + + public static function unsetConfig() { + self::$config = NULL; + } } ?>
\ No newline at end of file diff --git a/lib/SparkPost/Transmission.php b/lib/SparkPost/Transmission.php index dcc3fe1..4e54f1d 100644 --- a/lib/SparkPost/Transmission.php +++ b/lib/SparkPost/Transmission.php @@ -6,18 +6,15 @@ use Guzzle\Http\Exception\ClientErrorResponseException; /** * @desc SDK interface for managing transmissions */ -class Transmission { - /** - * @desc singleton holder to create a guzzle http client - * @var \GuzzleHttp\Client - */ - private static $request; +class Transmission extends APIResource { + + public static $endpoint = 'transmissions'; /** * @desc Mapping for values passed into the send method to the values needed for the Transmission API * @var array */ - private static $parameterMappings = array( + protected static $parameterMappings = array( 'campaign'=>'campaign_id', 'metadata'=>'metadata', 'substitutionData'=>'substitution_data', @@ -42,7 +39,7 @@ class Transmission { * @desc Sets up default structure and default values for the model that is acceptable by the API * @var array */ - private static $structure = array( + protected static $structure = array( 'return_path'=>"default@sparkpostmail.com", 'content'=>array( 'html'=>null, @@ -53,48 +50,6 @@ class Transmission { ); /** - * @desc Ensure that this class cannot be instansiated - */ - private function __construct() {} - - /** - * @desc Creates and returns a guzzle http client. - * @return \GuzzleHttp\Client - */ - private static function getHttpClient() { - if(!isset(self::$request)) { - self::$request = new Client(); - } - return self::$request; - } - - - /** - * @desc Private Method helper to reference parameter mappings and set the right value for the right parameter - */ - private static function setMappedValue (&$model, $mapKey, $value) { - //get mapping - if(array_key_exists($mapKey, self::$parameterMappings)) { - $temp = &$model; - $path = explode('.', self::$parameterMappings[$mapKey]); - foreach( $path as $key ) { - $temp = &$temp[$key]; - } - $temp = $value; - } //ignore anything we don't have a mapping for - } - - /** - * @desc Private Method helper to get the configuration values to create the base url for the transmissions API - * - * @return string base url for the transmissions API - */ - private static function getBaseUrl($config) { - $baseUrl = '/api/' . $config['version'] . '/transmissions'; - return $config['protocol'] . '://' . $config['host'] . ($config['port'] ? ':' . $config['port'] : '') . $baseUrl; - } - - /** * @desc Method for issuing POST request to the Transmissions API * * This method assumes that all the appropriate fields have @@ -120,80 +75,8 @@ class Transmission { * * @return array API repsonse represented as key-value pairs */ - public static function send($transmissionConfig) { - $hostConfig = SparkPost::getConfig(); - $request = self::getHttpClient(); - - //create model from $transmissionConfig - $model = self::$structure; - foreach($transmissionConfig as $key=>$value) { - self::setMappedValue($model, $key, $value); - } - - //send the request - try { - $response = $request->post(self::getBaseUrl($hostConfig), array('authorization' => $hostConfig['key']), json_encode($model), array("verify"=>$hostConfig['strictSSL']))->send(); - return $response->json(); - } - /* - * Handles 4XX responses - */ - catch (ClientErrorResponseException $exception) { - $response = $exception->getResponse(); - $responseArray = $response->json(); - throw new \Exception(json_encode($responseArray['errors'])); - } - /* - * Handles 5XX Errors, Configuration Errors, and a catch all for other errors - */ - catch (\Exception $exception) { - throw new \Exception('Unable to contact Transmissions API: '. $exception->getMessage()); - } - } - - /** - * @desc Private Method for issuing GET request to Transmissions API - * - * This method is responsible for getting the collection _and_ - * a specific entity from the Transmissions API - * - * If TransmissionID parameter is omitted, then we fetch the collection - * - * @param string $transmissionID (optional) string Transmission ID of specific Transmission to retrieve - * @return array Result set of transmissions found - */ - private static function fetch ($transmissionID = null) { - //figure out the url - $hostConfig = SparkPost::getConfig(); - $url = self::getBaseUrl($hostConfig); - if (!is_null($transmissionID)){ - $url .= '/'.$transmissionID; - } - - $request = self::getHttpClient(); - - //make request - try { - $response = $request->get($url, array('authorization' => $hostConfig['key']), array("verify"=>$hostConfig['strictSSL']))->send(); - return $response->json(); - } - /* - * Handles 4XX responses - */ - catch (ClientErrorResponseException $exception) { - $response = $exception->getResponse(); - $statusCode = $response->getStatusCode(); - if($statusCode === 404) { - throw new \Exception("The specified Transmission ID does not exist", 404); - } - throw new \Exception("Received bad response from Transmission API: ". $statusCode); - } - /* - * Handles 5XX Errors, Configuration Errors, and a catch all for other errors - */ - catch (\Exception $exception) { - throw new \Exception('Unable to contact Transmissions API: '. $exception->getMessage()); - } + public static function send( $transmissionConfig ) { + return self::sendRequest( $transmissionConfig ); } /** @@ -202,8 +85,12 @@ class Transmission { * * @return array result Set of transmissions */ - public static function all() { - return self::fetch(); + public static function all( $campaignID=null, $templateID=null ) { + $options = array(); + if( $campaignID !== NULL ) $options['campaign_id'] = $campaignID; + if( $templateID !== NULL ) $options['template_id'] = $templateID; + + return self::fetchResource( null, $options ); } /** @@ -214,7 +101,11 @@ class Transmission { * @return array result Single transmission represented in key-value pairs */ public static function find($transmissionID) { - return self::fetch($transmissionID); + return self::fetchResource($transmissionID); + } + + public static function delete( $transmissionID ) { + return self::deleteResource($transmissionID); } } |