mirror of
				https://github.com/beestat/app.git
				synced 2025-10-31 10:07:01 -04:00 
			
		
		
		
	
		
			
				
	
	
		
			105 lines
		
	
	
		
			3.1 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			105 lines
		
	
	
		
			3.1 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) === '' ||
 | |
|       $this->setting->get('smarty_streets_auth_id') === null ||
 | |
|       $this->setting->get('smarty_streets_auth_token') === null
 | |
|     ) {
 | |
|       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
 | |
|     );
 | |
|   }
 | |
| }
 |