キャッシュデータの作成

This commit is contained in:
2026-04-27 14:22:56 +09:00
parent 1bc9e594e2
commit 5b1a9c51bf
8 changed files with 198 additions and 127 deletions

View File

@@ -60,7 +60,7 @@ if (ATOM_ENABLED) {
if (OPENPROVIDER_ENABLED) {
$routes[] = Route::add('GET', 'openprovider', Op::class.'@index');
$routes[] = Route::add('GET', 'openprovider/searchcustomer', Op::class.'@opSearchCustomers');
$routes[] = Route::add('GET', 'openprovider/listcustomer', Op::class.'@opListCustomers');
$routes[] = Route::add('GET', 'openprovider/listtlds', Op::class.'@opListTlds');
$routes[] = Route::add('GET', 'openprovider/gettld/{tld}', Op::class.'@opGetTld');
$routes[] = Route::add('GET', 'openprovider/checkdomain', Op::class.'@opCheckDomainAvailable');

View File

@@ -39,7 +39,7 @@ class Op {
}
}
public function opSearchCustomers(array $params): void {
public function opListCustomers(array $params): void {
try {
$tmpl = new Template('/openprovider/');
$pagetit = 'OpenProvider管理 - 顧客様検索';
@@ -59,11 +59,11 @@ class Op {
if (!$user || $user->role !== \Roles::ADMIN) goto noaccess;
$op = new Openprovider();
$op->login();
$data = $op->searchCustomers();
$tmpl->assign('data', $data);
$data = $op->listCustomers();
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
$tmpl->render('searchcustomer');
$tmpl->render('listcustomer');
exit();
noaccess:
@@ -94,7 +94,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = $op->listTlds();
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
$tmpl->render('listtlds');
@@ -134,7 +134,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = $op->getTld($tld);
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
$tmpl->render('gettld');
@@ -168,7 +168,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = $op->listDomains($domains, true);
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->assign('saved', $saved);
@@ -209,7 +209,7 @@ class Op {
$op->login();
if (!empty($domains)) {
$data = $op->checkDomainAvailable($domains, true);
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$saved = $_GET['domains'];
}
@@ -251,7 +251,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = $op->getDomainPrices(['domain.name' => $domainname, 'domain.extension' => $domainext]);
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
$tmpl->render('getdomainprices');
@@ -285,7 +285,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = $op->listDnsZones();
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
if ($user && $user->role & (\Roles::ADMIN)) $tmpl->render('listdnszones');
@@ -326,7 +326,7 @@ class Op {
$op = new Openprovider();
$op->login();
$data = ['rec' => $op->listZoneRecords($domain), 'zone' => $op->getDnsZone($domain)];
$tmpl->assign('data', $data);
$tmpl->assign('data', $data->data);
$tmpl->addCss('table');
$tmpl->render('getdns');

View File

@@ -4,15 +4,15 @@ namespace Std\Lib;
use Std\Lib\Curl;
class Openprovider {
protected string $dataFile = ROOT."/data/session.json";
protected string $dataDir = ROOT."/data/cache/";
protected int $tokenDuration = 172800; // 48時間
private string $user = '';
private string $pass = '';
private string $token = '';
private string $ip = '';
private int $reseller_id = 0;
private int $last_auth = 0;
private int $resellerId = 0;
private int $lastAuth = 0;
private string $BASEURL = DEBUG_MODE ? 'http://api.sandbox.openprovider.nl:8480/v1beta'
: 'https://api.openprovider.eu/v1beta';
@@ -27,14 +27,18 @@ class Openprovider {
* トークンの受け取り。
* このライブリリーを使ったら、一回「login()」を実行する事が必須となります。
*
* @return Result|false 結果
* @return Result 結果
*/
public function login(): \Result|false {
public function login(): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$this->getCache();
if (time() < ($this->last_auth + $this->tokenDuration)) return false;
$curl = new Curl("{$this->BASEURL}/auth/login");
$cache = $this->getCache('login');
if (time() < ($this->lastAuth + $this->tokenDuration)) {
$this->token = $cache['data']['token'];
$this->lastAuth = $cache['last_auth'];
return \Result::Success('', $cache);
}
$curl = new Curl("{$this->BASEURL}/auth/login");
$payload = [
'username' => $this->user,
'password' => $this->pass,
@@ -62,17 +66,17 @@ class Openprovider {
}
assert_not_null($body, "返事ボディーは空です。");
$data = json_decode($body, true);
if (isset($data['data']['token'])) {
$this->token = $data['data']['token'];
$this->last_auth = time();
$this->reseller_id = $data['data']['reseller_id'];
$this->mkCache();
$res = json_decode($body, true);
if (isset($res['data']['token'])) {
$this->token = $res['data']['token'];
$this->lastAuth = time();
$res['last_auth'] = $this->lastAuth;
$this->setCache('login', $res);
return \Result::Success();
return \Result::Success('', $res);
}
return \Result::Error("ログインに失敗。");
return \Result::Error('ログインに失敗。');
}
// カスタマー
@@ -84,15 +88,21 @@ class Openprovider {
/***
* ドメイン一覧。
*
* @return Result|array 結果。
* @return Result 結果。
*/
public function listDomains(array $query = []): \Result|array {
public function listDomains(array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$curl = $this->setupCurl('/domains');
$data = $this->curlResult($curl);
if (isset($data['data']['results'])) return $data['data']['results'];
$cache = $this->getCache('listdomains');
if (!empty($cache)) return \Result::Success('', $cache);
return \Result::Error("ドメインの確認に失敗。");
$curl = $this->setupCurl('/domains');
$res = $this->curlResult($curl);
if (isset($res['data']['results'])) {
$this->setCache('listdomains', $res->data);
return \Result::Success('', $res['data']['results']);
}
return \Result::Error('ドメインの確認に失敗。');
}
/**
@@ -101,9 +111,9 @@ class Openprovider {
* @param string $name 登録したいドメイン名(例:"076studio.jp"
* @param array $info カスタマー情報等
* @param int $period 年間(デフォルト=1年)
* @return Result|array 結果。配列の場合:'activation_date'(リアルタイムで成功したのみ), 'auth_code'TLDが対応している場合のみ, 'expiration_date', 'id', 'renewal_date', 'status'ACT又はREQ
* @return Result 結果。配列の場合:'activation_date'(リアルタイムで成功したのみ), 'auth_code'TLDが対応している場合のみ, 'expiration_date', 'id', 'renewal_date', 'status'ACT又はREQ
*/
public function createDomain(string $name, array $info, int $period = 1): \Result|array {
public function createDomain(string $name, array $info, int $period = 1): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
if (!isset($info['owner_handle']) || $info['owner_handle'] === '') $info['owner_handle'] = OPENPROVIDER['owner_handle'];
if (!isset($info['admin_handle']) || $info['admin_handle'] === '') $info['admin_handle'] = OPENPROVIDER['owner_handle'];
@@ -142,10 +152,10 @@ class Openprovider {
$curl = $this->setupCurl('/domains/', 'POST', $payload);
kys('TODO');
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res['data'])) return \Result::Success('', $res);
return \Result::Error("ドメインの確認に失敗。");
return \Result::Error('ドメインの確認に失敗。');
}
/***
@@ -153,9 +163,9 @@ class Openprovider {
*
* @param array $domains ドメイン名リスト。例:['076.moe', '076.co.jp', '076.com']
* @param bool $with_price 値段を表示するかどうか。デフォルトは「false」
* @return Result|array 結果。配列の場合:'domain'と'status'はいつでもあり、'reason', 'premium', 'is_premium'が多分あり、そして'price'が「with_price」が「true」の場合のみ。
* @return Result 結果。配列の場合:'domain'と'status'はいつでもあり、'reason', 'premium', 'is_premium'が多分あり、そして'price'が「with_price」が「true」の場合のみ。
*/
public function checkDomainAvailable(array $domains, bool $with_price = false): \Result|array {
public function checkDomainAvailable(array $domains, bool $with_price = false): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$domainList = [];
foreach ($domains as $d) {
@@ -178,10 +188,10 @@ class Openprovider {
];
$curl = $this->setupCurl('/domains/check', 'POST', $payload);
$data = $this->curlResult($curl);
if (isset($data['data']['results'])) return $data['data']['results'];
$res = $this->curlResult($curl);
if (isset($res['data']['results'])) return \Result::Success('', $res['data']['results']);
return \Result::Error("ドメインの確認に失敗。");
return \Result::Error('ドメインの確認に失敗。');
}
//// 追加データ
@@ -192,18 +202,24 @@ class Openprovider {
* 顧客様の検索
*
* @param array $query 検索クエリー
* @return Result|array
* @return Result
*/
public function searchCustomers(array $query = []): \Result|array {
public function listCustomers(array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
foreach ($query as $k => $v) { if (is_bool($v)) $query[$k] = $v ? '1' : '0'; }
$cache = $this->getCache('listcustomer');
if (!empty($cache) && (isset($cache['query']) && $cache['query'] === $query)) return \Result::Success('', $cache);
foreach ($query as $k => $v) { if (is_bool($v)) $query[$k] = $v ? '1' : '0'; }
$uri = '/customers?'.http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$res->data['query'] = $query;
$this->setCache('listcustomer', $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
//// ドメイン値段
@@ -212,16 +228,28 @@ class Openprovider {
* ドメイン値段一覧
*
* @param array $query 検索クエリー
* @return Result|array
* @return Result
*/
public function getDomainPrices(array $query): \Result|array {
public function getDomainPrices(array $query): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$name = '';
$ext = '';
if (isset($query['domain.name'])) $name = $query['domain.name'];
if (isset($query['domain.extension'])) $ext = $query['domain.extension'];
$cacheName = $name && $ext ? "domainprices-{$name}.{$ext}" : 'domainprices';
$cache = $this->getCache($cacheName);
if (!empty($cache)) return \Result::Success('', $cache);
$uri = "/domains/prices?".http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache($cacheName, $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
//// 認証コード
@@ -232,22 +260,25 @@ class Openprovider {
* TLD一覧
*
* @param array $query 検索クエリー
* @return Result|array
* @return Result
*/
public function listTlds(array $query = []): \Result|array {
public function listTlds(array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
if (empty($query)) $query = [ 'limit' => 10, 'offset' => 0, 'order' => 'ASC' ];
$cache = $this->getCache('listtlds');
if (!empty($cache)) return \Result::Success('', $cache);
foreach ($query as $k => $v) {
if (is_bool($v)) $query[$k] = $v ? '1' : '0';
}
if (empty($query)) $query = [ 'limit' => 10, 'offset' => 0, 'order' => 'ASC' ];
foreach ($query as $k => $v) if (is_bool($v)) $query[$k] = $v ? '1' : '0';
$uri = '/tlds?'.http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache('listtlds', $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
/**
@@ -255,22 +286,25 @@ class Openprovider {
*
* @param string $tld TLD
* @param array $query 検索クエリー
* @return Result|array
* @return Result
*/
public function getTld(string $tld, array $query = []): \Result|array {
public function getTld(string $tld, array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
if (empty($query)) $query = [ 'limit' => 10, 'offset' => 0 ];
$cache = $this->getCache("gettld-{$tld}");
if (!empty($cache)) return \Result::Success('', $cache);
foreach ($query as $k => $v) {
if (is_bool($v)) $query[$k] = $v ? '1' : '0';
}
if (empty($query)) $query = [ 'limit' => 10, 'offset' => 0 ];
foreach ($query as $k => $v) if (is_bool($v)) $query[$k] = $v ? '1' : '0';
$uri = "/tlds/{$tld}?".http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache("gettld-{$tld}", $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
/**
@@ -293,22 +327,25 @@ class Openprovider {
* DNSゾーン一覧
*
* @param array $query
* @return Result|array
* @return Result
*/
public function listDnsZones(array $query = []): \Result|array {
public function listDnsZones(array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
if (empty($query)) $query = [ 'limit' => 25, 'offset' => 0, 'order_by.name' => 'asc' ];
$cache = $this->getCache('listdnszones');
if (!empty($cache)) return \Result::Success('', $cache);
foreach ($query as $k => $v) {
if (is_bool($v)) $query[$k] = $v ? '1' : '0';
}
if (empty($query)) $query = [ 'limit' => 25, 'offset' => 0, 'order_by.name' => 'asc' ];
foreach ($query as $k => $v) if (is_bool($v)) $query[$k] = $v ? '1' : '0';
$uri = "/dns/zones?".http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache('listdnszones', $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
/**
@@ -316,19 +353,25 @@ class Openprovider {
*
* @param string $domain ドメイン名
* @param array $query 検索クエリー
* @return Result|array
* @return Result
*/
public function getDnsZone(string $domain, array $query = []): \Result|array {
public function getDnsZone(string $domain, array $query = []): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$cache = $this->getCache("getdnszone-{$domain}");
if (!empty($cache)) return \Result::Success('', $cache);
if (empty($query)) $query = [ 'limit' => 100, 'offset' => 0, 'order_by.name' => 'asc' ];
foreach ($query as $k => $v) if (is_bool($v)) $query[$k] = $v ? '1' : '0';
$uri = "/dns/zones/{$domain}?".http_build_query($query, '', '&', PHP_QUERY_RFC3986);
$curl = $this->setupCurl($uri);
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache("getdnszone-{$domain}", $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error("TLD一覧の受け取りに失敗。");
return \Result::Error('TLD一覧の受け取りに失敗。');
}
//// ゾーンレコード
@@ -337,15 +380,21 @@ class Openprovider {
* DNSレコード一覧
*
* @param string $domain
* @return Result|array
* @return Result
*/
public function listZoneRecords(string $domain): \Result|array {
public function listZoneRecords(string $domain): \Result {
if (!OPENPROVIDER_ENABLED) return \Result::error('エラーOpenProviderは無効です。');
$curl = $this->setupCurl("/dns/zones/{$domain}/records");
$data = $this->curlResult($curl);
if (isset($data['data'])) return $data['data'];
$cache = $this->getCache("getzonerecords-{$domain}");
if (!empty($cache)) return \Result::Success('', $cache);
return \Result::Error("TLD一覧の受け取りに失敗。");
$curl = $this->setupCurl("/dns/zones/{$domain}/records");
$res = $this->curlResult($curl);
if (isset($res->data['data'])) {
$this->setCache("getzonerecords-{$domain}", $res->data);
return \Result::Success('', $res->data);
}
return \Result::Error('TLD一覧の受け取りに失敗。');
}
// Easydmarc
@@ -377,7 +426,7 @@ class Openprovider {
*/
public function getResellerId(): int {
if (!OPENPROVIDER_ENABLED) return 0;
return $this->reseller_id;
return $this->resellerId;
}
//////////
@@ -394,7 +443,7 @@ class Openprovider {
return $curl;
}
private function curlResult(Curl &$curl): \Result|array {
private function curlResult(Curl &$curl): \Result {
$res = $curl->execute();
if (!$res->isSuccess) {
$err = "CURL実行に失敗 {$curl->message}";
@@ -411,32 +460,47 @@ class Openprovider {
}
assert_not_null($body, "返事ボディーは空です。");
return json_decode($body, true);
return \Result::Success('', json_decode($body, true));
}
private function mkCache(): \Result {
$session = new \stdClass;
$session->lastAuth = $this->last_auth;
$session->token = $this->token;
$session->resellerId = $this->reseller_id;
$json = json_encode($session, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if (file_put_contents($this->dataFile, $json) === false) return \Result::Error('エラー:ユーザーデータの保存に失敗。');
/**
* キャッシュの作成
*
* @param string $type キャッシュ類login、domainlist等
* @param array $data 保存するデータ
* @return Result
*/
private function setCache(string $type, array $data): \Result {
if (!file_exists($this->dataDir)) {
if (!mkdir($this->dataDir, 0755))
return \Result::Error('エラー:ユーザーのアイコンディレクトリの作成に失敗。');
}
$json = json_encode($data, JSON_PRETTY_PRINT | JSON_UNESCAPED_UNICODE | JSON_UNESCAPED_SLASHES);
if (file_put_contents("{$this->dataDir}{$type}.json", $json) === false) return \Result::Error('エラー:ユーザーデータの保存に失敗。');
return \Result::Success();
}
private function getCache(): void {
if (!file_exists($this->dataFile)) return;
/**
* キャッシュから受け取り
*
* @param string $type キャッシュ類login、domainlist等
* @return array
*/
private function getCache(string $type): array {
if (!file_exists("{$this->dataDir}{$type}.json")) return [];
$content = file_get_contents($this->dataFile);
if ($content === false) return;
$content = file_get_contents("{$this->dataDir}{$type}.json");
if ($content === false) return [];
$data = json_decode($content, true);
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) return;
if (json_last_error() !== JSON_ERROR_NONE || !is_array($data)) return [];
$this->token = $data['token'] ?? null;
$this->reseller_id = $data['resellerId'] ?? null;
$this->last_auth = $data['lastAuth'] ?? null;
if ($type === 'login') {
$this->token = $data['data']['token'];
$this->lastAuth = $data['last_auth'];
}
return $data;
}
}

View File

@@ -11,18 +11,20 @@ enum LogType {
class Result {
public bool $isSuccess;
public ?string $message;
public array $data;
public function __construct(bool $isSuccess, ?string $message = null) {
public function __construct(bool $isSuccess, ?string $message = null, array $data = []) {
$this->isSuccess = $isSuccess;
$this->message = $message;
$this->data = $data;
}
public static function Success(?string $message = null): self {
return new self(true, $message);
public static function Success(?string $message = null, array $data = []): self {
return new self(true, $message, $data);
}
public static function Error(string $message): self {
return new self(false, $message);
public static function Error(string $message, array $data = []): self {
return new self(false, $message, $data);
}
}

View File

@@ -3,7 +3,7 @@
<ul>
<li>顧客様</li>
<ul>
<li><a href="/openprovider/searchcustomer">顧客様検索</a></li>
<li><a href="/openprovider/listcustomer">顧客様検索</a></li>
</ul>
<li>ドメイン</li>
<ul>

View File

@@ -1,18 +1,18 @@
{@ include(common/header) @}
検索<br />
{@ if (isset($data['results'])) @}
{@ if (isset($data['data']['results'])) @}
<table>
<thead>
<tr>
<th>Name</th>
<th>Company</th>
<th>E-mail address</th>
<th>Handle</th>
<th>Notes</th>
<th>名前</th>
<th>会社名</th>
<th>メールアドレス</th>
<th>ハンドル</th>
<th>メモ</th>
</tr>
</thead>
<tbody>
{@ foreach ($data['results'] as $d) @}
{@ foreach ($data['data']['results'] as $d) @}
<tr>
<td><a href="/openprovider/getcustomer/{{ $d['handle'] }}">{{ $d['name']['full_name'] }}</a></td>
<td>{{ $d['company_name'] }}</td>
@@ -23,6 +23,7 @@
{@ endforeach @}
</tbody>
</table>
<p>結果数:{{ $data['data']['total'] }}</p>
{@ else @}
<p>何も見つけられませんでした。</p>
{@ endif @}

View File

@@ -1,7 +1,7 @@
{@ include(common/header) @}
検索バー<br />
<a href="#" class="">DNSゾーンの追加ボタン</a>
{@ if (isset($data['results'])) @}
{@ if (isset($data['data']['results'])) @}
<table>
<thead>
<tr>
@@ -14,7 +14,7 @@
</tr>
</thead>
<tbody>
{@ foreach ($data['results'] as $d) @}
{@ foreach ($data['data']['results'] as $d) @}
<tr>
<td><a href="/openprovider/getdns/{{ $d['name'] }}">{{ $d['name'] }}</a></td>
<td>{{ $d['type'] }}</td>
@@ -26,6 +26,7 @@
{@ endforeach @}
</tbody>
</table>
<p>結果数:{{ $data['data']['total'] }}</p>
{@ else @}
<p>何も見つけられませんでした。</p>
{@ endif @}

View File

@@ -0,0 +1,3 @@
{@ include(common/header) @}
<h2>{{ $domain }}の登録</h2>
{@ include(common/footer) @}