diff --git a/app/Controllers/AbstractCRUDController.php b/app/Controllers/AbstractCRUDController.php index c1e2a21..3a5e37c 100644 --- a/app/Controllers/AbstractCRUDController.php +++ b/app/Controllers/AbstractCRUDController.php @@ -40,13 +40,13 @@ abstract class AbstractCRUDController extends AbstractWebController return $this->action_redirect_process('error', "{$this->getTitle()}에서 생성폼 오류:" . $e->getMessage()); } } - protected function create_process(): CommonEntity + protected function create_process(): object { // POST 데이터를 DTO 객체로 변환 (getPost()는 POST 요청 본문만 가져옵니다.) return $this->service->create($this->service->createDTO($this->request->getPost())); } - protected function create_result_process(CommonEntity $entity, ?string $redirect_url = null): string|RedirectResponse + protected function create_result_process($entity, ?string $redirect_url = null): string|RedirectResponse { return $this->action_redirect_process( 'info', @@ -73,7 +73,7 @@ abstract class AbstractCRUDController extends AbstractWebController } // --- 수정 (Modify) --- - protected function modify_form_process($uid): CommonEntity + protected function modify_form_process($uid): object { return $this->service->getEntity($uid); } @@ -100,13 +100,13 @@ abstract class AbstractCRUDController extends AbstractWebController } } - protected function modify_process($uid): CommonEntity + protected function modify_process($uid): object { // POST 데이터를 DTO 객체로 변환 return $this->service->modify($uid, $this->service->createDTO($this->request->getPost())); } - protected function modify_result_process(CommonEntity $entity, ?string $redirect_url = null): string|RedirectResponse + protected function modify_result_process($entity, ?string $redirect_url = null): string|RedirectResponse { return $this->action_redirect_process( 'info', @@ -131,13 +131,11 @@ abstract class AbstractCRUDController extends AbstractWebController } // --- 삭제 (Delete) --- - - protected function delete_process($uid): CommonEntity + protected function delete_process($uid): object { return $this->service->delete($uid); } - - protected function delete_result_process(CommonEntity $entity, ?string $redirect_url = null): string|RedirectResponse + protected function delete_result_process($entity, ?string $redirect_url = null): string|RedirectResponse { return $this->action_redirect_process('info', "{$this->getTitle()}에서 {$entity->getTitle()} 삭제가 완료되었습니다.", $redirect_url); } @@ -148,7 +146,7 @@ abstract class AbstractCRUDController extends AbstractWebController throw new \Exception("{$this->getTitle()}에 번호가 정의 되지 않았습니다."); } $entity = $this->service->getEntity($uid); - //Delete처리 + //Delete처리 $entity = $this->delete_process($uid); return $this->delete_result_process($entity); } catch (\Throwable $e) { @@ -157,8 +155,7 @@ abstract class AbstractCRUDController extends AbstractWebController } // --- 상세보기 (View) --- - - protected function view_process($uid): CommonEntity + protected function view_process($uid): object { return $this->service->getEntity($uid); } diff --git a/app/Controllers/Admin/Customer/AccountController.php b/app/Controllers/Admin/Customer/AccountController.php index 8b36c9b..ace20bc 100644 --- a/app/Controllers/Admin/Customer/AccountController.php +++ b/app/Controllers/Admin/Customer/AccountController.php @@ -2,7 +2,6 @@ namespace App\Controllers\Admin\Customer; -use App\Entities\Customer\AccountEntity; use CodeIgniter\HTTP\RequestInterface; use CodeIgniter\HTTP\ResponseInterface; use Psr\Log\LoggerInterface; diff --git a/app/Controllers/Auth/GoogleController.php b/app/Controllers/Auth/GoogleController.php index fd67d64..a2683e7 100644 --- a/app/Controllers/Auth/GoogleController.php +++ b/app/Controllers/Auth/GoogleController.php @@ -26,8 +26,7 @@ class GoogleController extends AuthController protected function login_process(): UserEntity { //요청 데이터를 DTO 객체로 변환 - $dto = new GoogleDTO($this->request->getPost()); - return $this->service->login($dto); + return $this->service->login(new GoogleDTO($this->request->getPost())); } protected function logout_process(): void { diff --git a/app/Controllers/Auth/LocalController.php b/app/Controllers/Auth/LocalController.php index 81167b6..073619f 100644 --- a/app/Controllers/Auth/LocalController.php +++ b/app/Controllers/Auth/LocalController.php @@ -26,8 +26,7 @@ class LocalController extends AuthController protected function login_process(): UserEntity { $this->action_init_process('login'); - $dto = new LocalDTO($this->request->getPost()); - return $this->service->login($dto); + return $this->service->login(new LocalDTO($this->request->getPost())); } protected function logout_process(): void { diff --git a/app/DTOs/Customer/ServiceDTO.php b/app/DTOs/Customer/ServiceDTO.php index 8f47f40..463d9a3 100644 --- a/app/DTOs/Customer/ServiceDTO.php +++ b/app/DTOs/Customer/ServiceDTO.php @@ -10,7 +10,6 @@ class ServiceDTO extends CommonDTO public ?int $user_uid = null; public ?int $clientinfo_uid = null; public ?int $serverinfo_uid = null; - public ?int $payment_uid = null; public ?string $code = null; public ?string $title = null; public ?string $site = null; diff --git a/app/Database/dbmsv4_init.sql b/app/Database/dbmsv4_init.sql index dc9ad44..b22c699 100644 --- a/app/Database/dbmsv4_init.sql +++ b/app/Database/dbmsv4_init.sql @@ -740,14 +740,14 @@ CREATE TABLE `user` ( `email` varchar(50) NOT NULL, `mobile` varchar(20) DEFAULT NULL, `role` varchar(255) DEFAULT NULL, - `status` varchar(20) DEFAULT 'normal', + `status` varchar(20) NOT NULL DEFAULT 'available', `updated_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT current_timestamp(), `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`uid`), UNIQUE KEY `UQ_id` (`id`), UNIQUE KEY `UQ_email` (`email`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='관리자정보'; +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='관리자정보'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -769,4 +769,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-12-01 18:50:18 +-- Dump completed on 2025-12-02 10:31:27 diff --git a/app/Database/dbmsv4_test1.sql b/app/Database/dbmsv4_test1.sql index 0f63434..6bbfac0 100644 --- a/app/Database/dbmsv4_test1.sql +++ b/app/Database/dbmsv4_test1.sql @@ -740,14 +740,14 @@ CREATE TABLE `user` ( `email` varchar(50) NOT NULL, `mobile` varchar(20) DEFAULT NULL, `role` varchar(255) DEFAULT NULL, - `status` varchar(20) DEFAULT 'normal', + `status` varchar(20) NOT NULL DEFAULT 'available', `updated_at` timestamp NULL DEFAULT NULL, `created_at` timestamp NOT NULL DEFAULT current_timestamp(), `deleted_at` timestamp NULL DEFAULT NULL, PRIMARY KEY (`uid`), UNIQUE KEY `UQ_id` (`id`), UNIQUE KEY `UQ_email` (`email`) -) ENGINE=InnoDB AUTO_INCREMENT=46 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='관리자정보'; +) ENGINE=InnoDB AUTO_INCREMENT=47 DEFAULT CHARSET=utf8 COLLATE=utf8_general_ci COMMENT='관리자정보'; /*!40101 SET character_set_client = @saved_cs_client */; -- @@ -769,4 +769,4 @@ UNLOCK TABLES; /*!40101 SET COLLATION_CONNECTION=@OLD_COLLATION_CONNECTION */; /*!40111 SET SQL_NOTES=@OLD_SQL_NOTES */; --- Dump completed on 2025-12-01 18:50:25 +-- Dump completed on 2025-12-02 10:31:19 diff --git a/app/Entities/Customer/ServiceEntity.php b/app/Entities/Customer/ServiceEntity.php index d458f06..447ef05 100644 --- a/app/Entities/Customer/ServiceEntity.php +++ b/app/Entities/Customer/ServiceEntity.php @@ -20,10 +20,6 @@ class ServiceEntity extends CustomerEntity { return $this->attributes['serverinfo_uid'] ?? null; } - final public function getPaymentUID(): string|null - { - return $this->attributes['payment_uid'] ?? null; - } //기본기능용 public function getCustomTitle(mixed $title = null): string { diff --git a/app/Entities/Equipment/ServerPartEntity.php b/app/Entities/Equipment/ServerPartEntity.php index 941c995..4c02fec 100644 --- a/app/Entities/Equipment/ServerPartEntity.php +++ b/app/Entities/Equipment/ServerPartEntity.php @@ -24,10 +24,6 @@ class ServerPartEntity extends EquipmentEntity { return $this->attributes['serviceinfo_uid'] ?? null; } - final public function getPaymentUID(): int|null - { - return $this->attributes['payment_uid'] ?? null; - } //기본기능용 public function getCalculatedAmount(): int { diff --git a/app/Forms/Auth/LocalForm.php b/app/Forms/Auth/LocalForm.php index fe44110..a1a722f 100644 --- a/app/Forms/Auth/LocalForm.php +++ b/app/Forms/Auth/LocalForm.php @@ -15,8 +15,7 @@ class LocalForm extends CommonForm { switch ($field) { case "id": - $rule = "required|trim|min_length[4]|max_length[20]"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|trim|min_length[4]|max_length[20]%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "passwd": $rule = in_array($action, ["create", "create_form"]) ? "required|trim|string" : "permit_empty|trim|string"; diff --git a/app/Forms/CommonForm.php b/app/Forms/CommonForm.php index 77a90dd..c7594ab 100644 --- a/app/Forms/CommonForm.php +++ b/app/Forms/CommonForm.php @@ -147,19 +147,17 @@ abstract class CommonForm switch ($field) { case $this->getAttribute('pk_field'): if (!$this->$this->getAttribute('useAutoIncrement')) { - $rule = "required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]"; - $rule .= in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|regex_match[/^[0-9a-f]{8}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{4}-[0-9a-f]{12}/]%s", in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); } else { $rule = "required|numeric"; } break; case $this->getAttribute('title_field'): - $rule = "required|trim|string"; + $rule = sprintf("required|trim|string%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "code": // a-zA-Z → 영문 대소문자,0-9 → 숫자,가-힣 → 한글 완성형,\- → 하이픈 - $rule = "required|regex_match[/^[a-zA-Z0-9가-힣\-]+$/]|min_length[4]|max_length[20]"; - $rule .= in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|regex_match[/^[a-zA-Z0-9가-힣\-]+$/]|min_length[4]|max_length[20]%s", in_array($action, ["create"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "user_uid": $rule = "required|numeric"; diff --git a/app/Forms/Customer/ClientForm.php b/app/Forms/Customer/ClientForm.php index c6c1979..5a758fb 100644 --- a/app/Forms/Customer/ClientForm.php +++ b/app/Forms/Customer/ClientForm.php @@ -11,12 +11,8 @@ class ClientForm extends CustomerForm public function getFormRule(string $action, string $field): string { switch ($field) { - case "user_uid": - $rule = "required|numeric"; - break; case "name": - $rule = "required|trim|string"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|trim|string%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "site": case "role": diff --git a/app/Forms/Customer/CouponForm.php b/app/Forms/Customer/CouponForm.php index 2479b4e..a6153ab 100644 --- a/app/Forms/Customer/CouponForm.php +++ b/app/Forms/Customer/CouponForm.php @@ -8,25 +8,4 @@ class CouponForm extends CustomerForm { parent::__construct(); } - public function getFormRule(string $action, string $field): string - { - switch ($field) { - case "user_uid": - case "clientinfo_uid": - case "cnt": - $rule = "required|numeric"; - break; - case "title": - case "status": - $rule = "required|trim|string"; - break; - case "content": - $rule = "permit_empty|trim|string"; - break; - default: - $rule = parent::getFormRule($action, $field); - break; - } - return $rule; - } } diff --git a/app/Forms/Customer/CustomerForm.php b/app/Forms/Customer/CustomerForm.php index a01fe04..641b8ed 100644 --- a/app/Forms/Customer/CustomerForm.php +++ b/app/Forms/Customer/CustomerForm.php @@ -10,27 +10,4 @@ abstract class CustomerForm extends CommonForm { parent::__construct(); } - public function getFormRule(string $action, string $field): string - { - switch ($field) { - case "title": - $rule = "required|trim|string"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; - break; - case "user_uid": - case "clientinfo_uid": - $rule = "required|numeric"; - break; - case "price": - $rule = "required|numeric"; - break; - case "status": - $rule = "permit_empty|trim|string"; - break; - default: - $rule = parent::getFormRule($action, $field); - break; - } - return $rule; - } } diff --git a/app/Forms/Customer/PointForm.php b/app/Forms/Customer/PointForm.php index 884be74..742a846 100644 --- a/app/Forms/Customer/PointForm.php +++ b/app/Forms/Customer/PointForm.php @@ -11,7 +11,6 @@ class PointForm extends CustomerForm public function getFormRule(string $action, string $field): string { switch ($field) { - case "user_uid": case "clientinfo_uid": case "amount": $rule = "required|numeric"; diff --git a/app/Forms/Customer/ServiceForm.php b/app/Forms/Customer/ServiceForm.php index 018982a..712399f 100644 --- a/app/Forms/Customer/ServiceForm.php +++ b/app/Forms/Customer/ServiceForm.php @@ -11,7 +11,6 @@ class ServiceForm extends CustomerForm public function getFormRule(string $action, string $field): string { switch ($field) { - case "user_uid": case "clientinfo_uid": case "serverinfo_uid": case "amount": @@ -20,7 +19,6 @@ class ServiceForm extends CustomerForm $rule = "required|numeric"; break; case "sale": - case "payment_uid": $rule = "permit_empty|numeric"; break; case "site": diff --git a/app/Forms/Equipment/EquipmentForm.php b/app/Forms/Equipment/EquipmentForm.php index 9a35d8a..9162895 100644 --- a/app/Forms/Equipment/EquipmentForm.php +++ b/app/Forms/Equipment/EquipmentForm.php @@ -10,29 +10,4 @@ abstract class EquipmentForm extends CommonForm { parent::__construct(); } - public function getFormRule(string $action, string $field): string - { - switch ($field) { - case "title": - $rule = "required|trim|string"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; - break; - case "user_uid": - case "clientinfo_uid": - case "serviceinfo_uid": - case "serverinfo_uid": - $rule = "permit_empty|numeric"; - break; - case "price": - $rule = "required|numeric"; - break; - case "status": - $rule = "permit_empty|trim|string"; - break; - default: - $rule = parent::getFormRule($action, $field); - break; - } - return $rule; - } } diff --git a/app/Forms/Equipment/ServerForm.php b/app/Forms/Equipment/ServerForm.php index 731378f..5584bb8 100644 --- a/app/Forms/Equipment/ServerForm.php +++ b/app/Forms/Equipment/ServerForm.php @@ -12,8 +12,7 @@ class ServerForm extends EquipmentForm { switch ($field) { case "switchinfo_uid": - $rule = "permit_empty|numeric"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("permit_empty|numeric%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "code": case "title": @@ -26,9 +25,8 @@ class ServerForm extends EquipmentForm case "status": $rule = "required|trim|string"; break; - case "ip": - $rule = "permit_empty|trim|valid_ip[both]"; //ipv4 , ipv6 , both(ipv4,ipv6) - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + case "ip": //ipv4 , ipv6 , both(ipv4,ipv6) + $rule = sprintf("permit_empty|trim|valid_ip[both]%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "os": $rule = "permit_empty|trim|string"; diff --git a/app/Forms/Equipment/ServerPartForm.php b/app/Forms/Equipment/ServerPartForm.php index 537e125..55bba2c 100644 --- a/app/Forms/Equipment/ServerPartForm.php +++ b/app/Forms/Equipment/ServerPartForm.php @@ -21,7 +21,6 @@ class ServerPartForm extends EquipmentForm break; case "clientinfo_uid": case "serviceinfo_uid": - case "payment_uid": $rule = "permit_empty|numeric"; break; case "title": diff --git a/app/Forms/Part/CPUForm.php b/app/Forms/Part/CPUForm.php index 5e66a6a..24314c7 100644 --- a/app/Forms/Part/CPUForm.php +++ b/app/Forms/Part/CPUForm.php @@ -11,7 +11,7 @@ class CPUForm extends PartForm public function getFormRule(string $action, string $field): string { switch ($field) { - case "format": + case "used": $rule = "required|numeric"; break; default: diff --git a/app/Forms/Part/CSForm.php b/app/Forms/Part/CSForm.php index 50c7ba2..098143b 100644 --- a/app/Forms/Part/CSForm.php +++ b/app/Forms/Part/CSForm.php @@ -14,9 +14,8 @@ class CSForm extends PartForm case "type": $rule = "required|trim|string"; break; - case "ip": - $rule = "required|trim|valid_ip[both]"; //ipv4 , ipv6 , both(ipv4,ipv6) - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + case "ip": //ipv4 , ipv6 , both(ipv4,ipv6) + $rule = sprintf("required|trim|valid_ip[both]%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "accountid": case "domain": diff --git a/app/Forms/Part/DISKForm.php b/app/Forms/Part/DISKForm.php index 58ceac4..6eba63f 100644 --- a/app/Forms/Part/DISKForm.php +++ b/app/Forms/Part/DISKForm.php @@ -11,6 +11,12 @@ class DISKForm extends PartForm public function getFormRule(string $action, string $field): string { switch ($field) { + case "used": + $rule = "required|numeric"; + break; + case "format": + $rule = "required|numeric"; + break; default: $rule = parent::getFormRule($action, $field); break; diff --git a/app/Forms/Part/IPForm.php b/app/Forms/Part/IPForm.php index e1c69a0..6002ad8 100644 --- a/app/Forms/Part/IPForm.php +++ b/app/Forms/Part/IPForm.php @@ -14,9 +14,8 @@ class IPForm extends PartForm case "lineinfo_uid": $rule = "required|numeric"; break; - case "ip": - $rule = "required|trim|valid_ip[both]"; //ipv4 , ipv6 , both(ipv4,ipv6) - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + case "ip": //ipv4 , ipv6 , both(ipv4,ipv6) + $rule = sprintf("required|trim|valid_ip[both]%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "status": $rule = "required|trim|string"; diff --git a/app/Forms/Part/PartForm.php b/app/Forms/Part/PartForm.php index 18e9576..a84cac1 100644 --- a/app/Forms/Part/PartForm.php +++ b/app/Forms/Part/PartForm.php @@ -14,8 +14,7 @@ abstract class PartForm extends CommonForm { switch ($field) { case "title": - $rule = "required|trim|string"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|trim|string%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "clientinfo_uid": case "serviceinfo_uid": diff --git a/app/Forms/Part/RAMForm.php b/app/Forms/Part/RAMForm.php index 92be45e..9def8b6 100644 --- a/app/Forms/Part/RAMForm.php +++ b/app/Forms/Part/RAMForm.php @@ -11,6 +11,9 @@ class RAMForm extends PartForm public function getFormRule(string $action, string $field): string { switch ($field) { + case "used": + $rule = "required|numeric"; + break; default: $rule = parent::getFormRule($action, $field); break; diff --git a/app/Forms/UserForm.php b/app/Forms/UserForm.php index dc9b941..1229583 100644 --- a/app/Forms/UserForm.php +++ b/app/Forms/UserForm.php @@ -26,18 +26,16 @@ class UserForm extends CommonForm { switch ($field) { case "id": - $rule = "required|trim|min_length[4]|max_length[20]"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""; + $rule = sprintf("required|trim|min_length[4]|max_length[20]%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "passwd": - $rule = in_array($action, ["create", "create_form"]) ? "required" : "permit_empty" . "|trim|string"; + $rule = sprintf("%s|%s", in_array($action, ["create", "create_form"]) ? "required" : "permit_empty", "trim|string"); break; case "confirmpassword": - $rule = in_array($action, ["create", "create_form"]) ? "required" : "permit_empty" . "|trim|string|matches[passwd]"; + $rule = sprintf("%s|%s", in_array($action, ["create", "create_form"]) ? "required" : "permit_empty", "trim|string|matches[passwd]"); break; case "email": - $rule = "required|trim|valid_email"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : "" . "|trim|valid_email"; + $rule = sprintf("required|trim|valid_email%s", in_array($action, ["create", "create_form"]) ? "|is_unique[{$this->getAttribute('table')}.{$field}]" : ""); break; case "role": $rule = "required|trim|string"; diff --git a/app/Models/Customer/ServiceModel.php b/app/Models/Customer/ServiceModel.php index ff86a2a..894d4ca 100644 --- a/app/Models/Customer/ServiceModel.php +++ b/app/Models/Customer/ServiceModel.php @@ -19,7 +19,6 @@ class ServiceModel extends CustomerModel "user_uid", "clientinfo_uid", "serverinfo_uid", - "payment_uid", "code", "title", "site", diff --git a/app/Models/Equipment/ServerPartModel.php b/app/Models/Equipment/ServerPartModel.php index 782b5ad..a4672a5 100644 --- a/app/Models/Equipment/ServerPartModel.php +++ b/app/Models/Equipment/ServerPartModel.php @@ -18,7 +18,6 @@ class ServerPartModel extends EquipmentModel "clientinfo_uid", "serverinfo_uid", "serviceinfo_uid", - "payment_uid", "title", "type", "billing", diff --git a/app/Models/Part/PartModel.php b/app/Models/Part/PartModel.php index f55cfed..1c71638 100644 --- a/app/Models/Part/PartModel.php +++ b/app/Models/Part/PartModel.php @@ -18,8 +18,7 @@ abstract class PartModel extends CommonModel } switch ($field) { case "title": - $rule = "required|trim|string"; - $rule .= in_array($action, ["create", "create_form"]) ? "|is_unique[" . $this->getTable() . "." . $field . "]" : ""; + $rule = sprintf("required|trim|string", in_array($action, ["create", "create_form"]) ? "|is_unique[" . $this->getTable() . "." . $field . "]" : ""); break; case "clientinfo_uid": case "serviceinfo_uid": diff --git a/app/Services/Auth/AuthService.php b/app/Services/Auth/AuthService.php index cf0975c..db1d801 100644 --- a/app/Services/Auth/AuthService.php +++ b/app/Services/Auth/AuthService.php @@ -2,38 +2,30 @@ namespace App\Services\Auth; -use App\DTOs\Auth\AuthDTO; -use App\Entities\CommonEntity; +use App\DTOs\Auth\GoogleDTO; +use App\DTOs\Auth\LocalDTO; use App\Entities\UserEntity; use App\Helpers\AuthHelper; -use App\Libraries\AuthContext; use App\Models\CommonModel; -use CodeIgniter\Validation\Exceptions\ValidationException; +use App\Services\CommonService; -/** - * AuthService - * 인증(로그인) 워크플로우를 정의하는 템플릿 클래스입니다. - * CommonService를 상속받지 않아 불필요한 CRUD 구현을 요구하지 않습니다. - */ -abstract class AuthService +abstract class AuthService extends CommonService { private $_helper = null; - private ?AuthContext $_authContext = null; - private array $_classPaths = []; - protected ?CommonModel $model = null; - protected function __construct(CommonModel $model) { - $this->model = $model; // 모델을 직접 주입받아 자식에게 전달 + parent::__construct($model); $this->addClassPaths('Auth'); } - abstract public function action_init_process(string $action); + public function getEntityClass(): string + { + return UserEntity::class; + } abstract public function getFormService(): mixed; final public function getHelper(): AuthHelper { if ($this->_helper === null) { $this->_helper = new AuthHelper(); - // AuthHelper에 필요한 기본 메타데이터만 설정합니다. (CRUD 제거) $this->_helper->setAttributes([ 'pk_field' => $this->model->getPKField(), 'title_field' => $this->model->getTitleField(), @@ -42,72 +34,12 @@ abstract class AuthService } return $this->_helper; } - //인증세션용 - final public function getAuthContext(): AuthContext - { - if ($this->_authContext === null) { - $this->_authContext = new AuthContext(); - } - return $this->_authContext; - } - final protected function addClassPaths(string $path): void - { - $this->_classPaths[] = $path; - } - final public function getClassPaths($isArray = true, $delimeter = DIRECTORY_SEPARATOR): array|string - { - return $isArray ? $this->_classPaths : implode($delimeter, $this->_classPaths); - } - abstract protected function getEntity_process(mixed $entity): CommonEntity; - final public function getEntity(string|int|array $where, ?string $message = null): mixed - { - try { - $entity = is_array($where) ? $this->model->where($where)->first() : $this->model->find($where); - if (!$entity) { - return null; - } - if (is_array($entity)) { - throw new \Exception(__METHOD__ . "에서 결과값 Array 오류발생:\n" . var_export($entity, true)); - } - return $this->getEntity_process($entity); - } catch (\Exception $e) { - $message = sprintf( - "\n------%s SQL오류-----
\n%s\n%s\n------------------------------\n", - __FUNCTION__, - $this->model->getLastQuery(), - $e->getMessage() - ); - throw new \Exception($message); - } - } - final protected function getValidationRules(string $action, array $rules): array - { - $dynamicRules = []; - foreach ($rules as $field => $rule) { - //field별 추가 커스텀 룰 적용 - list($field, $rule) = $this->getValidationRule($field, $rule); - $dynamicRules[$field] = $rule; - } - return $dynamicRules; - } - protected function getValidationRule(string $field, string $rule): array - { - return array($field, $rule); - } - //로그인 abstract protected function login_process(array $formDatas): UserEntity; - public function login(AuthDTO $dto): UserEntity + final public function login(LocalDTO|GoogleDTO $dto): UserEntity { - $formDatas = $dto->toArray(); - // dd($formDatas); - //입력값 검증 - if (!$this->getFormService()->validate($formDatas)) { - throw new ValidationException(implode("\n", service('validation')->getErrors())); - } - //인증처리 - $entity = $this->login_process($formDatas); - //세션처리 + $entity = $this->login_process($dto->toArray()); + //인증 세션처리 $this->getAuthContext()->setAuthSession($entity); return $entity; } diff --git a/app/Services/Auth/GoogleService.php b/app/Services/Auth/GoogleService.php index 7273a16..34eb484 100644 --- a/app/Services/Auth/GoogleService.php +++ b/app/Services/Auth/GoogleService.php @@ -3,13 +3,12 @@ namespace App\Services\Auth; use App\DTOs\Auth\GoogleDTO; -use App\DTOs\Auth\AuthDTO; use App\Entities\UserEntity; use App\Forms\Auth\GoogleForm; use App\Libraries\MySocket\GoogleSocket\CURL; use App\Models\UserModel; use CodeIgniter\Exceptions\PageNotFoundException; -use RuntimeException; +use CodeIgniter\Validation\Exceptions\ValidationException; class GoogleService extends AuthService { @@ -19,6 +18,14 @@ class GoogleService extends AuthService parent::__construct($model); $this->addClassPaths('Google'); } + public function createDTO(array $formDatas): GoogleDTO + { + return new GoogleDTO($formDatas); + } + protected function getDTOClass(): string + { + return GoogleDTO::class; + } public function getFormService(): GoogleForm { if ($this->_form === null) { @@ -33,7 +40,7 @@ class GoogleService extends AuthService } return $this->_form; } - public function action_init_process(string $action): void + public function action_init_process(string $action, array $formDatas = []): void { $fields = ['access_code']; $filters = []; @@ -56,6 +63,11 @@ class GoogleService extends AuthService protected function login_process(array $formDatas): UserEntity { try { + //입력값 검증 + if (!$this->getFormService()->validate($formDatas)) { + throw new ValidationException(implode("\n", service('validation')->getErrors())); + } + $this->socket->setToken($formDatas['access_code']); $sns_entity = $this->socket->signup(); // local db 사용와의 연결 확인 @@ -72,11 +84,4 @@ class GoogleService extends AuthService throw new PageNotFoundException("관리자에게 문의하시기 바랍니다.\n{$e->getMessage()}"); } } - public function login(AuthDTO $dto): UserEntity - { - if (!$dto instanceof GoogleDTO) { - throw new RuntimeException(__METHOD__ . "에서 오류발생: " . get_class($dto) . " DTO는 사용할 수 없습니다. LocalDTO만 허용됩니다."); - } - return parent::login($dto); - } } diff --git a/app/Services/Auth/LocalService.php b/app/Services/Auth/LocalService.php index 10c61cf..7982f49 100644 --- a/app/Services/Auth/LocalService.php +++ b/app/Services/Auth/LocalService.php @@ -2,13 +2,11 @@ namespace App\Services\Auth; -use App\DTOs\Auth\AuthDTO; // 부모 클래스의 타입 힌트를 위해 사용 (알리아스 아님) -use App\DTOs\Auth\LocalDTO; // LocalDTO를 직접 사용 +use App\DTOs\Auth\LocalDTO; use App\Entities\UserEntity; use App\Forms\Auth\LocalForm; use App\Models\UserModel; -use RuntimeException; - +use CodeIgniter\Validation\Exceptions\ValidationException; class LocalService extends AuthService { @@ -18,7 +16,14 @@ class LocalService extends AuthService parent::__construct($model); $this->addClassPaths('Local'); } - + public function createDTO(array $formDatas): LocalDTO + { + return new LocalDTO($formDatas); + } + protected function getDTOClass(): string + { + return LocalDTO::class; + } public function getFormService(): LocalForm { if ($this->_form === null) { @@ -33,7 +38,7 @@ class LocalService extends AuthService } return $this->_form; } - public function action_init_process(string $action): void + public function action_init_process(string $action, array $formDatas = []): void { $fields = ['id', 'passwd']; $filters = []; @@ -54,7 +59,12 @@ class LocalService extends AuthService } protected function login_process(array $formDatas): UserEntity { - $entity = $this->getEntity(['id' => $formDatas['id'], 'status' => 'AVAILABLE'], true); + //입력값 검증 + if (!$this->getFormService()->validate($formDatas)) { + throw new ValidationException(implode("\n", service('validation')->getErrors())); + } + //로그인 정보확인 + $entity = $this->getEntity(['id' => $formDatas['id'], 'status' => 'AVAILABLE']); if (!$entity instanceof UserEntity) { throw new \Exception("{$formDatas['id']}에 대한 로그인 정보를 찾을수 없습니다."); } @@ -63,12 +73,4 @@ class LocalService extends AuthService } return $entity; } - - public function login(AuthDTO $dto): UserEntity - { - if (!$dto instanceof LocalDTO) { - throw new RuntimeException(__METHOD__ . "에서 오류발생: " . get_class($dto) . " DTO는 사용할 수 없습니다. LocalDTO만 허용됩니다."); - } - return parent::login($dto); - } } diff --git a/app/Services/CommonService.php b/app/Services/CommonService.php index b7cdc16..0f27876 100644 --- a/app/Services/CommonService.php +++ b/app/Services/CommonService.php @@ -49,13 +49,9 @@ abstract class CommonService } /** * 단일 엔티티를 조회합니다. - * @return CommonEntity|null CommonEntity 인스턴스 또는 찾지 못했을 경우 null */ - protected function getEntity_process(CommonEntity $entity): CommonEntity - { - return $entity; - } - public function getEntity(string|int|array $where, ?string $message = null): ?object + abstract protected function getEntity_process(CommonEntity $entity): CommonEntity; + final public function getEntity(string|int|array $where, ?string $message = null): ?object { try { $entity = is_array($where) ? $this->model->where($where)->first() : $this->model->find($where); @@ -186,7 +182,7 @@ abstract class CommonService } return $this->save_process($entity); } - final public function create(object $dto): CommonEntity + final public function create(object $dto): object { $db = \Config\Database::connect(); try { @@ -197,10 +193,7 @@ abstract class CommonService if (!$dto instanceof $dtoClass) { throw new RuntimeException(__METHOD__ . "에서 오류발생: " . get_class($dto) . "는 사용할 수 없습니다. ({$dtoClass} 필요)"); } - // NOTE: create_process에서 엔티티를 생성할 때, 자동 증가(AUTO_INCREMENT) 필드는 - // DB가 처리하도록 NULL이나 빈 값(0)으로 두는 것이 일반적입니다. $entity = $this->create_process($dto->toArray()); - // 트랜잭션 완료 및 커밋 $db->transComplete(); return $entity; } catch (DatabaseException $e) { @@ -226,7 +219,7 @@ abstract class CommonService implode("\n", service('validation')->getErrors()) ); } - // 관리자 정보 추가 + //관리자 정보추가용 $formDatas['user_uid'] = $this->getAuthContext()->getUID(); //PK 추가 $pkField = $this->model->getPKField(); @@ -234,15 +227,20 @@ abstract class CommonService // original에 있는 PK 값을 attributes에 명시적으로 복사합니다. $formDatas[$pkField] = $entity->getPK(); } - $entity->fill($formDatas); + // dd($formDatas); + foreach ($formDatas as $key => $value) { + if ($value !== null) { + $entity->$key = $value; + } + } + // dd($entity); return $this->save_process($entity); } - final public function modify(string|int $uid, object $dto): CommonEntity + final public function modify(string|int $uid, object $dto): object { $db = \Config\Database::connect(); try { - //트랜잭션 도중 DB 오류가 발생하면 DatabaseException을 던지도록 설정 $db->transException(true)->transStart(); //DTO 타입 체크 로직을 일반화 $dtoClass = $this->getDTOClass(); @@ -268,7 +266,7 @@ abstract class CommonService } //배치 작업용 수정 - protected function batchjob_process(string|int $uid, array $formDatas): CommonEntity + protected function batchjob_process(string|int $uid, array $formDatas): object { // modify_process를 호출하여 로직 재사용 (PK 로드 및 PK 제거/방어 로직 포함) $entity = $this->modify_process($this->getEntity($uid), $formDatas); @@ -278,7 +276,6 @@ abstract class CommonService { $db = \Config\Database::connect(); try { - //트랜잭션 도중 DB 오류가 발생하면 DatabaseException을 던지도록 설정 $db->transException(true)->transStart(); //DTO 타입 체크 로직을 일반화 $dtoClass = $this->getDTOClass(); @@ -308,7 +305,7 @@ abstract class CommonService } //삭제용 (일반) - protected function delete_process(string|int $uid): CommonEntity + protected function delete_process(string|int $uid): object { if (!$uid) { throw new \Exception("삭제에 필요한 PrimaryKey 가 정의 되지 않았습니다."); @@ -332,11 +329,10 @@ abstract class CommonService } return $entity; } - final public function delete(string|int $uid): CommonEntity + final public function delete(string|int $uid): object { $db = \Config\Database::connect(); try { - //트랜잭션 도중 DB 오류가 발생하면 DatabaseException을 던지도록 설정 $db->transException(true)->transStart(); $entity = $this->delete_process($uid); // 트랜잭션 완료 및 커밋 @@ -357,7 +353,7 @@ abstract class CommonService } //삭제용 (배치 작업) - protected function batchjob_delete_process(string|int $uid): CommonEntity + protected function batchjob_delete_process(string|int $uid): object { // delete_process를 호출하여 로직 재사용 (CommonEntity 로드 및 유효성 검사) $entity = $this->delete_process($uid); @@ -368,7 +364,6 @@ abstract class CommonService { $db = \Config\Database::connect(); try { - //트랜잭션 도중 DB 오류가 발생하면 DatabaseException을 던지도록 설정 $db->transException(true)->transStart(); //일괄작업처리 $entities = []; diff --git a/app/Services/UserService.php b/app/Services/UserService.php index d3a9876..978ec86 100644 --- a/app/Services/UserService.php +++ b/app/Services/UserService.php @@ -101,30 +101,6 @@ class UserService extends CommonService { return $entity; } - protected function create_process(array $formDatas): UserEntity - { - //confirmpassword 필드는 Entity에 필요없으므로 제거 - if (isset($formDatas['confirmpassword'])) { - unset($formDatas['confirmpassword']); - } - $entity = parent::create_process($formDatas); - if (!$entity instanceof UserEntity) { - throw new RuntimeException(__METHOD__ . "에서 오류발생:Return Type은 UserEntity만 가능"); - } - return $entity; - } - protected function modify_process($entity, array $formDatas): UserEntity - { - //confirmpassword 필드는 Entity에 필요없으므로 제거 - if (isset($formDatas['confirmpassword'])) { - unset($formDatas['confirmpassword']); - } - $entity = parent::modify_process($entity, $formDatas); - if (!$entity instanceof UserEntity) { - throw new RuntimeException(__METHOD__ . "에서 오류발생:Return Type은 UserEntity만 가능"); - } - return $entity; - } //List 검색용 //FormFilter 조건절 처리 public function setFilter(string $field, mixed $filter_value): void