diff --git a/app/Config/Constants.php b/app/Config/Constants.php index f74b31e..c429da7 100644 --- a/app/Config/Constants.php +++ b/app/Config/Constants.php @@ -156,6 +156,7 @@ define("MESSENGERS", [ //아이콘 및 Sound관련 define('ICONS', [ 'LOGO' => '', + 'MEMBER' => '', 'LOGIN' => '', 'LOGOUT' => '', 'HOME' => '', @@ -179,7 +180,10 @@ define('ICONS', [ 'LEFT' => '', 'RIGHT' => '', 'IMAGE_FILE' => '', - 'GOOGLE' => '', + 'GOOGLE' => '', + 'CLOUD' => '', + 'SIGNPOST' => '', + 'SIGNPOST2' => '', ]); //배너관련 define('TOP_BANNER', [ diff --git a/app/Config/Routes.php b/app/Config/Routes.php index 4e9626e..77de753 100644 --- a/app/Config/Routes.php +++ b/app/Config/Routes.php @@ -26,10 +26,12 @@ $routes->group('admin', ['namespace' => 'App\Controllers\Admin'], function ($rou }); $routes->group('zone', function ($routes) { $routes->get('/', 'ZoneController::index'); - $routes->post('create/(:uuid)', 'RecordController::create/$1'); + $routes->get('create', 'ZoneController::create_form'); + $routes->post('create/(:uuid)', 'ZoneController::create/$1'); }); $routes->group('record', function ($routes) { $routes->get('/', 'RecordController::index'); + $routes->get('create', 'RecordController::create_form'); $routes->post('create/(:uuid)', 'RecordController::create/$1'); }); }); diff --git a/app/Controllers/Admin/Cloudflare/AccountController.php b/app/Controllers/Admin/Cloudflare/AccountController.php index 80eb295..cfcbd1d 100644 --- a/app/Controllers/Admin/Cloudflare/AccountController.php +++ b/app/Controllers/Admin/Cloudflare/AccountController.php @@ -2,7 +2,7 @@ namespace App\Controllers\Admin\Cloudflare; -use App\Libraries\MyCloudflare\Account; +use App\Libraries\MySocket\Cloudflare\AccountSocket; use App\Models\Cloudflare\AccountModel; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; @@ -11,8 +11,10 @@ use Psr\Log\LoggerInterface; class AccountController extends CloudflareController { - private $_myLibrary = null; + private $_mySocket = null; private $_model = null; + private $_email = ""; + private $_auth_key = ""; public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) { parent::initController($request, $response, $logger); @@ -28,39 +30,55 @@ class AccountController extends CloudflareController } return $this->_model; } - final protected function getMyLibrary(): Account + final protected function getMySocket(): AccountSocket { - if ($this->_myLibrary === null) { - $this->_myLibrary = new Account(); + if ($this->_mySocket === null) { + $this->_mySocket = new AccountSocket($this->_email, $this->_auth_key); } - return $this->_myLibrary; + return $this->_mySocket; } //생성 - protected function create_init(): void + public function create_form(): RedirectResponse|string { - $this->action = 'create'; $this->fields = ['id', 'authkey']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); $this->filter_fields = []; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); + $this->field_options = $this->getFormFieldOptions($this->filter_fields); + return $this->create_form_procedure(); } protected function create_process(): void { parent::create_process(); - $this->getMyLibrary()->create($this->formDatas); + $results = $this->getMySocket()->create(); + $this->entitys = []; + foreach ($results as $result) { + $this->formDatas = $this->getMySocket()->getArrayByResult($result); + $entity = $this->getModel()->create($this->formDatas); + log_message("notice", "Account:" . __FUNCTION__ . "=> {$entity->getTitle()} 작업을 완료하였습니다."); + $this->entitys[] = $entity; + } } - //수정 - protected function modify_init(): void {} - // 리스트 - public function list_init(): void + public function create(): RedirectResponse + { + $this->fields = ['id', 'authkey']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); + // $this->filter_fields = []; + // $this->field_options = $this->getFormFieldOptions($this->filter_fields); + $this->create_validate(); + $this->formDatas = $this->getFormDatas(); + //Socket 인증용 + $this->_email = $this->formDatas['id']; + $this->auth_key = $this->formDatas['authkey']; + return $this->create_procedure(); + } + // 리스트 + public function index(): string { - $this->action = 'index'; $this->fields = [$this->getModel()::TITLE, 'oldkey', 'type', 'status', 'updated_at', 'created_at']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); $this->filter_fields = ['type', 'status']; $this->batchjob_fields = ['status']; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); + $this->field_options = $this->getFormFieldOptions($this->filter_fields); + return $this->list_procedure(); } } diff --git a/app/Controllers/Admin/Cloudflare/CloudflareController.php b/app/Controllers/Admin/Cloudflare/CloudflareController.php index 7bfd611..23382ee 100644 --- a/app/Controllers/Admin/Cloudflare/CloudflareController.php +++ b/app/Controllers/Admin/Cloudflare/CloudflareController.php @@ -5,8 +5,8 @@ namespace App\Controllers\Admin\Cloudflare; use App\Controllers\Admin\AdminController; use App\Models\Cloudflare\AccountModel; use App\Models\Cloudflare\RecordModel; - use App\Models\Cloudflare\ZoneModel; +use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; @@ -21,6 +21,7 @@ abstract class CloudflareController extends AdminController parent::initController($request, $response, $logger); $this->class_path .= "Cloudflare/"; } + abstract protected function getMySocket(): mixed; final protected function getAccountModel(): AccountModel { if ($this->_accountModel === null) { @@ -42,7 +43,19 @@ abstract class CloudflareController extends AdminController } return $this->_recordModel; } - protected function modify_process_submit(): void + final protected function reload_procedure(): RedirectResponse { + try { + //Transaction Start + $this->getModel()->transStart(); + $$this->getMySocket()->reload($this->getModel()); + return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/"); + } catch (\Exception $e) { + //Transaction Rollback + $this->getModel()->transRollback(); + log_message("error", $e->getMessage()); + $this->session->setFlashdata(SESSION_NAMES['RETURN_MSG'], __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage()); + return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/"); + } } } diff --git a/app/Controllers/Admin/Cloudflare/RecordController.php b/app/Controllers/Admin/Cloudflare/RecordController.php index 88ea702..38383a9 100644 --- a/app/Controllers/Admin/Cloudflare/RecordController.php +++ b/app/Controllers/Admin/Cloudflare/RecordController.php @@ -2,7 +2,7 @@ namespace App\Controllers\Admin\Cloudflare; -use App\Libraries\MyCloudflare\Record; +use App\Libraries\MySocket\Cloudflare\RecordSocket; use App\Models\Cloudflare\RecordModel; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; @@ -29,12 +29,12 @@ class RecordController extends CloudflareController } return $this->_model; } - final protected function getMyLibrary(): Record + final protected function getMySocket(): RecordSocket { - if ($this->_myLibrary === null) { - $this->_myLibrary = new Record($this->_account_entity, $this->_zone_entity); + if ($this->_mySocket === null) { + $this->_mySocket = new RecordSocket($this->_account_entity, $this->_zone_entity); } - return $this->_myLibrary; + return $this->_mySocket; } protected function getFormFieldOption(string $field, array $options = []): array { @@ -42,8 +42,8 @@ class RecordController extends CloudflareController case $this->getModel()::PARENT: $this->getZoneModel()->where('status', DEFAULTS['STATUS']); $options[$field] = [ - DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택', - ...$this->getZoneModel()->getFormFieldOption($field, $options), + DEFAULTS['EMPTY'] => lang($this->class_path . '.label.' . $field) . ' 선택', + $this->getZoneModel()->getFormFieldOption($field, $options), ]; break; default: @@ -68,14 +68,14 @@ class RecordController extends CloudflareController } return $formDatas; } - protected function create_init(): void + //생성 + public function create_form(): RedirectResponse|string { - $this->action = 'create'; $this->fields = [$this->getModel()::PARENT, 'type', 'content', 'proxied', 'hosts']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); $this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied']; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); + $this->field_options = $this->getFormFieldOptions($this->filter_fields); + return $this->create_form_procedure(); } protected function create_validate(): void { @@ -91,20 +91,45 @@ class RecordController extends CloudflareController } //Record생성 foreach ($this->formDatas['hosts'] as $host) { - $this->getMyLibrary()->create($host, $this->formDatas); + $result = $this->getMySocket()->create($host, [ + 'type' => $this->formDatas['type'], + 'content' => $this->formDatas['content'], + 'proxied' => $this->formDatas['proxied'], + ]); + $formDatas = $this->getMySocket()->getArrayByResult($result); + $entity = $this->getRecordModel()->create($formDatas); + log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); } } - //수정 - protected function modify_init(): void {} - // 리스트 - public function list_init(): void + public function create(): RedirectResponse + { + $this->fields = [$this->getModel()::PARENT, 'type', 'content', 'proxied', 'hosts']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); + // $this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied']; + // $this->field_options = $this->getFormFieldOptions($this->filter_fields); + $this->create_validate(); + $this->formDatas = $this->getFormDatas(); + //부모데이터 정의 + $this->_account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]); + return $this->create_procedure(); + } + //수정 + // 리스트 + public function index(): string { - $this->action = 'index'; $this->fields = [$this->getModel()::PARENT, $this->getModel()::TITLE, 'type', 'content', 'ttl', 'proxied', 'locked', 'updated_at', 'created_at']; $this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); $this->batchjob_fields = ['proxied']; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); + $this->field_options = $this->getFormFieldOptions($this->filter_fields); + return $this->list_procedure(); + } + //reload + public function reload(string $zone_uid): RedirectResponse + { + //부모데이터 정의 + $this->_zone_entity = $this->getZoneModel()->getEntityByPK($zone_uid); + $this->_account_entity = $this->getAccountModel()->getEntityByPK($this->_zone_entity->getParent()); + return $this->reload_procedure(); } } diff --git a/app/Controllers/Admin/Cloudflare/ZoneController.php b/app/Controllers/Admin/Cloudflare/ZoneController.php index 45045eb..adfddd3 100644 --- a/app/Controllers/Admin/Cloudflare/ZoneController.php +++ b/app/Controllers/Admin/Cloudflare/ZoneController.php @@ -2,8 +2,8 @@ namespace App\Controllers\Admin\Cloudflare; -use App\Libraries\MyCloudflare\Record; -use App\Libraries\MyCloudflare\Zone; +use App\Libraries\MySocket\Cloudflare\RecordSocket; +use App\Libraries\MySocket\Cloudflare\ZoneSocket; use App\Models\Cloudflare\ZoneModel; use CodeIgniter\HTTP\RedirectResponse; use CodeIgniter\HTTP\RequestInterface; @@ -12,7 +12,7 @@ use Psr\Log\LoggerInterface; class ZoneController extends CloudflareController { - private $_myLibrary = null; + private $_mySocket = null; private $_account_entity = null; private $_model = null; public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger) @@ -30,12 +30,12 @@ class ZoneController extends CloudflareController } return $this->_model; } - final protected function getMyLibrary(): Zone + final protected function getMySocket(): ZoneSocket { - if ($this->_myLibrary === null) { - $this->_myLibrary = new Zone($this->_account_entity); + if ($this->_mySocket === null) { + $this->_mySocket = new ZoneSocket($this->_account_entity); } - return $this->_myLibrary; + return $this->_mySocket; } protected function getFormFieldOption(string $field, array $options = []): array { @@ -43,8 +43,8 @@ class ZoneController extends CloudflareController case $this->getModel()::PARENT: $this->getAccountModel()->where('status', DEFAULTS['STATUS']); $options[$field] = [ - DEFAULTS['EMPTY'] => lang($this->_className . '.label.' . $field) . ' 선택', - ...$this->getAccountModel()->getFormFieldOption($field, $options), + DEFAULTS['EMPTY'] => lang($this->class_path . '.label.' . $field) . ' 선택', + $this->getAccountModel()->getFormFieldOption($field, $options), ]; break; default: @@ -74,15 +74,7 @@ class ZoneController extends CloudflareController } return $formDatas; } - protected function create_init(): void - { - $this->action = 'create'; - $this->fields = [$this->$this->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']; - $this->filter_fields = [$this->$this->getModel()::PARENT, 'type', 'proxied']; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); - } + //생성 protected function create_validate(): void { //domains,hosts를 제외한 fields Valid처리 @@ -90,38 +82,85 @@ class ZoneController extends CloudflareController } protected function create_process(): void { - $this->_account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]); - if ($this->_account_entity === null) { - throw new \Exception("해당 계정정보를 찾을수 없습니다."); - } + parent::create_process(); //Zone생성 $zone_entitys = []; foreach ($this->formDatas['domains'] as $domain) { - $zone_entitys[] = $this->getMyLibrary()->create($domain); + //Storage용 + $result = $this->getMySocket()->create($domain); + $formDatas = $this->getMySocket()->getArrayByResult($result); + $entity = $this->getModel()->create($formDatas); + //아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF + $entity = $this->getMySocket()->setCFSetting($entity, 'ipv6', 'off'); + $entity = $this->getMySocket()->setCFSetting($entity, 'development_mode', 'off'); + $entity = $this->getMySocket()->setCFSetting($entity, 'security_level', 'medium'); + log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); + $zone_entitys[] = $entity; } //Record생성 foreach ($zone_entitys as $zone_entity) { - $record = new Record($this->_account_entity, $zone_entity); + $record = new RecordSocket($this->_account_entity, $zone_entity); foreach ($this->formDatas['hosts'] as $host) { - $record->create($host, [ - 'type' => $this->formDatas['type'], + $result = $record->create($host, [ + 'type' => $this->formDatas['type'], 'content' => $this->formDatas['content'], 'proxied' => $this->formDatas['proxied'], ]); + $formDatas = $record->getArrayByResult($result); + $entity = $this->getRecordModel()->create($formDatas); + log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); } } } - //수정 - protected function modify_init(): void {} - // 리스트 - public function list_init(): void + public function create(): RedirectResponse + { + $this->fields = [$this->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); + // $this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied']; + // $this->field_options = $this->getFormFieldOptions($this->filter_fields); + $this->create_validate(); + $this->formDatas = $this->getFormDatas(); + //부모데이터 정의 + $this->_account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]); + return $this->create_procedure(); + } + // //수정 + // protected function modify_process(): void + // { + // $this->entity = $this->getMySocket()->modify($this->entity, $this->formDatas); + // } + // public function modify(string $uid): RedirectResponse + // { + // $this->entity = $this->getModel()->getEntityByPK($uid); + // if ($this->entity === null) { + // throw new \Exception("해당 정보를 찾을수 없습니다."); + // } + // //부모데이터 정의 + // $this->_account_entity = $this->getAccountModel()->getEntityByPK($this->entity->getParent()); + + // $this->fields = [$this->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']; + // $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); + // // $this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied']; + // // $this->field_options = $this->getFormFieldOptions($this->filter_fields); + // $this->modify_validate(); + // $this->formDatas = $this->getFormDatas(); + // return $this->create_procedure(); + // } + // 리스트 + public function index(): string { - $this->action = 'index'; $this->fields = [$this->getModel()::PARENT, $this->getModel()::TITLE, 'name_servers', 'original_name_servers', 'plan', 'development_mode', 'ipv6', 'security_level', 'status', 'updated_at', 'created_at']; + $this->field_rules = $this->getModel()->getFieldRules(__FUNCTION__, $this->fields); $this->filter_fields = [$this->getModel()::PARENT, 'development_mode', 'ipv6', 'security_level', 'status']; $this->batchjob_fields = ['development_mode', 'ipv6', 'security_level']; - $this->field_rules = $this->getModel()->getFieldRules($this->fields); - $this->field_options = $this->getFormFieldOptions(); - $this->getModel()->setAction($this->action); + $this->field_options = $this->getFormFieldOptions($this->filter_fields); + return $this->list_procedure(); + } + //reload + public function reload(string $account_uid): RedirectResponse + { + //부모데이터 정의 + $this->_account_entity = $this->getAccountModel()->getEntityByPK($account_uid); + return $this->reload_procedure(); } } diff --git a/app/Controllers/MVController.php b/app/Controllers/MVController.php index ff4419b..0bb871a 100644 --- a/app/Controllers/MVController.php +++ b/app/Controllers/MVController.php @@ -15,10 +15,6 @@ abstract class MVController extends CommonController helper('common'); } abstract protected function getModel(): mixed; - abstract protected function getMyLibrary(): mixed; - abstract protected function create_init(): void; - abstract protected function modify_init(): void; - abstract protected function list_init(): void; //Field별 Form Option용 protected function getFormFieldOption(string $field, array $options): array { @@ -33,9 +29,9 @@ abstract class MVController extends CommonController } return $options; } - final protected function getFormFieldOptions(array $options = []): array + final protected function getFormFieldOptions(array $fields, array $options = []): array { - foreach ($this->filter_fields as $field) { + foreach ($fields as $field) { if (is_array($field)) { throw new \Exception(__FUNCTION__ . "에서 field array 입니다.\n" . var_export($field, true)); } @@ -60,23 +56,7 @@ abstract class MVController extends CommonController } return $formDatas; } - //전송된 데이터 재정의 - protected function convertFormData(string $field, array $formDatas): array - { - switch ($field) { - default: - break; - } - return $formDatas; - } - final protected function convertFormDatas(array $formDatas = []): array - { - foreach ($this->fields as $field) { - $formDatas = $this->convertFormData($field, $formDatas); - } - return $formDatas; - } - final protected function validateFormDatas(array $fields): void + private function validateFormDatas(array $fields): void { //변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요 $this->validation = service('validation'); @@ -89,12 +69,17 @@ abstract class MVController extends CommonController } } // 생성 - protected function create_form_process(): void {} - public function create_form(): RedirectResponse|string + protected function create_validate(): void + { + $this->validateFormDatas($this->fields); + } + protected function create_form_process(): void + { + } + final protected function create_form_procedure(): RedirectResponse|string { try { helper(['form']); - $this->create_init(); $this->create_form_process(); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; @@ -107,18 +92,12 @@ abstract class MVController extends CommonController return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with(SESSION_NAMES['RETURN_MSG'], $e->getMessage()); } } - protected function create_validate(): void + protected function create_process(): void { - $this->validateFormDatas($this->fields); } - protected function create_process(): void {} - public function create(): RedirectResponse + final protected function create_procedure(): RedirectResponse { try { - $this->create_init(); - $this->create_validate(); - $this->formDatas = $this->getFormDatas(); - $this->formDatas = $this->convertFormDatas($this->formDatas); //Transaction Start $this->getModel()->transStart(); $this->create_process(); @@ -137,18 +116,13 @@ abstract class MVController extends CommonController { $this->validateFormDatas($this->fields); } - protected function modify_form_process(): void {} - public function modify_form(): RedirectResponse|string + protected function modify_form_process(): void + { + } + final protected function modify_form_procedure(): RedirectResponse|string { try { helper(['form']); - $this->modify_init(); - $this->formDatas = $this->getFormDatas(); - //기존 데이터 가져오기 - $this->entity = $this->getModel()->getEntityByPK($this->formDatas[$this->getModel()->getPKField()]); - if ($this->entity === null) { - throw new \Exception("해당 정보를 찾을수 없습니다."); - } $this->modify_form_process(); $this->session->keepFlashdata(SESSION_NAMES['RETURN_URL']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; @@ -161,19 +135,12 @@ abstract class MVController extends CommonController return redirect()->to($this->session->getFlashdata(SESSION_NAMES['RETURN_URL']) ?: "/")->with(SESSION_NAMES['RETURN_MSG'], $e->getMessage()); } } - protected function modify_process(): void {} - public function modify(): mixed + protected function modify_process(): void + { + } + final protected function modify_procedure(): RedirectResponse { try { - $this->modify_init(); - $this->modify_validate(); - $this->formDatas = $this->getFormDatas(); - $this->formDatas = $this->convertFormDatas($this->formDatas); - //기존 데이터 가져오기 - $this->entity = $this->getModel()->getEntityByPK($this->formDatas[$this->getModel()->getPKField()]); - if ($this->entity === null) { - throw new \Exception("해당 정보를 찾을수 없습니다."); - } //Transaction Start $this->getModel()->transStart(); $this->modify_process(); @@ -188,7 +155,7 @@ abstract class MVController extends CommonController } } // 리스트 - protected function list_condition($isTotalCount = false): void + private function list_condition_process($isTotalCount = false): void { //조건절 처리 foreach ($this->filter_fields as $field) { @@ -216,15 +183,15 @@ abstract class MVController extends CommonController } } //Totalcount 처리 - protected function list_total(): int + private function list_total_process(): int { - $this->list_condition(true); + $this->list_condition_process(true); $total_count = $this->getModel()->countAllResults(); // echo $this->getModel()->getLastQuery(); return $total_count; } //PageNation 처리 - protected function list_pagination($pager_group = 'default', int $segment = 0, $template = 'default_full'): string + private function list_pagination_process($pager_group = 'default', int $segment = 0, $template = 'default_full'): string { //Page, Per_page필요부분 $this->page = (int)$this->request->getVar('page') ?: 1; @@ -252,9 +219,9 @@ abstract class MVController extends CommonController $this->total_page = $pager->getPageCount($pager_group); return $pager->links($pager_group, $template); } - protected function list_entitys(): array + private function list_entitys_process(): array { - $this->list_condition(); + $this->list_condition_process(); if ($this->page) { $this->getModel()->limit( $this->per_page, @@ -265,20 +232,19 @@ abstract class MVController extends CommonController // echo $this->getModel()->getLastQuery(); return $entitys; } - public function index(): string + final protected function list_procedure(): string { try { helper(['form']); $this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []]; - $this->list_init(); //URL처리 $this->uri = $this->request->getUri(); //total 처리 - $this->total_count = $this->list_total(); + $this->total_count = $this->list_total_process(); //pagenation 처리 - $this->pagination = $this->list_pagination(); + $this->pagination = $this->list_pagination_process(); //모델 처리 - $this->entitys = $this->list_entitys(); + $this->entitys = $this->list_entitys_process(); //setting return_url to session flashdata $this->session->setFlashdata(SESSION_NAMES['RETURN_URL'], current_url() . '?' . $this->request->getUri()->getQuery() ?: ""); return view( diff --git a/app/Helpers/Admin/Cloudflare/Record_helper.php b/app/Helpers/Admin/Cloudflare/Record_helper.php index 18e175b..a6135e2 100644 --- a/app/Helpers/Admin/Cloudflare/Record_helper.php +++ b/app/Helpers/Admin/Cloudflare/Record_helper.php @@ -20,7 +20,7 @@ function getFieldForm_RecordHelper(string $field, mixed $value, array $viewDatas { $value = $value ?: DEFAULTS['EMPTY']; switch ($field) { - case 'user_uid': + case 'zone_uid': $form = form_dropdown($field, $viewDatas['field_options'][$field], $value, [...$attributes, 'class' => "select-field"]); // // return form_multiselect($field, $field_options[$field], is_array($value) ? [...$value] : [$value], [...$attributes]); // foreach ($viewDatas['field_options'][$field] as $key => $label) { @@ -29,20 +29,17 @@ function getFieldForm_RecordHelper(string $field, mixed $value, array $viewDatas // return implode(" ", $checkboxs); break; case 'content': - case 'head': - case 'tail': - $form = form_textarea($field, html_entity_decode($value), ['class' => 'editor', 'rows' => '20', 'cols' => '100']); + $form = form_input($field, $value, ["placeholder" => "예)123.123.123.123", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); + break; + case 'hosts': + $form = form_textarea($field, html_entity_decode($value), ['class' => 'editor', 'rows' => '5']); break; case "type": - case "status": + case "locked": + case "proxied": + case "proxiable": $form = form_dropdown($field, $viewDatas['field_options'][$field], $value, $attributes); break; - case 'id': - $form = form_input($field, $value, ["placeholder" => "예)sample@test.com", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); - break; - case 'name': - $form = form_input($field, $value, ["placeholder" => "예)", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); - break; case 'updated_at': case 'created_at': $form = form_input($field, $value, ['class' => 'calender']); diff --git a/app/Helpers/Admin/Cloudflare/Zone_helper.php b/app/Helpers/Admin/Cloudflare/Zone_helper.php index 516a3da..10a8955 100644 --- a/app/Helpers/Admin/Cloudflare/Zone_helper.php +++ b/app/Helpers/Admin/Cloudflare/Zone_helper.php @@ -20,7 +20,7 @@ function getFieldForm_ZoneHelper(string $field, mixed $value, array $viewDatas, { $value = $value ?: DEFAULTS['EMPTY']; switch ($field) { - case 'user_uid': + case 'account_uid': $form = form_dropdown($field, $viewDatas['field_options'][$field], $value, [...$attributes, 'class' => "select-field"]); // // return form_multiselect($field, $field_options[$field], is_array($value) ? [...$value] : [$value], [...$attributes]); // foreach ($viewDatas['field_options'][$field] as $key => $label) { @@ -29,20 +29,20 @@ function getFieldForm_ZoneHelper(string $field, mixed $value, array $viewDatas, // return implode(" ", $checkboxs); break; case 'content': - case 'head': - case 'tail': - $form = form_textarea($field, html_entity_decode($value), ['class' => 'editor', 'rows' => '20', 'cols' => '100']); + $form = form_input($field, $value, ["placeholder" => "예)123.123.123.123", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); + break; + case 'domains': + case 'hosts': + $form = form_textarea($field, html_entity_decode($value), ['class' => 'editor', 'rows' => '5']); break; case "type": + case "proxied": + case "development_mode": + case "ipv6": + case "security_level": case "status": $form = form_dropdown($field, $viewDatas['field_options'][$field], $value, $attributes); break; - case 'id': - $form = form_input($field, $value, ["placeholder" => "예)sample@test.com", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); - break; - case 'name': - $form = form_input($field, $value, ["placeholder" => "예)", "style" => "width:60%; ::placeholder{color:silver; opacity: 1;}"]); - break; case 'updated_at': case 'created_at': $form = form_input($field, $value, ['class' => 'calender']); diff --git a/app/Libraries/MyCloudflare/Account.php b/app/Libraries/MyCloudflare/Account.php deleted file mode 100644 index 5f35911..0000000 --- a/app/Libraries/MyCloudflare/Account.php +++ /dev/null @@ -1,84 +0,0 @@ -_myStorage === null) { - $this->_myStorage = new AccountModel(); - } - return $this->_myStorage; - } - //Result 형태 - // [ - // {"id":"078e88a7735965b661715af13031ecb0", - // "name":"Cloudwin002@idcjp.jp's Auth", - // "type":"standard", - // "settings":{ - // "enforce_twofactor":false, - // "api_access_enabled":null, - // "access_approval_expiry":null, - // "use_account_custom_ns_by_default":false - // }, - // "legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}}, - // "created_on":"2017-06-26T05:44:49.470184Z"} - // ] - protected function getArrayByResult($result, array $formDatas = []): array - { - $formDatas[$this->getMyStorage()->getPKField()] = $result->id; - $formDatas[$this->getMyStorage()->getTitleField()] = $result->name; - $formDatas['type'] = $result->type; - $formDatas['status'] = 'use'; - $formDatas['updated_at'] = $result->created_on; - $formDatas['created_at'] = $result->created_on; - return $formDatas; - } - // public function create(array $formDatas): AccountEntity - // { - // //Socket용 - // $cf = $this->getMySocket()->request($formDatas['authkey']) - // ->post('accounts', [ - // 'name' => $formDatas[$this->getMyStorage()->getTitleField()], - // 'type' => $formDatas['type'], - // ]); - // $cf = json_decode($cf->getBody()); - // if (!$cf->success) { - // throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); - // } - // //Storage용 - // $formDatas = $this->getArrayByResult($cf->result, $formDatas); - // $entity = $this->getMyStorage()->create($formDatas); - // log_message("notice", "Account::" . __FUNCTION__ . "=> 작업을 완료하였습니다."); - // return $entity; - // } - public function create(array $formDatas): array - { - //Account의 경우 인증키를 가지고있고 생성할수 없으므로 get으로 읽은후 첫번째것을 사용하기로 함 - $entitys = []; - foreach ($this->reload_cfs($this->getMySocket(), 'accounts') as $cf) { - $formDatas = $this->getArrayByResult($cf->result); - $entity = $this->$this->getMyStorage()->create($formDatas); - log_message("notice", "Account:" . __FUNCTION__ . "=> {$entity->getTitle()} 작업을 완료하였습니다."); - $entitys[] = $entity; - } - return $entitys; - } - - protected function reload_entity($cf): AccountEntity - { - return $this->getMyStorage()->modify(new AccountEntity, $this->getArrayByResult($cf)); - } -} diff --git a/app/Libraries/MyCloudflare/MyCloudflare.php b/app/Libraries/MyCloudflare/MyCloudflare.php deleted file mode 100644 index df0171f..0000000 --- a/app/Libraries/MyCloudflare/MyCloudflare.php +++ /dev/null @@ -1,69 +0,0 @@ -_account_uid = $account_uid; - } - abstract protected function getArrayByResult($result, array $formDatas = []): array; - abstract protected function reload_entity($cf): mixed; - abstract protected function getMyStorage(): mixed; - final protected function getMySocket(): CloudflareSocket - { - if ($this->_mySocket === null) { - $this->_mySocket = new CloudflareSocket(); - } - return $this->_mySocket; - } - //-----------------------필수항목-------------------// - final protected function reload_entitys(string $parent, array $cfs): array - { - $entity_uids = []; - if (count($cfs)) { - $cnt = 1; - foreach ($cfs as $cf) { - $entity = $this->reload_entity($cf); - $entity_uids[] = $entity->getPK(); - log_message("debug", "{$cnt}번째: {$entity->getTitle()} 저장"); - $cnt++; - } - //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 - $this->getMyStorage()->where($this->getMyStorage()::PARENT, $parent); - $this->getMyStorage()->whereNotIn($this->getMyStorage()->getPKField(), $entity_uids); - $this->getMyStorage()->delete(); - } - return $entity_uids; - } - final protected function reload_cfs(Guzzle $request, $uri): array - { - $page = 1; //Page는 1부터 시작해야함 - $perpage_max = getenv("cfmgr.request.perpage.max"); - $cfs = []; - do { - $query = [ - 'page' => $page, - 'per_page' => $perpage_max, - 'match' => 'all', - ]; - $cf = $request->get($uri, $query); - $cf = json_decode($cf->getBody()); - if (!$cf->success) { - throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); - } - $cfs = [$cfs, ...$cf->result]; - //Loop 제한 : 한페이지에서 가져온 갯수가 perpage_max보다 적다는것은 더이상 다음페이지기 없으므로 0로 종료시키기 위함 - $page = count($cf->result) < $perpage_max ? 0 : $page + 1; - } while (0 < $page); - return $cfs; - } -} diff --git a/app/Libraries/MySocket/Cloudflare/AccountSocket.php b/app/Libraries/MySocket/Cloudflare/AccountSocket.php new file mode 100644 index 0000000..6db7ee5 --- /dev/null +++ b/app/Libraries/MySocket/Cloudflare/AccountSocket.php @@ -0,0 +1,43 @@ +setAdapter($email, $auth_key); + } + //Result 형태 + // [ + // {"id":"078e88a7735965b661715af13031ecb0", + // "name":"Cloudwin002@idcjp.jp's Auth", + // "type":"standard", + // "settings":{ + // "enforce_twofactor":false, + // "api_access_enabled":null, + // "access_approval_expiry":null, + // "use_account_custom_ns_by_default":false + // }, + // "legacy_flags":{"enterprise_zone_quota":{"maximum":0,"current":0,"available":0}}, + // "created_on":"2017-06-26T05:44:49.470184Z"} + // ] + public function getArrayByResult($result, array $formDatas = []): array + { + $formDatas[AccountModel::PK] = $result->id; + $formDatas[AccountModel::TITLE] = $result->name; + $formDatas['type'] = $result->type; + $formDatas['status'] = 'use'; + $formDatas['updated_at'] = date("Y-m-d H:i:s"); + $formDatas['created_at'] = $result->created_on; + return $formDatas; + } + public function create(): array + { + return $this->reload_procedure('accounts'); + } +} diff --git a/app/Libraries/MyCloudflare/Record.php b/app/Libraries/MySocket/Cloudflare/RecordSocket.php similarity index 56% rename from app/Libraries/MyCloudflare/Record.php rename to app/Libraries/MySocket/Cloudflare/RecordSocket.php index 1291eb3..35b9b52 100644 --- a/app/Libraries/MyCloudflare/Record.php +++ b/app/Libraries/MySocket/Cloudflare/RecordSocket.php @@ -1,55 +1,48 @@ _account_entity->getPK()); + parent::__construct(); $this->_account_entity = $account_entity; $this->_zone_entity = $zone_entity; + $this->setAdapter($account_entity->getID(), $account_entity->getAuthKey()); } - final protected function getMyStorage(): RecordModel + public function getArrayByResult($result, array $formDatas = []): array { - if ($this->_myStorage === null) { - $this->_myStorage = new RecordModel(); - } - return $this->_myStorage; - } - protected function getArrayByResult($result, array $formDatas = []): array - { - $formDatas[$this->getMyStorage()->getPKField()] = $result->id; - $formDatas[$this->getMyStorage()::PARENT] = $result->zone_id; - $formDatas[$this->getMyStorage()->getTitleField()] = $result->name; - $formDatas['type'] = $result->type; - $formDatas['content'] = $result->content; - $formDatas['ttl'] = (int)$result->ttl; - $formDatas['proxiable'] = $result->proxiable ? "on" : "off"; - $formDatas['proxied'] = $result->proxied ? "on" : "off"; - $formDatas['locked'] = "on"; + $formDatas[RecordModel::PK] = $result->id; + $formDatas[RecordModel::PARENT] = $result->zone_id; + $formDatas[RecordModel::TITLE] = $result->name; + $formDatas['type'] = $result->type; + $formDatas['content'] = $result->content; + $formDatas['ttl'] = (int)$result->ttl; + $formDatas['proxiable'] = $result->proxiable ? "on" : "off"; + $formDatas['proxied'] = $result->proxied ? "on" : "off"; + $formDatas['locked'] = "on"; if (isset($result->locked) && $result->locked) { $formDatas['locked'] = "off"; } - // $formDatas['updated_at'] = $cfResult->modified_on; + $formDatas['updated_at'] = date("Y-m-d H:i:s"); $formDatas['created_at'] = $result->created_on; return $formDatas; } - public function create(string $host, array $formDatas): RecordEntity + public function create(string $host, array $formDatas): mixed { //Socket용 //도메인생성을 위해 Cloudflare에 전송 - $cf = $this->getRequest()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [ + $cf = $this->request()->post('zones/' . $this->_zone_entity->getPK() . '/dns_records', [ 'name' => $host, 'type' => $formDatas['type'], 'content' => $formDatas['content'], @@ -59,11 +52,7 @@ class Record extends MyCloudflare if (!$cf->success) { throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); } - //Storage용 - $formDatas = $this->getArrayByResult($cf->result); - $entity = $this->$this->getMyStorage()->create($formDatas); - log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); - return $entity; + return $cf->result; } public function modify(RecordEntity $entity, array $formDatas): RecordEntity { @@ -83,7 +72,7 @@ class Record extends MyCloudflare $datas['proxied'] = false; $datas['ttl'] = 120; } - $cf = $this->getRequest()->put('zones/' . $this->_zone_entity->getPK() . '/dns_records', $datas); + $cf = $this->request()->put('zones/' . $this->_zone_entity->getPK() . '/dns_records', $datas); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); @@ -93,7 +82,7 @@ class Record extends MyCloudflare } public function delete(RecordEntity $entity): void { - $cf = $this->getRequest()->delete('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK()); + $cf = $this->request()->delete('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK()); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception("Record:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); @@ -102,24 +91,29 @@ class Record extends MyCloudflare } public function sync(RecordEntity $entity): RecordEntity { - $cf = $this->getRequest()->get('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK()); + $cf = $this->request()->get('zones/' . $this->_zone_entity->getPK() . '/dns_records/' . $entity->getPK()); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); } log_message("notice", "Record:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); - $formDatas = $this->getArrayByResult($cf->result); - return $this->$this->getMyStorage()->create($formDatas); + return new RecordEntity($this->getArrayByResult($cf->result)); } - protected function reload_entity($cf): RecordEntity + //Reload + public function reload(RecordModel $model): void { - return $this->getMyStorage()->modify(new RecordEntity, $this->getArrayByResult($cf)); - } - public function reload(): void - { - $cfs = $this->reload_cfs($this->getRequest(), 'zones/' . $this->_zone_entity->getPK() . '/dns_records'); - log_message("notice", "-----{$this->_zone_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----"); - $entitys = $this->reload_entitys($this->_zone_entity->getPK(), $cfs); - log_message("notice", "-----{$this->_zone_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----"); + log_message("notice", "-----{$this->_zone_entity->getTitle()} 처리 시작-----"); + $entity_uids = []; + $results = $this->reload_procedure("zones/{$this->_zone_entity->getPK()}/dns_records"); + foreach ($results as $result) { + $formDatas = $this->getArrayByResult($result); + $entity = $model->modify($model->getEntity(), $formDatas); + $entity_uids[] = $entity->getPK(); + } + //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 + $model->where($model::PARENT, $this->_zone_entity); + $model->whereNotIn($model::PK, $entity_uids); + $model->delete(); + log_message("notice", "-----{$this->_zone_entity->getTitle()} 처리[" . count($results) . "개] 완료-----"); } } diff --git a/app/Libraries/MyCloudflare/Zone.php b/app/Libraries/MySocket/Cloudflare/ZoneSocket.php similarity index 61% rename from app/Libraries/MyCloudflare/Zone.php rename to app/Libraries/MySocket/Cloudflare/ZoneSocket.php index 9f1021e..d12c9ac 100644 --- a/app/Libraries/MyCloudflare/Zone.php +++ b/app/Libraries/MySocket/Cloudflare/ZoneSocket.php @@ -1,40 +1,28 @@ _account_entity->getPK()); + parent::__construct(); $this->_account_entity = $account_entity; + $this->setAdapter($account_entity->getID(), $account_entity->getAuthKey()); } - final protected function getMyStorage(): ZoneModel + public function getArrayByResult($result, array $formDatas = []): array { - if ($this->_myStorage === null) { - $this->_myStorage = new ZoneModel(); - } - return $this->_myStorage; - } - final protected function getRequest(): Guzzle - { - return $this->getMySocket()->request($this->_account_uid); - } - protected function getArrayByResult($result, array $formDatas = []): array - { - $formDatas[$this->getMyStorage()->getPKField()] = $result->id; - $formDatas[$this->getMyStorage()::PARENT] = $result->account->id; - $formDatas[$this->getMyStorage()->getTitleField()] = $result->name; - $formDatas['status'] = $result->status; + $formDatas[ZoneModel::PK] = $result->id; + $formDatas[ZoneModel::PARENT] = $result->account->id; + $formDatas[ZoneModel::TITLE] = $result->name; + $formDatas['status'] = $result->status; //$formDatas['type'] = $result->type; // full 이게있는데 뭔지 잘모름 $formDatas['name_servers'] = 'none'; if (isset($result->name_servers)) { @@ -52,7 +40,8 @@ class Zone extends MyCloudflare $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['created_at'] = $result->created_on; $formDatas['plan'] = $result->plan->name; return $formDatas; @@ -60,7 +49,7 @@ class Zone extends MyCloudflare //Cfzone에서 가져온 값을 zone에 setting final public function getCFSetting(ZoneEntity $entity): ZoneEntity { - $cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/'); + $cf = $this->request()->patch('zones/' . $entity->getPK() . '/settings/'); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); @@ -80,9 +69,9 @@ class Zone extends MyCloudflare } return $entity; } - final public function setCFSetting(ZoneEntity $entity, string $field, string $value): ZoneEntity + public function setCFSetting(ZoneEntity $entity, string $field, string $value): ZoneEntity { - $cf = $this->getRequest()->patch('zones/' . $entity->getPK() . '/settings/' . $field, array('value' => $value)); + $cf = $this->request()->patch('zones/' . $entity->getPK() . '/settings/' . $field, array('value' => $value)); $cf = json_decode($cf->getBody()); if (!$cf->success || $cf->result->id !== $field) { throw new \Exception("Zone:" . __FUNCTION__ . "에서 {$field}->{$value} 변경실패:\n" . var_export($cf, true)); @@ -91,11 +80,11 @@ class Zone extends MyCloudflare $entity->$field = $cf->result->value; return $entity; } - public function create(string $domain, bool $jump_start = false): ZoneEntity + public function create(string $domain, bool $jump_start = false): mixed { //Socket용 //도메인생성을 위해 Cloudflare에 전송 - $cf = $this->getRequest()->post('zones/', [ + $cf = $this->request()->post('zones/', [ 'accountId' => $this->_account_entity->getPK(), 'name' => $domain, 'jump_start' => $jump_start, @@ -104,15 +93,7 @@ class Zone extends MyCloudflare if (!$cf->success) { throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); } - //Storage용 - $formDatas = $this->getArrayByResult($cf->result); - $entity = $this->$this->getMyStorage()->create($formDatas); - //아래는 추가 셋팅 ipv6 TurnOFF , //Development mode TurnOFF - $entity = $this->setCFSetting($entity, 'ipv6', 'off'); - $entity = $this->setCFSetting($entity, 'development_mode', 'off'); - $entity = $this->setCFSetting($entity, 'security_level', 'medium'); - log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); - return $entity; + return $cf->result; } public function modify(ZoneEntity $entity, array $formDatas): ZoneEntity { @@ -125,7 +106,7 @@ class Zone extends MyCloudflare } public function delete(ZoneEntity $entity): void { - $cf = $this->getRequest()->delete('zones/' . $entity->getPK()); + $cf = $this->request()->delete('zones/' . $entity->getPK()); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); @@ -134,24 +115,29 @@ class Zone extends MyCloudflare } public function sync(ZoneEntity $entity): ZoneEntity { - $cf = $this->getRequest()->get('zones/' . $entity->getPK()); + $cf = $this->request()->get('zones/' . $entity->getPK()); $cf = json_decode($cf->getBody()); if (!$cf->success) { throw new \Exception("Zone:" . __FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); } log_message("notice", "Zone:" . __FUNCTION__ . "=> 작업을 완료하였습니다."); - $formDatas = $this->getArrayByResult($cf->result); - return $this->$this->getMyStorage()->create($formDatas); + return new ZoneEntity($this->getArrayByResult($cf->result)); } - protected function reload_entity($cf): ZoneEntity + //Reload + public function reload(ZoneModel $model): void { - return $this->getMyStorage()->modify(new ZoneEntity, $this->getArrayByResult($cf)); - } - public function reload(): void - { - $cfs = $this->reload_cfs($this->getRequest(), 'zones'); - log_message("notice", "-----{$this->_account_entity->getTitle()} 처리[" . count($cfs) . "개] 시작-----"); - $entitys = $this->reload_entitys($this->_account_entity->getPK(), $cfs); - log_message("notice", "-----{$this->_account_entity->getTitle()} DB 처리[" . count($entitys) . "개] 완료-----"); + log_message("notice", "-----{$this->_account_entity->getTitle()} 처리 시작-----"); + $entity_uids = []; + $results = $this->reload_procedure('zones'); + foreach ($results as $result) { + $formDatas = $this->getArrayByResult($result); + $entity = $model->modify($model->getEntity(), $formDatas); + $entity_uids[] = $entity->getPK(); + } + //부모키를 기준으로 CF에 존재하지 않는 데이터 삭제용 + $model->where($model::PARENT, $this->_account_entity); + $model->whereNotIn($model::PK, $entity_uids); + $model->delete(); + log_message("notice", "-----{$this->_account_entity->getTitle()} 처리[" . count($results) . "개] 완료-----"); } } diff --git a/app/Libraries/MySocket/CloudflareSocket.php b/app/Libraries/MySocket/CloudflareSocket.php index 066577a..d592464 100644 --- a/app/Libraries/MySocket/CloudflareSocket.php +++ b/app/Libraries/MySocket/CloudflareSocket.php @@ -5,41 +5,28 @@ namespace App\Libraries\MySocket; use Cloudflare\API\Auth\APIKey; use Cloudflare\API\Adapter\Guzzle; -use App\Models\Cloudflare\AccountModel; use App\Libraries\CommonLibrary; -class CloudflareSocket extends CommonLibrary +abstract class CloudflareSocket extends CommonLibrary { private static int $_request = 0; private static int $_request_max = 100; private static int $_request_timewait = 60; - private $_accountModel = null; - private $_clients = []; - public function __construct() + private $_adapter = null; + protected function __construct() { parent::__construct(); - $this->initAdapters(); self::$_request_max = getenv("cfmgr.request.max"); } - private function getAccountModel(): AccountModel + abstract public function getArrayByResult($result, array $formDatas = []): array; + final protected function setAdapter(string $email, string $auth_key): void { - if ($this->_accountModel === null) { - $this->_accountModel = new AccountModel(); - } - return $this->_accountModel; + $this->_adapter = new Guzzle(new APIKey($email, $auth_key)); } - private function initAdapters(): void + final public function request(): Guzzle { - foreach ($this->getAccountModel()->getEntitys() as $entity) { - $this->_clients[$entity->getPK()] = new Guzzle( - new APIKey($entity->getTitle(), $entity->getAuthKey()) - ); - } - } - final public function request(string $key): Guzzle - { - if (!array_key_exists($key, $this->_clients)) { - throw new \Exception(+__FUNCTION__ . " => {$key}에 해당하는 Adapter를 찾을수 없습니다."); + if ($this->_adapter === null) { + throw new \Exception(+__FUNCTION__ . " => Adapter를 정의하지 않았습니다."); } if (self::$_request >= self::$_request_max) { log_message('warning', sprintf("--Cloudflare API Call %s초 대기 시작--", self::$_request_timewait)); @@ -48,6 +35,28 @@ class CloudflareSocket extends CommonLibrary log_message('warning', sprintf("--Cloudflare API Call %s초 대기 종료--", self::$_request_timewait)); } self::$_request++; - return $this->_clients[$key]; + return $this->_adapter; + } + final protected function reload_procedure($uri): array + { + $page = 1; //Page는 1부터 시작해야함 + $perpage_max = getenv("cfmgr.request.perpage.max"); + $results = []; + do { + $query = [ + 'page' => $page, + 'per_page' => $perpage_max, + 'match' => 'all', + ]; + $cf = $this->request()->get($uri, $query); + $cf = json_decode($cf->getBody()); + if (!$cf->success) { + throw new \Exception(__FUNCTION__ . "에서 실패:\n" . var_export($cf, true)); + } + $results[] = $cf->result; + //Loop 제한 : 한페이지에서 가져온 갯수가 perpage_max보다 적다는것은 더이상 다음페이지기 없으므로 0로 종료시키기 위함 + $page = count($cf->result) < $perpage_max ? 0 : $page + 1; + } while (0 < $page); + return $results; } } diff --git a/app/Models/Cloudflare/AccountModel.php b/app/Models/Cloudflare/AccountModel.php index 0f6a84b..913bca7 100644 --- a/app/Models/Cloudflare/AccountModel.php +++ b/app/Models/Cloudflare/AccountModel.php @@ -24,7 +24,7 @@ class AccountModel extends CommonModel { return self::TITLE; } - public function getFieldRule(string $field, array $rules): array + public function getFieldRule(string $action, string $field, array $rules): array { switch ($field) { case self::TITLE: @@ -44,7 +44,7 @@ class AccountModel extends CommonModel $rules[$field] = "if_exist|in_list[standard,enterprise]"; break; default: - $rules = parent::getFieldRule($field, $rules); + $rules = parent::getFieldRule($action, $field, $rules); break; } return $rules; diff --git a/app/Models/Cloudflare/RecordModel.php b/app/Models/Cloudflare/RecordModel.php index 156d9e9..16eaab3 100644 --- a/app/Models/Cloudflare/RecordModel.php +++ b/app/Models/Cloudflare/RecordModel.php @@ -27,11 +27,11 @@ class RecordModel extends CommonModel { return self::TITLE; } - public function getFieldRule(string $field, array $rules): array + public function getFieldRule(string $action, string $field, array $rules): array { switch ($field) { case self::PARENT: - $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]";; + $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; break; case self::TITLE: case "content": @@ -50,7 +50,7 @@ class RecordModel extends CommonModel $rules[$field] = "if_exist|in_list[on,off]"; break; default: - $rules = parent::getFieldRule($field, $rules); + $rules = parent::getFieldRule($action, $field, $rules); break; } return $rules; diff --git a/app/Models/Cloudflare/ZoneModel.php b/app/Models/Cloudflare/ZoneModel.php index b6f2e21..e82cc97 100644 --- a/app/Models/Cloudflare/ZoneModel.php +++ b/app/Models/Cloudflare/ZoneModel.php @@ -26,12 +26,11 @@ class ZoneModel extends CommonModel { return self::TITLE; } - public function getFieldRule(string $field, array $rules): array + public function getFieldRule(string $action, string $field, array $rules): array { switch ($field) { case self::PARENT: $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; - ; break; case self::TITLE: case "plan": @@ -46,7 +45,7 @@ class ZoneModel extends CommonModel $rules[$field] = "if_exist|in_list[on,off]"; break; default: - $rules = parent::getFieldRule($field, $rules); + $rules = parent::getFieldRule($action, $field, $rules); break; } return $rules; diff --git a/app/Models/CommonModel.php b/app/Models/CommonModel.php index 09aedc3..07c0c1f 100644 --- a/app/Models/CommonModel.php +++ b/app/Models/CommonModel.php @@ -45,7 +45,6 @@ abstract class CommonModel extends Model protected $beforeDelete = []; protected $afterDelete = []; - private $_action = 'create'; protected function __construct() { parent::__construct(); @@ -55,19 +54,11 @@ abstract class CommonModel extends Model { return $this->primaryKey; } - final public function getAction(): string - { - return $this->_action; - } - final public function setAction(string $action): string - { - return $this->_action = $action; - } // final public function getFields(array $except_fields = []): array // { // return array_diff($this->allowedFields, $except_fields); //제외한 fields // } - public function getFieldRule(string $field, array $rules): array + public function getFieldRule(string $action, string $field, array $rules): array { if (is_array($field)) { throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true)); @@ -77,19 +68,20 @@ abstract class CommonModel extends Model //수동입력인경우 if (!$this->useAutoIncrement) { $rules[$field] = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; - $rules[$field] .= $this->getAction() == "create" ? "|is_unique[{$this->table}.{$field}]" : ""; + $rules[$field] .= $action == "create" ? "|is_unique[{$this->table}.{$field}]" : ""; } else { $rules[$field] = "required|numeric"; - }; + } + ; break; case $this->getTitleField(): $rules[$field] = "required|string"; break; case "passwd": - $rules[$field] = $this->getAction() == "create" ? "required" : "if_exist" . "|trim|string"; + $rules[$field] = $action == "create" ? "required" : "if_exist" . "|trim|string"; break; case "confirmpassword": - $rules["confirmpassword"] = $this->getAction() == "create" ? "required" : "if_exist" . "|trim|string|matches[passwd]"; + $rules["confirmpassword"] = $action == "create" ? "required" : "if_exist" . "|trim|string|matches[passwd]"; break; case "email": $rules[$field] = "if_exist|trim|valid_email"; @@ -111,13 +103,13 @@ abstract class CommonModel extends Model } return $rules; } - final public function getFieldRules(array $fields, array $rules = []): array + final public function getFieldRules(string $action, array $fields, array $rules = []): array { foreach ($fields as $field) { if (is_array($field)) { throw new \Exception(__FUNCTION__ . "에서 field array 입니다.\n" . var_export($field, true)); } - $rules = $this->getFieldRule($field, $rules); + $rules = $this->getFieldRule($action, $field, $rules); } return $rules; } @@ -194,8 +186,7 @@ abstract class CommonModel extends Model final protected function create_process($entity, array $formDatas): mixed { //Field에 맞는 Validation Rule 재정의 - $this->setAction('create'); - $this->setValidationRules($this->getFieldRules($this->allowedFields)); + $this->setValidationRules($this->getFieldRules('create', $this->allowedFields)); //저장하기 전에 데이터 값 변경이 필요한 Field foreach (array_keys($formDatas) as $field) { $entity->$field = $this->convertEntityData($field, $formDatas); @@ -212,8 +203,7 @@ abstract class CommonModel extends Model final protected function modify_process($entity, array $formDatas): mixed { //Field에 맞는 Validation Rule 재정의 - $this->setAction('modify'); - $this->setValidationRules($this->getFieldRules($this->allowedFields)); + $this->setValidationRules($this->getFieldRules('modify', $this->allowedFields)); //저장하기 전에 데이터 값 변경이 필요한 Field foreach (array_keys($formDatas) as $field) { $entity->$field = $this->convertEntityData($field, $formDatas); diff --git a/app/Views/admin/cloudflare/account/index.php b/app/Views/admin/cloudflare/account/index.php index e4c4918..5b0185b 100644 --- a/app/Views/admin/cloudflare/account/index.php +++ b/app/Views/admin/cloudflare/account/index.php @@ -73,7 +73,7 @@
endSection() ?> \ No newline at end of file diff --git a/app/Views/admin/cloudflare/zone/create.php b/app/Views/admin/cloudflare/zone/create.php index 387d088..4dcc998 100644 --- a/app/Views/admin/cloudflare/zone/create.php +++ b/app/Views/admin/cloudflare/zone/create.php @@ -1,19 +1,44 @@ - - - - - - - - + +
- - -
- + + + + + + - -
- "btn btn-outline btn-primary")); ?> - 계정정보TypeIP/내용도메인명CDN기능호스트명
\ No newline at end of file + + + account_uid) ?: old('account_uid'), $viewDatas) ?> + + + + "Type 선택"], lang('Admin/Cloudflare/Record.TYPE')), old('type')) ?> + + + + 30]) ?> + + + + 30, "rows" => 5]) ?> + + + + "CDN기능 선택", "on" => "사용", "off" => "사용 않함"], old('proxied')) ?> + + + + +
+ "hosts[]", "value" => $host, "checked" => "checked"]); ?> +
+ + + + + + +getFlashdata('error')): ?> getFlashdata('error') ?> \ No newline at end of file diff --git a/app/Views/admin/cloudflare/zone/index.php b/app/Views/admin/cloudflare/zone/index.php index 88e95e1..c91199c 100644 --- a/app/Views/admin/cloudflare/zone/index.php +++ b/app/Views/admin/cloudflare/zone/index.php @@ -69,15 +69,7 @@
-
-
+
+ include('admin/cloudflare/zone/create'); ?>
- endSection() ?> \ No newline at end of file diff --git a/app/Views/layouts/admin/left_menu.php b/app/Views/layouts/admin/left_menu.php index 0d49f80..4b44a24 100644 --- a/app/Views/layouts/admin/left_menu.php +++ b/app/Views/layouts/admin/left_menu.php @@ -7,8 +7,7 @@

Main

include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu/base'); ?> - include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu/site'); ?> - include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu/shoppingmall'); ?> + include(LAYOUTS[$viewDatas['layout']]['path'] . '/left_menu/cloudflare'); ?> \ No newline at end of file diff --git a/app/Views/layouts/admin/left_menu/base.php b/app/Views/layouts/admin/left_menu/base.php index 00929c2..707ce75 100644 --- a/app/Views/layouts/admin/left_menu/base.php +++ b/app/Views/layouts/admin/left_menu/base.php @@ -1,9 +1,9 @@
-

계정 관리

+

계정 관리

-

SNS 계정 관리

+

SNS 계정 관리

-

분류 관리

+

MapURL 관리

\ No newline at end of file diff --git a/app/Views/layouts/admin/left_menu/cloudflare.php b/app/Views/layouts/admin/left_menu/cloudflare.php new file mode 100644 index 0000000..d8f5663 --- /dev/null +++ b/app/Views/layouts/admin/left_menu/cloudflare.php @@ -0,0 +1,16 @@ +

+ +

+
+
+

Account

+
+
+

Zone

+
+
+

Record

+
+
\ No newline at end of file diff --git a/app/Views/layouts/admin/left_menu/shoppingmall.php b/app/Views/layouts/admin/left_menu/shoppingmall.php deleted file mode 100644 index 21bb42d..0000000 --- a/app/Views/layouts/admin/left_menu/shoppingmall.php +++ /dev/null @@ -1,20 +0,0 @@ -

- -

-
-
-

장비 관리

-
-
-

상품 관리

-
-
-

주문 관리

-
-
-

청구서 관리

-
-
\ No newline at end of file diff --git a/public/css/admin.css b/public/css/admin.css index f2bdf4b..04de7b7 100644 --- a/public/css/admin.css +++ b/public/css/admin.css @@ -31,8 +31,11 @@ div.layout > nav.tail { padding: 10px; } +div.layout > div.center > div.left_menu { + /* border-color: 1px solid red; */ +} div.layout > div.center > div.content { - margin: 25px 0px 25px 25px; + margin: 15px 15px 15px 25px; } div.layout > div.center > div.content > div.header { /*content 헤더라인*/ diff --git a/public/css/admin/content.css b/public/css/admin/content.css index b20c549..8e05e93 100644 --- a/public/css/admin/content.css +++ b/public/css/admin/content.css @@ -14,7 +14,6 @@ table.form tbody tr td.column { /*조건검색*/ nav.index_top nav.condition { - max-width: 400px; border-color: 1px solid red; } /*검색*/ @@ -100,7 +99,7 @@ div.index_pagination nav ul.pagination li a:hover { border: 1px solid black; } div.index_form { - margin-top:30px; + margin-top: 30px; text-align: center; /* border: 1px solid red; */ }