cfmgrv4 init...3

This commit is contained in:
최준흠 2024-10-18 16:59:09 +09:00
parent 38d6544ff4
commit e6f0a3c11c
9 changed files with 141 additions and 155 deletions

View File

@ -20,6 +20,9 @@ class AccountHelper extends MVCHelper
$value = $value ?: DEFAULTS['EMPTY']; $value = $value ?: DEFAULTS['EMPTY'];
switch ($field) { switch ($field) {
case AccountModel::PARENT: case AccountModel::PARENT:
//기존 작성하던값old($field)가 있으면 그값을 넣고 없으면 부모값이 있으면 넣고 없으면 entiy가 있으면 그값을 넣고 없으면 디폴트값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY']));
$extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field'; $extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field';
$form = form_dropdown($field, [ $form = form_dropdown($field, [
"" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택', "" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택',

View File

@ -33,6 +33,9 @@ class RecordHelper extends MVCHelper
$value = $value ?: DEFAULTS['EMPTY']; $value = $value ?: DEFAULTS['EMPTY'];
switch ($field) { switch ($field) {
case RecordModel::PARENT: case RecordModel::PARENT:
//기존 작성하던값old($field)가 있으면 그값을 넣고 없으면 부모값이 있으면 넣고 없으면 entiy가 있으면 그값을 넣고 없으면 디폴트값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY']));
$extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field'; $extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field';
$form = form_dropdown($field, [ $form = form_dropdown($field, [
"" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택', "" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택',

View File

@ -20,6 +20,9 @@ class ZoneHelper extends MVCHelper
$value = $value ?: DEFAULTS['EMPTY']; $value = $value ?: DEFAULTS['EMPTY'];
switch ($field) { switch ($field) {
case ZoneModel::PARENT: case ZoneModel::PARENT:
//기존 작성하던값old($field)가 있으면 그값을 넣고 없으면 부모값이 있으면 넣고 없으면 entiy가 있으면 그값을 넣고 없으면 디폴트값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY']));
$extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field'; $extra_class = isset($extras['class']) ? 'select-field ' . $extras['class'] : 'select-field';
$form = form_dropdown($field, [ $form = form_dropdown($field, [
"" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택', "" => lang($viewDatas['class_path'] . '.label.' . $field) . ' 선택',

View File

@ -119,7 +119,7 @@ abstract class MVCHelper extends CommonHelper
'입력', '입력',
$action, $action,
[ [
"data-src" => current_url() . '/' . $action, "data-src" => current_url() . '/' . $action . '?' . $viewDatas['uri']->getQuery(),
"data-bs-toggle" => "modal", "data-bs-toggle" => "modal",
"data-bs-target" => "#index_action_form", "data-bs-target" => "#index_action_form",
...$extras ...$extras

View File

@ -5,15 +5,12 @@ namespace App\Libraries\MySocket;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use GuzzleHttp\Exception\RequestException; use GuzzleHttp\Exception\RequestException;
use GuzzleHttp\Cookie\CookieJar; use GuzzleHttp\Cookie\CookieJar;
use GuzzleHttp\Client;
use Cloudflare\API\Adapter\ResponseException; use Cloudflare\API\Adapter\ResponseException;
abstract class MySocket abstract class MySocket
{ {
private $_cookieJar = null; private $_cookieJar = null;
protected function __construct() protected function __construct() {}
{
}
abstract public function getClient(): mixed; abstract public function getClient(): mixed;
final protected function getCookieJar(): CookieJar final protected function getCookieJar(): CookieJar
{ {
@ -53,15 +50,23 @@ abstract class MySocket
} }
try { try {
$options = $this->getRequestOptions($method, $options, $headers); $options = $this->getRequestOptions($method, $options, $headers);
// log_message("debug", __FUNCTION__ .
// "=> 호출 Socket URL:{$uri}\n--------------\n" .
// var_export($options, true) .
// "\n--------------\n");
$response = $this->getClient()->$method($uri, $options); $response = $this->getClient()->$method($uri, $options);
$body = json_decode(json: $response->getBody());
if (!$body->success) {
$message = sprintf(
"%s에서 {$uri} 실패:\nrequest:%s\nresponse:%s",
$method,
$uri,
var_export($options, true),
var_export($response, true)
);
log_message("error", $message);
throw new ResponseException($message);
}
return $response;
} catch (RequestException $err) { } catch (RequestException $err) {
throw ResponseException::fromRequestException($err); throw ResponseException::fromRequestException($err);
} }
return $response;
} }
final public function get($uri, array $options = [], array $headers = []): ResponseInterface final public function get($uri, array $options = [], array $headers = []): ResponseInterface
{ {

View File

@ -5,15 +5,24 @@ namespace App\Services\Cloudflare;
use App\Models\Cloudflare\AccountModel; use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\AuthEntity; use App\Entities\Cloudflare\AuthEntity;
use App\Entities\Cloudflare\AccountEntity; use App\Entities\Cloudflare\AccountEntity;
use Psr\Http\Message\ResponseInterface;
class Account extends Cloudflare class Account extends Cloudflare
{ {
private $_model = null; private ?AuthEntity $_parent_entity = null;
public function __construct(AuthEntity $auth_entity) private ?AccountModel $_model = null;
public function __construct(AuthEntity $parent_entity)
{ {
parent::__construct($auth_entity); $this->_parent_entity = $parent_entity;
parent::__construct($parent_entity);
}
protected function getParentEntity(): AuthEntity
{
if ($this->_parent_entity === null) {
throw new \Exception(__FUNCTION__ . "에서 부모정보가 없습니다.");
}
return $this->_parent_entity;
} }
protected function getModel(): AccountModel protected function getModel(): AccountModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -36,7 +45,7 @@ class Account extends Cloudflare
// "created_on":"2017-06-26T05:44:49.470184Z"} // "created_on":"2017-06-26T05:44:49.470184Z"}
// ] // ]
protected function getArrayByResult($result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
$formDatas[AccountModel::PK] = $result->id; $formDatas[AccountModel::PK] = $result->id;
$formDatas[AccountModel::PARENT] = $this->getAuthEntity()->getPK(); $formDatas[AccountModel::PARENT] = $this->getAuthEntity()->getPK();
@ -53,9 +62,9 @@ class Account extends Cloudflare
log_message("notice", "\n----------Auth {$this->getAuthEntity()->getTitle()}의 Account 처리 시작-----------"); log_message("notice", "\n----------Auth {$this->getAuthEntity()->getTitle()}의 Account 처리 시작-----------");
$entitys = []; $entitys = [];
try { try {
$account_results = $this->reload_procedure("accounts"); $results = $this->reload_procedure("accounts");
if (count($account_results) > 0) { if (count($results) > 0) {
foreach ($account_results as $result) { foreach ($results as $result) {
$formDatas = $this->getArrayByResult($result); $formDatas = $this->getArrayByResult($result);
$entitys[$formDatas[AccountModel::PK]] = $this->getModel()->modify(new AccountEntity(), $formDatas); $entitys[$formDatas[AccountModel::PK]] = $this->getModel()->modify(new AccountEntity(), $formDatas);
} }

View File

@ -5,6 +5,7 @@ namespace App\Services\Cloudflare;
use App\Models\Cloudflare\AuthModel; use App\Models\Cloudflare\AuthModel;
use App\Libraries\MySocket\CloudflareSocket; use App\Libraries\MySocket\CloudflareSocket;
use App\Entities\Cloudflare\AuthEntity; use App\Entities\Cloudflare\AuthEntity;
use Psr\Http\Message\ResponseInterface;
abstract class Cloudflare abstract class Cloudflare
{ {
@ -15,7 +16,8 @@ abstract class Cloudflare
{ {
$this->_auth_entity = $auth_entity; $this->_auth_entity = $auth_entity;
} }
abstract protected function getArrayByResult($result, array $formDatas = []): array; abstract protected function getArrayByResult(\stdClass $result, array $formDatas = []): array;
abstract protected function getParentEntity(): mixed;
final public function getMySocket(): CloudflareSocket final public function getMySocket(): CloudflareSocket
{ {
if ($this->_mySocket === null) { if ($this->_mySocket === null) {
@ -37,7 +39,7 @@ abstract class Cloudflare
} }
return $this->_authModel; return $this->_authModel;
} }
private function reload_page(string $uri, int $page, int $per_page = 50): mixed private function reload_page(string $uri, int $page, int $per_page = 50): ResponseInterface
{ {
$query = [ $query = [
'page' => $page, 'page' => $page,
@ -51,29 +53,24 @@ abstract class Cloudflare
'Pragma' => 'no-cache', 'Pragma' => 'no-cache',
]; ];
// log_message("debug", var_export($query, true)); // log_message("debug", var_export($query, true));
$response = $this->getMySocket()->get($uri, $query, $headers); return $this->getMySocket()->get($uri, $query, $headers);
$cf = json_decode($response->getBody());
if (!$cf->success) {
$message = __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
// log_message("debug", "Page {$page} response: " . var_export($cf->result_info, true));
return $cf;
} }
final protected function reload_procedure(string $uri): array final protected function reload_procedure(string $uri): array
{ {
$page = 1; //1부터 시작 $page = 1; //1부터 시작
//한번에 가져올수 있는 갯수 (countfalre 5~50사이) //한번에 가져올수 있는 갯수 (countfalre 5~50사이)
$cf = $this->reload_page($uri, $page); $response = $this->reload_page($uri, $page);
$per_page = $cf->result_info->per_page; $body = json_decode($response->getBody());
$total_page = $cf->result_info->total_pages; // log_message("debug", var_export($body, true));
$results = $cf->result; $per_page = $body->result_info->per_page;
$total_page = $body->result_info->total_pages;
$results = [$body->result];
for ($i = $page + 1; $i <= $total_page; $i++) { for ($i = $page + 1; $i <= $total_page; $i++) {
// API 제한을 고려한 지연 추가 // API 제한을 고려한 지연 추가
usleep(100000); // 0.1초 대기 usleep(100000); // 0.1초 대기
$cf = $this->reload_page($uri, $i, $per_page); $response = $this->reload_page($uri, $i, $per_page);
$results = array_merge($results, $cf->result); $body = json_decode($response->getBody());
$results = array_merge($results, $body->result);
log_message("notice", "현재: page[{$i}/{$total_page}] , result수[" . count($results) . "]"); log_message("notice", "현재: page[{$i}/{$total_page}] , result수[" . count($results) . "]");
} }
return $results; return $results;

View File

@ -4,18 +4,19 @@ namespace App\Services\Cloudflare;
use App\Entities\Cloudflare\RecordEntity; use App\Entities\Cloudflare\RecordEntity;
use App\Entities\Cloudflare\ZoneEntity; use App\Entities\Cloudflare\ZoneEntity;
use App\Models\Cloudflare\RecordModel;
use App\Models\Cloudflare\AccountModel; use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\RecordModel;
use Psr\Http\Message\ResponseInterface;
class Record extends Cloudflare class Record extends Cloudflare
{ {
private $_model = null; private ?ZoneEntity $_parent_entity = null;
private $_accountModel = null; private ?RecordModel $_model = null;
private $_zone_entity = null; private ?AccountModel $_accountModel = null;
public function __construct(ZoneEntity $zone_entity) public function __construct(ZoneEntity $zone_entity)
{ {
$this->_zone_entity = $zone_entity; $this->_parent_entity = $zone_entity;
$account_entity = $this->getAccountModel()->getEntityByPK($this->_zone_entity->getParent()); $account_entity = $this->getAccountModel()->getEntityByPK($this->getParentEntity()->getParent());
if ($account_entity === null) { if ($account_entity === null) {
throw new \Exception("해당 계정정보를 찾을수 없습니다."); throw new \Exception("해당 계정정보를 찾을수 없습니다.");
} }
@ -25,6 +26,13 @@ class Record extends Cloudflare
} }
parent::__construct($auth_entity); parent::__construct($auth_entity);
} }
protected function getParentEntity(): ZoneEntity
{
if ($this->_parent_entity === null) {
throw new \Exception(__FUNCTION__ . "에서 부모정보가 없습니다.");
}
return $this->_parent_entity;
}
protected function getModel(): RecordModel protected function getModel(): RecordModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -32,15 +40,16 @@ class Record extends Cloudflare
} }
return $this->_model; return $this->_model;
} }
final protected function getAccountModel(): AccountModel protected function getAccountModel(): AccountModel
{ {
if ($this->_accountModel === null) { if ($this->_accountModel === null) {
$this->_accountModel = new AccountModel(); $this->_accountModel = new AccountModel();
} }
return $this->_accountModel; return $this->_accountModel;
} }
public function getArrayByResult($result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
// log_message("debug", var_export($result, true));
$formDatas[RecordModel::PK] = $result->id; $formDatas[RecordModel::PK] = $result->id;
$formDatas[RecordModel::PARENT] = $result->zone_id; $formDatas[RecordModel::PARENT] = $result->zone_id;
$formDatas[RecordModel::TITLE] = $result->name; $formDatas[RecordModel::TITLE] = $result->name;
@ -49,13 +58,10 @@ class Record extends Cloudflare
$formDatas['ttl'] = (int) $result->ttl; $formDatas['ttl'] = (int) $result->ttl;
$formDatas['proxiable'] = $result->proxiable ? "on" : "off"; $formDatas['proxiable'] = $result->proxiable ? "on" : "off";
$formDatas['proxied'] = $result->proxied ? "on" : "off"; $formDatas['proxied'] = $result->proxied ? "on" : "off";
$formDatas['locked'] = "on"; $formDatas['locked'] = isset($result->locked) && $result->locked ? "off" : "on";
if (isset($result->locked) && $result->locked) {
$formDatas['locked'] = "off";
}
$formDatas['updated_at'] = date("Y-m-d H:i:s"); $formDatas['updated_at'] = date("Y-m-d H:i:s");
$formDatas['created_at'] = $result->created_on; $formDatas['created_at'] = $result->created_on;
// log_message("debug", var_export($result, return: true)); // log_message("debug", print_r($formDatas, true));
return $formDatas; return $formDatas;
} }
public function create(string $host, string $type, string $content, string $proxied): RecordEntity public function create(string $host, string $type, string $content, string $proxied): RecordEntity
@ -68,16 +74,10 @@ class Record extends Cloudflare
'content' => $content, 'content' => $content,
'proxied' => $proxied === 'on' ? true : false 'proxied' => $proxied === 'on' ? true : false
]; ];
$cf = $this->getMySocket()->post("zones/{$this->_zone_entity->getPK()}/dns_records", $datas); $response = $this->getMySocket()->post("zones/{$this->getParentEntity()->getPK()}/dns_records", $datas);
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) {
$message = "Record:" . __FUNCTION__ . "에서 실패:\nrequest:" . var_export($datas, true) . "\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
//DB생성 //DB생성
$formDatas = $this->getArrayByResult($cf->result); return $this->getModel()->create($this->getArrayByResult($body->result));
return $this->getModel()->create($formDatas);
} }
public function modify(RecordEntity $entity, array $formDatas): RecordEntity public function modify(RecordEntity $entity, array $formDatas): RecordEntity
{ {
@ -100,47 +100,29 @@ class Record extends Cloudflare
} }
// 인코딩된 JSON을 확인 // 인코딩된 JSON을 확인
// throw new \Exception("Record:" . __FUNCTION__ . "\n" . json_encode($datas, JSON_PRETTY_PRINT) . "\n" . var_export($datas, true)); // throw new \Exception("Record:" . __FUNCTION__ . "\n" . json_encode($datas, JSON_PRETTY_PRINT) . "\n" . var_export($datas, true));
$cf = $this->getMySocket()->put("zones/{$this->_zone_entity->getPK()}/dns_records/{$entity->getPK()}", $datas); $response = $this->getMySocket()->put("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}", $datas);
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) { // DB 수정
$message = "Record:" . __FUNCTION__ . "에서 실패:\nrequest:" . var_export($datas, true) . "\nresponse:" . var_export($cf, true); return $this->getModel()->modify($entity, $this->getArrayByResult($body->result));
log_message("error", $message);
throw new \Exception($message);
}
//DB수정
$formDatas = $this->getArrayByResult($cf->result);
return $this->getModel()->modify($entity, $formDatas);
} }
public function delete(RecordEntity $entity): RecordEntity public function delete(RecordEntity $entity): RecordEntity
{ {
$cf = $this->getMySocket()->delete("zones/{$this->_zone_entity->getPK()}/dns_records/{$entity->getPK()}"); $this->getMySocket()->delete("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}");
$cf = json_decode($cf->getBody());
if (!$cf->success) {
$message = "Record:" . __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
//DB삭제 //DB삭제
$this->getModel()->where(RecordModel::PK, $entity->getPK()); $this->getModel()->delete($entity->getPK());
$this->getModel()->delete();
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
return $entity; return $entity;
} }
public function sync(RecordEntity $entity): RecordEntity public function sync(RecordEntity $entity): RecordEntity
{ {
// 기존 Sync형태 // 기존 Sync형태
$cf = $this->getMySocket()->get("zones/{$this->_zone_entity->getPK()}/dns_records/{$entity->getPK()}"); $response = $this->getMySocket()->get("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}");
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) {
$message = "Record:" . __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
// DB수정 // DB수정
// log_message("debug", var_export($cf->result, true)); // log_message("debug", var_export($cf->result, true));
$entity = $this->getModel()->modify($entity, $this->getArrayByResult($cf->result)); $entity = $this->getModel()->modify($entity, $this->getArrayByResult($body->result));
//Async형태 //Async형태
// $promise = $this->getMySocket()getAsync("zones/{$this->_zone_entity->getPK()}/dns_records/{$entity->getPK()}"); // $promise = $this->getMySocket()getAsync("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}");
// $entity =$promise->then( // $entity =$promise->then(
// onFulfilled: function ($response) use ($entity): RecordEntity { // onFulfilled: function ($response) use ($entity): RecordEntity {
// $record = json_decode($response->getBody(), true)['result']; // $record = json_decode($response->getBody(), true)['result'];
@ -159,17 +141,19 @@ class Record extends Cloudflare
//Reload //Reload
public function reload(): array public function reload(): array
{ {
log_message("notice", "\n-----------Zone {$this->_zone_entity->getTitle()}의 Record 처리 시작-----------"); log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Record 처리 시작-----------");
$entitys = []; $entitys = [];
try { try {
$record_results = $this->reload_procedure("zones/{$this->_zone_entity->getPK()}/dns_records"); $results_array = $this->reload_procedure("zones/{$this->getParentEntity()->getPK()}/dns_records");
if (count($record_results) > 0) { if (count(value: $results_array) > 0) {
foreach ($record_results as $result) { foreach ($results_array as $results) {
$formDatas = $this->getArrayByResult($result); foreach ($results as $result) {
$entitys[$formDatas[RecordModel::PK]] = $this->getModel()->modify(new RecordEntity(), $formDatas); $formDatas = $this->getArrayByResult($result);
$entitys[$formDatas[RecordModel::PK]] = $this->getModel()->modify(new RecordEntity(), $formDatas);
}
} }
//부모키를 기준으로 CF에 존재하지 않는 데이터 DB삭제 //부모키를 기준으로 CF에 존재하지 않는 데이터 DB삭제
$this->getModel()->where(RecordModel::PARENT, $this->_zone_entity->getPK()); $this->getModel()->where(RecordModel::PARENT, $this->getParentEntity()->getPK());
$this->getModel()->whereNotIn(RecordModel::PK, array_keys($entitys)); $this->getModel()->whereNotIn(RecordModel::PK, array_keys($entitys));
$this->getModel()->delete(); $this->getModel()->delete();
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
@ -178,7 +162,7 @@ class Record extends Cloudflare
log_message("error", $e->getMessage()); log_message("error", $e->getMessage());
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());
} }
log_message("notice", "\n-----------Zone {$this->_zone_entity->getTitle()}의 Record처리[" . count($entitys) . "개] 완료-----------"); log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Record처리[" . count($entitys) . "개] 완료-----------");
return $entitys; return $entitys;
} }
} }

View File

@ -5,12 +5,12 @@ namespace App\Services\Cloudflare;
use App\Entities\Cloudflare\AccountEntity; use App\Entities\Cloudflare\AccountEntity;
use App\Entities\Cloudflare\ZoneEntity; use App\Entities\Cloudflare\ZoneEntity;
use App\Models\Cloudflare\ZoneModel; use App\Models\Cloudflare\ZoneModel;
use Psr\Http\Message\ResponseInterface;
class Zone extends Cloudflare class Zone extends Cloudflare
{ {
private $_model = null; private ?AccountEntity $_parent_entity = null;
private $_account_entity = null; private ?ZoneModel $_model = null;
private $_setting_fields = [ private $_setting_fields = [
'development_mode' => 'off', 'development_mode' => 'off',
'ipv6' => 'off', 'ipv6' => 'off',
@ -20,13 +20,20 @@ class Zone extends Cloudflare
]; ];
public function __construct(AccountEntity $account_entity) public function __construct(AccountEntity $account_entity)
{ {
$this->_account_entity = $account_entity; $this->_parent_entity = $account_entity;
$auth_entity = $this->getAuthModel()->getEntityByPK($this->_account_entity->getParent()); $auth_entity = $this->getAuthModel()->getEntityByPK(uid: $this->getParentEntity()->getParent());
if ($auth_entity === null) { if ($auth_entity === null) {
throw new \Exception("해당 계정정보를 찾을수 없습니다."); throw new \Exception("해당 계정정보를 찾을수 없습니다.");
} }
parent::__construct($auth_entity); parent::__construct($auth_entity);
} }
protected function getParentEntity(): AccountEntity
{
if ($this->_parent_entity === null) {
throw new \Exception(__FUNCTION__ . "에서 부모정보가 없습니다.");
}
return $this->_parent_entity;
}
protected function getModel(): ZoneModel protected function getModel(): ZoneModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -34,8 +41,9 @@ class Zone extends Cloudflare
} }
return $this->_model; return $this->_model;
} }
protected function getArrayByResult($result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
// log_message("debug", var_export($result, true));
$formDatas[ZoneModel::PK] = $result->id; $formDatas[ZoneModel::PK] = $result->id;
$formDatas[ZoneModel::PARENT] = $result->account->id; $formDatas[ZoneModel::PARENT] = $result->account->id;
$formDatas[ZoneModel::TITLE] = $result->name; $formDatas[ZoneModel::TITLE] = $result->name;
@ -61,22 +69,18 @@ class Zone extends Cloudflare
$formDatas['updated_at'] = date("Y-m-d H:i:s"); $formDatas['updated_at'] = date("Y-m-d H:i:s");
$formDatas['created_at'] = $result->created_on; $formDatas['created_at'] = $result->created_on;
$formDatas['plan'] = $result->plan->name; $formDatas['plan'] = $result->plan->name;
// log_message("debug", var_export($result, true)); // log_message("debug", var_export($formDatas, true));
return $formDatas; return $formDatas;
} }
//Cfzone에서 가져온 값을 zone에 setting //Cfzone에서 가져온 값을 zone에 setting
private function getCFSetting(string $uid, array $formDatas = []): array private function getCFSetting(string $uid, array $formDatas = []): array
{ {
$cf = $this->getMySocket()->get('zones/' . $uid . '/settings'); $response = $this->getMySocket()->get('zones/' . $uid . '/settings');
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) { // log_message("debug", var_export($body, true));
$message = "Zone:" . __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true); foreach ($body->result as $result) {
log_message("error", $message);
throw new \Exception($message);
}
foreach ($cf->result as $result) {
if (in_array(needle: $result->id, haystack: array_keys($this->_setting_fields))) { if (in_array(needle: $result->id, haystack: array_keys($this->_setting_fields))) {
$formDatas[$result->id === 'ssl' ? 'ssl_mode' : $result->id] = $result->value; $formDatas[($result->id === 'ssl') ? 'ssl_mode' : $result->id] = $result->value;
} }
} }
// log_message("debug", var_export($cf, return: true)); // log_message("debug", var_export($cf, return: true));
@ -84,38 +88,26 @@ class Zone extends Cloudflare
} }
private function setCFSetting(string $uid, string $field, string $value): string private function setCFSetting(string $uid, string $field, string $value): string
{ {
if ($field === 'ssl_mode') { $field = ($field === 'ssl_mode') ? 'ssl' : $field;
$field = 'ssl';
}
$datas = ['value' => $value]; $datas = ['value' => $value];
$cf = $this->getMySocket()->patch('zones/' . $uid . '/settings/' . $field, $datas); $response = $this->getMySocket()->patch('zones/' . $uid . '/settings/' . $field, $datas);
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success || $cf->result->id !== $field) {
$message = "Zone:" . __FUNCTION__ . "에서 실패:\nrequest:" . var_export($datas, true) . "\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
//최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음 //최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음
return $cf->result->value; return $body->result->value;
} }
public function create(string $domain, bool $jump_start = false): ZoneEntity public function create(string $domain, bool $jump_start = false): ZoneEntity
{ {
//Socket용 //Socket용
//도메인생성을 위해 Cloudflare에 전송 //도메인생성을 위해 Cloudflare에 전송
$datas = [ $datas = [
'accountId' => $this->_account_entity->getPK(), 'accountId' => $this->getParentEntity()->getPK(),
'name' => $domain, 'name' => $domain,
'jump_start' => $jump_start, 'jump_start' => $jump_start,
]; ];
$cf = $this->getMySocket()->post('zones/', $datas); $response = $this->getMySocket()->post('zones/', $datas);
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) {
$message = "Zone:" . __FUNCTION__ . "에서 실패:\nrequest:" . var_export($datas, true) . "\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
//DB생성 //DB생성
$formDatas = $this->getArrayByResult($cf->result); $formDatas = $this->getArrayByResult($body->result);
foreach ($this->_setting_fields as $field => $default) { foreach ($this->_setting_fields as $field => $default) {
//초기화값 추가셋팅 ipv6 , development_mode , security_level //초기화값 추가셋팅 ipv6 , development_mode , security_level
$formDatas[$field] = $this->setCFSetting($formDatas[ZoneModel::PK], $field, $default); $formDatas[$field] = $this->setCFSetting($formDatas[ZoneModel::PK], $field, $default);
@ -134,29 +126,17 @@ class Zone extends Cloudflare
} }
public function delete(ZoneEntity $entity): ZoneEntity public function delete(ZoneEntity $entity): ZoneEntity
{ {
$cf = $this->getMySocket()->delete("zones/{$entity->getPK()}"); $this->getMySocket()->delete("zones/{$entity->getPK()}");
$cf = json_decode($cf->getBody());
if (!$cf->success) {
$message = "Zone:" . __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
//DB삭제 //DB삭제
$this->getModel()->where(ZoneModel::PK, $entity->getPK()); $this->getModel()->delete($entity->getPK());
$this->getModel()->delete();
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
return $entity; return $entity;
} }
public function sync(ZoneEntity $entity): ZoneEntity public function sync(ZoneEntity $entity): ZoneEntity
{ {
$cf = $this->getMySocket()->get("zones/{$entity->getPK()}"); $response = $this->getMySocket()->get("zones/{$entity->getPK()}");
$cf = json_decode($cf->getBody()); $body = json_decode($response->getBody());
if (!$cf->success) { $formDatas = $this->getArrayByResult($body->result);
$message = "Zone:" . __FUNCTION__ . "에서 실패:\nresponse:" . var_export($cf, true);
log_message("error", $message);
throw new \Exception($message);
}
$formDatas = $this->getArrayByResult($cf->result);
// log_message("debug", var_export($formDatas, true)); // log_message("debug", var_export($formDatas, true));
$formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas); $formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas);
// log_message("debug", var_export($formDatas, true)); // log_message("debug", var_export($formDatas, true));
@ -167,18 +147,20 @@ class Zone extends Cloudflare
//Reload //Reload
public function reload(): array public function reload(): array
{ {
log_message("notice", "\n-----------Account {$this->_account_entity->getTitle()}의 Zone처리 시작-----------"); log_message("notice", "\n-----------Account {$this->getParentEntity()->getTitle()}의 Zone처리 시작-----------");
$entitys = []; $entitys = [];
try { try {
$zone_results = $this->reload_procedure("zones"); $results_array = $this->reload_procedure("zones");
if (count($zone_results) > 0) { if (count(value: $results_array) > 0) {
foreach ($zone_results as $result) { foreach ($results_array as $results) {
$formDatas = $this->getArrayByResult($result); foreach ($results as $result) {
$formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas); $formDatas = $this->getArrayByResult($result);
$entitys[$formDatas[ZoneModel::PK]] = $this->getModel()->modify(new ZoneEntity(), $formDatas); $formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas);
$entitys[$formDatas[ZoneModel::PK]] = $this->getModel()->modify(new ZoneEntity(), $formDatas);
}
} }
//부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용
$this->getModel()->where(ZoneModel::PARENT, $this->_account_entity->getPK()); $this->getModel()->where(ZoneModel::PARENT, value: $this->getParentEntity()->getPK());
$this->getModel()->whereNotIn(ZoneModel::PK, array_keys($entitys)); $this->getModel()->whereNotIn(ZoneModel::PK, array_keys($entitys));
$this->getModel()->delete(); $this->getModel()->delete();
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
@ -187,7 +169,7 @@ class Zone extends Cloudflare
log_message("error", $e->getMessage()); log_message("error", $e->getMessage());
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());
} }
log_message("notice", "\n----------Account {$this->_account_entity->getTitle()}의 Zone 처리[" . count($entitys) . "개] 완료-----------"); log_message("notice", "\n----------Account {$this->getParentEntity()->getTitle()}의 Zone 처리[" . count($entitys) . "개] 완료-----------");
return $entitys; return $entitys;
} }
} }