diff --git a/src/Module/Templates/DemoWeb/src/Middlewares/BaseMiddleware.php.tpl b/src/Module/Templates/DemoWeb/src/Middlewares/BaseMiddleware.php.tpl index 583ff6dde..df09e85c2 100644 --- a/src/Module/Templates/DemoWeb/src/Middlewares/BaseMiddleware.php.tpl +++ b/src/Module/Templates/DemoWeb/src/Middlewares/BaseMiddleware.php.tpl @@ -1,5 +1,17 @@ + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 2.9.9 + */ + namespace {{MODULE_NAMESPACE}}\Middlewares; use Quantum\Libraries\Validation\Validator; diff --git a/src/Module/Templates/Toolkit/src/Controllers/DashboardController.php.tpl b/src/Module/Templates/Toolkit/src/Controllers/DashboardController.php.tpl index 8c4bdf9d8..94276df2e 100644 --- a/src/Module/Templates/Toolkit/src/Controllers/DashboardController.php.tpl +++ b/src/Module/Templates/Toolkit/src/Controllers/DashboardController.php.tpl @@ -9,14 +9,14 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Modules\Toolkit\Controllers; use Quantum\Service\Exceptions\ServiceException; use Modules\Toolkit\Services\DashboardService; -use Quantum\Service\Factories\ServiceFactory; +use Quantum\App\Exceptions\BaseException; use Quantum\Di\Exceptions\DiException; use Quantum\Http\Response; use Quantum\Http\Request; @@ -37,12 +37,13 @@ class DashboardController extends BaseController /** * @throws DiException - * @throws ServiceException * @throws ReflectionException + * @throws ServiceException + * @throws BaseException */ public function __before() { - $this->dashboardService = ServiceFactory::get(DashboardService::class); + $this->dashboardService = service(DashboardService::class); parent::__before(); } diff --git a/src/Module/Templates/Toolkit/src/Controllers/DatabaseController.php.tpl b/src/Module/Templates/Toolkit/src/Controllers/DatabaseController.php.tpl index 14ed8ef69..c14c48f87 100644 --- a/src/Module/Templates/Toolkit/src/Controllers/DatabaseController.php.tpl +++ b/src/Module/Templates/Toolkit/src/Controllers/DatabaseController.php.tpl @@ -9,14 +9,13 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Modules\Toolkit\Controllers; use Quantum\Libraries\Database\Exceptions\DatabaseException; use Modules\Toolkit\Services\DatabaseService; -use Quantum\Service\Factories\ServiceFactory; use Quantum\Http\Response; use Quantum\Http\Request; @@ -37,7 +36,7 @@ class DatabaseController extends BaseController */ public function __before() { - $this->databaseService = ServiceFactory::get(DatabaseService::class); + $this->databaseService = service(DatabaseService::class); parent::__before(); } diff --git a/src/Module/Templates/Toolkit/src/Controllers/EmailsController.php.tpl b/src/Module/Templates/Toolkit/src/Controllers/EmailsController.php.tpl index 801d97362..ce989073c 100644 --- a/src/Module/Templates/Toolkit/src/Controllers/EmailsController.php.tpl +++ b/src/Module/Templates/Toolkit/src/Controllers/EmailsController.php.tpl @@ -9,13 +9,12 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Modules\Toolkit\Controllers; use Quantum\Service\Exceptions\ServiceException; -use Quantum\Service\Factories\ServiceFactory; use Modules\Toolkit\Services\EmailService; use Quantum\Di\Exceptions\DiException; use Quantum\Http\Response; @@ -42,7 +41,7 @@ class EmailsController extends BaseController */ public function __before() { - $this->emailService = ServiceFactory::get(EmailService::class); + $this->emailService = service(EmailService::class); parent::__before(); } diff --git a/src/Module/Templates/Toolkit/src/Controllers/LogsController.php.tpl b/src/Module/Templates/Toolkit/src/Controllers/LogsController.php.tpl index ce324c80e..14880291d 100644 --- a/src/Module/Templates/Toolkit/src/Controllers/LogsController.php.tpl +++ b/src/Module/Templates/Toolkit/src/Controllers/LogsController.php.tpl @@ -9,13 +9,13 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Modules\Toolkit\Controllers; use Quantum\Service\Exceptions\ServiceException; -use Quantum\Service\Factories\ServiceFactory; +use Quantum\App\Exceptions\BaseException; use Modules\Toolkit\Services\LogsService; use Quantum\Di\Exceptions\DiException; use Quantum\Http\Response; @@ -28,6 +28,7 @@ use ReflectionException; */ class LogsController extends BaseController { + /** * Logs service * @var LogsService @@ -36,12 +37,13 @@ class LogsController extends BaseController /** * @throws DiException - * @throws ServiceException * @throws ReflectionException + * @throws ServiceException + * @throws BaseException */ public function __before() { - $this->logsService = ServiceFactory::get(LogsService::class); + $this->logsService = service(LogsService::class); parent::__before(); } diff --git a/src/Module/Templates/Toolkit/src/Middlewares/BaseMiddleware.php.tpl b/src/Module/Templates/Toolkit/src/Middlewares/BaseMiddleware.php.tpl new file mode 100644 index 000000000..261e0b0d0 --- /dev/null +++ b/src/Module/Templates/Toolkit/src/Middlewares/BaseMiddleware.php.tpl @@ -0,0 +1,75 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 2.9.9 + */ + +namespace Modules\Toolkit\Middlewares; + +use Quantum\Libraries\Validation\Validator; +use Quantum\Middleware\QtMiddleware; +use Quantum\Http\Response; +use Quantum\Http\Request; + +/** + * Class BaseMiddleware + * @package Modules\{{MODULE_NAME}} + */ +abstract class BaseMiddleware extends QtMiddleware +{ + + /** + * @var Validator + */ + protected $validator; + + /** + * Initialize Validator and define rules. + * @param Request $request + */ + public function __construct(Request $request) + { + $this->validator = new Validator(); + + $this->defineValidationRules($request); + } + + /** + * @param Request $request + * @param Response $response + */ + protected function validateRequest(Request $request, Response $response) + { + if (!$this->validator->isValid($request->all())) { + $this->respondWithError($request, $response, $this->validator->getErrors()); + } + } + + /** + * Define validation rules specific to middleware. + * @param Request $request + */ + protected function defineValidationRules(Request $request) + { + // default no-op: subclasses override if needed + } + + /** + * Handles error response logic. + * @param Request $request + * @param Response $response + * @param mixed $message + */ + protected function respondWithError(Request $request, Response $response, $message) + { + // default no-op: subclasses override if needed + } +} \ No newline at end of file diff --git a/src/Module/Templates/Toolkit/src/Middlewares/CreateTable.php.tpl b/src/Module/Templates/Toolkit/src/Middlewares/CreateTable.php.tpl new file mode 100644 index 000000000..0a350551e --- /dev/null +++ b/src/Module/Templates/Toolkit/src/Middlewares/CreateTable.php.tpl @@ -0,0 +1,90 @@ + + * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) + * @link http://quantum.softberg.org/ + * @since 2.9.9 + */ + +namespace Modules\Toolkit\Middlewares; + +use Modules\Toolkit\Services\DatabaseService; +use Quantum\Service\Factories\ServiceFactory; +use Quantum\Libraries\Validation\Rule; +use Quantum\Http\Response; +use Quantum\Http\Request; +use Closure; + +/** + * Class CreateTable + * @package Modules\Toolkit + */ +class CreateTable extends BaseMiddleware +{ + + /** + * @param Request $request + * @param Response $response + * @param Closure $next + * @return mixed + */ + public function apply(Request $request, Response $response, Closure $next) + { + $this->validateRequest($request, $response); + + return $next($request, $response); + } + + /** + * @inheritDoc + */ + protected function defineValidationRules(Request $request) + { + $this->registerCustomRules(); + + $originalTableName = $request->get('originalName'); + + $this->validator->setRules([ + 'table' => [ + Rule::required(), + Rule::uniqueTableName($originalTableName) + ], + 'data' => [ + Rule::required(), + Rule::jsonString(), + Rule::nonEmptyJson() + ] + ]); + } + + /** + * @inheritDoc + */ + protected function respondWithError(Request $request, Response $response, $message) + { + session()->setFlash('error', $message); + redirect(get_referrer()); + } + + /** + * Registers custom validation rules + */ + private function registerCustomRules(): void + { + $this->validator->addRule('uniqueTableName', function ($value, $except = null) { + $databaseService = ServiceFactory::get(DatabaseService::class); + return !$databaseService->tableExists($value, $except); + }); + + $this->validator->addRule('nonEmptyJson', function ($value) { + $decoded = json_decode($value, true); + return is_array($decoded) && !empty($decoded); + }); + } +} \ No newline at end of file diff --git a/src/Module/Templates/Toolkit/src/Middlewares/UniqueTable.php.tpl b/src/Module/Templates/Toolkit/src/Middlewares/UniqueTable.php.tpl deleted file mode 100644 index 5e441ca48..000000000 --- a/src/Module/Templates/Toolkit/src/Middlewares/UniqueTable.php.tpl +++ /dev/null @@ -1,67 +0,0 @@ - - * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) - * @link http://quantum.softberg.org/ - * @since 2.9.8 - */ - -namespace Modules\Toolkit\Middlewares; - -use Modules\Toolkit\Services\DatabaseService; -use Quantum\Service\Factories\ServiceFactory; -use Quantum\Libraries\Validation\Validator; -use Quantum\Libraries\Validation\Rule; -use Quantum\Middleware\QtMiddleware; -use Quantum\Http\Response; -use Quantum\Http\Request; -use Closure; - -/** - * Class UniqueTable - * @package Modules\Toolkit - */ -class UniqueTable extends QtMiddleware -{ - public function __construct(Request $request, Response $response) - { - $this->validator = new Validator(); - - $this->validator->addValidation('uniqueTableName', function ($value, $except = null) { - $databaseService = ServiceFactory::get(DatabaseService::class); - return !$databaseService->tableExists($value, $except); - }); - - $originalTableName = $request->get('originalName'); - - $this->validator->addRules([ - 'table' => [ - Rule::set('required'), - Rule::set('uniqueTableName', $originalTableName) - ] - ]); - } - - /** - * @param Request $request - * @param Response $response - * @param Closure $next - * @return mixed - */ - public function apply(Request $request, Response $response, Closure $next) - { - if (!$this->validator->isValid($request->all())) { - session()->setFlash('error', $this->validator->getErrors()); - redirect(get_referrer()); - } - - return $next($request, $response); - } - -} \ No newline at end of file diff --git a/src/Module/Templates/Toolkit/src/Services/DatabaseService.php.tpl b/src/Module/Templates/Toolkit/src/Services/DatabaseService.php.tpl index 6a028aa70..e848e7333 100644 --- a/src/Module/Templates/Toolkit/src/Services/DatabaseService.php.tpl +++ b/src/Module/Templates/Toolkit/src/Services/DatabaseService.php.tpl @@ -9,14 +9,13 @@ * @author Arman Ag. * @copyright Copyright (c) 2018 Softberg LLC (https://softberg.org) * @link http://quantum.softberg.org/ - * @since 2.9.8 + * @since 2.9.9 */ namespace Modules\Toolkit\Services; use Quantum\Libraries\Storage\Exceptions\FileSystemException; use Quantum\Config\Exceptions\ConfigException; -use Quantum\Model\Factories\ModelFactory; use Quantum\App\Exceptions\BaseException; use Quantum\Di\Exceptions\DiException; use Quantum\Paginator\Paginator; @@ -93,9 +92,7 @@ class DatabaseService extends QtService */ public function getTableData(string $tableName, int $perPage, int $currentPage): array { - $table = ModelFactory::createDynamicModel($tableName); - - $paginator = $table + $paginator = dynamicModel($tableName) ->orderBy("id", "DESC") ->paginate($perPage, $currentPage); @@ -114,9 +111,9 @@ class DatabaseService extends QtService */ public function createTableRow(string $tableName, array $data): void { - $table = ModelFactory::createDynamicModel($tableName); + $model = dynamicModel($tableName); - $row = $table->create(); + $row = $model->create(); foreach ($data as $field => $value) { $row->prop($field, $value); @@ -134,9 +131,9 @@ class DatabaseService extends QtService */ public function updateTable(string $tableName, int $id, array $data): void { - $table = ModelFactory::createDynamicModel($tableName); + $model = dynamicModel($tableName); - $row = $table->findOne($id); + $row = $model->findOne($id); foreach ($data as $field => $value) { $row->prop($field, $value); @@ -153,9 +150,7 @@ class DatabaseService extends QtService */ public function deleteTableRow(string $tableName, int $id): void { - $table = ModelFactory::createDynamicModel($tableName); - - $table->findOne($id)->delete(); + dynamicModel($tableName)->findOne($id)->delete(); } /** @@ -166,6 +161,7 @@ class DatabaseService extends QtService private function extractColumns(Paginator $paginator): array { $firstRow = $paginator->firstItem(); + if (!$firstRow) { return []; } diff --git a/src/Module/Templates/Toolkit/src/helpers/toolkit.php.tpl b/src/Module/Templates/Toolkit/src/helpers/toolkit.php.tpl index 51fb3ea66..1c34efb5b 100644 --- a/src/Module/Templates/Toolkit/src/helpers/toolkit.php.tpl +++ b/src/Module/Templates/Toolkit/src/helpers/toolkit.php.tpl @@ -12,7 +12,6 @@ * @since 2.9.8 */ - const LEVEL_ATTRIBUTES = [ 'emergency' => [ 'class' => 'red-text text-darken-4', diff --git a/src/Module/Templates/Toolkit/src/routes/routes.php.tpl b/src/Module/Templates/Toolkit/src/routes/routes.php.tpl index f5d916666..832d416d6 100644 --- a/src/Module/Templates/Toolkit/src/routes/routes.php.tpl +++ b/src/Module/Templates/Toolkit/src/routes/routes.php.tpl @@ -13,7 +13,7 @@ return function ($route) { $route->get('database', 'DatabaseController', 'list'); $route->get('database/view', 'DatabaseController', 'single'); - $route->post('database/create', 'DatabaseController', 'create')->middlewares(['UniqueTable']); + $route->post('database/create', 'DatabaseController', 'create')->middlewares(['CreateTable']); $route->post('database/update', 'DatabaseController', 'update'); $route->get('database/delete', 'DatabaseController', 'delete'); })->middlewares(['BasicAuth']);