cfmgrv4 init...5

This commit is contained in:
최준흠 2025-02-11 10:00:38 +09:00
parent 60cf0c0f8a
commit 8c3067d8e8
19 changed files with 277 additions and 150 deletions

View File

@ -8,10 +8,12 @@ use App\Models\Cloudflare\AccountModel;
class AccountHelper extends MVCHelper class AccountHelper extends MVCHelper
{ {
public $old_parent = ""; public $old_parent = "";
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string
{ {
if (in_array($viewDatas['action'], ['create', 'modify'])) { if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -20,7 +22,7 @@ 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가 있으면 그값을 넣고 없으면 디폴트값을 넣는다. // 기존 작성하던 old($field)가 있으면 그 값을 넣고 없으면 부모 값이 있으면 넣고 없으면 entity가 있으면 그 값을 넣고 없으면 디폴트 값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY'])); $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';
@ -44,7 +46,8 @@ class AccountHelper extends MVCHelper
break; break;
} }
return $form; return $form;
} // }
public function getFieldView(string $field, array $viewDatas, array $extras = []): string public function getFieldView(string $field, array $viewDatas, array $extras = []): string
{ {
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']; $value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
@ -105,7 +108,8 @@ class AccountHelper extends MVCHelper
break; break;
} }
return $value; return $value;
} // }
public function getListButton(string $action, array $viewDatas, array $extras = []): string public function getListButton(string $action, array $viewDatas, array $extras = []): string
{ {
switch ($action) { switch ($action) {

View File

@ -8,10 +8,12 @@ use App\Models\Cloudflare\RecordModel;
class RecordHelper extends MVCHelper class RecordHelper extends MVCHelper
{ {
public $old_parent = ""; public $old_parent = "";
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string
{ {
if (in_array($viewDatas['action'], ['create', 'modify'])) { if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -20,7 +22,7 @@ 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가 있으면 그값을 넣고 없으면 디폴트값을 넣는다. // 기존 작성하던 old($field)가 있으면 그 값을 넣고 없으면 부모 값이 있으면 넣고 없으면 entity가 있으면 그 값을 넣고 없으면 디폴트 값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY'])); $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';
@ -31,7 +33,7 @@ class RecordHelper extends MVCHelper
...array_diff_key($extras, ['class' => '']) ...array_diff_key($extras, ['class' => ''])
]); ]);
break; break;
case RecordModel::TITLE: //host case RecordModel::TITLE: // host
$form = form_input($field, $value, $extras); $form = form_input($field, $value, $extras);
break; break;
case 'hosts': case 'hosts':
@ -57,7 +59,8 @@ class RecordHelper extends MVCHelper
break; break;
} }
return $form; return $form;
} // }
public function getFieldView(string $field, array $viewDatas, array $extras = []): string public function getFieldView(string $field, array $viewDatas, array $extras = []): string
{ {
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']; $value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
@ -116,25 +119,27 @@ class RecordHelper extends MVCHelper
break; break;
} }
return $value; return $value;
} // }
public function getListRowColor($entity): string public function getListRowColor($entity): string
{ {
return $entity->locked != 'on' ? 'class="table-danger"' : ""; return $entity->locked != 'on' ? 'class="table-danger"' : "";
} }
public function getListLabel(string $field, array $viewDatas, array $extras = []): string public function getListLabel(string $field, array $viewDatas, array $extras = []): string
{ {
$label = parent::getListLabel($field, $viewDatas, $extras); $label = parent::getListLabel($field, $viewDatas, $extras);
switch ($field) { switch ($field) {
case RecordModel::PARENT: case RecordModel::PARENT:
$label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_zones'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Domains</buttion>"; $label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_zones'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Domains</button>";
break; break;
case RecordModel::TITLE: case RecordModel::TITLE:
$label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_hosts'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Hosts</buttion>"; $label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_hosts'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Hosts</button>";
break; break;
} }
return $label; return $label;
} }
public function getListButton(string $action, array $viewDatas, array $extras = []): string public function getListButton(string $action, array $viewDatas, array $extras = []): string
{ {
switch ($action) { switch ($action) {

View File

@ -8,10 +8,12 @@ use App\Models\Cloudflare\ZoneModel;
class ZoneHelper extends MVCHelper class ZoneHelper extends MVCHelper
{ {
public $old_parent = ""; public $old_parent = "";
public function __construct() public function __construct()
{ {
parent::__construct(); parent::__construct();
} }
function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string
{ {
if (in_array($viewDatas['action'], ['create', 'modify'])) { if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -20,7 +22,7 @@ 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가 있으면 그값을 넣고 없으면 디폴트값을 넣는다. // 기존 작성하던 old($field)가 있으면 그 값을 넣고 없으면 부모 값이 있으면 넣고 없으면 entity가 있으면 그 값을 넣고 없으면 디폴트 값을 넣는다.
$value = $value ?: (isset($viewDatas[$field]) ? $viewDatas[$field] : (isset($viewDatas['entity']) ? $viewDatas['entity']->getParent() : DEFAULTS['EMPTY'])); $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';
@ -68,7 +70,8 @@ class ZoneHelper extends MVCHelper
break; break;
} }
return $form; return $form;
} // }
function getFieldView(string $field, array $viewDatas, array $extras = []): string function getFieldView(string $field, array $viewDatas, array $extras = []): string
{ {
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']; $value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
@ -158,21 +161,24 @@ class ZoneHelper extends MVCHelper
break; break;
} }
return $value; return $value;
} // }
public function getListRowColor($entity): string public function getListRowColor($entity): string
{ {
return $entity->status != 'active' ? 'class="table-danger"' : ""; return $entity->status != 'active' ? 'class="table-danger"' : "";
} }
public function getListLabel(string $field, array $viewDatas, array $extras = []): string public function getListLabel(string $field, array $viewDatas, array $extras = []): string
{ {
$label = parent::getListLabel($field, $viewDatas, $extras); $label = parent::getListLabel($field, $viewDatas, $extras);
switch ($field) { switch ($field) {
case ZoneModel::TITLE: case ZoneModel::TITLE:
$label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_zones'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Domains</buttion>"; $label .= "<button onClick=\"getElementsByClassNameCopyToClipboard('label_zones'); return false;\" class=\"btn btn-sm btn-danger btn-circle\">Copy Domains</button>";
break; break;
} }
return $label; return $label;
} }
public function getListButton(string $action, array $viewDatas, array $extras = []): string public function getListButton(string $action, array $viewDatas, array $extras = []): string
{ {
switch ($action) { switch ($action) {

View File

@ -5,15 +5,18 @@ namespace App\Helpers;
class CommonHelper class CommonHelper
{ {
public function __construct() {} public function __construct() {}
final public function getRandomString($length = 10, $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789") final public function getRandomString($length = 10, $characters = "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789")
{ {
return substr(str_shuffle($characters), 0, $length); return substr(str_shuffle($characters), 0, $length);
} }
final public function getPasswordString($length = 8) final public function getPasswordString($length = 8)
{ {
return $this->getRandomString($length, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?"); return $this->getRandomString($length, "abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ0123456789!@#$%^&*()_-=+;:,.?");
} // }
//byte값을 알아보기 쉽게 변환
// byte값을 알아보기 쉽게 변환
final public function getSizeForHuman($bytes) final public function getSizeForHuman($bytes)
{ {
$ext = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB'); $ext = array('B', 'KB', 'MB', 'GB', 'TB', 'PB', 'EB', 'ZB', 'YB');
@ -22,8 +25,9 @@ class CommonHelper
$bytes /= 1024; $bytes /= 1024;
} }
return floor($bytes) . $ext[$unitCount]; return floor($bytes) . $ext[$unitCount];
} // }
//Proxy등을 통하여 Client_IP가 알수없는경우 실제사용자의 IP를 가져오기 위한것
// Proxy등을 통하여 Client_IP가 알수없는경우 실제사용자의 IP를 가져오기 위한것
final public function getClientIP($clientIP = false) final public function getClientIP($clientIP = false)
{ {
if (isset($_SERVER['HTTP_CLIENT_IP'])) { if (isset($_SERVER['HTTP_CLIENT_IP'])) {
@ -40,12 +44,14 @@ class CommonHelper
$clientIP = $_SERVER['REMOTE_ADDR']; $clientIP = $_SERVER['REMOTE_ADDR'];
} }
return $clientIP; return $clientIP;
} // }
final public function isDomain(string $domain): bool final public function isDomain(string $domain): bool
{ {
$parttern_validation = '/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/'; $pattern_validation = '/((http|https)\:\/\/)?[a-zA-Z0-9\.\/\?\:@\-_=#]+\.([a-zA-Z0-9\&\.\/\?\:@\-_=#])*/';
return preg_match("$parttern_validation", $domain); return preg_match($pattern_validation, $domain);
} }
final public function isIPAddress(string $ip, $type = false): bool final public function isIPAddress(string $ip, $type = false): bool
{ {
switch ($type) { switch ($type) {
@ -64,23 +70,27 @@ class CommonHelper
} }
return $result; return $result;
} }
final public function isHost(string $host): bool final public function isHost(string $host): bool
{ {
$parttern_validation = '/[a-zA-Z0-9\.\/\?\:@\*\-_=#]/'; $pattern_validation = '/[a-zA-Z0-9\.\/\?\:@\*\-_=#]/';
return preg_match($parttern_validation, $host); return preg_match($pattern_validation, $host);
} }
//(EX:192.168.1.0 -> 192.168.001.000)
// (EX:192.168.1.0 -> 192.168.001.000)
final public function convertIPV4toCIDR($cidr) final public function convertIPV4toCIDR($cidr)
{ {
$temps = explode(".", $cidr); $temps = explode(".", $cidr);
return sprintf("%03d.%03d.%03d.%03d", $temps[0], $temps[1], $temps[2], $temps[3]); return sprintf("%03d.%03d.%03d.%03d", $temps[0], $temps[1], $temps[2], $temps[3]);
} // }
//(EX:192.168.001.0000 -> 192.168.1.0)
// (EX:192.168.001.0000 -> 192.168.1.0)
final public function convertCIDRtoIPV4($ipv4) final public function convertCIDRtoIPV4($ipv4)
{ {
$temps = explode(".", $ipv4); $temps = explode(".", $ipv4);
return sprintf("%d.%d.%d.%d", $temps[0], $temps[1], $temps[2], $temps[3]); return sprintf("%d.%d.%d.%d", $temps[0], $temps[1], $temps[2], $temps[3]);
} // }
final public function isMobile() final public function isMobile()
{ {
// Check the server headers to see if they're mobile friendly // Check the server headers to see if they're mobile friendly
@ -107,7 +117,8 @@ class CommonHelper
} }
// None of the above? Then it's probably not a mobile device. // None of the above? Then it's probably not a mobile device.
return false; return false;
} // }
final public function alert(string $msg, $url = null) final public function alert(string $msg, $url = null)
{ {
$msg = preg_replace("/\r/", "\\r", $msg); $msg = preg_replace("/\r/", "\\r", $msg);
@ -127,5 +138,5 @@ class CommonHelper
break; break;
} }
return "<script type=\"text/javascript\">{$msg}</script>"; return "<script type=\"text/javascript\">{$msg}</script>";
} // }
} }

View File

@ -8,6 +8,7 @@ abstract class MVCHelper extends CommonHelper
{ {
parent::__construct(); parent::__construct();
} }
public function getFieldLabel(string $field, array $viewDatas, array $extras = []): string public function getFieldLabel(string $field, array $viewDatas, array $extras = []): string
{ {
switch ($field) { switch ($field) {
@ -18,7 +19,8 @@ abstract class MVCHelper extends CommonHelper
} }
return $label; return $label;
} }
//header.php에서 getFieldForm_Helper사용
// header.php에서 getFieldForm_Helper사용
public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string
{ {
if (in_array($viewDatas['action'], ['create', 'modify'])) { if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -41,7 +43,8 @@ abstract class MVCHelper extends CommonHelper
break; break;
} }
return $form; return $form;
} // }
public function getFieldView(string $field, array $viewDatas, array $extras = []): string public function getFieldView(string $field, array $viewDatas, array $extras = []): string
{ {
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']; $value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
@ -73,11 +76,13 @@ abstract class MVCHelper extends CommonHelper
break; break;
} }
return $value; return $value;
} // }
public function getListRowColor($entity): string public function getListRowColor($entity): string
{ {
return $entity->status != DEFAULTS['STATUS'] ? 'class="table-danger"' : ""; return $entity->status != DEFAULTS['STATUS'] ? 'class="table-danger"' : "";
} }
public function getListLabel(string $field, array $viewDatas, array $extras = []): string public function getListLabel(string $field, array $viewDatas, array $extras = []): string
{ {
switch ($field) { switch ($field) {
@ -95,6 +100,7 @@ abstract class MVCHelper extends CommonHelper
} }
return $label; return $label;
} }
public function getListButton(string $action, array $viewDatas, array $extras = []): string public function getListButton(string $action, array $viewDatas, array $extras = []): string
{ {
switch ($action) { switch ($action) {

View File

@ -10,6 +10,7 @@ class MapurlHelper extends MVCHelper
{ {
parent::__construct(); parent::__construct();
} }
public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string public function getFieldForm(string $field, mixed $value, array $viewDatas, array $extras = []): string
{ {
if (in_array($viewDatas['action'], ['create', 'modify'])) { if (in_array($viewDatas['action'], ['create', 'modify'])) {
@ -28,7 +29,8 @@ class MapurlHelper extends MVCHelper
break; break;
} }
return $form; return $form;
} // }
public function getFieldView(string $field, array $viewDatas, array $extras = []): string public function getFieldView(string $field, array $viewDatas, array $extras = []): string
{ {
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY']; $value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
@ -51,12 +53,13 @@ class MapurlHelper extends MVCHelper
break; break;
} }
return $value; return $value;
} // }
public function getRemapPage(array $viewDatas): string public function getRemapPage(array $viewDatas): string
{ {
$urls = []; $urls = [];
foreach ($viewDatas['entitys'] as $viewDatas['entity']) { foreach ($viewDatas['entitys'] as $viewDatas['entity']) {
//한글을 포함하고 있는지 체크 HTTP 나 HTTPS 와 도메인 분리해서 한글도메인을 Punycode로 변환 // 한글을 포함하고 있는지 체크 HTTP 나 HTTPS 와 도메인 분리해서 한글도메인을 Punycode로 변환
if (preg_match("/[\xE0-\xFF][\x80-\xFF][\x80-\xFF]/", $viewDatas['entity']->oldurl)) { if (preg_match("/[\xE0-\xFF][\x80-\xFF][\x80-\xFF]/", $viewDatas['entity']->oldurl)) {
preg_match("/^(https?:\/\/)(.*)/", $viewDatas['entity']->oldurl, $matches); preg_match("/^(https?:\/\/)(.*)/", $viewDatas['entity']->oldurl, $matches);
$oldurl = $matches[1] . idn_to_ascii($matches[2]); $oldurl = $matches[1] . idn_to_ascii($matches[2]);

View File

@ -49,19 +49,19 @@ abstract class CommonModel extends Model
{ {
parent::__construct(); parent::__construct();
} }
abstract public function getTitleField(): string; abstract public function getTitleField(): string;
final public function getTable(): string final public function getTable(): string
{ {
return $this->table; return $this->table;
} }
final public function getPKField(): string final public function getPKField(): string
{ {
return $this->primaryKey; return $this->primaryKey;
} }
// final public function getFields(array $except_fields = []): array
// {
// return array_diff($this->allowedFields, $except_fields); //제외한 fields
// }
public function getFieldRule(string $action, string $field): string public function getFieldRule(string $action, string $field): string
{ {
if (is_array($field)) { if (is_array($field)) {
@ -69,13 +69,13 @@ abstract class CommonModel extends Model
} }
switch ($field) { switch ($field) {
case $this->getPKField(): case $this->getPKField():
//수동입력인경우 // 수동입력인 경우
if (!$this->useAutoIncrement) { if (!$this->useAutoIncrement) {
$rule = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; $rule = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";
$rule .= $action == "create" ? "|is_unique[{$this->table}.{$field}]" : ""; $rule .= $action == "create" ? "|is_unique[{$this->table}.{$field}]" : "";
} else { } else {
$rule = "required|numeric"; $rule = "required|numeric";
}; }
break; break;
case $this->getTitleField(): case $this->getTitleField():
$rule = "required|string"; $rule = "required|string";
@ -97,6 +97,7 @@ abstract class CommonModel extends Model
} }
return $rule; return $rule;
} }
final public function getFieldRules(string $action, array $fields, $rules = []): array final public function getFieldRules(string $action, array $fields, $rules = []): array
{ {
foreach ($fields as $field) { foreach ($fields as $field) {
@ -104,6 +105,7 @@ abstract class CommonModel extends Model
} }
return $rules; return $rules;
} }
public function getFormFieldOption(string $field, array $options = []): array public function getFormFieldOption(string $field, array $options = []): array
{ {
switch ($field) { switch ($field) {
@ -116,20 +118,23 @@ abstract class CommonModel extends Model
// dd($options); // dd($options);
return $options; return $options;
} }
final public function getEntity(): array|object|null final public function getEntity(): array|object|null
{ {
return $this->asObject($this->returnType)->first(); return $this->asObject($this->returnType)->first();
} }
final public function getEntitys(): array final public function getEntitys(): array
{ {
return $this->asObject($this->returnType)->findAll(); return $this->asObject($this->returnType)->findAll();
} }
//create , modify 직전 작업용 작업
// create, modify 직전 작업용 작업
protected function convertEntityData(string $field, array $formDatas): mixed protected function convertEntityData(string $field, array $formDatas): mixed
{ {
switch ($field) { switch ($field) {
case $this->getPKField(): case $this->getPKField():
//$formDatas에 전달된 값이 없는경우 // $formDatas에 전달된 값이 없는 경우
if (!array_key_exists($field, $formDatas)) { if (!array_key_exists($field, $formDatas)) {
$randomBytes = bin2hex(random_bytes(32)); $randomBytes = bin2hex(random_bytes(32));
$value = sprintf( $value = sprintf(
@ -144,7 +149,7 @@ abstract class CommonModel extends Model
$value = $formDatas[$field]; $value = $formDatas[$field];
} }
break; break;
case "editor": //content등 textarea를 사용한 Field case "editor": // content 등 textarea를 사용한 Field
$value = htmlentities($formDatas[$field], ENT_QUOTES); $value = htmlentities($formDatas[$field], ENT_QUOTES);
break; break;
default: default:
@ -157,12 +162,12 @@ abstract class CommonModel extends Model
private function save_process($entity): mixed private function save_process($entity): mixed
{ {
try { try {
//최종 변경사항이 없으면 // 최종 변경사항이 없으면
if (!$entity->hasChanged()) { if (!$entity->hasChanged()) {
throw new \Exception(__FUNCTION__ . " 변경된 내용이 없습니다."); throw new \Exception(__FUNCTION__ . " 변경된 내용이 없습니다.");
} }
// log_message("debug", var_export($entity, true)); // log_message("debug", var_export($entity, true));
// 최종 저장시 오류발생하면 // 최종 저장 시 오류 발생하면
if (!$this->save($entity)) { if (!$this->save($entity)) {
throw new \Exception("저장오류:" . var_export($this->errors(), true)); throw new \Exception("저장오류:" . var_export($this->errors(), true));
} }
@ -179,16 +184,17 @@ abstract class CommonModel extends Model
throw new \Exception($message); throw new \Exception($message);
} }
} }
final protected function create_process($entity, array $formDatas): mixed final protected function create_process($entity, array $formDatas): mixed
{ {
//Field에 맞는 Validation Rule 재정의 // Field에 맞는 Validation Rule 재정의
$this->setValidationRules($this->getFieldRules('create', $this->allowedFields)); $this->setValidationRules($this->getFieldRules('create', $this->allowedFields));
//저장하기 전에 데이터 값 변경이 필요한 Field // 저장하기 전에 데이터 값 변경이 필요한 Field
foreach (array_keys($formDatas) as $field) { foreach (array_keys($formDatas) as $field) {
$entity->$field = $this->convertEntityData($field, $formDatas); $entity->$field = $this->convertEntityData($field, $formDatas);
} }
$entity = $this->save_process($entity); $entity = $this->save_process($entity);
//primaryKey가 자동입력이면 // primaryKey가 자동입력이면
if ($this->useAutoIncrement) { if ($this->useAutoIncrement) {
$pkField = $this->getPKField(); $pkField = $this->getPKField();
$entity->$pkField = $this->getInsertID(); $entity->$pkField = $this->getInsertID();
@ -196,11 +202,12 @@ abstract class CommonModel extends Model
// log_message("debug", $this->getTable() . " => " . __FUNCTION__ . " DB 작업 완료"); // log_message("debug", $this->getTable() . " => " . __FUNCTION__ . " DB 작업 완료");
return $entity; return $entity;
} }
final protected function modify_process($entity, array $formDatas): mixed final protected function modify_process($entity, array $formDatas): mixed
{ {
//Field에 맞는 Validation Rule 재정의 // Field에 맞는 Validation Rule 재정의
$this->setValidationRules($this->getFieldRules('modify', $this->allowedFields)); $this->setValidationRules($this->getFieldRules('modify', $this->allowedFields));
//저장하기 전에 데이터 값 변경이 필요한 Field // 저장하기 전에 데이터 값 변경이 필요한 Field
foreach (array_keys($formDatas) as $field) { foreach (array_keys($formDatas) as $field) {
$entity->$field = $this->convertEntityData($field, $formDatas); $entity->$field = $this->convertEntityData($field, $formDatas);
} }
@ -209,15 +216,17 @@ abstract class CommonModel extends Model
return $entity; return $entity;
} }
//List용 // List용
final public function setList_FieldFilter(string $field, int|string $value): void final public function setList_FieldFilter(string $field, int|string $value): void
{ {
$this->where($this->getTable() . '.' . $field, $value); $this->where($this->getTable() . '.' . $field, $value);
} }
public function setList_WordFilter(string $word, string $field = null): void public function setList_WordFilter(string $word, string $field = null): void
{ {
$this->like($this->getTable() . '.' . ($field ?? $this->getTitleField()), $word, 'both'); //befor , after , both $this->like($this->getTable() . '.' . ($field ?? $this->getTitleField()), $word, 'both'); // before, after, both
} }
final public function setList_DateFilter(string $start, string $end, $field = "created_at"): void final public function setList_DateFilter(string $start, string $end, $field = "created_at"): void
{ {
if ($start !== DEFAULTS['EMPTY']) { if ($start !== DEFAULTS['EMPTY']) {

View File

@ -6,18 +6,23 @@ use App\Entities\UserEntity;
use App\Models\UserModel; use App\Models\UserModel;
use App\Services\CommonService; use App\Services\CommonService;
use CodeIgniter\Session\Session; use CodeIgniter\Session\Session;
// 참고:https://github.com/SyntaxPhoenix/iloclient // 참고:https://github.com/SyntaxPhoenix/iloclient
class AuthService extends CommonService class AuthService extends CommonService
{ {
private ?Session $_session = null; private ?Session $_session = null;
private ?UserModel $_model = null;
public function __construct() {} public function __construct() {}
final public function getSession(): Session final public function getSession(): Session
{ {
if ($this->_session == null) { if ($this->_session === null) {
$this->_session = \Config\Services::session(); $this->_session = \Config\Services::session();
} }
return $this->_session; return $this->_session;
} }
final protected function getModel(): UserModel final protected function getModel(): UserModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -25,29 +30,30 @@ class AuthService extends CommonService
} }
return $this->_model; return $this->_model;
} }
final public function getAuthInfo(string $key = ""): array|string final public function getAuthInfo(string $key = ""): array|string
{ {
$authInfo = $this->getSession()->get(SESSION_NAMES['AUTH']);
if ($key) { if ($key) {
return isset($this->getSession()->get(SESSION_NAMES['AUTH'])[$key]) ? $this->getSession()->get(SESSION_NAMES['AUTH'])[$key] : ""; return $authInfo[$key] ?? "";
} }
return $this->getSession()->get(SESSION_NAMES['AUTH']); return $authInfo;
} }
final public function isLoggedIn(): bool final public function isLoggedIn(): bool
{ {
return $this->getSession()->has(SESSION_NAMES['ISLOGIN']); return $this->getSession()->has(SESSION_NAMES['ISLOGIN']);
} }
final public function isAccessRole(array $roles): bool final public function isAccessRole(array $roles): bool
{ {
if ($this->getAuthInfo('role') === "") { $role = $this->getAuthInfo('role');
return false; if ($role === "") {
}
$myRoles = explode(DEFAULTS['DELIMITER_ROLE'], $this->getAuthInfo('role'));
// 교집합이 없으면 false
if (empty(array_intersect($myRoles, $roles))) {
return false; return false;
} }
return true; $myRoles = explode(DEFAULTS['DELIMITER_ROLE'], $role);
// 교집합이 없으면 false
return !empty(array_intersect($myRoles, $roles));
} }
final public function pushCurrentUrl(string $url): void final public function pushCurrentUrl(string $url): void

View File

@ -8,11 +8,12 @@ use CodeIgniter\Exceptions\PageNotFoundException;
class GoogleService extends AuthService class GoogleService extends AuthService
{ {
private $_mysocket = null; private $_mySocket = null;
private string $_access_code = ""; private string $_access_code = "";
public function __construct(mixed $mySocket) public function __construct(mixed $mySocket)
{ {
$this->_mysocket = $mySocket; $this->_mySocket = $mySocket;
parent::__construct(); parent::__construct();
} }
@ -24,12 +25,13 @@ class GoogleService extends AuthService
$this->_mySocket->setToken($this->_access_code); $this->_mySocket->setToken($this->_access_code);
return $this->_mySocket; return $this->_mySocket;
} }
public function checkUser(string $access_code): UserEntity public function checkUser(string $access_code): UserEntity
{ {
try { try {
// Google 서비스 설정 // Google 서비스 설정
$userSNS_entity = $this->getMySocket($access_code)->getUserSNSEntity(); $userSNS_entity = $this->getMySocket($access_code)->getUserSNSEntity();
//local db 사용와의 연결 확인 // local db 사용와의 연결 확인
$user_entity = $this->getModel()->getEntityByPK($userSNS_entity->getParent()); $user_entity = $this->getModel()->getEntityByPK($userSNS_entity->getParent());
if ($user_entity === null) { if ($user_entity === null) {
throw new PageNotFoundException("회원[{$userSNS_entity->getTitle()}]님은 아직 로컬사용자 연결이 이루어지지 않았습니다."); throw new PageNotFoundException("회원[{$userSNS_entity->getTitle()}]님은 아직 로컬사용자 연결이 이루어지지 않았습니다.");

View File

@ -19,14 +19,17 @@ class LocalService extends AuthService
if (!isset($formDatas['passwd']) || !$formDatas['passwd']) { if (!isset($formDatas['passwd']) || !$formDatas['passwd']) {
throw new \Exception("암호를 입력해주세요!"); throw new \Exception("암호를 입력해주세요!");
} }
$entity = $this->getModel()->getEntityByID($formDatas['id']); $entity = $this->getModel()->getEntityByID($formDatas['id']);
if (is_null($entity) || !isset($entity->passwd)) { if (is_null($entity) || !isset($entity->passwd)) {
throw new \Exception("사용자ID: {$formDatas['id']}가 존재하지 않습니다."); throw new \Exception("사용자ID: {$formDatas['id']}가 존재하지 않습니다.");
} }
if (!password_verify($formDatas['passwd'], $entity->passwd)) { if (!password_verify($formDatas['passwd'], $entity->passwd)) {
// log_message("error", "암호: {$formDatas['passwd']}, {$entity->passwd}"); // log_message("error", "암호: {$formDatas['passwd']}, {$entity->passwd}");
throw new \Exception("암호가 맞지 않습니다."); throw new \Exception("암호가 맞지 않습니다.");
} }
return $entity; return $entity;
} }
} }

View File

@ -11,12 +11,14 @@ class AccountService extends CloudflareService
{ {
private ?AuthEntity $_parent_entity = null; private ?AuthEntity $_parent_entity = null;
private ?AccountModel $_model = null; private ?AccountModel $_model = null;
public function __construct() public function __construct()
{ {
$this->class_name = "Account"; $this->class_name = "Account";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
private function getParentEntity(): AuthEntity private function getParentEntity(): AuthEntity
{ {
if ($this->_parent_entity === null) { if ($this->_parent_entity === null) {
@ -24,11 +26,13 @@ class AccountService extends CloudflareService
} }
return $this->_parent_entity; return $this->_parent_entity;
} }
private function setParentEntity(AuthEntity $parent_entity): void private function setParentEntity(AuthEntity $parent_entity): void
{ {
$this->_parent_entity = $parent_entity; $this->_parent_entity = $parent_entity;
$this->setAuthEntity($this->getParentEntity()); $this->setAuthEntity($this->getParentEntity());
} }
protected function getModel(): AccountModel protected function getModel(): AccountModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -36,24 +40,28 @@ class AccountService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
public function create(AuthEntity $parent_entity, array $formDatas): AccountEntity public function create(AuthEntity $parent_entity, array $formDatas): AccountEntity
{ {
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
return $this->getModel()->create($formDatas); return $this->getModel()->create($formDatas);
} }
public function modify(AuthEntity $parent_entity, AccountEntity $entity, array $formDatas): AccountEntity public function modify(AuthEntity $parent_entity, AccountEntity $entity, array $formDatas): AccountEntity
{ {
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
return $this->getModel()->modify($entity, $formDatas); return $this->getModel()->modify($entity, $formDatas);
} }
public function delete(AuthEntity $parent_entity): void public function delete(AuthEntity $parent_entity): void
{ {
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
$this->getModel()->delete(); $this->getModel()->delete();
} }
//Result 형태 //Result 형태
// [ // [
// {"id":"078e88a7735965b661715af13031ecb0", // {"id":"078e88a7735965b661715af13031ecb0",
@ -69,7 +77,7 @@ class AccountService extends CloudflareService
// "created_on":"2017-06-26T05:44:49.470184Z"} // "created_on":"2017-06-26T05:44:49.470184Z"}
// ] // ]
protected function getArrayByResult(\stdClass $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();
@ -86,26 +94,28 @@ class AccountService extends CloudflareService
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
log_message("notice", "\n----------Auth {$this->getParentEntity()->getTitle()}의 Account 처리 시작-----------"); log_message("notice", "\n----------Auth {$this->getParentEntity()->getTitle()}의 Account 처리 시작-----------");
$entitys = [];
$entities = [];
try { try {
$results = $this->reload_procedure("accounts"); $results = $this->reload_procedure("accounts");
$total = count($results); $total = count($results);
if ($total > 0) { if ($total > 0) {
$cnt = 1; foreach ($results as $index => $result) {
foreach ($results as $result) {
if (!is_object($result) || get_class($result) !== 'stdClass') { if (!is_object($result) || get_class($result) !== 'stdClass') {
log_message("error", "Account: result is not a stdClass:\n" . var_export($result, true) . "\n"); log_message("error", "Account: result is not a stdClass:\n" . var_export($result, true) . "\n");
continue; continue;
} }
$formDatas = $this->getArrayByResult($result); $formDatas = $this->getArrayByResult($result);
$entity = $this->getModel()->modify(new AccountEntity(), $formDatas); $entity = $this->getModel()->modify(new AccountEntity(), $formDatas);
log_message("debug", "{$cnt}/{$total} => {$entity->getTitle()} Account 처리,[{$this->getMySocket()::$_request}]"); log_message("debug", ($index + 1) . "/{$total} => {$entity->getTitle()} Account 처리,[{$this->getMySocket()::$_request}]");
$entitys[$entity->getPK()] = $entity; $entities[$entity->getPK()] = $entity;
$cnt++;
} }
//부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용
$this->getModel()->where(AccountModel::PARENT, $this->getParentEntity()->getPK()); $this->getModel()->where(AccountModel::PARENT, $this->getParentEntity()->getPK());
$this->getModel()->whereNotIn(AccountModel::PK, array_keys($entitys)); $this->getModel()->whereNotIn(AccountModel::PK, array_keys($entities));
$this->getModel()->delete(); $this->getModel()->delete();
// log_message("debug", $this->getModel()->getLastQuery()); // log_message("debug", $this->getModel()->getLastQuery());
} }
@ -113,7 +123,8 @@ class AccountService extends CloudflareService
log_message("error", $e->getMessage()); log_message("error", $e->getMessage());
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());
} }
log_message("notice", message: "\n-----------Auth {$this->getParentEntity()->getTitle()}의 Account 처리[" . count($entitys) . "개] 완료-----------");
return $entitys; log_message("notice", "\n-----------Auth {$this->getParentEntity()->getTitle()}의 Account 처리[" . count($entities) . "개] 완료-----------");
return $entities;
} }
} }

View File

@ -12,12 +12,14 @@ class AuditLogService extends CloudflareService
private ?AuditLogModel $_model = null; private ?AuditLogModel $_model = null;
private ?AccountModel $_accountModel = null; private ?AccountModel $_accountModel = null;
private ?ZoneModel $_zoneModel = null; private ?ZoneModel $_zoneModel = null;
public function __construct() public function __construct()
{ {
$this->class_name = "AuditLog"; $this->class_name = "AuditLog";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
protected function getModel(): AuditLogModel protected function getModel(): AuditLogModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -25,6 +27,7 @@ class AuditLogService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
protected function getZoneModel(): ZoneModel protected function getZoneModel(): ZoneModel
{ {
if ($this->_zoneModel === null) { if ($this->_zoneModel === null) {
@ -32,6 +35,7 @@ class AuditLogService extends CloudflareService
} }
return $this->_zoneModel; return $this->_zoneModel;
} }
protected function getAccountModel(): AccountModel protected function getAccountModel(): AccountModel
{ {
if ($this->_accountModel === null) { if ($this->_accountModel === null) {
@ -43,10 +47,10 @@ class AuditLogService extends CloudflareService
protected function getArrayByResult(\stdClass $result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
$formDatas[AuditLogModel::PK] = $result->id; $formDatas[AuditLogModel::PK] = $result->id;
$formDatas[AuditLogModel::TITLE] = $result->action->type; $formDatas[AuditLogModel::TITLE] = $result->action->type;
$formDatas['action_info'] = isset($result->action->info) ? $result->action->info : ""; $formDatas['action_info'] = $result->action->info ?? "";
$formDatas['actor'] = $result->actor->type; $formDatas['actor'] = $result->actor->type;
$formDatas['interface'] = isset($result->interface) ? $result->interface : ""; $formDatas['interface'] = $result->interface ?? "";
$formDatas['zone_name'] = $result->metadata->zone_name; $formDatas['zone_name'] = $result->metadata->zone_name;
$formDatas['meta'] = isset($result->metadata) ? var_export($result->metadata, true) : ""; $formDatas['meta'] = isset($result->metadata) ? var_export($result->metadata, true) : "";
$formDatas['resource'] = isset($result->newValueJson) ? var_export($result->newValueJson, true) : ""; $formDatas['resource'] = isset($result->newValueJson) ? var_export($result->newValueJson, true) : "";
@ -60,7 +64,7 @@ class AuditLogService extends CloudflareService
{ {
//Auditlog 신규등록 //Auditlog 신규등록
$formDatas = $this->getArrayByResult($result); $formDatas = $this->getArrayByResult($result);
$entity = $this->getModel()->create($formDatas); $entity = $this->getModel()->create($formDatas);
//auditlog의 domain에 해당하는 Zone이 존재하는지 확인 //auditlog의 domain에 해당하는 Zone이 존재하는지 확인
$this->getZoneModel()->where('domain', $entity->getZoneName()); $this->getZoneModel()->where('domain', $entity->getZoneName());
@ -68,7 +72,7 @@ class AuditLogService extends CloudflareService
if ($zone_entity !== null) { if ($zone_entity !== null) {
//해당 Zone만 Sync작업을 한다. //해당 Zone만 Sync작업을 한다.
$zone_service = new ZoneService(); $zone_service = new ZoneService();
$zone_entity = $zone_service->sync($account_entity, $zone_entity); $zone_entity = $zone_service->sync($account_entity, $zone_entity);
//해당 Zone의 Record reload작업한다 //해당 Zone의 Record reload작업한다
$record_service = new RecordService(); $record_service = new RecordService();
$record_service->reload($zone_entity); $record_service->reload($zone_entity);
@ -78,6 +82,7 @@ class AuditLogService extends CloudflareService
log_message("debug", "AuditLog Process의 {$zone_entity->getTitle()} Sync및 Record,Firewall Reload 처리작업"); log_message("debug", "AuditLog Process의 {$zone_entity->getTitle()} Sync및 Record,Firewall Reload 처리작업");
} }
} }
public function reload(AccountEntity $account_entity): void public function reload(AccountEntity $account_entity): void
{ {
//Socket인증정보 정의 //Socket인증정보 정의
@ -108,6 +113,6 @@ class AuditLogService extends CloudflareService
log_message("error", $e->getMessage()); log_message("error", $e->getMessage());
throw new \Exception($e->getMessage()); throw new \Exception($e->getMessage());
} }
log_message("notice", message: "\n-----------Account {$account_entity->getTitle()}의 AuditLog 처리 완료-----------"); log_message("notice", "\n-----------Account {$account_entity->getTitle()}의 AuditLog 처리 완료-----------");
} }
} }

View File

@ -8,12 +8,14 @@ use App\Models\Cloudflare\AuthModel;
class AuthService extends CloudflareService class AuthService extends CloudflareService
{ {
private ?AuthModel $_model = null; private ?AuthModel $_model = null;
public function __construct() public function __construct()
{ {
$this->class_name = "Auth"; $this->class_name = "Auth";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
protected function getModel(): AuthModel protected function getModel(): AuthModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -21,14 +23,17 @@ class AuthService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
public function create(array $formDatas): AuthEntity public function create(array $formDatas): AuthEntity
{ {
return $this->getModel()->create($formDatas); return $this->getModel()->create($formDatas);
} }
public function modify(AuthEntity $entity, array $formDatas): AuthEntity public function modify(AuthEntity $entity, array $formDatas): AuthEntity
{ {
return $this->getModel()->modify($entity, $formDatas); return $this->getModel()->modify($entity, $formDatas);
} }
public function delete(): void public function delete(): void
{ {
$this->getModel()->delete(); $this->getModel()->delete();

View File

@ -10,21 +10,25 @@ use Psr\Http\Message\ResponseInterface;
abstract class CloudflareService extends CommonService abstract class CloudflareService extends CommonService
{ {
private $_mySockets = []; private array $_mySockets = [];
private $_auth_entity = null; private ?AuthEntity $_auth_entity = null;
private $_authModel = null; private ?AuthModel $_authModel = null;
protected function __construct() protected function __construct()
{ {
parent::__construct(); parent::__construct();
$this->class_path = "Cloudflare/"; $this->class_path = "Cloudflare/";
} }
final public function getMySocket(): CloudflareSocket final public function getMySocket(): CloudflareSocket
{ {
if (!isset($this->_mySockets[$this->getAuthEntity()->getPK()])) { $authEntityPK = $this->getAuthEntity()->getPK();
$this->_mySockets[$this->getAuthEntity()->getPK()] = new CloudflareSocket($this->getAuthEntity()); if (!isset($this->_mySockets[$authEntityPK])) {
$this->_mySockets[$authEntityPK] = new CloudflareSocket($this->getAuthEntity());
} }
return $this->_mySockets[$this->getAuthEntity()->getPK()]; return $this->_mySockets[$authEntityPK];
} }
final protected function getAuthEntity(): AuthEntity final protected function getAuthEntity(): AuthEntity
{ {
if ($this->_auth_entity === null) { if ($this->_auth_entity === null) {
@ -32,10 +36,12 @@ abstract class CloudflareService extends CommonService
} }
return $this->_auth_entity; return $this->_auth_entity;
} }
final protected function setAuthEntity(AuthEntity $auth_entity): void final protected function setAuthEntity(AuthEntity $auth_entity): void
{ {
$this->_auth_entity = $auth_entity; $this->_auth_entity = $auth_entity;
} }
final protected function getAuthModel(): AuthModel final protected function getAuthModel(): AuthModel
{ {
if ($this->_authModel === null) { if ($this->_authModel === null) {
@ -43,6 +49,7 @@ abstract class CloudflareService extends CommonService
} }
return $this->_authModel; return $this->_authModel;
} }
private function reload_page(string $uri, int $page, int $per_page = 50): ResponseInterface private function reload_page(string $uri, int $page, int $per_page = 50): ResponseInterface
{ {
$query = [ $query = [
@ -59,38 +66,37 @@ abstract class CloudflareService extends CommonService
// log_message("debug", var_export($query, true)); // log_message("debug", var_export($query, true));
return $this->getMySocket()->get($uri, $query, $headers); return $this->getMySocket()->get($uri, $query, $headers);
} }
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사이)
$response = $this->reload_page($uri, $page); $response = $this->reload_page($uri, $page);
$body = json_decode($response->getBody()); $body = json_decode($response->getBody());
// log_message("debug", var_export($body, true));
if (json_last_error() !== JSON_ERROR_NONE) {
log_message("error", "JSON 파싱 오류: " . json_last_error_msg());
return [];
}
$per_page = $body->result_info->per_page; $per_page = $body->result_info->per_page;
$total_page = $body->result_info->total_pages; $total_page = $body->result_info->total_pages;
$total_count = $body->result_info->total_count; $total_count = $body->result_info->total_count;
$results = []; $results = $this->process_results($body->result);
foreach ($body->result as $result) {
if (!is_object($result) || get_class($result) !== 'stdClass') {
log_message("error", "Cloudflare: result is not a stdClass:\n" . var_export($body, true) . "\n");
} else {
array_push($results, $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초 대기
$response = $this->reload_page($uri, $i, $per_page); $response = $this->reload_page($uri, $i, $per_page);
$body = json_decode($response->getBody()); $body = json_decode($response->getBody());
foreach ($body->result as $result) {
if (!is_object($result) || get_class($result) !== 'stdClass') { if (json_last_error() !== JSON_ERROR_NONE) {
log_message("error", "Cloudflare: result is not a stdClass:\n" . var_export($body, true) . "\n"); log_message("error", "JSON 파싱 오류: " . json_last_error_msg());
} else { continue;
array_push($results, $result);
}
} }
$results = array_merge($results, $this->process_results($body->result));
log_message("notice", sprintf( log_message("notice", sprintf(
"현재: page[%s/%s] , total_count:[%s] , results:[%s]", "현재: page[%s/%s], total_count:[%s], results:[%s]",
$i, $i,
$total_page, $total_page,
$total_count, $total_count,
@ -99,4 +105,17 @@ abstract class CloudflareService extends CommonService
} }
return $results; return $results;
} }
private function process_results(array $results): array
{
$processed_results = [];
foreach ($results as $result) {
if (!is_object($result) || get_class($result) !== 'stdClass') {
log_message("error", "Cloudflare: result is not a stdClass:\n" . var_export($result, true) . "\n");
} else {
$processed_results[] = $result;
}
}
return $processed_results;
}
} }

View File

@ -12,12 +12,14 @@ class FirewallService extends CloudflareService
private ?ZoneEntity $_parent_entity = null; private ?ZoneEntity $_parent_entity = null;
private ?FirewallModel $_model = null; private ?FirewallModel $_model = null;
private ?AccountModel $_accountModel = null; private ?AccountModel $_accountModel = null;
public function __construct() public function __construct()
{ {
$this->class_name = "Firewall"; $this->class_name = "Firewall";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
private function getParentEntity(): ZoneEntity private function getParentEntity(): ZoneEntity
{ {
if ($this->_parent_entity === null) { if ($this->_parent_entity === null) {
@ -25,6 +27,7 @@ class FirewallService extends CloudflareService
} }
return $this->_parent_entity; return $this->_parent_entity;
} }
private function setParentEntity(ZoneEntity $parent_entity): void private function setParentEntity(ZoneEntity $parent_entity): void
{ {
$this->_parent_entity = $parent_entity; $this->_parent_entity = $parent_entity;
@ -38,6 +41,7 @@ class FirewallService extends CloudflareService
} }
$this->setAuthEntity($auth_entity); $this->setAuthEntity($auth_entity);
} }
protected function getModel(): FirewallModel protected function getModel(): FirewallModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -45,6 +49,7 @@ class FirewallService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
protected function getAccountModel(): AccountModel protected function getAccountModel(): AccountModel
{ {
if ($this->_accountModel === null) { if ($this->_accountModel === null) {
@ -52,6 +57,7 @@ class FirewallService extends CloudflareService
} }
return $this->_accountModel; return $this->_accountModel;
} }
protected function getArrayByResult(\stdClass $rule, array $formDatas = []): array protected function getArrayByResult(\stdClass $rule, array $formDatas = []): array
{ {
// log_message("debug", var_export($result, true)); // log_message("debug", var_export($result, true));
@ -66,6 +72,7 @@ class FirewallService extends CloudflareService
// log_message("debug", print_r($formDatas, true)); // log_message("debug", print_r($formDatas, true));
return $formDatas; return $formDatas;
} }
public function modify(ZoneEntity $parent_entity, FirewallEntity $entity, array $formDatas): FirewallEntity public function modify(ZoneEntity $parent_entity, FirewallEntity $entity, array $formDatas): FirewallEntity
{ {
//부모데이터정의 //부모데이터정의
@ -90,32 +97,33 @@ class FirewallService extends CloudflareService
} }
return $entity; return $entity;
} }
//Reload //Reload
public function reload(ZoneEntity $parent_entity): array public function reload(ZoneEntity $parent_entity): array
{ {
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
// log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Firewall 처리 시작-----------"); // log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Firewall 처리 시작-----------");
$entitys = []; $entities = [];
try { try {
$response = $this->getMySocket()->get("zones/{$this->getParentEntity()->getPK()}/rulesets/phases/http_request_firewall_custom/entrypoint"); $response = $this->getMySocket()->get("zones/{$this->getParentEntity()->getPK()}/rulesets/phases/http_request_firewall_custom/entrypoint");
$body = json_decode($response->getBody()); $body = json_decode($response->getBody());
foreach ($body->result->rules as $rule) { foreach ($body->result->rules as $rule) {
if (!is_object(value: $rule) || get_class($rule) !== 'stdClass') { if (!is_object($rule) || get_class($rule) !== 'stdClass') {
log_message("error", "Firewall: result is not a stdClass:\n" . var_export($rule, true) . "\n"); log_message("error", "Firewall: result is not a stdClass:\n" . var_export($rule, true) . "\n");
} else { } else {
$formDatas = ['rulesetid' => $body->result->id]; $formDatas = ['rulesetid' => $body->result->id];
$formDatas = $this->getArrayByResult($rule, $formDatas); $formDatas = $this->getArrayByResult($rule, $formDatas);
$entity = $this->getModel()->modify(new FirewallEntity(), $formDatas); $entity = $this->getModel()->modify(new FirewallEntity(), $formDatas);
log_message("debug", "{$entity->getTitle()} Firewall 처리,[{$this->getMySocket()::$_request}]"); log_message("debug", "{$entity->getTitle()} Firewall 처리,[{$this->getMySocket()::$_request}]");
$entitys[$entity->getPK()] = $entity; $entities[$entity->getPK()] = $entity;
} }
} }
} catch (\Exception $e) { } catch (\Exception $e) {
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->getParentEntity()->getTitle()}의 Firewall처리[" . count($entitys) . "개] 완료-----------"); // log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Firewall처리[" . count($entities) . "개] 완료-----------");
return $entitys; return $entities;
} }
} }

View File

@ -12,12 +12,14 @@ class RecordService extends CloudflareService
private ?ZoneEntity $_parent_entity = null; private ?ZoneEntity $_parent_entity = null;
private ?RecordModel $_model = null; private ?RecordModel $_model = null;
private ?AccountModel $_accountModel = null; private ?AccountModel $_accountModel = null;
public function __construct() public function __construct()
{ {
$this->class_name = "Record"; $this->class_name = "Record";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
private function getParentEntity(): ZoneEntity private function getParentEntity(): ZoneEntity
{ {
if ($this->_parent_entity === null) { if ($this->_parent_entity === null) {
@ -25,6 +27,7 @@ class RecordService extends CloudflareService
} }
return $this->_parent_entity; return $this->_parent_entity;
} }
private function setParentEntity(ZoneEntity $parent_entity): void private function setParentEntity(ZoneEntity $parent_entity): void
{ {
$this->_parent_entity = $parent_entity; $this->_parent_entity = $parent_entity;
@ -38,6 +41,7 @@ class RecordService extends CloudflareService
} }
$this->setAuthEntity($auth_entity); $this->setAuthEntity($auth_entity);
} }
protected function getModel(): RecordModel protected function getModel(): RecordModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -45,6 +49,7 @@ class RecordService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
protected function getAccountModel(): AccountModel protected function getAccountModel(): AccountModel
{ {
if ($this->_accountModel === null) { if ($this->_accountModel === null) {
@ -52,11 +57,11 @@ class RecordService extends CloudflareService
} }
return $this->_accountModel; return $this->_accountModel;
} }
protected function getArrayByResult(\stdClass $result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
// log_message("debug", var_export($result, true)); // 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] = $this->getParentEntity()->getPK(); $formDatas[RecordModel::PARENT] = $this->getParentEntity()->getPK();
$formDatas[RecordModel::TITLE] = $result->name; $formDatas[RecordModel::TITLE] = $result->name;
$formDatas['type'] = $result->type; $formDatas['type'] = $result->type;
@ -64,13 +69,13 @@ class RecordService extends CloudflareService
$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'] = isset($result->locked) && $result->locked ? "off" : "on";
$formDatas['locked'] = "on"; $formDatas['locked'] = "on";
$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", print_r($formDatas, true)); // log_message("debug", print_r($formDatas, true));
return $formDatas; return $formDatas;
} }
public function create(ZoneEntity $parent_entity, string $host, string $type, string $content, string $proxied): RecordEntity public function create(ZoneEntity $parent_entity, string $host, string $type, string $content, string $proxied): RecordEntity
{ {
//부모데이터정의 //부모데이터정의
@ -81,7 +86,7 @@ class RecordService extends CloudflareService
'name' => $host, 'name' => $host,
'type' => $type, 'type' => $type,
'content' => $content, 'content' => $content,
'proxied' => $proxied === 'on' ? true : false 'proxied' => $proxied === 'on'
]; ];
$response = $this->getMySocket()->post("zones/{$this->getParentEntity()->getPK()}/dns_records", $datas); $response = $this->getMySocket()->post("zones/{$this->getParentEntity()->getPK()}/dns_records", $datas);
$body = json_decode($response->getBody()); $body = json_decode($response->getBody());
@ -90,6 +95,7 @@ class RecordService extends CloudflareService
log_message("debug", "Record:{$entity->getTitle()} 작업을 완료하였습니다."); log_message("debug", "Record:{$entity->getTitle()} 작업을 완료하였습니다.");
return $entity; return $entity;
} }
public function modify(ZoneEntity $parent_entity, RecordEntity $entity, array $formDatas): RecordEntity public function modify(ZoneEntity $parent_entity, RecordEntity $entity, array $formDatas): RecordEntity
{ {
//fixed 필드가 있고 값이 변경되었을때(toggle에서 fixed만 설정시사용) //fixed 필드가 있고 값이 변경되었을때(toggle에서 fixed만 설정시사용)
@ -104,10 +110,10 @@ class RecordService extends CloudflareService
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
//TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용 //TTL값은 CDN(proxied)가 사용함일때는 무조건 1, 않함일때는 120이 적용
$datas = [ $datas = [
'type' => isset($formDatas['type']) ? $formDatas['type'] : $entity->type, 'type' => $formDatas['type'] ?? $entity->type,
'name' => isset($formDatas['host']) ? $formDatas['host'] : $entity->host, 'name' => $formDatas['host'] ?? $entity->host,
'content' => isset($formDatas['content']) ? $formDatas['content'] : $entity->content, 'content' => $formDatas['content'] ?? $entity->content,
'proxied' => $entity->proxied == 'on' ? true : false, 'proxied' => $entity->proxied === 'on',
'ttl' => intval($entity->ttl), 'ttl' => intval($entity->ttl),
]; ];
if (isset($formDatas['proxied'])) { if (isset($formDatas['proxied'])) {
@ -126,6 +132,7 @@ class RecordService extends CloudflareService
// DB 수정 // DB 수정
return $this->getModel()->modify($entity, $this->getArrayByResult($body->result)); return $this->getModel()->modify($entity, $this->getArrayByResult($body->result));
} }
public function delete(ZoneEntity $parent_entity, RecordEntity $entity): RecordEntity public function delete(ZoneEntity $parent_entity, RecordEntity $entity): RecordEntity
{ {
//부모데이터정의 //부모데이터정의
@ -136,6 +143,7 @@ class RecordService extends CloudflareService
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
return $entity; return $entity;
} }
public function sync(ZoneEntity $parent_entity, RecordEntity $entity): RecordEntity public function sync(ZoneEntity $parent_entity, RecordEntity $entity): RecordEntity
{ {
//부모데이터정의 //부모데이터정의
@ -163,32 +171,31 @@ class RecordService extends CloudflareService
// $promise->wait(); // $promise->wait();
return $entity; return $entity;
} }
//Reload //Reload
public function reload(ZoneEntity $parent_entity): array public function reload(ZoneEntity $parent_entity): array
{ {
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
// log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Record 처리 시작-----------"); // log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Record 처리 시작-----------");
$entitys = []; $entities = [];
try { try {
$results = $this->reload_procedure("zones/{$this->getParentEntity()->getPK()}/dns_records"); $results = $this->reload_procedure("zones/{$this->getParentEntity()->getPK()}/dns_records");
$total = count($results); $total = count($results);
if ($total > 0) { if ($total > 0) {
$cnt = 1; foreach ($results as $index => $result) {
foreach ($results as $result) {
if (!is_object($result) || get_class($result) !== 'stdClass') { if (!is_object($result) || get_class($result) !== 'stdClass') {
log_message("error", "Record: result is not a stdClass:\n" . var_export($result, true) . "\n"); log_message("error", "Record: result is not a stdClass:\n" . var_export($result, true) . "\n");
continue; continue;
} }
$formDatas = $this->getArrayByResult($result); $formDatas = $this->getArrayByResult($result);
$entity = $this->getModel()->modify(new RecordEntity(), $formDatas); $entity = $this->getModel()->modify(new RecordEntity(), $formDatas);
log_message("debug", "{$cnt}/{$total} => {$entity->getTitle()} Record 처리,[{$this->getMySocket()::$_request}]"); log_message("debug", ($index + 1) . "/{$total} => {$entity->getTitle()} Record 처리,[{$this->getMySocket()::$_request}]");
$entitys[$entity->getPK()] = $entity; $entities[$entity->getPK()] = $entity;
$cnt++;
} }
//부모키를 기준으로 CF에 존재하지 않는 데이터 DB삭제 //부모키를 기준으로 CF에 존재하지 않는 데이터 DB삭제
$this->getModel()->where(RecordModel::PARENT, $this->getParentEntity()->getPK()); $this->getModel()->where(RecordModel::PARENT, $this->getParentEntity()->getPK());
$this->getModel()->whereNotIn(RecordModel::PK, array_keys($entitys)); $this->getModel()->whereNotIn(RecordModel::PK, array_keys($entities));
$this->getModel()->delete(); $this->getModel()->delete();
// log_message("debug", $this->getModel()->getLastQuery()); // log_message("debug", $this->getModel()->getLastQuery());
} }
@ -196,7 +203,7 @@ class RecordService extends CloudflareService
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->getParentEntity()->getTitle()}의 Record처리[" . count($entitys) . "개] 완료-----------"); // log_message("notice", "\n-----------Zone {$this->getParentEntity()->getTitle()}의 Record처리[" . count($entities) . "개] 완료-----------");
return $entitys; return $entities;
} }
} }

View File

@ -10,19 +10,21 @@ class ZoneService extends CloudflareService
{ {
private ?AccountEntity $_parent_entity = null; private ?AccountEntity $_parent_entity = null;
private ?ZoneModel $_model = null; private ?ZoneModel $_model = null;
private $_setting_fields = [ private array $_setting_fields = [
'development_mode' => 'off', 'development_mode' => 'off',
'ipv6' => 'off', 'ipv6' => 'off',
'security_level' => 'medium', 'security_level' => 'medium',
'ssl' => 'flexible', 'ssl' => 'flexible',
'always_use_https' => 'off' 'always_use_https' => 'off'
]; ];
public function __construct() public function __construct()
{ {
$this->class_name = "Zone"; $this->class_name = "Zone";
parent::__construct(); parent::__construct();
$this->class_path .= $this->class_name; $this->class_path .= $this->class_name;
} }
private function getParentEntity(): AccountEntity private function getParentEntity(): AccountEntity
{ {
if ($this->_parent_entity === null) { if ($this->_parent_entity === null) {
@ -30,6 +32,7 @@ class ZoneService extends CloudflareService
} }
return $this->_parent_entity; return $this->_parent_entity;
} }
private function setParentEntity(AccountEntity $parent_entity): void private function setParentEntity(AccountEntity $parent_entity): void
{ {
$this->_parent_entity = $parent_entity; $this->_parent_entity = $parent_entity;
@ -39,6 +42,7 @@ class ZoneService extends CloudflareService
} }
$this->setAuthEntity($auth_entity); $this->setAuthEntity($auth_entity);
} }
protected function getModel(): ZoneModel protected function getModel(): ZoneModel
{ {
if ($this->_model === null) { if ($this->_model === null) {
@ -46,6 +50,7 @@ class ZoneService extends CloudflareService
} }
return $this->_model; return $this->_model;
} }
protected function getArrayByResult(\stdClass $result, array $formDatas = []): array protected function getArrayByResult(\stdClass $result, array $formDatas = []): array
{ {
// log_message("debug", var_export($result, true)); // log_message("debug", var_export($result, true));
@ -57,18 +62,12 @@ class ZoneService extends CloudflareService
$formDatas['name_servers'] = 'none'; $formDatas['name_servers'] = 'none';
if (isset($result->name_servers)) { if (isset($result->name_servers)) {
$formDatas['name_servers'] = is_array($result->name_servers) ? $formDatas['name_servers'] = is_array($result->name_servers) ?
implode( implode(',', $result->name_servers) : $result->name_servers;
',',
$result->name_servers
) : $result->name_servers;
} }
$formDatas['original_name_servers'] = 'none'; $formDatas['original_name_servers'] = 'none';
if (isset($result->original_name_servers)) { if (isset($result->original_name_servers)) {
$formDatas['original_name_servers'] = is_array($result->original_name_servers) ? $formDatas['original_name_servers'] = is_array($result->original_name_servers) ?
implode( implode(',', $result->original_name_servers) : $result->original_name_servers;
',',
$result->original_name_servers
) : $result->original_name_servers;
} }
// $formDatas['updated_at'] = $result->modified_on; // $formDatas['updated_at'] = $result->modified_on;
$formDatas['updated_at'] = date("Y-m-d H:i:s"); $formDatas['updated_at'] = date("Y-m-d H:i:s");
@ -77,6 +76,7 @@ class ZoneService extends CloudflareService
// log_message("debug", var_export($formDatas, 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
{ {
@ -84,13 +84,14 @@ class ZoneService extends CloudflareService
$body = json_decode($response->getBody()); $body = json_decode($response->getBody());
// log_message("debug", var_export($body, true)); // log_message("debug", var_export($body, true));
foreach ($body->result as $result) { foreach ($body->result as $result) {
if (in_array(needle: $result->id, haystack: array_keys($this->_setting_fields))) { if (in_array($result->id, 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));
return $formDatas; return $formDatas;
} }
private function setCFSetting(string $uid, string $field, string $value): string private function setCFSetting(string $uid, string $field, string $value): string
{ {
$field = ($field === 'ssl_mode') ? 'ssl' : $field; $field = ($field === 'ssl_mode') ? 'ssl' : $field;
@ -100,6 +101,7 @@ class ZoneService extends CloudflareService
//최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음 //최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음
return $body->result->value; return $body->result->value;
} }
public function create(AccountEntity $parent_entity, string $domain, bool $jump_start = false): ZoneEntity public function create(AccountEntity $parent_entity, string $domain, bool $jump_start = false): ZoneEntity
{ {
//부모데이터정의 //부모데이터정의
@ -123,6 +125,7 @@ class ZoneService extends CloudflareService
log_message("debug", "Zone:{$entity->getTitle()} 작업을 완료하였습니다."); log_message("debug", "Zone:{$entity->getTitle()} 작업을 완료하였습니다.");
return $entity; return $entity;
} }
public function modify(AccountEntity $parent_entity, ZoneEntity $entity, array $formDatas): ZoneEntity public function modify(AccountEntity $parent_entity, ZoneEntity $entity, array $formDatas): ZoneEntity
{ {
//부모데이터정의 //부모데이터정의
@ -135,6 +138,7 @@ class ZoneService extends CloudflareService
//DB수정 //DB수정
return $this->getModel()->modify($entity, $formDatas); return $this->getModel()->modify($entity, $formDatas);
} }
public function delete(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity public function delete(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
{ {
//부모데이터정의 //부모데이터정의
@ -145,6 +149,7 @@ class ZoneService extends CloudflareService
log_message("debug", $this->getModel()->getLastQuery()); log_message("debug", $this->getModel()->getLastQuery());
return $entity; return $entity;
} }
public function sync(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity public function sync(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
{ {
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
@ -158,6 +163,7 @@ class ZoneService extends CloudflareService
// log_message("debug", $this->getModel()->getLastQuery()); // log_message("debug", $this->getModel()->getLastQuery());
return $entity; return $entity;
} }
public function expire(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity public function expire(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
{ {
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
@ -176,7 +182,7 @@ class ZoneService extends CloudflareService
//부모데이터정의 //부모데이터정의
$this->setParentEntity($parent_entity); $this->setParentEntity($parent_entity);
log_message("notice", "\n-----------Account {$this->getParentEntity()->getTitle()}의 Zone처리 시작-----------"); log_message("notice", "\n-----------Account {$this->getParentEntity()->getTitle()}의 Zone처리 시작-----------");
$entitys = []; $entities = [];
try { try {
$results = $this->reload_procedure("zones"); $results = $this->reload_procedure("zones");
$cnt = 1; $cnt = 1;
@ -192,15 +198,15 @@ class ZoneService extends CloudflareService
$formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas); $formDatas = $this->getCFSetting($formDatas[ZoneModel::PK], $formDatas);
$entity = $this->getModel()->modify(new ZoneEntity(), $formDatas); $entity = $this->getModel()->modify(new ZoneEntity(), $formDatas);
log_message("debug", "{$cnt}/{$total} => {$entity->getTitle()} Zone 처리,[{$this->getMySocket()::$_request}]"); log_message("debug", "{$cnt}/{$total} => {$entity->getTitle()} Zone 처리,[{$this->getMySocket()::$_request}]");
$entitys[$entity->getPK()] = $entity; $entities[$entity->getPK()] = $entity;
$cnt++; $cnt++;
} else { } else {
log_message("error", "Zone is abnormal status:\n" . var_export($result, true) . "\n"); log_message("error", "Zone is abnormal status:\n" . var_export($result, true) . "\n");
} }
} }
//부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용
$this->getModel()->where(ZoneModel::PARENT, value: $this->getParentEntity()->getPK()); $this->getModel()->where(ZoneModel::PARENT, $this->getParentEntity()->getPK());
$this->getModel()->whereNotIn(ZoneModel::PK, array_keys($entitys)); $this->getModel()->whereNotIn(ZoneModel::PK, array_keys($entities));
$this->getModel()->delete(); $this->getModel()->delete();
// log_message("debug", $this->getModel()->getLastQuery()); // log_message("debug", $this->getModel()->getLastQuery());
} }
@ -208,7 +214,7 @@ class ZoneService extends CloudflareService
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->getParentEntity()->getTitle()}의 Zone 처리[" . count($entitys) . "개] 완료-----------"); log_message("notice", "\n----------Account {$this->getParentEntity()->getTitle()}의 Zone 처리[" . count($entities) . "개] 완료-----------");
return $entitys; return $entities;
} }
} }

View File

@ -13,7 +13,7 @@ trait FileTrait
} }
} }
final protected function isFileType_FileTrait(string $file_ext, $type = "img"): bool final protected function isFileType_FileTrait(string $file_ext, string $type = "img"): bool
{ {
switch ($type) { switch ($type) {
case "audio": case "audio":
@ -30,8 +30,8 @@ trait FileTrait
return in_array($file_ext, $exts); return in_array($file_ext, $exts);
} }
//디렉토리에 속한 파일 List // 디렉토리에 속한 파일 List
final protected function getFiles_FileTrait(string $path, string $type = "image"): array final protected function getFiles_FileTrait(string $path, string $type = "img"): array
{ {
// 디렉토리에서 파일 목록 가져오기 // 디렉토리에서 파일 목록 가져오기
$files = []; $files = [];
@ -45,7 +45,7 @@ trait FileTrait
return $files; return $files;
} }
final protected function getUniqueName_FileTrait($path, $file_name) final protected function getUniqueName_FileTrait(string $path, string $file_name): string
{ {
$fileExtension = pathinfo($file_name, PATHINFO_EXTENSION); $fileExtension = pathinfo($file_name, PATHINFO_EXTENSION);
$fileBaseName = pathinfo($file_name, PATHINFO_FILENAME); $fileBaseName = pathinfo($file_name, PATHINFO_FILENAME);

View File

@ -14,15 +14,17 @@ trait ImageTrait
{ {
return imagesx($this->_image); return imagesx($this->_image);
} }
// 이미지의 현재 높이를 반환하는 메소드 // 이미지의 현재 높이를 반환하는 메소드
final public function getHeight_ImageTrait() final public function getHeight_ImageTrait()
{ {
return imagesy($this->_image); return imagesy($this->_image);
} }
// 이미지 파일을 로드하는 메소드 // 이미지 파일을 로드하는 메소드
final public function load_ImageTrait($file) final public function load_ImageTrait($file)
{ {
$imageInfo = getimagesize($file); $imageInfo = getimagesize($file);
$this->_imageType = $imageInfo[2]; $this->_imageType = $imageInfo[2];
switch ($this->_imageType) { switch ($this->_imageType) {
case IMAGETYPE_JPEG: case IMAGETYPE_JPEG:
@ -37,8 +39,11 @@ trait ImageTrait
case IMAGETYPE_WEBP: case IMAGETYPE_WEBP:
$this->_image = imagecreatefromwebp($file); $this->_image = imagecreatefromwebp($file);
break; break;
default:
throw new \Exception("Unsupported image type: " . $this->_imageType);
} }
} }
// 이미지 크기를 지정된 너비, 높이로 변경하는 메소드 // 이미지 크기를 지정된 너비, 높이로 변경하는 메소드
final public function resize_ImageTrait($width, $height) final public function resize_ImageTrait($width, $height)
{ {
@ -57,25 +62,29 @@ trait ImageTrait
); );
$this->_image = $newImage; $this->_image = $newImage;
} }
// 이미지 비율을 유지하면서 크기를 조정하는 메소드 // 이미지 비율을 유지하면서 크기를 조정하는 메소드
final public function resizeToWidth_ImageTrait($width) final public function resizeToWidth_ImageTrait($width)
{ {
$ratio = $width / $this->getWidth_ImageTrait(); $ratio = $width / $this->getWidth_ImageTrait();
$height = $this->getHeight_ImageTrait() * $ratio; $height = $this->getHeight_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height); $this->resize_ImageTrait($width, $height);
} }
final public function resizeToHeight_ImageTrait($height) final public function resizeToHeight_ImageTrait($height)
{ {
$ratio = $height / $this->getHeight_ImageTrait(); $ratio = $height / $this->getHeight_ImageTrait();
$width = $this->getWidth_ImageTrait() * $ratio; $width = $this->getWidth_ImageTrait() * $ratio;
$this->resize_ImageTrait($width, $height); $this->resize_ImageTrait($width, $height);
} }
final public function scale($scale) final public function scale($scale)
{ {
$width = $this->getWidth_ImageTrait() * ($scale / 100); $width = $this->getWidth_ImageTrait() * ($scale / 100);
$height = $this->getHeight_ImageTrait() * ($scale / 100); $height = $this->getHeight_ImageTrait() * ($scale / 100);
$this->resize_ImageTrait($width, $height); $this->resize_ImageTrait($width, $height);
} }
// 이미지를 저장하는 메소드 // 이미지를 저장하는 메소드
final public function save_ImageTrait($file, $imageType = IMAGETYPE_WEBP, $compression = 75) final public function save_ImageTrait($file, $imageType = IMAGETYPE_WEBP, $compression = 75)
{ {
@ -90,11 +99,13 @@ trait ImageTrait
imagepng($this->_image, $file); imagepng($this->_image, $file);
break; break;
case IMAGETYPE_WEBP: case IMAGETYPE_WEBP:
default:
imagewebp($this->_image, $file, $compression); imagewebp($this->_image, $file, $compression);
break; break;
default:
throw new \Exception("Unsupported image type: " . $imageType);
} }
} }
// 메모리 해제를 위한 메소드 // 메모리 해제를 위한 메소드
final public function destroy_ImageTrait() final public function destroy_ImageTrait()
{ {