Files
dev-chiefworks 47f4fad75c Added Other AP
2022-04-26 11:30:34 -04:00

224 lines
6.3 KiB
PHP

<?php
class HourlyAveragesApi extends Api {
public $apiName = 'hourlyaverages';
public function __construct($requestUri, $encryption=true) {
$encryption = false; // We do not need encryption for this class
parent::__construct($requestUri, $encryption);
//$this->encryption = $encryption;
}
/**
* @OA\Get(
* path="/SAVVY/geofencearea/api/addresstoarea?address_id={address_id}",
* security={{"token": {}}},
* summary="Geocode address id to a geofence area",
* @OA\Response(
* response="200",
* description="area list address belongs to",
* @OA\JsonContent(
* type="object"
* )
* )
* )
*/
public function indexAction() {
$message = 'No hourly data found';
$from_address = $this->requestParams['from_address'] ?? '';
$to_address = $this->requestParams['to_address'] ?? '';
$country = $this->requestParams['country'] ?? '';
$city = $this->requestParams['city'] ?? 0;
$member_id = $this->requestParams['member_id'] ?? 0;
$from_lat = $this->requestParams['from_lat'] ?? '';
$from_lng = $this->requestParams['from_lng'] ?? '';
$to_lat = $this->requestParams['to_lat'] ?? '';
$to_lng = $this->requestParams['to_lng'] ?? '';
$from_postal_code = $this->requestParams['from_postal_code'] ?? null;
$to_postal_code = $this->requestParams['to_postal_code'] ?? null;
try {
if ($from_address==="") {
throw new Exception("Invalid from address");
}
if ($to_address==="") {
throw new Exception("Invalid to address");
}
if ($city<1) {
throw new Exception("Invalid city");
}
if (!in_array(strtoupper($country), ['SG','US']) ) { // Singapore and USA only for now
throw new Exception("Invalid country");
}
// Get city info by ID
$db = new Db();
$cityInfo = HourlyAverages::getCityInfo($db->getConnect(), $city);
if (count($cityInfo) == 0) {
throw new Exception("Couldn't get information for city with id=${city}");
}
$timeZoneId = $cityInfo['timezone'];
$cityName = $cityInfo['city'];
// Step 1: geocode the addresses
if ($from_lat && $from_lng) {
$fAddress = [
'address' => $from_address,
'geocode' => [
'message' => '',
'latitude' => $from_lat,
'longitude' => $from_lng,
'address' => $from_address,
'postal' => $from_postal_code,
'timeZoneId' => $timeZoneId,
'city' => $cityName,
'city_lat' => $from_lat,
'city_lng' => $from_lng,
'country' => $country,
'id' => null
],
'error' => null
];
} else {
list($fAddress, $err) = $this->geocode($from_address,$country,(int)$member_id);
if (!is_array($fAddress) || !array_key_exists('geocode',$fAddress) || !is_array($fAddress['geocode'])
|| !array_key_exists('id',$fAddress['geocode']) || $fAddress['geocode']['id']<1) {
throw new Exception("Failed to geocode from address".json_encode($fAddress));
}
$fAddress['geocode']['longitude'] = $fAddress['geocode']['lng'];
$fAddress['geocode']['latitude'] = $fAddress['geocode']['lat'];
}
if ($to_lat && $to_lng) {
$tAddress = [
'address' => $to_address,
'geocode' => [
'message' => '',
'latitude' => $to_lat,
'longitude' => $to_lng,
'address' => $to_address,
'postal' => $to_postal_code,
'timeZoneId' => $timeZoneId,
'city' => $cityName,
'city_lat' => $to_lat,
'city_lng' => $to_lng,
'country' => $country,
'id' => null
],
'error' => null
];
} else {
list($tAddress, $err) = $this->geocode($to_address,$country,(int)$member_id);
if (!is_array($tAddress) || !array_key_exists('geocode',$tAddress) || !is_array($tAddress['geocode'])
|| !array_key_exists('id',$tAddress['geocode']) || $tAddress['geocode']['id']<1) {
throw new Exception("Failed to geocode to address");
}
$tAddress['geocode']['longitude'] = $tAddress['geocode']['lng'];
$tAddress['geocode']['latitude'] = $tAddress['geocode']['lat'];
}
list($res, $err) = HourlyAverages::get( $db->getConnect(), $fAddress['geocode'], $tAddress['geocode'], $city, $country );
if (!is_array($res) || count($res)<1) {
throw new Exception($err!==""?$err:"Failed to get hourly averages");
}
$result = [
'city' => $city,
'country' => $country,
'member_id' => $member_id,
'from_address' => $fAddress,
'to_address' => $tAddress,
'data' => $res
];
return $this->response(
[
"hourlyaverages" => $result,
"error" => $err
], 200 );
} catch (Exception $e) {
$message = $e->getMessage();
}
return $this->response(
[
"hourlyaverages" => NULL,
"error" => $message
], 404);
}
public function viewAction() {
}
public function createAction() {
}
public function updateAction() {
}
public function deleteAction() {
}
protected function geocode($address, $country, $member_id=0) {
global $httpAuthToken, $savvyext;
$encryptionAlg = $savvyext->cfgReadChar('encryption.algorithm');
$encryptionKey = $savvyext->cfgReadChar('encryption.key');
$encryptionIV = $savvyext->cfgReadChar('encryption.iv');
$baseURL = $savvyext->cfgReadChar('system.api_url');
$in = [
'address' => $address,
'member_id' => $member_id,
'country' => $country
];
$data = http_build_query($in);
$url = $baseURL . "/trips/api/geocode/?".$data;
$ch = curl_init($url);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, "GET");
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false);
curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($ch, CURLOPT_VERBOSE, false);
curl_setopt($ch, CURLOPT_HTTPHEADER, array(
'Content-Type: application/json',
'Authorization: Server-Token ' . $httpAuthToken)
);
$body = curl_exec($ch);
$result = json_decode($body,true);
$payload = openssl_decrypt(
hex2bin(
$result['payload']
),
$encryptionAlg,
$encryptionKey,
OPENSSL_RAW_DATA,
$encryptionIV
);
return [json_decode($payload,true),$body];
}
}