Skip to content
Snippets Groups Projects
SmartDataContextApiClient.php 4.02 KiB
Newer Older
<?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);
    }




}