WowPress-Tailwind/theme/wowpress/Api/Api.php

189 lines
5.4 KiB
PHP
Raw Normal View History

2024-04-15 16:00:49 +02:00
<?php
namespace WoWPress\Api;
use WoWPress\Database\Cache;
abstract class Api
{
protected $api_url;
private $api_key;
private $api_id;
public function __construct($api_id, $api_key)
{
$this->api_id = $api_id;
$this->api_key = $api_key;
}
protected function auth()
{
return $this->api_key;
}
protected function bearer()
{
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, 'https://us.battle.net/oauth/token');
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, "grant_type=client_credentials");
curl_setopt($ch, CURLOPT_USERPWD, $this->api_id . ':' . $this->api_key);
$headers = array();
$headers[] = 'Content-Type: application/x-www-form-urlencoded';
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = json_decode(curl_exec($ch), 1);
if (curl_errno($ch)) {
return false;
}
curl_close($ch);
if (!empty($result['error'])) {
return false;
}
$apitoken = $result;
$bearer = $apitoken['access_token'];
return $bearer;
}
public function put($url, $parameter = [], $headerauth = true)
{
$result = "{}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->api_url . $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data_json = json_encode($parameter);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'PUT');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
$headers = array('Content-Type: application/json', 'Content-Length: ' . strlen($data_json));
$headers[] = 'Accept: application/json';
if ($headerauth) {
$headers[] = 'Authorization: ' . $this->api_key;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
error_log('Error:' . curl_error($ch));
return false;
}
curl_close($ch);
$out = json_decode($result, true, 512, JSON_INVALID_UTF8_SUBSTITUTE);
if (json_last_error()) {
error_log('Error:' . json_last_error_msg());
return false;
} else {
return $out;
}
}
public function post($url, $parameter = [], $headerauth = true)
{
$result = "{}";
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $this->api_url . $url);
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
$data_json = json_encode($parameter);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'POST');
curl_setopt($ch, CURLOPT_POSTFIELDS, $data_json);
$headers = array('Content-Type: application/json', 'Content-Length: ' . strlen($data_json));
$headers[] = 'Accept: application/json';
if ($headerauth) {
$headers[] = 'Authorization: ' . $this->api_key;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$result = curl_exec($ch);
if (curl_errno($ch)) {
error_log('Error:' . curl_error($ch));
return false;
}
curl_close($ch);
$out = json_decode($result, true, 512, JSON_INVALID_UTF8_SUBSTITUTE);
if (json_last_error()) {
error_log('Error:' . json_last_error_msg());
return false;
} else {
return $out;
}
}
public function get($url, $parameter = [], $headerauth = true, $expiration = 5)
{
$from_cache = true;
$result = "{}";
if (!str_contains($url, "https:/")) {
$url = $this->api_url . $url;
}else{
$parts = parse_url($url);
parse_str($parts['query'], $query);
$parameter = array_merge($parameter,$query);
$url = strtok($url, '?');
}
$cache_key = Cache::buildKey([
$url,
http_build_query($parameter),
$headerauth ? "true" : "false",
]);
$cache = Cache::where('p_key', $cache_key)->get()->last();
if(empty($cache->ID) || $cache->isExpired($expiration)){
$ch = curl_init();
if (!empty($parameter)) {
$parameter = http_build_query($parameter);
curl_setopt($ch, CURLOPT_URL, $url . "?" . $parameter);
} else {
curl_setopt($ch, CURLOPT_URL, $url);
}
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 1);
curl_setopt($ch, CURLOPT_CUSTOMREQUEST, 'GET');
$headers = array();
$headers[] = 'Accept: application/json';
if ($headerauth) {
$headers[] = 'Authorization: ' . $this->api_key;
}
curl_setopt($ch, CURLOPT_HTTPHEADER, $headers);
$response = curl_exec($ch);
$header_size = curl_getinfo($ch, CURLINFO_HEADER_SIZE);
$header = substr($response, 0, $header_size);
$result = substr($response, $header_size);
if (curl_errno($ch)) {
error_log('Error:' . curl_error($ch));
return false;
}
$cache = Cache::upsert($cache_key, $result);
$from_cache = false;
}
if (!is_array($cache->value)) {
return ['error' => true];
}
return array_merge($cache->value, compact('from_cache'));
}
}