cfmgrv4 init...10

This commit is contained in:
최준흠 2025-03-12 12:51:37 +09:00
parent 2cbd5a5161
commit 7f4741ea36
51 changed files with 1215 additions and 857 deletions

View File

@ -101,6 +101,29 @@ define('DEFAULTS', [
'DELIMITER_FILE' => "||",
'DELIMITER_ROLE' => ",",
]);
define('MESSAGES', [
'CREATED' => '생성되었습니다.',
'UPDATED' => '수정되였습니다.',
'DELETED' => '삭제되였습니다.',
'SUCCESS' => '작업이 성공적으로 완료되었습니다.',
'FAILED' => '작업이 실패하였습니다.',
'NOT_FOUND' => '데이터가 존재하지 않습니다.',
'NOT_AUTH' => '권한이 없습니다.',
'NOT_LOGIN' => '로그인이 필요합니다.',
'NOT_MATCH' => '데이터가 일치하지 않습니다.',
'NOT_EMPTY' => '데이터가 비어있습니다.',
'NOT_UNIQUE' => '중복된 데이터가 존재합니다.',
'NOT_DELETE' => '삭제할 수 없는 데이터가 존재합니다.',
'NOT_UPDATE' => '수정할 수 없는 데이터가 존재합니다.',
'NOT_CREATE' => '생성할 수 없는 데이터가 존재합니다.',
'NOT_SYNC' => '동기화할 수 없는 데이터가 존재합니다.',
'NOT_SYNC_RESULT' => '동기화 결과가 실패하였습니다.',
'NOT_SYNC_SUCCESS' => '동기화 결과가 성공하였습니다.',
'NOT_SYNC_ERROR' => '동기화 결과가 실패하였습니다.',
'NOT_SYNC_NOTHING' => '동기화할 데이터가 없습니다.',
'NOT_SYNC_NOTHING_RESULT' => '동기화 결과가 없습니다.',
'NOT_SYNC_NOTHING_ERROR' => '동기화 결과가 없습니다.',
]);
//URL
define('URLS', [
'LOGIN' => '/user/login',

View File

@ -74,6 +74,10 @@ $routes->group('admin', ['namespace' => 'App\Controllers\Admin', 'filter' => 'au
$routes->post('batchjob_delete', 'MapurlController::batchjob_delete');
$routes->get('download/(:alpha)', 'MapurlController::download/$1');
});
$routes->group('mylog', ['namespace' => 'App\Controllers\Admin'], function ($routes) {
$routes->get('/', 'MyLogController::index');
$routes->get('view/(:num)', 'MyLogController::view/$1');
});
$routes->group('cloudflare', ['namespace' => 'App\Controllers\Admin\Cloudflare', 'filter' => 'authFilter:cloudflare'], function ($routes) {
$routes->group('auth', ['namespace' => 'App\Controllers\Admin\Cloudflare'], function ($routes) {
$routes->get('/', 'AuthController::index');

View File

@ -2,12 +2,12 @@
namespace App\Controllers\Admin;
use App\Controllers\MVController;
use App\Controllers\CommonController;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
abstract class AdminController extends MVController
abstract class AdminController extends CommonController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{

View File

@ -3,7 +3,6 @@
namespace App\Controllers\Admin\Cloudflare;
use App\Helpers\Cloudflare\AccountHelper;
use App\Models\Cloudflare\AccountModel;
use App\Services\Cloudflare\AccountService;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\RedirectResponse;
@ -13,20 +12,12 @@ use Psr\Log\LoggerInterface;
class AccountController extends CloudflareController
{
private $_auth_entity = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new AccountHelper();
}
protected function getModel(): AccountModel
{
if ($this->_model === null) {
$this->_model = new AccountModel();
}
return $this->_model;
}
protected function getService(): AccountService
{
if ($this->service === null) {
@ -37,7 +28,7 @@ class AccountController extends CloudflareController
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case $this->getModel()::PARENT:
case $this->getService()->getModel()::PARENT:
// $this->getAuthModel()->where('status', DEFAULTS['STATUS']);
$options[$field] = $this->getAuthModel()->getFormFieldOption($field);
// echo $this->getAuthModel()->getLastQuery();
@ -49,15 +40,6 @@ class AccountController extends CloudflareController
}
return $options;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::PARENT, $this->getModel()::TITLE, 'type', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'type', 'status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = [];
}
//View
public function view(string $uid): RedirectResponse|string
{

View File

@ -17,16 +17,9 @@ class AuditLogController extends CloudflareController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new AuditLogHelper();
}
protected function getModel(): AuditLogModel
{
if ($this->_model === null) {
$this->_model = new AuditLogModel();
}
return $this->_model;
}
protected function getService(): AuditLogService
{
if ($this->service === null) {
@ -34,26 +27,17 @@ class AuditLogController extends CloudflareController
}
return $this->service;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : ['zone_name', $this->getModel()::TITLE, 'action_info', 'actor', 'interface', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = [];
}
//View
public function view(string $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, ['zone_name', $this->getModel()::TITLE, 'actor', 'action_info', 'interface', 'meta', 'resource', 'status', 'updated_at', 'created_at']);
$this->init(__FUNCTION__, ['zone_name', $this->getService()->getModel()::TITLE, 'actor', 'action_info', 'interface', 'meta', 'resource', 'status', 'updated_at', 'created_at']);
return $this->view_procedure($uid);
}
// 리스트
protected function list_entitys_process(): array
{
//기본Soring처리
$this->getModel()->orderBy("created_at DESC,zone_name ASC");
$this->getService()->getModel()->orderBy("created_at DESC,zone_name ASC");
return parent::list_entitys_process();
}
public function index(): string

View File

@ -3,7 +3,6 @@
namespace App\Controllers\Admin\Cloudflare;
use App\Helpers\Cloudflare\AuthHelper;
use App\Models\Cloudflare\AuthModel;
use App\Services\Cloudflare\AuthService;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\RedirectResponse;
@ -16,16 +15,9 @@ class AuthController extends CloudflareController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new AuthHelper();
}
protected function getModel(): AuthModel
{
if ($this->_model === null) {
$this->_model = new AuthModel();
}
return $this->_model;
}
protected function getService(): AuthService
{
if ($this->service === null) {
@ -33,35 +25,26 @@ class AuthController extends CloudflareController
}
return $this->service;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::TITLE, 'authkey', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = ['status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['status'];
}
//생성
public function create_form(): RedirectResponse|string
{
$this->init('create', [$this->getModel()::TITLE, 'authkey', 'status']);
$this->init('create', [$this->getService()->getModel()::TITLE, 'authkey', 'status']);
return $this->create_form_procedure();
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::TITLE, 'authkey', 'status']);
$this->init(__FUNCTION__, [$this->getService()->getModel()::TITLE, 'authkey', 'status']);
return $this->create_procedure();
}
//수정
public function modify_form(int $uid): RedirectResponse|string
{
$this->init('modify', [$this->getModel()::TITLE, 'authkey', 'status']);
$this->init('modify', [$this->getService()->getModel()::TITLE, 'authkey', 'status']);
return $this->modify_form_procedure($uid);
}
public function modify(int $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::TITLE, 'authkey', 'status']);
$this->init(__FUNCTION__, [$this->getService()->getModel()::TITLE, 'authkey', 'status']);
return $this->modify_procedure($uid);
}
//단일필드작업

View File

@ -11,6 +11,7 @@ use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Services\MyLogService;
abstract class CloudflareController extends AdminController
{
@ -18,6 +19,7 @@ abstract class CloudflareController extends AdminController
private $_accountModel = null;
private $_zoneModel = null;
private $_recordModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
@ -53,42 +55,56 @@ abstract class CloudflareController extends AdminController
return $this->_recordModel;
}
protected function sync_process(string $uid): void {}
protected function sync_process_result($message): RedirectResponse|string
{
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $message);
}
final protected function sync_procedure(string $uid): RedirectResponse
{
//Transaction Start
$this->getModel()->transStart();
$this->getService()->getModel()->transStart();
try {
$this->sync_process($uid);
$this->message = "{$this->getService()->class_name}: 동기화작업을 완료하였습니다.";
$this->getModel()->transCommit();
log_message("notice", __FUNCTION__ . $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
$this->getService()->getModel()->transCommit();
return $this->sync_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
protected function reload_process(mixed $uid): void {}
protected function reload_process_result($message): RedirectResponse|string
{
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $message);
}
final protected function reload_procedure(mixed $uid): RedirectResponse
{
//Transaction Start
$this->getModel()->transStart();
$this->getService()->getModel()->transStart();
try {
$this->reload_process($uid);
$this->message = "{$this->getService()->class_name}: Reload 작업이 완료되었습니다.";
$this->getModel()->transCommit();
log_message("notice", __FUNCTION__ . $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
$this->getService()->getModel()->transCommit();
return $this->reload_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
}

View File

@ -7,7 +7,6 @@ use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\Cloudflare\FirewallModel;
use App\Services\Cloudflare\FirewallService;
use App\Helpers\Cloudflare\FirewallHelper;
use App\Models\Cloudflare\ZoneModel;
@ -18,15 +17,9 @@ class FirewallController extends CloudflareController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new FirewallHelper();
}
final protected function getModel(): FirewallModel
{
if ($this->model === null) {
$this->model = new FirewallModel();
}
return $this->model;
$this->isMyLog = env("mylog.cloudflare.firewall.use") == "true"; //MyLogService 사용여부
}
protected function getService(): FirewallService
{
@ -38,7 +31,7 @@ class FirewallController extends CloudflareController
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case $this->getModel()::PARENT:
case $this->getService()->getModel()::PARENT:
// $this->getZoneModel()->where('status', 'active');
$options[$field] = $this->getZoneModel()->getFormFieldOption($field);
// echo $this->getAccountModel()->getLastQuery();
@ -50,23 +43,13 @@ class FirewallController extends CloudflareController
}
return $options;
}
//전송된 데이터
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::PARENT, 'mode', 'description', 'expression', 'enabled', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'mode', 'enabled'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = [];
}
//수정 (modify,toggle,batchjob사용)
protected function modify_process(mixed $uid): void
{
//DB작업도 Socket에서 다 처리하므로 parent::modify_process($uid)하면 않됨
$this->formDatas = $this->modify_validate($this->action, $this->fields);
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
@ -91,29 +74,29 @@ class FirewallController extends CloudflareController
{
$this->list_condition_process();
//기본Soring처리
$this->getModel()->orderBy(ZoneModel::TABLE . "." . ZoneModel::TITLE . " ASC ," . $this->getModel()::TITLE . " ASC");
$this->getService()->getModel()->orderBy(ZoneModel::TABLE . "." . ZoneModel::TITLE . " ASC ," . $this->getService()->getModel()::TITLE . " ASC");
//Sorting 처리
$this->order_field = $this->request->getVar('order_field') ?: DEFAULTS['EMPTY'];
$this->order_value = $this->request->getVar('order_value') ?: DEFAULTS['EMPTY'];
if ($this->order_field !== DEFAULTS['EMPTY'] && $this->order_value !== DEFAULTS['EMPTY']) {
$this->getModel()->orderBy(sprintf(
$this->getService()->getModel()->orderBy(sprintf(
"%s.%s %s",
$this->getModel()::TABLE,
$this->getService()->getModel()::TABLE,
$this->order_field,
$this->order_value
));
}
$this->getModel()->limit($this->per_page, $this->page * $this->per_page - $this->per_page);
$this->getService()->getModel()->limit($this->per_page, $this->page * $this->per_page - $this->per_page);
//Join을 해서 도메인부터 Sorting하기위함
$this->getModel()->join(ZoneModel::TABLE, sprintf(
$this->getService()->getModel()->join(ZoneModel::TABLE, sprintf(
"%s.%s=%s.%s",
$this->getModel()::TABLE,
$this->getModel()::PARENT,
$this->getService()->getModel()::TABLE,
$this->getService()->getModel()::PARENT,
ZoneModel::TABLE,
ZoneModel::PK
));
$entitys = $this->getModel()->select($this->getModel()::TABLE . '.*')->findAll();
log_message("debug", $this->getModel()->getLastQuery());
$entitys = $this->getService()->getModel()->select($this->getService()->getModel()::TABLE . '.*')->findAll();
log_message("debug", $this->getService()->getModel()->getLastQuery());
return $entitys;
}
public function index(): string

View File

@ -8,7 +8,6 @@ use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Helpers\Cloudflare\RecordHelper;
use App\Models\Cloudflare\RecordModel;
use App\Services\Cloudflare\RecordService;
use App\Models\Cloudflare\ZoneModel;
@ -18,15 +17,9 @@ class RecordController extends CloudflareController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new RecordHelper();
}
final protected function getModel(): RecordModel
{
if ($this->model === null) {
$this->model = new RecordModel();
}
return $this->model;
$this->isMyLog = env("mylog.cloudflare.record.use") == "true"; //MyLogService 사용여부
}
protected function getService(): RecordService
{
@ -38,7 +31,7 @@ class RecordController extends CloudflareController
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case $this->getModel()::PARENT:
case $this->getService()->getModel()::PARENT:
// $this->getZoneModel()->where('status', 'active');
$options[$field] = $this->getZoneModel()->getFormFieldOption($field);
// echo $this->getAccountModel()->getLastQuery();
@ -50,22 +43,13 @@ class RecordController extends CloudflareController
}
return $options;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::PARENT, 'host', 'type', 'content', 'proxied', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied', 'fixed'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['type', 'content', 'proxied'];
}
//생성
public function create_form(): RedirectResponse|string
{
$this->init('create', [$this->getModel()::PARENT, 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->init('create', [$this->getService()->getModel()::PARENT, 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getService()->getModel()->getFieldRules($this->action, $this->fields);
//부모데이터 정의
$parent_field = $this->getModel()::PARENT;
$parent_field = $this->getService()->getModel()::PARENT;
$this->$parent_field = $this->request->getVar($parent_field) ?: DEFAULTS["EMPTY"];
return $this->create_form_procedure();
}
@ -93,9 +77,9 @@ class RecordController extends CloudflareController
}
//Socket처리
//부모데이터정의
$this->_zone_entity = $this->getZoneModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$this->_zone_entity = $this->getZoneModel()->getEntityByPK($this->formDatas[$this->getService()->getModel()::PARENT]);
if ($this->_zone_entity === null) {
throw new \Exception("Zone: [{$this->formDatas[$this->getModel()::PARENT]}] 정보를 찾을수 없습니다.");
throw new \Exception("Zone: [{$this->formDatas[$this->getService()->getModel()::PARENT]}] 정보를 찾을수 없습니다.");
}
$entitys = [];
foreach ($hosts as $host) {
@ -110,20 +94,20 @@ class RecordController extends CloudflareController
}
$this->entitys = $entitys;
}
protected function create_process_result(): RedirectResponse|string
protected function create_process_result($message): RedirectResponse|string
{
$this->init(__FUNCTION__);
helper(['form']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
strtolower($this->view_path . $this->class_path . "/create_result"),
strtolower($this->view_path . $this->getService()->getClassPath() . "/create_result"),
data: ['viewDatas' => $this->getViewDatas()]
);
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::PARENT, 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->init(__FUNCTION__, [$this->getService()->getModel()::PARENT, 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getService()->getModel()->getFieldRules($this->action, $this->fields);
return $this->create_procedure();
}
//수정 (modify,toggle,batchjob사용)
@ -132,7 +116,7 @@ class RecordController extends CloudflareController
//DB작업도 Socket에서 다 처리하므로 parent::modify_process($uid)하면 않됨
$this->formDatas = $this->modify_validate($this->action, $this->fields);
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
@ -167,7 +151,7 @@ class RecordController extends CloudflareController
{
//DB작업도 Socket에서 다 처리하므로 parent::delete_process($uid)하면 않됨
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
@ -183,12 +167,12 @@ class RecordController extends CloudflareController
protected function list_entitys_process(): array
{
//기본Soring처리
$this->getModel()->orderBy(ZoneModel::TABLE . "." . ZoneModel::TITLE . " ASC ," . $this->getModel()::TITLE . " ASC");
$this->getService()->getModel()->orderBy(ZoneModel::TABLE . "." . ZoneModel::TITLE . " ASC ," . $this->getService()->getModel()::TITLE . " ASC");
//Join을 해서 도메인부터 Sorting하기위함
$this->getModel()->join(ZoneModel::TABLE, sprintf(
$this->getService()->getModel()->join(ZoneModel::TABLE, sprintf(
"%s.%s=%s.%s",
$this->getModel()::TABLE,
$this->getModel()::PARENT,
$this->getService()->getModel()::TABLE,
$this->getService()->getModel()::PARENT,
ZoneModel::TABLE,
ZoneModel::PK
));
@ -209,7 +193,7 @@ class RecordController extends CloudflareController
protected function sync_process(string $uid): void
{
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}

View File

@ -4,7 +4,6 @@ namespace App\Controllers\Admin\Cloudflare;
use App\Helpers\Cloudflare\ZoneHelper;
use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\ZoneModel;
use App\Services\Cloudflare\RecordService;
use App\Services\Cloudflare\ZoneService;
use CodeIgniter\HTTP\DownloadResponse;
@ -19,15 +18,9 @@ class ZoneController extends CloudflareController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");;
$this->title = lang("{$this->getService()->getClassPath()}.title");;
$this->helper = new ZoneHelper();
}
protected function getModel(): ZoneModel
{
if ($this->_model === null) {
$this->_model = new ZoneModel();
}
return $this->_model;
$this->isMyLog = env("mylog.cloudflare.zone.use") == "true"; //MyLogService 사용여부
}
protected function getService(): ZoneService
{
@ -39,7 +32,7 @@ class ZoneController extends CloudflareController
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case $this->getModel()::PARENT:
case $this->getService()->getModel()::PARENT:
// $this->getAccountModel()->where('status', DEFAULTS['STATUS']);
$options[$field] = $this->getAccountModel()->getFormFieldOption($field);
// echo $this->getAccountModel()->getLastQuery();
@ -55,24 +48,15 @@ class ZoneController extends CloudflareController
}
return $options;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::PARENT, $this->getModel()::TITLE, 'name_servers', 'original_name_servers', 'plan', 'development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'plan', 'development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https'];
}
//생성
public function create_form(): RedirectResponse|string
{
$this->init('create', [$this->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied'];
$this->init('create', [$this->getService()->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getService()->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getService()->getModel()::PARENT, 'type', 'proxied'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
//부모데이터 정의
$parent_field = $this->getModel()::PARENT;
$parent_field = $this->getService()->getModel()::PARENT;
$this->$parent_field = $this->request->getVar($parent_field) ?: DEFAULTS["EMPTY"];
return $this->create_form_procedure();
}
@ -81,9 +65,9 @@ class ZoneController extends CloudflareController
//DB작업도 Socket에서 다 처리하므로 parent::create_process()하면 않됨
$this->formDatas = $this->create_validate($this->action, $this->fields);
//부모데이터 정의
$this->_account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getModel()::PARENT]);
$this->_account_entity = $this->getAccountModel()->getEntityByPK($this->formDatas[$this->getService()->getModel()::PARENT]);
if ($this->_account_entity === null) {
throw new \Exception("Account: [{$this->formDatas[$this->getModel()::PARENT]}] 정보를 찾을수 없습니다.");
throw new \Exception("Account: [{$this->formDatas[$this->getService()->getModel()::PARENT]}] 정보를 찾을수 없습니다.");
}
//데이터검증
@ -105,7 +89,7 @@ class ZoneController extends CloudflareController
throw new \Exception("{$cnt}번째 : [{$domain}]는 도메인명 형식에 맞지 않습니다.");
}
//도메인명이 해당계정의 유일한 도메인인지 확인
if (!$this->getModel()->isUniqueDomain($this->_account_entity, $domain)) {
if (!$this->getService()->getModel()->isUniqueDomain($this->_account_entity, $domain)) {
throw new \Exception("{$cnt}번째 : [{$domain}]는 이미 등록된 도메인입니다.");
}
$cnt++;
@ -146,21 +130,21 @@ class ZoneController extends CloudflareController
}
$this->entitys = $entitys;
}
protected function create_process_result(): RedirectResponse|string
protected function create_process_result($message): RedirectResponse|string
{
$this->init(__FUNCTION__);
helper(['form']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
strtolower($this->view_path . $this->class_path . "/create_result"),
strtolower($this->view_path . $this->getService()->getClassPath() . "/create_result"),
data: ['viewDatas' => $this->getViewDatas()]
);
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'type', 'proxied'];
$this->init(__FUNCTION__, [$this->getService()->getModel()::PARENT, 'domains', 'hosts', 'type', 'content', 'proxied']);
$this->field_rules = $this->getService()->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getService()->getModel()::PARENT, 'type', 'proxied'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
return $this->create_procedure();
}
@ -170,7 +154,7 @@ class ZoneController extends CloudflareController
//DB작업도 Socket에서 다 처리하므로 parent::modify_process($uid)하면 않됨
$this->formDatas = $this->modify_validate($this->action, $this->fields);
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
@ -205,7 +189,7 @@ class ZoneController extends CloudflareController
{
//DB작업도 Socket에서 다 처리하므로 parent::delete_process($uid)하면 않됨
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
@ -227,12 +211,12 @@ class ZoneController extends CloudflareController
protected function list_entitys_process(): array
{
//기본Soring처리
$this->getModel()->orderBy(orderBy: AccountModel::TABLE . "." . AccountModel::TITLE . " ASC ," . $this->getModel()::TITLE . " ASC");
$this->getService()->getModel()->orderBy(orderBy: AccountModel::TABLE . "." . AccountModel::TITLE . " ASC ," . $this->getService()->getModel()::TITLE . " ASC");
//Join을 해서 Account부터 Sorting하기위함
$this->getModel()->join(AccountModel::TABLE, sprintf(
$this->getService()->getModel()->join(AccountModel::TABLE, sprintf(
"%s.%s=%s.%s",
$this->getModel()::TABLE,
$this->getModel()::PARENT,
$this->getService()->getModel()::TABLE,
$this->getService()->getModel()::PARENT,
AccountModel::TABLE,
AccountModel::PK
));
@ -253,7 +237,7 @@ class ZoneController extends CloudflareController
protected function sync_process(mixed $uid): void
{
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}

View File

@ -2,13 +2,14 @@
namespace App\Controllers\Admin;
use App\Controllers\CommonController;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\HTTP\RequestInterface;
use App\Helpers\CommonHelper;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
class Home extends CommonController
use App\Helpers\CommonHelper;
use App\Services\UserService;
class Home extends AdminController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
@ -19,6 +20,13 @@ class Home extends CommonController
$this->title = "관리자페이지 메인";
$this->helper = new CommonHelper();
}
protected function getService(): UserService
{
if ($this->service === null) {
$this->service = new UserService();
}
return $this->service;
}
public function index(): string
{
helper(['form']);

View File

@ -3,7 +3,6 @@
namespace App\Controllers\Admin;
use App\Helpers\MapurlHelper;
use App\Models\MapurlModel;
use App\Services\MapurlService;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\RedirectResponse;
@ -16,17 +15,10 @@ class MapurlController extends AdminController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new MapurlHelper();
$this->isMyLog = env("mylog.mapurl.use") == "true"; //MyLogService 사용여부
}
protected function getModel(): MapurlModel
{
if ($this->_model === null) {
$this->_model = new MapurlModel();
}
return $this->_model;
}
protected function getService(): MapurlService
{
if ($this->service === null) {
@ -34,22 +26,13 @@ class MapurlController extends AdminController
}
return $this->service;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::TITLE, 'newurl', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = ['status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['status'];
}
private function remaping_process(): void
{
//모든 필요한 FormOption등 조기화작업 필요
$this->getModel()->where('status', DEFAULTS['STATUS']);
$this->getModel()->orderBy('oldurl', 'ASC');
$this->entitys = $this->getModel()->getEntitys();
$remap_page = view($this->view_path . DIRECTORY_SEPARATOR . strtolower($this->class_path) . DIRECTORY_SEPARATOR . 'remap_template', ["viewDatas" => $this->getViewDatas()]);
$this->getService()->getModel()->where('status', DEFAULTS['STATUS']);
$this->getService()->getModel()->orderBy('oldurl', 'ASC');
$this->entitys = $this->getService()->getModel()->getEntitys();
$remap_page = view($this->view_path . DIRECTORY_SEPARATOR . strtolower($this->getService()->getClassPath()) . DIRECTORY_SEPARATOR . 'remap_template', ["viewDatas" => $this->getViewDatas()]);
$remap_path = FCPATH . DIRECTORY_SEPARATOR . "mapurl";
//디렉토리 생성 여부 확인
if (!is_dir($remap_path)) {
@ -63,7 +46,7 @@ class MapurlController extends AdminController
//생성
public function create_form(): RedirectResponse|string
{
$this->init('create', [$this->getModel()::TITLE, 'newurl', 'status']);
$this->init('create', [$this->getService()->getModel()::TITLE, 'newurl', 'status']);
return $this->create_form_procedure();
}
protected function create_process(): void
@ -73,13 +56,13 @@ class MapurlController extends AdminController
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::TITLE, 'newurl', 'status']);
$this->init(__FUNCTION__, [$this->getService()->getModel()::TITLE, 'newurl', 'status']);
return $this->create_procedure();
}
//수정
public function modify_form(int $uid): RedirectResponse|string
{
$this->init('modify', [$this->getModel()::TITLE, 'newurl', 'status']);
$this->init('modify', [$this->getService()->getModel()::TITLE, 'newurl', 'status']);
return $this->modify_form_procedure($uid);
}
//(modify,toggle,batchjob사용)
@ -90,7 +73,7 @@ class MapurlController extends AdminController
}
public function modify(int $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::TITLE, 'newurl', 'status']);
$this->init(__FUNCTION__, [$this->getService()->getModel()::TITLE, 'newurl', 'status']);
return $this->modify_procedure($uid);
}
public function toggle(mixed $uid, string $field): RedirectResponse

View File

@ -0,0 +1,63 @@
<?php
namespace App\Controllers\Admin;
use App\Helpers\MyLogHelper;
use App\Services\MyLogService;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\UserModel;
class MyLogController extends AdminController
{
private $_userModel = null;
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("Mylog.title");
$this->helper = new MyLogHelper();
}
protected function getService(): MyLogService
{
if ($this->service === null) {
$this->service = new MyLogService();
}
return $this->service;
}
public function getUserModel(): UserModel
{
if ($this->_userModel === null) {
$this->_userModel = new UserModel();
}
return $this->_userModel;
}
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case 'user_uid':
// $this->getUserModel()->where('status', DEFAULTS['STATUS']);
$options[$field] = $this->getUserModel()->getFormFieldOption($field);
// echo $this->getUserModel()->getLastQuery();
// dd($options);
break;
default:
$options = parent::getFormFieldOption($field, $options);
break;
}
return $options;
}
//View
public function view(int $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, ['user_uid', 'class_name', 'method_name', $this->getService()->getModel()::TITLE, 'created_at', 'content']);
return $this->view_procedure($uid);
}
// 리스트
public function index(): string
{
$this->init(__FUNCTION__);
return $this->list_procedure();
}
}

View File

@ -3,7 +3,6 @@
namespace App\Controllers\Admin;
use App\Helpers\UserHelper;
use App\Models\UserModel;
use App\Services\UserService;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\RedirectResponse;
@ -18,16 +17,9 @@ class UserController extends AdminController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new UserHelper();
}
protected function getModel(): UserModel
{
if ($this->_model === null) {
$this->_model = new UserModel();
}
return $this->_model;
}
protected function getService(): UserService
{
if ($this->service === null) {
@ -40,7 +32,7 @@ class UserController extends AdminController
switch ($field) {
case 'role':
//아래 Rule Array는 필드명.* checkbox를 사용
$validation->setRule("{$field}.*", $field, $this->getModel()->getFieldRule($action, $field));
$validation->setRule("{$field}.*", $field, $this->getService()->getModel()->getFieldRule($action, $field));
break;
default:
$validation = parent::setValidation($action, $field, $validation);
@ -48,35 +40,26 @@ class UserController extends AdminController
}
return $validation;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : ['id', $this->getModel()::TITLE, 'email', 'mobile', 'role', 'status', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($action, $this->fields);
$this->filter_fields = ['role', 'status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = ['status'];
}
//생성
public function create_form(): RedirectResponse|string
{
$this->init('create', ['id', 'passwd', 'confirmpassword', $this->getModel()::TITLE, 'email', 'mobile', 'role']);
$this->init('create', ['id', 'passwd', 'confirmpassword', $this->getService()->getModel()::TITLE, 'email', 'mobile', 'role']);
return $this->create_form_procedure();
}
public function create(): RedirectResponse|string
{
$this->init(__FUNCTION__, ['id', 'passwd', 'confirmpassword', $this->getModel()::TITLE, 'email', 'mobile', 'role']);
$this->init(__FUNCTION__, ['id', 'passwd', 'confirmpassword', $this->getService()->getModel()::TITLE, 'email', 'mobile', 'role']);
return $this->create_procedure();
}
//수정
public function modify_form(int $uid): RedirectResponse|string
{
$this->init('modify', ['passwd', 'confirmpassword', $this->getModel()::TITLE, 'email', 'mobile', 'role', 'status']);
$this->init('modify', ['passwd', 'confirmpassword', $this->getService()->getModel()::TITLE, 'email', 'mobile', 'role', 'status']);
return $this->modify_form_procedure($uid);
}
public function modify(int $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, ['passwd', 'confirmpassword', $this->getModel()::TITLE, 'email', 'mobile', 'role', 'status']);
$this->init(__FUNCTION__, ['passwd', 'confirmpassword', $this->getService()->getModel()::TITLE, 'email', 'mobile', 'role', 'status']);
return $this->modify_procedure($uid);
}
public function toggle(mixed $uid, string $field): RedirectResponse

View File

@ -9,7 +9,6 @@ use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Helpers\UserSNSHelper;
use App\Models\UserModel;
use App\Models\UserSNSModel;
use App\Services\UserSNSService;
class UserSNSController extends AdminController
@ -17,16 +16,9 @@ class UserSNSController extends AdminController
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");
$this->title = lang("{$this->getService()->getClassPath()}.title");
$this->helper = new UserSNSHelper();
}
protected function getModel(): UserSNSModel
{
if ($this->_model === null) {
$this->_model = new UserSNSModel();
}
return $this->_model;
}
protected function getService(): UserSNSService
{
if ($this->service === null) {
@ -37,7 +29,7 @@ class UserSNSController extends AdminController
protected function getFormFieldOption(string $field, array $options = []): array
{
switch ($field) {
case $this->getModel()::PARENT:
case $this->getService()->getModel()::PARENT:
$userModel = model(UserModel::class);
// $this->getUserModel()->where('status', DEFAULTS['STATUS']);
$options[$field] = $userModel->getFormFieldOption($field);
@ -50,24 +42,15 @@ class UserSNSController extends AdminController
}
return $options;
}
private function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : [$this->getModel()::PARENT, 'site', 'id', $this->getModel()::TITLE, 'email', 'updated_at', 'created_at'];
$this->field_rules = $this->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = [$this->getModel()::PARENT, 'status'];
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = [];
}
//수정
public function modify_form(int $uid): RedirectResponse|string
{
$this->init('modify', [$this->getModel()::PARENT, 'site', 'id', $this->getModel()::TITLE, 'email']);
$this->init('modify', [$this->getService()->getModel()::PARENT, 'site', 'id', $this->getService()->getModel()::TITLE, 'email']);
return $this->modify_form_procedure($uid);
}
public function modify(int $uid): RedirectResponse|string
{
$this->init(__FUNCTION__, [$this->getModel()::PARENT, 'site', 'id', $this->getModel()::TITLE, 'email']);
$this->init(__FUNCTION__, [$this->getService()->getModel()::PARENT, 'site', 'id', $this->getService()->getModel()::TITLE, 'email']);
return $this->modify_procedure($uid);
}
public function toggle(mixed $uid, string $field): RedirectResponse

View File

@ -116,9 +116,9 @@ class Cloudflare extends BaseController
$zone = new ZoneService();
foreach ($zone_model->getEntitys() as $entity) {
if (!array_key_exists($entity->getParent(), $account_entitys)) {
$account_entitys[$entity->getParent()] = $account_model->getEntity($entity->getParent());
$account_entitys[$entity->getParent()] = $account_model->getEntityByID($entity->getParent());
}
$zone->expire($account_entitys[$entity->getParent()], $entity);
$zone->expired($account_entitys[$entity->getParent()], $entity);
}
log_message("notice", "Expire 작업을 완료하였습니다.");
// $this->_db->transCommit();

View File

@ -7,9 +7,21 @@ use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\Validation\Validation;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Html;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use App\Services\MyLogService;
abstract class CommonController extends BaseController
{
private $_controlDatas = [];
private $_viewDatas = [];
abstract protected function getService(): mixed;
//Field별 Form Rule용
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
@ -17,17 +29,542 @@ abstract class CommonController extends BaseController
}
final public function __get($name)
{
if (!array_key_exists($name, $this->_controlDatas)) {
if (!array_key_exists($name, $this->_viewDatas)) {
return null;
}
return $this->_controlDatas[$name];
return $this->_viewDatas[$name];
}
final public function __set($name, $value): void
{
$this->_controlDatas[$name] = $value;
$this->_viewDatas[$name] = $value;
}
final public function getViewDatas(): array
{
return $this->_controlDatas;
return $this->_viewDatas;
}
protected function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : $this->getService()->getModel()->getFields();
$this->field_rules = $this->getService()->getModel()->getFieldRules($this->action, $this->fields);
$this->filter_fields = $this->getService()->getModel()->getFilterFields();
$this->field_options = $this->getFormFieldOptions($this->filter_fields);
$this->batchjob_fields = $this->getService()->getModel()->getBatchJobFields();
}
protected function setValidation(string $action, string $field, Validation $validation): Validation
{
switch ($field) {
default:
$validation->setRule($field, $field, $this->getService()->getModel()->getFieldRule($action, $field));
break;
}
return $validation;
}
final protected function getValidation(string $action, array $fields): Validation
{
$validation = service('validation');
foreach ($fields as $field) {
$validation = $this->setValidation($action, $field, $validation);
}
return $validation;
}
//Field별 Form Option용
protected function getFormFieldOption(string $field, array $options): array
{
switch ($field) {
default:
$options[$field] = lang($this->getService()->getClassPath() . '.' . strtoupper($field));
break;
}
return $options;
}
final protected function getFormFieldOptions(array $fields, array $options = []): array
{
foreach ($fields as $field) {
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "에서 field array 입니다.\n" . var_export($field, true));
}
$options = $this->getFormFieldOption($field, $options);
}
return $options;
}
// 생성
protected function create_form_process(): void {}
final protected function create_form_procedure(): RedirectResponse|string
{
try {
helper(['form']);
$this->create_form_process();
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "create",
data: ['viewDatas' => $this->getViewDatas()]
);
} catch (\Exception $e) {
return redirect()->back()->with('error', $e->getMessage());
}
}
protected function create_validate(string $action, array $fields): array
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getPOST()보다 먼처 체크필요
$validation = $this->getValidation($action, $fields);
if (!$validation->withRequest($this->request)->run()) {
throw new \Exception("{$this->getService()->getClassName()} 작업 데이터 검증 오류발생\n" . implode(
"\n",
$validation->getErrors()
));
}
return $validation->getValidated();
}
protected function create_process(): void
{
$this->formDatas = $this->create_validate($this->action, $this->fields);
$this->entity = $this->getService()->create($this->formDatas);
}
protected function create_process_result($message): RedirectResponse|string
{
$url = strtolower(base_url() . $this->uri_path . $this->getService()->getClassName()) . "/view/" . $this->entity->getPK();
return redirect()->to($url)->with('error', $message);
}
final protected function create_procedure(): RedirectResponse|string
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
helper(['form']);
$this->create_process();
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->create_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->withInput()->with('error', $e->getMessage());
}
}
// 수정
protected function modify_form_process(mixed $uid): void
{
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("해당 정보를 찾을수 없습니다.");
}
}
final protected function modify_form_procedure(mixed $uid): RedirectResponse|string
{
try {
helper(['form']);
$this->modify_form_process($uid);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "modify",
data: ['viewDatas' => $this->getViewDatas()]
);
} catch (\Exception $e) {
return redirect()->back()->with('error', $e->getMessage());
}
}
final protected function modify_validate(string $action, array $fields): array
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요
$validation = $this->getValidation($action, $fields);
if (!$validation->withRequest($this->request)->run()) {
throw new \Exception("{$this->getService()->getClassName()} 작업 데이터 검증 오류발생\n" . implode(
"\n",
$validation->getErrors()
));
}
return $validation->getValidated();
}
//modify,toggle,batchjob 공통사용
protected function modify_process(mixed $uid): void
{
$this->formDatas = $this->modify_validate($this->action, $this->fields);
//자신정보정의
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception(__FUNCTION__ . " => {$uid} 정보를 찾을수 없습니다.");
}
//수정된값 Log남기기
foreach ($this->fields as $field) {
MyLogService::add("info", "{$field}: {$this->formDatas[$field]}=>{$this->entity->$field}");
}
$this->entity = $this->getService()->modify($this->entity, $this->formDatas);
}
protected function modify_process_result($message): RedirectResponse|string
{
$url = strtolower(base_url() . $this->uri_path . $this->getService()->getClassName()) . "/view/" . $this->entity->getPK();
return redirect()->to($url)->with('error', $message);
}
final protected function modify_procedure(mixed $uid): RedirectResponse|string
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
helper(['form']);
$this->modify_process($uid);
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->modify_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->withInput()->with('error', $e->getMessage());
}
}
//단일필드작업
protected function toggle_process_result($message): RedirectResponse|string
{
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $message);
}
final protected function toggle_procedure(mixed $uid, string $field): RedirectResponse
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
$this->action = __FUNCTION__;
$this->fields = [$field];
$this->modify_process($uid);
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->toggle_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
//일괄처리작업
protected function batchjob_process_result($message): RedirectResponse|string
{
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $message);
}
final protected function batchjob_procedure(): RedirectResponse
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
//데이터가 있는경우 Field만 처리하기위해
$fields = [];
foreach ($this->batchjob_fields as $field) {
if ($this->request->getVar($field)) {
$fields[$field] = $field;
}
}
$this->fields = $fields;
//변경할 UIDS
$uids = $this->request->getVar('batchjob_uids');
if (!$uids) {
throw new \Exception("적용할 리스트를 선택하셔야합니다.");
}
foreach (explode(",", $uids) as $uid) {
$this->modify_process($uid);
}
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->batchjob_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
//View
protected function view_process(mixed $uid): void
{
//자신정보정의
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("해당 정보를 찾을수 없습니다.");
}
}
protected function view_process_result(): string
{
helper(['form']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "view",
data: ['viewDatas' => $this->getViewDatas()]
);
}
final protected function view_procedure(mixed $uid): RedirectResponse|string
{
try {
$this->view_process($uid);
return $this->view_process_result();
} catch (\Exception $e) {
return redirect()->back()->with('error', $e->getMessage());
}
}
//삭제 delete,batchjob_delete 공통사용
protected function delete_process(mixed $uid): void
{
//자신정보정의
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
//삭제된값 Log남기기
foreach ($this->fields as $field) {
MyLogService::add("info", "{$field}: {$this->entity->$field}");
}
$this->entity = $this->getService()->delete($this->entity->getPK());
}
protected function delete_process_result($message): RedirectResponse|string
{
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $message);
}
final public function delete(mixed $uid): RedirectResponse
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
$this->delete_process($uid);
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->delete_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
//일괄삭제
final public function batchjob_delete(): RedirectResponse|string
{
//Transaction Start
$this->getService()->getModel()->transStart();
try {
//변경할 UIDS
$uids = $this->request->getVar('batchjob_uids');
if (!$uids) {
throw new \Exception("적용할 리스트를 선택하셔야합니다.");
}
foreach (explode(",", $uids) as $uid) {
$this->delete_process($uid);
}
$this->getService()->getModel()->transCommit();
if ($this->isMyLog) {
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["SUCCESS"], $this->myauth->getUIDByAuthInfo());
}
return $this->delete_process_result(MESSAGES["SUCCESS"]);
} catch (\Exception $e) {
//Transaction Rollback
$this->getService()->getModel()->transRollback();
if ($this->isMyLog) {
MyLogService::add("error", $e->getMessage());
MyLogService::save($this->getService()->getClassName(), __FUNCTION__, MESSAGES["FAILED"], $this->myauth->getUIDByAuthInfo());
}
return redirect()->back()->with('error', $e->getMessage());
}
}
// 리스트
protected function list_condition_process(): void
{
//조건절 처리
foreach ($this->filter_fields as $field) {
$this->$field = $this->request->getVar($field) ?: DEFAULTS['EMPTY'];
if ($this->$field !== DEFAULTS['EMPTY']) {
$this->getService()->getModel()->setList_FieldFilter($field, $this->$field);
}
}
//검색어 처리
$this->word = $this->request->getVar('word') ?: DEFAULTS['EMPTY'];
if ($this->word !== DEFAULTS['EMPTY']) {
$this->getService()->getModel()->setList_WordFilter($this->word);
}
//검색일 처리
$this->start = $this->request->getVar('start') ?: DEFAULTS['EMPTY'];
$this->end = $this->request->getVar('end') ?: DEFAULTS['EMPTY'];
$this->getService()->getModel()->setList_DateFilter($this->start, $this->end);
}
//Totalcount 처리
private function list_total_process(): int
{
$this->list_condition_process();
$total_count = $this->getService()->getModel()->countAllResults();
// MyLogService::add("debug", $this->getService()->getModel()->getLastQuery());
return $total_count;
}
//PageNation 처리
private function list_pagination_process($pager_group = 'default', int $segment = 0, $template = 'bootstrap_full'): string
{
//Page, Per_page필요부분
$this->page = (int) $this->request->getVar('page') ?: 1;
$this->per_page = (int) $this->request->getVar('per_page') ?: intval(env("mvc.default.list.per_page") ?? 10);
//줄수 처리용
$page_options = array("" => "줄수선택");
for ($i = $this->per_page; $i <= $this->total_count; $i += $this->per_page) {
$page_options[$i] = $i;
}
$this->page_options = $page_options;
// 1.Views/Pagers/에 bootstrap_full.php,bootstrap_simple.php 생성
// 2.app/Config/Pager.php/$templates에 'bootstrap_full => 'Pagers\bootstrap_full',
// 'bootstrap_simple' => 'Pagers\bootstrap_simple', 추가
$pager = service("pager");
// $this->getService()->getModel()->paginate($this->per_page, $pager_group, $this->page, $segment);
$pager->makeLinks(
$this->page,
$this->per_page,
$this->total_count,
$template,
$segment,
$pager_group
);
$this->page = $pager->getCurrentPage($pager_group);
$this->total_page = $pager->getPageCount($pager_group);
return $pager->links($pager_group, $template);
}
protected function list_entitys_process(): array
{
$this->list_condition_process();
//Sorting 처리
$this->order_field = $this->request->getVar('order_field') ?: DEFAULTS['EMPTY'];
$this->order_value = $this->request->getVar('order_value') ?: DEFAULTS['EMPTY'];
if ($this->order_field !== DEFAULTS['EMPTY'] && $this->order_value !== DEFAULTS['EMPTY']) {
$this->getService()->getModel()->orderBy(sprintf(
"%s.%s %s",
$this->getService()->getModel()::TABLE,
$this->order_field,
$this->order_value
));
}
$this->getService()->getModel()->limit($this->per_page, $this->page * $this->per_page - $this->per_page);
$entitys = $this->getService()->getModel()->select($this->getService()->getModel()::TABLE . '.*')->findAll();
MyLogService::add("debug", $this->getService()->getModel()->getLastQuery());
return $entitys;
}
protected function list_process_result(): string
{
return view(
$this->view_path . "index",
['viewDatas' => $this->getViewDatas()]
);
}
final protected function list_procedure(): string
{
try {
helper(['form']);
//URL처리
$this->uri = $this->request->getUri();
//total 처리
$this->total_count = $this->list_total_process();
//pagenation 처리
$this->pagination = $this->list_pagination_process();
//모델 처리
$this->entitys = $this->list_entitys_process();
// 현재 URL을 스택에 저장
$this->myauth->pushCurrentUrl($this->request->getUri()->getPath() . ($this->request->getUri()->getQuery() ? "?" . $this->request->getUri()->getQuery() : ""));
return $this->list_process_result();
} catch (\Exception $e) {
return $this->helper->alert($e->getMessage());
}
}
//OUPUT Document 관련
private function output_save_process(string $document_type, mixed $loaded_data): array
{
$full_path = WRITEPATH . DIRECTORY_SEPARATOR . "excel";
switch ($document_type) {
case 'excel':
$file_name = sprintf("%s_%s.xlsx", $this->getService()->getClassName(), date('Y-m-d_Hm'));
$writer = IOFactory::createWriter($loaded_data, 'Xlsx');
$writer->save($full_path . DIRECTORY_SEPARATOR . $file_name);
break;
case 'pdf':
$file_name = sprintf("%s_%s.pdf", $this->getService()->getClassName(), date('Y-m-d_Hm'));
$writer = new Mpdf($loaded_data);
$writer->save($full_path . DIRECTORY_SEPARATOR . $file_name);
break;
default:
if (!is_file($full_path)) {
throw new \Exception("첨부파일이 확인되지 않습니다.\n");
}
// //oupuput directly
// header("Content-Type: application/vnd.ms-excel");
// header(sprintf("Content-Disposition: attachment; filename=%s", urlencode($output_name)));
// header("Expires: 0");
// header("Cache-Control: must-revalidate");
// header("Pragma: public");
// header("Content-Length:" . filesize($full_path));
// return $writer->save('php://output');
break;
}
return array($full_path, $file_name);
}
//File Download관련
final protected function download_procedure(string $output_type, mixed $uid = false): DownloadResponse|RedirectResponse
{
try {
helper(['form']);
//URL처리
$this->uri = $this->request->getUri();
switch ($output_type) {
case 'excel':
case 'pdf':
// string buffer에서 읽어오는 경우
$this->entitys = $this->list_entitys_process();
$html = view(
'templates' . DIRECTORY_SEPARATOR . $this->action,
['viewDatas' => $this->getViewDatas()]
);
//data loading
$reader = new Html();
$loaded_data = $reader->loadFromString($html);
list($full_path, $file_name) = $this->output_save_process($output_type, $loaded_data);
$full_path .= DIRECTORY_SEPARATOR . $file_name;
break;
default:
if (!$uid) {
throw new \Exception("{$output_type}은 반드시 uid의 값이 필요합니다.");
}
$this->entity = $this->getService()->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
list($file_name, $uploaded_filename) = $this->entity->getDownlaodFile();
$full_path = WRITEPATH . DIRECTORY_SEPARATOR . "uploads" . DIRECTORY_SEPARATOR . $uploaded_filename;
break;
}
return $this->response->download($full_path, null)->setFileName($file_name);
} catch (\Exception $e) {
return $this->helper->alert($e->getMessage());
}
}
}

View File

@ -2,7 +2,7 @@
namespace App\Controllers;
class Home extends CommonController
class Home extends BaseController
{
public function index(): string
{

View File

@ -1,502 +0,0 @@
<?php
namespace App\Controllers;
use CodeIgniter\HTTP\DownloadResponse;
use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use CodeIgniter\Validation\Validation;
use PhpOffice\PhpSpreadsheet\IOFactory;
use PhpOffice\PhpSpreadsheet\Reader\Html;
use PhpOffice\PhpSpreadsheet\Writer\Pdf\Mpdf;
use Psr\Log\LoggerInterface;
abstract class MVController extends CommonController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->class_path = $this->getService()->class_path;
}
abstract protected function getModel(): mixed;
abstract protected function getService(): mixed;
//Field별 Form Rule용
protected function setValidation(string $action, string $field, Validation $validation): Validation
{
switch ($field) {
default:
$validation->setRule($field, $field, $this->getModel()->getFieldRule($action, $field));
break;
}
return $validation;
}
final protected function getValidation(string $action, array $fields): Validation
{
$validation = service('validation');
foreach ($fields as $field) {
$validation = $this->setValidation($action, $field, $validation);
}
return $validation;
}
//Field별 Form Option용
protected function getFormFieldOption(string $field, array $options): array
{
switch ($field) {
default:
// echo "TEST:" . $this->getService()->class_path . "," . $this->getService()->class_name;
// dd(lang($this->getService()->class_path . '.' . strtoupper($field)));
$options[$field] = lang($this->getService()->class_path . '.' . strtoupper($field));
break;
}
return $options;
}
final protected function getFormFieldOptions(array $fields, array $options = []): array
{
foreach ($fields as $field) {
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "에서 field array 입니다.\n" . var_export($field, true));
}
$options = $this->getFormFieldOption($field, $options);
}
return $options;
}
// 생성
protected function create_form_process(): void {}
final protected function create_form_procedure(): RedirectResponse|string
{
try {
helper(['form']);
$this->create_form_process();
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "create",
data: ['viewDatas' => $this->getViewDatas()]
);
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return redirect()->back()->with('error', $e->getMessage());
}
}
protected function create_validate(string $action, array $fields): array
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getPOST()보다 먼처 체크필요
$validation = $this->getValidation($action, $fields);
if (!$validation->withRequest($this->request)->run()) {
throw new \Exception("{$this->getService()->class_name} 작업 데이터 검증 오류발생\n" . implode(
"\n",
$validation->getErrors()
));
}
return $validation->getValidated();
}
protected function create_process(): void
{
$this->formDatas = $this->create_validate($this->action, $this->fields);
$this->entity = $this->getService()->create($this->formDatas);
}
protected function create_process_result(): RedirectResponse|string
{
$url = strtolower(base_url() . $this->uri_path . $this->getService()->class_name) . "/view/" . $this->entity->getPK();
return redirect()->to($url)->with('error', $this->message);
}
final protected function create_procedure(): RedirectResponse|string
{
//Transaction Start
$this->getModel()->transStart();
try {
helper(['form']);
$this->create_process();
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 생성작업이 완료되었습니다.";
log_message("notice", $this->message);
return $this->create_process_result();
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->withInput()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
// 수정
protected function modify_form_process(mixed $uid): void
{
$this->entity = $this->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("해당 정보를 찾을수 없습니다.");
}
}
final protected function modify_form_procedure(mixed $uid): RedirectResponse|string
{
try {
helper(['form']);
$this->modify_form_process($uid);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "modify",
data: ['viewDatas' => $this->getViewDatas()]
);
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return redirect()->back()->with('error', $e->getMessage());
}
}
final protected function modify_validate(string $action, array $fields): array
{
//변경할 값 확인 : Upload된 파일 검증시 $this->request->getVar()보다 먼처 체크필요
$validation = $this->getValidation($action, $fields);
if (!$validation->withRequest($this->request)->run()) {
throw new \Exception("{$this->getService()->class_name} 작업 데이터 검증 오류발생\n" . implode(
"\n",
$validation->getErrors()
));
}
return $validation->getValidated();
}
//modify,toggle,batchjob 공통사용
protected function modify_process(mixed $uid): void
{
$this->formDatas = $this->modify_validate($this->action, $this->fields);
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception(__FUNCTION__ . " => {$uid} 정보를 찾을수 없습니다.");
}
$this->entity = $this->getService()->modify($this->entity, $this->formDatas);
}
protected function modify_process_result(): RedirectResponse|string
{
$url = strtolower(base_url() . $this->uri_path . $this->getService()->class_name) . "/view/" . $this->entity->getPK();
return redirect()->to($url)->with('error', $this->message);
}
final protected function modify_procedure(mixed $uid): RedirectResponse|string
{
//Transaction Start
$this->getModel()->transStart();
try {
helper(['form']);
$this->modify_process($uid);
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 수정작업이 완료되었습니다.";
log_message("notice", $this->message);
return $this->modify_process_result();
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->withInput()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
//단일필드작업
final protected function toggle_procedure(mixed $uid, string $field): RedirectResponse
{
//Transaction Start
$this->getModel()->transStart();
try {
$this->action = __FUNCTION__;
$this->fields = [$field];
$this->modify_process($uid);
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 단일필드작업이 완료되었습니다.";
log_message("notice", $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
//일괄처리작업
final protected function batchjob_procedure(): RedirectResponse
{
//Transaction Start
$this->getModel()->transStart();
try {
//데이터가 있는경우 Field만 처리하기위해
$fields = [];
foreach ($this->batchjob_fields as $field) {
if ($this->request->getVar($field)) {
$fields[$field] = $field;
}
}
$this->fields = $fields;
//변경할 UIDS
$uids = $this->request->getVar('batchjob_uids');
if (!$uids) {
throw new \Exception("적용할 리스트를 선택하셔야합니다.");
}
foreach (explode(",", $uids) as $uid) {
$this->modify_process($uid);
}
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 일괄처리작업이 완료되었습니다.";
log_message("notice", $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
//View
protected function view_process(mixed $uid): void
{
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("해당 정보를 찾을수 없습니다.");
}
}
protected function view_process_result(): string
{
helper(['form']);
$this->forms = ['attributes' => ['method' => "post",], 'hiddens' => []];
return view(
$this->view_path . "view",
data: ['viewDatas' => $this->getViewDatas()]
);
}
final protected function view_procedure(mixed $uid): RedirectResponse|string
{
try {
$this->view_process($uid);
return $this->view_process_result();
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return redirect()->back()->with('error', $e->getMessage());
}
}
//삭제 delete,batchjob_delete 공통사용
protected function delete_process(mixed $uid): void
{
//자신정보정의
$this->entity = $this->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
$this->entity = $this->getService()->delete($this->entity->getPK());
}
final public function delete(mixed $uid): RedirectResponse
{
//Transaction Start
$this->getModel()->transStart();
try {
$this->delete_process($uid);
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 삭제작업이 완료되었습니다.";
log_message("notice", $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
//일괄삭제
final public function batchjob_delete(): RedirectResponse|string
{
//Transaction Start
$this->getModel()->transStart();
try {
//변경할 UIDS
$uids = $this->request->getVar('batchjob_uids');
if (!$uids) {
throw new \Exception("적용할 리스트를 선택하셔야합니다.");
}
foreach (explode(",", $uids) as $uid) {
$this->delete_process($uid);
}
$this->getModel()->transCommit();
$this->message = "{$this->getService()->class_name} : 일괄삭제처리작업이 완료되었습니다.";
log_message("notice", $this->message);
// 이전 URL로 리다이렉트
return redirect()->to($this->myauth->popPreviousUrl())->with('error', $this->message);
} catch (\Exception $e) {
//Transaction Rollback
$this->getModel()->transRollback();
log_message("error", $e->getMessage());
return redirect()->back()->with('error', __FUNCTION__ . " 실패하였습니다.\n" . $e->getMessage());
}
}
// 리스트
protected function list_condition_process(): void
{
//조건절 처리
foreach ($this->filter_fields as $field) {
$this->$field = $this->request->getVar($field) ?: DEFAULTS['EMPTY'];
if ($this->$field !== DEFAULTS['EMPTY']) {
$this->getModel()->setList_FieldFilter($field, $this->$field);
}
}
//검색어 처리
$this->word = $this->request->getVar('word') ?: DEFAULTS['EMPTY'];
if ($this->word !== DEFAULTS['EMPTY']) {
$this->getModel()->setList_WordFilter($this->word);
}
//검색일 처리
$this->start = $this->request->getVar('start') ?: DEFAULTS['EMPTY'];
$this->end = $this->request->getVar('end') ?: DEFAULTS['EMPTY'];
$this->getModel()->setList_DateFilter($this->start, $this->end);
}
//Totalcount 처리
private function list_total_process(): int
{
$this->list_condition_process();
$total_count = $this->getModel()->countAllResults();
// log_message("debug", $this->getModel()->getLastQuery());
return $total_count;
}
//PageNation 처리
private function list_pagination_process($pager_group = 'default', int $segment = 0, $template = 'bootstrap_full'): string
{
//Page, Per_page필요부분
$this->page = (int) $this->request->getVar('page') ?: 1;
$this->per_page = (int) $this->request->getVar('per_page') ?: intval(env("mvc.default.list.per_page") ?? 10);
//줄수 처리용
$page_options = array("" => "줄수선택");
for ($i = $this->per_page; $i <= $this->total_count; $i += $this->per_page) {
$page_options[$i] = $i;
}
$this->page_options = $page_options;
// 1.Views/Pagers/에 bootstrap_full.php,bootstrap_simple.php 생성
// 2.app/Config/Pager.php/$templates에 'bootstrap_full => 'Pagers\bootstrap_full',
// 'bootstrap_simple' => 'Pagers\bootstrap_simple', 추가
$pager = service("pager");
// $this->getModel()->paginate($this->per_page, $pager_group, $this->page, $segment);
$pager->makeLinks(
$this->page,
$this->per_page,
$this->total_count,
$template,
$segment,
$pager_group
);
$this->page = $pager->getCurrentPage($pager_group);
$this->total_page = $pager->getPageCount($pager_group);
return $pager->links($pager_group, $template);
}
protected function list_entitys_process(): array
{
$this->list_condition_process();
//Sorting 처리
$this->order_field = $this->request->getVar('order_field') ?: DEFAULTS['EMPTY'];
$this->order_value = $this->request->getVar('order_value') ?: DEFAULTS['EMPTY'];
if ($this->order_field !== DEFAULTS['EMPTY'] && $this->order_value !== DEFAULTS['EMPTY']) {
$this->getModel()->orderBy(sprintf(
"%s.%s %s",
$this->getModel()::TABLE,
$this->order_field,
$this->order_value
));
}
$this->getModel()->limit($this->per_page, $this->page * $this->per_page - $this->per_page);
$entitys = $this->getModel()->select($this->getModel()::TABLE . '.*')->findAll();
log_message("debug", $this->getModel()->getLastQuery());
return $entitys;
}
protected function list_process_result(): string
{
return view(
$this->view_path . "index",
['viewDatas' => $this->getViewDatas()]
);
}
final protected function list_procedure(): string
{
try {
helper(['form']);
//URL처리
$this->uri = $this->request->getUri();
//total 처리
$this->total_count = $this->list_total_process();
//pagenation 처리
$this->pagination = $this->list_pagination_process();
//모델 처리
$this->entitys = $this->list_entitys_process();
// 현재 URL을 스택에 저장
$this->myauth->pushCurrentUrl($this->request->getUri()->getPath() . ($this->request->getUri()->getQuery() ? "?" . $this->request->getUri()->getQuery() : ""));
return $this->list_process_result();
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return $this->helper->alert($e->getMessage());
}
}
//OUPUT Document 관련
private function output_save_process(string $document_type, mixed $loaded_data): array
{
$full_path = WRITEPATH . DIRECTORY_SEPARATOR . "excel";
switch ($document_type) {
case 'excel':
$file_name = sprintf("%s_%s.xlsx", $this->getService()->class_name, date('Y-m-d_Hm'));
$writer = IOFactory::createWriter($loaded_data, 'Xlsx');
$writer->save($full_path . DIRECTORY_SEPARATOR . $file_name);
break;
case 'pdf':
$file_name = sprintf("%s_%s.pdf", $this->getService()->class_name, date('Y-m-d_Hm'));
$writer = new Mpdf($loaded_data);
$writer->save($full_path . DIRECTORY_SEPARATOR . $file_name);
break;
default:
if (!is_file($full_path)) {
throw new \Exception("첨부파일이 확인되지 않습니다.\n");
}
// //oupuput directly
// header("Content-Type: application/vnd.ms-excel");
// header(sprintf("Content-Disposition: attachment; filename=%s", urlencode($output_name)));
// header("Expires: 0");
// header("Cache-Control: must-revalidate");
// header("Pragma: public");
// header("Content-Length:" . filesize($full_path));
// return $writer->save('php://output');
break;
}
return array($full_path, $file_name);
}
//File Download관련
final protected function download_procedure(string $output_type, mixed $uid = false): DownloadResponse|RedirectResponse
{
try {
helper(['form']);
//URL처리
$this->uri = $this->request->getUri();
switch ($output_type) {
case 'excel':
case 'pdf':
// string buffer에서 읽어오는 경우
$this->entitys = $this->list_entitys_process();
$html = view(
'templates' . DIRECTORY_SEPARATOR . $this->action,
['viewDatas' => $this->getViewDatas()]
);
//data loading
$reader = new Html();
$loaded_data = $reader->loadFromString($html);
list($full_path, $file_name) = $this->output_save_process($output_type, $loaded_data);
$full_path .= DIRECTORY_SEPARATOR . $file_name;
break;
default:
if (!$uid) {
throw new \Exception("{$output_type}은 반드시 uid의 값이 필요합니다.");
}
$this->entity = $this->getModel()->getEntityByPK($uid);
if ($this->entity === null) {
throw new \Exception("{$uid} 정보를 찾을수 없습니다.");
}
list($file_name, $uploaded_filename) = $this->entity->getDownlaodFile();
$full_path = WRITEPATH . DIRECTORY_SEPARATOR . "uploads" . DIRECTORY_SEPARATOR . $uploaded_filename;
break;
}
return $this->response->download($full_path, null)->setFileName($file_name);
} catch (\Exception $e) {
log_message("error", $e->getMessage());
return $this->helper->alert($e->getMessage());
}
}
}

View File

@ -7,27 +7,19 @@ use CodeIgniter\HTTP\RedirectResponse;
use CodeIgniter\HTTP\RequestInterface;
use CodeIgniter\HTTP\ResponseInterface;
use Psr\Log\LoggerInterface;
use App\Models\UserModel;
use App\Services\UserService;
use App\Helpers\UserHelper;
use App\Services\Auth\GoogleService;
use App\Services\Auth\LocalService;
class UserController extends MVController
class UserController extends CommonController
{
public function initController(RequestInterface $request, ResponseInterface $response, LoggerInterface $logger)
{
parent::initController($request, $response, $logger);
$this->title = lang("{$this->getService()->class_path}.title");;
$this->title = lang("{$this->getService()->getClassPath()}.title");;
$this->helper = new UserHelper();
}
protected function getModel(): UserModel
{
if ($this->_model === null) {
$this->_model = new UserModel();
}
return $this->_model;
}
protected function getService(): UserService
{
if ($this->service === null) {
@ -35,7 +27,7 @@ class UserController extends MVController
}
return $this->service;
}
private function init(string $action, array $fields = []): void
protected function init(string $action, array $fields = []): void
{
$this->action = $action;
$this->fields = count($fields) ? $fields : ['id', 'passwd'];

View File

@ -2,9 +2,9 @@
namespace App\Controllers\Utils;
use App\Controllers\CommonController;
use App\Controllers\BaseController;
class RSSFeedController extends CommonController
class RSSFeedController extends BaseController
{
public function getITWorld()
{

View File

@ -2,9 +2,9 @@
namespace App\Controllers\Utils;
use App\Controllers\CommonController;
use App\Controllers\BaseController;
class WebhookController extends CommonController
class WebhookController extends BaseController
{
public function cloudflare()
{

View File

@ -0,0 +1,27 @@
<?php
namespace App\Entities;
use App\Entities\CommonEntity;
use App\Models\MyLogModel;
class MyLogEntity extends CommonEntity
{
public function __toString(): string
{
return "{$this->getPK()}:{$this->getTitle()}}";
}
public function getPK(): int
{
return $this->attributes[MyLogModel::PK];
}
public function getTitle(): string
{
return $this->attributes[MyLogModel::TITLE];
}
public function setTitle(string $title): void
{
$this->attributes[MyLogModel::TITLE] = $title;
}
//Common Function
}

View File

@ -0,0 +1,47 @@
<?php
namespace App\Helpers;
use App\Models\MyLogModel;
class MyLogHelper extends MVCHelper
{
public function __construct()
{
parent::__construct();
}
public function getFieldView(string $field, array $viewDatas, array $extras = []): string
{
$value = $viewDatas['entity']->$field ?: DEFAULTS['EMPTY'];
switch ($field) {
case MyLogModel::TITLE:
$value = form_label(
$value,
'view',
[
"data-src" => current_url() . '/view/' . $viewDatas['entity']->getPK(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#index_action_form",
"style" => "color: blue; cursor: pointer; font-weight:bold;",
...$extras,
]
);
break;
case 'user_uid':
$roles = [];
foreach (explode(DEFAULTS["DELIMITER_ROLE"], $value) as $key) {
$roles[] = $viewDatas['field_options'][$field][$key];
}
$value = implode(" , ", $roles);
break;
case 'content':
$value = nl2br($value);
break;
default:
$value = parent::getFieldView($field, $viewDatas, $extras);
break;
}
return $value;
}
}

14
app/Language/en/MyLog.php Normal file
View File

@ -0,0 +1,14 @@
<?php
return [
'title' => "Log 정보",
'label' => [
'uid' => "번호",
'class_name' => "클래스",
'method_name' => "함수",
'title' => "제목",
'user_uid' => "사용자",
'content' => "내용",
'updated_at' => "수정일",
'created_at' => "작성일",
],
];

View File

@ -26,6 +26,18 @@ class AccountModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::PARENT, self::TITLE, 'type', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [self::PARENT, self::TITLE, 'type', 'status'];
}
public function getBatchJobFields(): array
{
return [];
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -26,6 +26,18 @@ class AuditLogModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return ['zone_name', self::TITLE, 'action_info', 'actor', 'interface', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [];
}
public function getBatchJobFields(): array
{
return $this->getFilterFields();
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -24,6 +24,18 @@ class AuthModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::TITLE, 'authkey', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return ['status'];
}
public function getBatchJobFields(): array
{
return $this->getFilterFields();
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -27,6 +27,18 @@ class FirewallModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::PARENT, 'mode', 'description', 'expression', 'enabled', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [self::PARENT, 'mode', 'enabled'];
}
public function getBatchJobFields(): array
{
return [];
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -27,6 +27,18 @@ class RecordModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::PARENT, 'host', 'type', 'content', 'proxied', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [self::PARENT, 'type', 'proxied', 'fixed'];
}
public function getBatchJobFields(): array
{
return ['type', 'proxied', 'fixed'];
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -26,6 +26,18 @@ class ZoneModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::PARENT, self::TITLE, 'name_servers', 'original_name_servers', 'plan', 'development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [self::PARENT, 'plan', 'development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https'];
}
public function getBatchJobFields(): array
{
return ['development_mode', 'ipv6', 'security_level', 'ssl_mode', 'always_use_https'];
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -51,17 +51,18 @@ abstract class CommonModel extends Model
}
abstract public function getTitleField(): string;
abstract public function getFields(): array;
abstract public function getFilterFields(): array;
abstract public function getBatchJobFields(): array;
final public function getTable(): string
{
return $this->table;
}
final public function getPKField(): string
{
return $this->primaryKey;
}
public function getFieldRule(string $action, string $field): string
{
if (is_array($field)) {
@ -193,6 +194,7 @@ abstract class CommonModel extends Model
foreach (array_keys($formDatas) as $field) {
$entity->$field = $this->convertEntityData($field, $formDatas);
}
// dd($entity);
$entity = $this->save_process($entity);
// primaryKey가 자동입력이면
if ($this->useAutoIncrement) {
@ -222,9 +224,9 @@ abstract class CommonModel extends Model
$this->where($this->getTable() . '.' . $field, $value);
}
public function setList_WordFilter(string $word, string $field = null): void
public function setList_WordFilter(string $word, string $field): void
{
$this->like($this->getTable() . '.' . ($field ?? $this->getTitleField()), $word, 'both'); // before, after, both
$this->like($this->getTable() . '.' . $field, $word, 'both'); // before, after, both
}
final public function setList_DateFilter(string $start, string $end, $field = "created_at"): void

View File

@ -26,6 +26,18 @@ class MapurlModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::TITLE, 'newurl', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return ['status'];
}
public function getBatchJobFields(): array
{
return $this->getFilterFields();
}
public function getFieldRule(string $action, string $field): string
{
if (is_array($field)) {

69
app/Models/MyLogModel.php Normal file
View File

@ -0,0 +1,69 @@
<?php
namespace App\Models;
use App\Entities\MyLogEntity;
use App\Models\CommonModel;
class MyLogModel extends CommonModel
{
const TABLE = "logger";
const PK = "uid";
const TITLE = "title";
protected $table = self::TABLE;
protected $primaryKey = self::PK;
protected $returnType = MyLogEntity::class;
protected $allowedFields = [
"user_uid",
"class_name",
"method_name",
"title",
"content",
"created_at",
];
public function __construct()
{
parent::__construct();
}
public function getTitleField(): string
{
return self::TITLE;
}
public function getFields(): array
{
return ['class_name', 'method_name', self::TITLE, 'user_uid', 'created_at'];
}
public function getFilterFields(): array
{
return ['user_uid'];
}
public function getBatchJobFields(): array
{
return [];
}
public function getFieldRule(string $action, string $field): string
{
if (is_array($field)) {
throw new \Exception(__FUNCTION__ . "=> field가 array 입니다.\n" . var_export($field, true));
}
switch ($field) {
case "user_uid":
$rule = "if_exist|numeric";
break;
default:
$rule = parent::getFieldRule($action, $field);
break;
}
return $rule;
}
public function getEntityByPK(string $uid): null|MyLogEntity
{
$this->where($this->getPKField(), intval($uid));
return $this->getEntity();
}
//create용
public function create(array $formDatas = []): MyLogEntity
{
return $this->create_process(new MyLogEntity(), $formDatas);
}
}

View File

@ -30,6 +30,18 @@ class UserModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return ['id', self::TITLE, 'email', 'mobile', 'role', 'status', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return ['role', 'status'];
}
public function getBatchJobFields(): array
{
return ['status'];
}
public function getFieldRule(string $action, string $field): string
{
if (is_array($field)) {

View File

@ -32,6 +32,18 @@ class UserSNSModel extends CommonModel
{
return self::TITLE;
}
public function getFields(): array
{
return [self::PARENT, 'site', 'id', self::TITLE, 'email', 'updated_at', 'created_at'];
}
public function getFilterFields(): array
{
return [self::PARENT, 'status'];
}
public function getBatchJobFields(): array
{
return [];
}
public function getFieldRule(string $action, string $field): string
{
switch ($field) {

View File

@ -23,7 +23,7 @@ class AuthService extends CommonService
return $this->_session;
}
final protected function getModel(): UserModel
final public function getModel(): UserModel
{
if ($this->_model === null) {
$this->_model = new UserModel();
@ -31,7 +31,7 @@ class AuthService extends CommonService
return $this->_model;
}
final public function getAuthInfo(string $key = ""): array|string
private function getAuthInfo(string $key = ""): array|string
{
$authInfo = $this->getSession()->get(SESSION_NAMES['AUTH']);
if ($key) {
@ -40,6 +40,28 @@ class AuthService extends CommonService
return $authInfo;
}
final public function getUIDByAuthInfo(): string
{
return $this->getAuthInfo('uid');
}
final public function getIDByAuthInfo(): string
{
return $this->getAuthInfo('id');
}
final public function getNameByAuthInfo(): string
{
return $this->getAuthInfo('name');
}
final public function getRoleByAuthInfo(): string
{
return $this->getAuthInfo('role');
}
final public function isLoggedIn(): bool
{
return $this->getSession()->has(SESSION_NAMES['ISLOGIN']);
@ -47,7 +69,7 @@ class AuthService extends CommonService
final public function isAccessRole(array $roles): bool
{
$role = $this->getAuthInfo('role');
$role = $this->getAuthInfo(key: 'role');
if ($role === "") {
return false;
}

View File

@ -14,9 +14,7 @@ class AccountService extends CloudflareService
public function __construct()
{
$this->class_name = "Account";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Account");
}
private function getParentEntity(): AuthEntity
@ -33,7 +31,7 @@ class AccountService extends CloudflareService
$this->setAuthEntity($this->getParentEntity());
}
protected function getModel(): AccountModel
public function getModel(): AccountModel
{
if ($this->_model === null) {
$this->_model = new AccountModel();

View File

@ -15,12 +15,10 @@ class AuditLogService extends CloudflareService
public function __construct()
{
$this->class_name = "AuditLog";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("AuditLog");
}
protected function getModel(): AuditLogModel
public function getModel(): AuditLogModel
{
if ($this->_model === null) {
$this->_model = new AuditLogModel();

View File

@ -11,12 +11,10 @@ class AuthService extends CloudflareService
public function __construct()
{
$this->class_name = "Auth";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Auth");
}
protected function getModel(): AuthModel
public function getModel(): AuthModel
{
if ($this->_model === null) {
$this->_model = new AuthModel();

View File

@ -13,11 +13,9 @@ abstract class CloudflareService extends CommonService
private array $_mySockets = [];
private ?AuthEntity $_auth_entity = null;
private ?AuthModel $_authModel = null;
protected function __construct()
protected function __construct(string $class_name, string $class_path = "")
{
parent::__construct();
$this->class_path = "Cloudflare/";
parent::__construct($class_name, "Cloudflare/" . $class_path);
}
final public function getMySocket(): CloudflareSocket

View File

@ -6,6 +6,7 @@ use App\Models\Cloudflare\FirewallModel;
use App\Models\Cloudflare\AccountModel;
use App\Entities\Cloudflare\ZoneEntity;
use App\Entities\Cloudflare\FirewallEntity;
use App\Services\MyLogService;
class FirewallService extends CloudflareService
{
@ -15,9 +16,7 @@ class FirewallService extends CloudflareService
public function __construct()
{
$this->class_name = "Firewall";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Firewall");
}
private function getParentEntity(): ZoneEntity
@ -42,7 +41,7 @@ class FirewallService extends CloudflareService
$this->setAuthEntity($auth_entity);
}
protected function getModel(): FirewallModel
public function getModel(): FirewallModel
{
if ($this->_model === null) {
$this->_model = new FirewallModel();
@ -90,9 +89,13 @@ class FirewallService extends CloudflareService
$body = json_decode($response->getBody());
foreach ($body->result->rules as $rule) {
if ($rule->id === $entity->getPK()) {
$formDatas = ['rulesetid' => $body->result->id];
$formDatas = $this->getArrayByResult($rule, $formDatas);
$formDatas = $this->getArrayByResult($rule, ['rulesetid' => $body->result->id]);
//변경전 entity 값, 변경값 formDatas Log남기기
MyLogService::add("info", "{$body->result->id}:{$entity->expression}=>{$rule}");
//DB수정
$entity = $this->getModel()->modify($entity, $formDatas);
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["UPDATED"]);
// log_message("debug", $this->getModel()->getLastQuery());
}
}
return $entity;

View File

@ -6,6 +6,7 @@ use App\Entities\Cloudflare\RecordEntity;
use App\Entities\Cloudflare\ZoneEntity;
use App\Models\Cloudflare\AccountModel;
use App\Models\Cloudflare\RecordModel;
use App\Services\MyLogService;
class RecordService extends CloudflareService
{
@ -15,9 +16,7 @@ class RecordService extends CloudflareService
public function __construct()
{
$this->class_name = "Record";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Record");
}
private function getParentEntity(): ZoneEntity
@ -42,7 +41,7 @@ class RecordService extends CloudflareService
$this->setAuthEntity($auth_entity);
}
protected function getModel(): RecordModel
public function getModel(): RecordModel
{
if ($this->_model === null) {
$this->_model = new RecordModel();
@ -90,9 +89,15 @@ class RecordService extends CloudflareService
];
$response = $this->getMySocket()->post("zones/{$this->getParentEntity()->getPK()}/dns_records", $datas);
$body = json_decode($response->getBody());
$formDatas = $this->getArrayByResult($body->result);
//생성값 formDatas Log남기기
foreach ($formDatas as $field => $value) {
MyLogService::add("info", "{$field}:{$value}");
}
//DB생성
$entity = $this->getModel()->create($this->getArrayByResult($body->result));
log_message("debug", "Record:{$entity->getTitle()} 작업을 완료하였습니다.");
$entity = $this->getModel()->create($formDatas);
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["CREATED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}
@ -129,8 +134,16 @@ class RecordService extends CloudflareService
// throw new \Exception("Record:" . __FUNCTION__ . "\n" . json_encode($datas, JSON_PRETTY_PRINT) . "\n" . var_export($datas, true));
$response = $this->getMySocket()->put("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}", $datas);
$body = json_decode($response->getBody());
// DB 수정
return $this->getModel()->modify($entity, $this->getArrayByResult($body->result));
$formDatas = $this->getArrayByResult($body->result);
//변경전 entity 값, 변경값 formDatas Log남기기
foreach ($formDatas as $field => $value) {
MyLogService::add("info", "{$field}:{$entity->$field}=>{$value}");
}
//DB수정
$entity = $this->getModel()->modify($entity, $formDatas);
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["UPDATED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}
public function delete(ZoneEntity $parent_entity, RecordEntity $entity): RecordEntity
@ -140,7 +153,12 @@ class RecordService extends CloudflareService
$this->getMySocket()->delete("zones/{$this->getParentEntity()->getPK()}/dns_records/{$entity->getPK()}");
//DB삭제
$this->getModel()->delete($entity->getPK());
log_message("debug", $this->getModel()->getLastQuery());
//삭제전 entity 값 Log남기기
foreach ($this->getModel()->getAllowedFields() as $field) {
MyLogService::add("info", "{$field}:{$entity->$field}");
}
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["DELETED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}

View File

@ -5,6 +5,7 @@ namespace App\Services\Cloudflare;
use App\Entities\Cloudflare\AccountEntity;
use App\Entities\Cloudflare\ZoneEntity;
use App\Models\Cloudflare\ZoneModel;
use App\Services\MyLogService;
class ZoneService extends CloudflareService
{
@ -20,9 +21,7 @@ class ZoneService extends CloudflareService
public function __construct()
{
$this->class_name = "Zone";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Zone");
}
private function getParentEntity(): AccountEntity
@ -43,7 +42,7 @@ class ZoneService extends CloudflareService
$this->setAuthEntity($auth_entity);
}
protected function getModel(): ZoneModel
public function getModel(): ZoneModel
{
if ($this->_model === null) {
$this->_model = new ZoneModel();
@ -95,10 +94,10 @@ class ZoneService extends CloudflareService
private function setCFSetting(string $uid, string $field, string $value): string
{
$field = ($field === 'ssl_mode') ? 'ssl' : $field;
$datas = ['value' => $value];
$response = $this->getMySocket()->patch('zones/' . $uid . '/settings/' . $field, $datas);
$response = $this->getMySocket()->patch('zones/' . $uid . '/settings/' . $field, ['value' => $value]);
$body = json_decode($response->getBody());
//최종 결과값은 body->result->id='필드명',body->result->value='on/off'이런식으로 받음
MyLogService::add("debug", __FUNCTION__ . "에서 {$field}:{$body->result->value}을 설정하였습니다.");
return $body->result->value;
}
@ -108,21 +107,26 @@ class ZoneService extends CloudflareService
$this->setParentEntity($parent_entity);
//Socket용
//도메인생성을 위해 Cloudflare에 전송
$datas = [
'accountId' => $this->getParentEntity()->getPK(),
'name' => $domain,
$datas = [
'accountId' => $this->getParentEntity()->getPK(),
'name' => $domain,
'jump_start' => $jump_start,
];
$response = $this->getMySocket()->post('zones/', $datas);
$body = json_decode($response->getBody());
//DB생성
$body = json_decode($response->getBody());
$formDatas = $this->getArrayByResult($body->result);
//Zone Setting Fields: ipv6 , development_mode , security_level
foreach ($this->_setting_fields as $field => $default) {
//초기화값 추가셋팅 ipv6 , development_mode , security_level
$formDatas[$field] = $this->setCFSetting($formDatas[ZoneModel::PK], $field, $default);
}
//생성값 formDatas Log남기기
foreach ($formDatas as $field => $value) {
MyLogService::add("info", "{$field}:{$value}");
}
//DB생성
$entity = $this->getModel()->create($formDatas);
log_message("debug", "Zone:{$entity->getTitle()} 작업을 완료하였습니다.");
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["CREATED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}
@ -130,13 +134,19 @@ class ZoneService extends CloudflareService
{
//부모데이터정의
$this->setParentEntity($parent_entity);
// throw new \Exception("zone:modify" . var_export($formDatas, true));
//Zone Setting Fields: ipv6 , development_mode , security_level
foreach ($formDatas as $field => $value) {
//modify,toggle,batchjob 사용 셋팅 ipv6 , //development_mode , //security_level
$formDatas[$field] = $this->setCFSetting($entity->getPK(), $field, $value);
}
//변경전 entity 값, 변경값 formDatas Log남기기
foreach ($formDatas as $field => $value) {
MyLogService::add("info", "{$field}:{$entity->$field}=>{$value}");
}
//DB수정
return $this->getModel()->modify($entity, $formDatas);
$entity = $this->getModel()->modify($entity, $formDatas);
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["UPDATED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}
public function delete(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
@ -146,7 +156,12 @@ class ZoneService extends CloudflareService
$this->getMySocket()->delete("zones/{$entity->getPK()}");
//DB삭제
$this->getModel()->delete($entity->getPK());
log_message("debug", $this->getModel()->getLastQuery());
//삭제전 entity 값 Log남기기
foreach ($this->getModel()->getAllowedFields() as $field) {
MyLogService::add("info", "{$field}:{$entity->$field}");
}
MyLogService::add("info", __FUNCTION__ . " {$entity->getTitle()} " . MESSAGES["DELETED"]);
// log_message("debug", $this->getModel()->getLastQuery());
return $entity;
}
@ -164,7 +179,7 @@ class ZoneService extends CloudflareService
return $entity;
}
public function expire(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
public function expired(AccountEntity $parent_entity, ZoneEntity $entity): ZoneEntity
{
$this->setParentEntity($parent_entity);
$response = $this->getMySocket()->get("accounts/{$entity->getParent()}/registrar/domains/{$entity->getTitle()}");

View File

@ -5,8 +5,15 @@ namespace App\Services;
abstract class CommonService
{
private $_serviceDatas = [];
public function __construct() {}
abstract protected function getModel(): mixed;
private $class_name = "";
private $class_path = "";
public function __construct(string $class_name, string $class_path = "")
{
$this->class_name = $class_name;
$this->class_path = $class_path ? $class_path : $this->class_name;
}
abstract public function getModel(): mixed;
final public function __get($name)
{
if (!array_key_exists($name, $this->_serviceDatas)) {
@ -18,6 +25,14 @@ abstract class CommonService
{
$this->_serviceDatas[$name] = $value;
}
final public function getClassName(): string
{
return $this->class_name;
}
final public function getClassPath(): string
{
return $this->class_path;
}
final public function getServiceDatas(): array
{
return $this->_serviceDatas;

View File

@ -0,0 +1,39 @@
<?php
namespace App\Services;
use App\Models\MyLogModel;
use App\Entities\MyLogEntity;
class MyLogService
{
private static ?MyLogModel $_model = null;
private static $_logBuffers = [];
public function __construct() {}
static public function getModel(): MyLogModel
{
if (self::$_model === null) {
self::$_model = new MyLogModel();
}
return self::$_model;
}
static public function add(string $level, string $message): void
{
self::$_logBuffers[] = sprintf("%s[%s]: %s", date("H:i:s"), $level, $message);
log_message($level, $message);
}
static public function save($class_name, $method_name, $title, $user_uid): MyLogEntity
{
$formDatas = [
'user_uid' => $user_uid,
'class_name' => $class_name,
'method_name' => $method_name,
'title' => $title,
'content' => implode("\n", self::$_logBuffers),
];
self::$_logBuffers = [];
// dd($formDatas);
return self::getModel()->create($formDatas);
}
}

View File

@ -10,11 +10,9 @@ class MapurlService extends CommonService
private ?MapurlModel $_model = null;
public function __construct()
{
$this->class_name = "Mapurl";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("Mapurl");
}
protected function getModel(): MapurlModel
public function getModel(): MapurlModel
{
if ($this->_model === null) {
$this->_model = new MapurlModel();

View File

@ -10,11 +10,9 @@ class UserSNSService extends CommonService
private ?UserSNSModel $_model = null;
public function __construct()
{
$this->class_name = "UserSNS";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("UserSNS");
}
protected function getModel(): UserSNSModel
public function getModel(): UserSNSModel
{
if ($this->_model === null) {
$this->_model = new UserSNSModel();

View File

@ -10,11 +10,9 @@ class UserService extends CommonService
private ?UserModel $_model = null;
public function __construct()
{
$this->class_name = "User";
parent::__construct();
$this->class_path .= $this->class_name;
parent::__construct("User");
}
protected function getModel(): UserModel
public function getModel(): UserModel
{
if ($this->_model === null) {
$this->_model = new UserModel();

View File

@ -4,6 +4,9 @@
<div class="accordion-item">
<a href="/admin/usersns"><?= ICONS['GOOGLE'] ?> SNS 계정 관리</a>
</div>
<div class="accordion-item">
<a href="/admin/mylog"><?= ICONS['FLAG'] ?> Log 관리</a>
</div>
<div class="accordion-item">
<a href="/admin/mapurl"><?= ICONS['FLAG'] ?> MapURL 관리</a>
</div>

View File

@ -22,7 +22,7 @@
<div class="btn-group">
<button type="button" class="btn btn-outline-primary dropdown-toggle" data-bs-toggle="dropdown"
aria-expanded="false">
<b><?= ICONS['LOGIN'] . $viewDatas['myauth']->getAuthInfo('name') ?></b>
<b><?= ICONS['LOGIN'] . $viewDatas['myauth']->getNameByAuthInfo('name') ?></b>
</button>
<ul class="dropdown-menu dropdown-menu-end">
<li><?= form_label(
@ -30,7 +30,7 @@
"modify",
[
"class" => "dropdown-item",
"data-src" => "/admin/user/modify/" . $viewDatas['myauth']->getAuthInfo('uid'),
"data-src" => "/admin/user/modify/" . $viewDatas['myauth']->getUIDByAuthInfo(),
"data-bs-toggle" => "modal",
"data-bs-target" => "#index_action_form"
]