<?php namespace Ingress\Services\smartdataapi; use Exception; /** * API client for SmartDataContext API */ class SmartDataContextApiClient { private string $baseUrl; private string $certificatePath; private string $certificateKeyPath; public function __construct(string $baseUrl, string $certificatePath, string $certificateKeyPath) { $this->baseUrl = $baseUrl; $this->certificatePath = $certificatePath; $this->certificateKeyPath = $certificateKeyPath; } private function postRequest(string $endpoint, array $data): array { $url = $this->baseUrl . $endpoint; $ch = curl_init($url); $jsonData = json_encode($data); $headers = [ 'Content-Type: application/json', 'Content-Length: ' . strlen($jsonData), ]; curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); curl_setopt($ch, CURLOPT_POST, true); curl_setopt($ch, CURLOPT_POSTFIELDS, $jsonData); curl_setopt($ch, CURLOPT_HTTPHEADER, $headers); curl_setopt($ch, CURLOPT_SSLCERT, $this->certificatePath); curl_setopt($ch, CURLOPT_SSLKEY, $this->certificateKeyPath); curl_setopt($ch, CURLOPT_SSL_VERIFYPEER, false); curl_setopt($ch, CURLOPT_SSL_VERIFYHOST, false); $response = curl_exec($ch); $error = curl_error($ch); $http_status = curl_getinfo($ch, CURLINFO_HTTP_CODE); curl_close($ch); if ($error) { return ['errors' => [$error]]; } else if ($http_status == 401) { return ['errors' => ["Unauthorized (invalid certificate)."]]; } return json_decode($response, true); } public function createSmartDataContext(array $request): array { $data = [ 'command' => '/create', 'request' => $request, ]; return $this->postRequest('/api/context.php#create', $data); } public function associateSmartDataContext(array $request): array { $data = [ 'command' => '/associate', 'request' => $request, ]; return $this->postRequest('/api/context.php#associate', $data); } public function unassociateSmartDataContext(array $request): array { $data = [ 'command' => '/unassociate', 'request' => $request, ]; return $this->postRequest('/api/context.php#unassociate', $data); } public function getSmartDataContext(string $id): array { $data = [ 'command' => '/get', 'request' => ['smartDataContextId' => $id] ]; return $this->postRequest('/api/context.php#get', $data); } public function getIdByIdentifier(string $signature): mixed { $data = [ 'command' => '/query', 'request' => ['features.identifier' => $signature] ]; $result = $this->postRequest('/api/context.php#query', $data); if (array_key_exists('result', $result) && count($result['result']) > 0) { return $result['result'][0]['id']; } else if (array_key_exists('errors', $result)) { throw new Exception(json_encode($result['errors'])); } else { return null; } } public function updateSmartDataContext(string $id, array $request): array { $request['smartDataContextId'] = $id; $data = [ 'command' => '/update', 'request' => $request, ]; return $this->postRequest('/api/context.php#update', $data); } public function querySmartDataContext(array $request): array { $data = [ 'command' => '/query', 'request' => $request, ]; return $this->postRequest('/api/context.php#query', $data); } public function retrieveContext(array $request): array { $data = [ 'command' => '/contexts', 'request' => $request, ]; return $this->postRequest('/api/context.php#context', $data); } }