diff --git a/Admin/Routes/Web/Backend.php b/Admin/Routes/Web/Backend.php index f47660d..bd69b4e 100644 --- a/Admin/Routes/Web/Backend.php +++ b/Admin/Routes/Web/Backend.php @@ -3,15 +3,15 @@ use phpOMS\Router\RouteVerb; use phpOMS\Account\PermissionType; use Modules\Kanban\Models\PermissionState; -use Modules\Kanban\Controller; +use Modules\Kanban\Controller\BackendController; return [ '^.*/backend/kanban.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:setupStyles', + 'dest' => '\Modules\Kanban\Controller\BackendController:setupStyles', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::KANBAN, ], @@ -19,10 +19,10 @@ return [ ], '^.*/backend/kanban/dashboard.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:viewKanbanDashboard', + 'dest' => '\Modules\Kanban\Controller\BackendController:viewKanbanDashboard', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::KANBAN, ], @@ -30,10 +30,10 @@ return [ ], '^.*/backend/kanban/archive.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:viewKanbanArchive', + 'dest' => '\Modules\Kanban\Controller\BackendController:viewKanbanArchive', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::KANBAN, ], @@ -41,10 +41,10 @@ return [ ], '^.*/backend/kanban/board.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:viewKanbanBoard', + 'dest' => '\Modules\Kanban\Controller\BackendController:viewKanbanBoard', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::BOARD, ], @@ -52,10 +52,10 @@ return [ ], '^.*/backend/kanban/card.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:viewKanbanCard', + 'dest' => '\Modules\Kanban\Controller\BackendController:viewKanbanCard', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::READ, 'state' => PermissionState::CARD, ], @@ -63,10 +63,10 @@ return [ ], '^.*/backend/kanban/create.*$' => [ [ - 'dest' => '\Modules\Kanban\Controller:viewKanbanBoardCreate', + 'dest' => '\Modules\Kanban\Controller\BackendController:viewKanbanBoardCreate', 'verb' => RouteVerb::GET, 'permission' => [ - 'module' => Controller::MODULE_NAME, + 'module' => BackendController::MODULE_NAME, 'type' => PermissionType::CREATE, 'state' => PermissionState::KANBAN, ], diff --git a/Controller/ApiController.php b/Controller/ApiController.php new file mode 100644 index 0000000..e1e5734 --- /dev/null +++ b/Controller/ApiController.php @@ -0,0 +1,229 @@ +validateKanbanCardCreate($request))) { + $response->set('kanban_card_create', new FormValidation($val)); + + return; + } + + $card = $this->createKanbanCardFromRquest($request); + KanbanCardMapper::create($card); + $response->set('card', $card->jsonSerialize()); + } + + public function createKanbanCardFromRquest(RequestAbstract $request) : KanbanCard + { + $mardkownParser = new Markdown(); + + $card = new KanbanCard(); + $card->setName((string) ($request->getData('title'))); + $card->setDescription((string) ($request->getData('plain'))); + $card->setColumn((int) $request->getData('column')); + $card->setOrder((int) $request->getData('order')); + $card->setRef((int) $request->getData('ref')); + $card->setLabels((array) $request->getData('labels')); + $card->setStatus((int) $request->getData('status')); + $card->setType((int) $request->getData('type')); + + return $card; + } + + private function validateKanbanCardCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['plain'] = empty($request->getData('plain'))) + || ($val['column'] = empty($request->getData('column'))) + || ($val['order'] = empty($request->getData('order'))) + || ($val['ref'] = empty($request->getData('ref'))) + || ($val['labels'] = empty($request->getData('labels'))) + || ($val['status'] = ( + $request->getData('status') !== null + && !CardStatus::isValidValue((int) $request->getData('status')) + )) + || ($val['type'] = ( + $request->getData('type') === null + || !CardType::isValidValue((int) $request->getData('type')) + )) + ) { + return $val; + } + + return []; + } + + public function apiKanbanBoardCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateKanbanBoardCreate($request))) { + $response->set('kanban_board_create', new FormValidation($val)); + + return; + } + + $board = $this->createKanbanBoardFromRquest($request); + KanbanBoardMapper::create($board); + $response->set('board', $board->jsonSerialize()); + } + + public function createKanbanBoardFromRquest(RequestAbstract $request) : KanbanBoard + { + $mardkownParser = new Markdown(); + + $board = new KanbanBoard(); + $board->setName((string) $request->getData('title')); + $board->setDescription((string) $request->getData('plain')); + $board->setOrder((int) $request->getData('order')); + $board->setStatus((int) $request->getData('status')); + + return $board; + } + + private function validateKanbanBoardCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['plain'] = empty($request->getData('plain'))) + || ($val['order'] = empty($request->getData('order'))) + || ($val['status'] = ( + $request->getData('status') !== null + && !CardStatus::isValidValue((int) $request->getData('status')) + )) + ) { + return $val; + } + + return []; + } + + public function apiKanbanColumnCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + if (!empty($val = $this->validateKanbanColumnCreate($request))) { + $response->set('kanban_column_create', new FormValidation($val)); + + return; + } + + $column = $this->createKanbanColumnFromRquest($request); + KanbanColumnMapper::create($column); + $response->set('column', $column->jsonSerialize()); + } + + public function createKanbanColumnFromRquest(RequestAbstract $request) : KanbanColumn + { + $mardkownParser = new Markdown(); + + $column = new KanbanColumn(); + $column->setName((string) $request->getData('title')); + $column->setOrder((int) $request->getData('order')); + + return $column; + } + + private function validateKanbanColumnCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['order'] = empty($request->getData('order'))) + ) { + return $val; + } + + return []; + } + + public function apiKanbanLabelCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : void + { + $account = $this->app->accountManager->get($request->getHeader()->getAccount()); + + if (!$account->hasPermission(PermissionType::CREATE, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::BOARD) + && !$account->hasPermission(PermissionType::CREATE, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::LABEL) + ) { + $response->set('kanban_label_create', null); + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + return; + } + + if (!empty($val = $this->validateKanbanLabelCreate($request))) { + $response->set('kanban_label_create', new FormValidation($val)); + + return; + } + + $label = $this->createKanbanLabelFromRquest($request); + KanbanLabelMapper::create($label); + $response->set('label', $label->jsonSerialize()); + } + + public function createKanbanLabelFromRquest(RequestAbstract $request) : KanbanLabel + { + $label = new KanbanLabel(); + $label->setName($request->getData('title')); + $label->setBoard((int) $request->getData('board')); + $label->setcolor((int) $request->getData('color')); + + return $label; + } + + private function validateKanbanLabelCreate(RequestAbstract $request) : array + { + $val = []; + if (($val['title'] = empty($request->getData('title'))) + || ($val['board'] = empty($request->getData('board'))) + || ($val['color'] = empty($request->getData('color'))) + ) { + return $val; + } + + return []; + } +} diff --git a/Controller/BackendController.php b/Controller/BackendController.php new file mode 100644 index 0000000..9564efe --- /dev/null +++ b/Controller/BackendController.php @@ -0,0 +1,188 @@ +get('Content')->getData('head'); + $head->addAsset(AssetType::CSS, '/Modules/Kanban/Theme/Backend/css/styles.css'); + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewKanbanDashboard(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-dashboard'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response)); + + $list = KanbanBoardMapper::getNewest(50); + $view->setData('boards', $list); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewKanbanBoard(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $board = KanbanBoardMapper::get((int) $request->getData('id')); + $accountId = $request->getHeader()->getAccount(); + + if ($board->getCreatedBy()->getId() !== $accountId + && !$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::READ, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::BOARD, $board->getId()) + ) { + $view->setTemplate('/Web/Backend/Error/403_inline'); + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + return $view; + } + + $view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-board'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response)); + + $view->setData('board', $board); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewKanbanBoardCreate(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $accountId = $request->getHeader()->getAccount(); + + if (!$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::CREATE, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::BOARD) + ) { + $view->setTemplate('/Web/Backend/Error/403_inline'); + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + return $view; + } + + $view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-board-create'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response)); + + return $view; + } + + /** + * @param RequestAbstract $request Request + * @param ResponseAbstract $response Response + * @param mixed $data Generic data + * + * @return \Serializable + * + * @since 1.0.0 + * @codeCoverageIgnore + */ + public function viewKanbanCard(RequestAbstract $request, ResponseAbstract $response, $data = null) : \Serializable + { + $view = new View($this->app, $request, $response); + + $card = KanbanCardMapper::get((int) $request->getData('id')); + $accountId = $request->getHeader()->getAccount(); + + if ($card->getCreatedBy()->getId() !== $accountId + && !$this->app->accountManager->get($accountId)->hasPermission( + PermissionType::READ, $this->app->orgId, $this->app->appName, self::MODULE_NAME, PermissionState::CARD, $card->getId()) + ) { + $view->setTemplate('/Web/Backend/Error/403_inline'); + $response->getHeader()->setStatusCode(RequestStatusCode::R_403); + return $view; + } + + $view->setTemplate('/Modules/Kanban/Theme/Backend/kanban-card'); + $view->addData('nav', $this->app->moduleManager->get('Navigation')->createNavigationMid(1005801001, $request, $response)); + $view->setData('card', $card); + + return $view; + } +} diff --git a/Controller.php b/Controller/Controller.php similarity index 98% rename from Controller.php rename to Controller/Controller.php index df625d3..930efe2 100644 --- a/Controller.php +++ b/Controller/Controller.php @@ -12,7 +12,7 @@ */ declare(strict_types=1); -namespace Modules\Kanban; +namespace Modules\Kanban\Controller; use phpOMS\Message\RequestAbstract; use phpOMS\Message\ResponseAbstract; @@ -46,7 +46,7 @@ use Modules\Kanban\Models\BoardStatus; * @link http://website.orange-management.de * @since 1.0.0 */ -final class Controller extends ModuleAbstract implements WebInterface +class Controller extends ModuleAbstract implements WebInterface { /** @@ -55,7 +55,7 @@ final class Controller extends ModuleAbstract implements WebInterface * @var string * @since 1.0.0 */ - public const MODULE_PATH = __DIR__; + public const MODULE_PATH = __DIR__ . '/../'; /** * Module version.