1
0
mirror of https://github.com/beestat/app.git synced 2025-05-24 02:14:03 -04:00
beestat/api/smarty_streets.php
Jon Ziebell 4d9e1e660a Made SmartyStreets failures not throw errors for #271
I still need to address the business side of things, though. For now if my subscription runs out or SmartyStreets returns garbage beestat will ignore the error and comparisons just won't work properly. Any issue caused by this will auto-resolve as soon as possible since the API call will retry automatically.
2020-05-19 22:18:04 -04:00

101 lines
2.9 KiB
PHP

<?php
/**
* High level functionality for interacting with the SmartyStreets API.
*
* @author Jon Ziebell
*/
/**
* Smarty Streets provides address lookup for normalizing address strings.
* This is useful for turning bad data into good data. For example, much of
* the data beestat gets has inconsistent naming (IN vs Indiana) between
* thermostats. This fixes those issues, provides geocoding, and increases the
* amount of trust I can put in locations for various reports.
*/
class smarty_streets extends external_api {
protected static $log_mysql = 'all';
protected static $cache = true;
protected static $cache_for = null;
/**
* Send an API call to smarty_streets and return the response.
*
* @param string $address_string The address to look up.
* @param array $country The country the address is in.
*
* @return array The response of this API call.
*/
public function smarty_streets_api($address_string, $country) {
// Smarty doesn't like this.
if(trim($address_string) === '') {
return null;
}
// Smarty has a different endpoint for USA vs International.
if ($country === 'USA') {
$url = 'https://us-street.api.smartystreets.com/street-address';
$url .= '?' . http_build_query([
'street' => $address_string,
'auth-id' => $this->setting->get('smarty_streets_auth_id'),
'auth-token' => $this->setting->get('smarty_streets_auth_token')
]);
} else {
$url = 'https://international-street.api.smartystreets.com/verify';
$url .= '?' . http_build_query([
'freeform' => $address_string,
'country' => $country,
'geocode' => 'true',
'auth-id' => $this->setting->get('smarty_streets_auth_id'),
'auth-token' => $this->setting->get('smarty_streets_auth_token')
]);
}
$curl_response = $this->curl([
'url' => $url
]);
$response = json_decode($curl_response, true);
if ($response === null || count($response) === 0) {
return null;
} else {
// Smarty doesn't return this but I want it.
if($country === 'USA') {
$response[0]['components']['country_iso_3'] = 'USA';
}
return $response[0];
}
}
/**
* Generate a cache key from a URL. Just hashes it.
*
* @param array $arguments
*
* @return string
*/
protected function generate_cache_key($arguments) {
return sha1($arguments['url']);
}
/**
* Determine whether or not a request should be cached. For this, cache
* valid JSON responses with status code 200.
*
* @param array $arguments
* @param string $curl_response
* @param array $curl_info
*
* @return boolean
*/
protected function should_cache($arguments, $curl_response, $curl_info) {
return (
$curl_info['http_code'] === 200 &&
json_decode($curl_response, true) !== null
);
}
}