diff --git a/app/DashBoard/Controls/AddUser/Control.latte b/app/DashBoard/Controls/AddUser/Control.latte new file mode 100644 index 00000000..98189dd1 --- /dev/null +++ b/app/DashBoard/Controls/AddUser/Control.latte @@ -0,0 +1 @@ +{control form} diff --git a/app/DashBoard/Controls/AddUser/Control.php b/app/DashBoard/Controls/AddUser/Control.php new file mode 100644 index 00000000..dfa37703 --- /dev/null +++ b/app/DashBoard/Controls/AddUser/Control.php @@ -0,0 +1,81 @@ +userAddEditFormFactory = $userAddEditFormFactory; + $this->usersRepository = $usersRepository; + $this->user = $user; + $this->passwords = $passwords; + } + + + public function render(): void + { + $this->getTemplate()->setFile(__DIR__ . '/Control.latte'); + $this->getTemplate()->render(); + } + + + protected function createComponentForm(): \Nette\Application\UI\Form + { + $form = $this->userAddEditFormFactory->create(); + + $form->getComponent(\Pd\Monitoring\DashBoard\Forms\UserAddEditFormFactory::FIELD_PASSWORD) + ->setRequired(); + + $form->onSuccess[] = function (\Nette\Forms\Form $form, \Pd\Monitoring\DashBoard\Forms\UserEditFormData $values): void + { + $this->processAddForm($form, $values); + }; + + return $form; + } + + + protected function processAddForm(\Nette\Forms\Form $form, \Pd\Monitoring\DashBoard\Forms\UserEditFormData $values): void + { + + $user = new \Pd\Monitoring\User\User(); + $user->gitHubName = $values->gitHubName; + $user->slackId = $values->slackId; + + /** @var bool $administrator */ + $administrator = $values->administrator; + $user->administrator = $administrator; + + $user->email = $values->email; + + /** @var string $password */ + $password = $values->password; + $user->password = $this->passwords->hash($password); + + $this->usersRepository->persistAndFlush($user); + + if ($this->user->isAllowed(\Pd\Monitoring\User\AclFactory::RESOURCE_USER, \Pd\Monitoring\User\AclFactory::PRIVILEGE_ADD)) { + $this->getPresenter()->redirect(':DashBoard:User:'); + } else { + $this->getPresenter()->redirect(':DashBoard:HomePage:'); + } + } + +} diff --git a/app/DashBoard/Controls/AddUser/IFactory.php b/app/DashBoard/Controls/AddUser/IFactory.php new file mode 100644 index 00000000..879df1e5 --- /dev/null +++ b/app/DashBoard/Controls/AddUser/IFactory.php @@ -0,0 +1,10 @@ +identity = $identity; - $this->userEditFormFactory = $userEditFormFactory; + $this->userAddEditFormFactory = $userAddEditFormFactory; $this->usersRepository = $usersRepository; $this->user = $user; $this->passwords = $passwords; @@ -46,10 +46,10 @@ public function render(): void protected function createComponentForm(): \Nette\Application\UI\Form { - $form = $this->userEditFormFactory->create(); + $form = $this->userAddEditFormFactory->create(); if (!$this->user->isAllowed($this->identity, \Pd\Monitoring\User\AclFactory::PRIVILEGE_EDIT)) { - $form->removeComponent($form->getComponent(\Pd\Monitoring\DashBoard\Forms\UserEditFormFactory::FIELD_PASSWORD)); + $form->removeComponent($form->getComponent(\Pd\Monitoring\DashBoard\Forms\UserAddEditFormFactory::FIELD_PASSWORD)); } $form->onSuccess[] = function (\Nette\Forms\Form $form, \Pd\Monitoring\DashBoard\Forms\UserEditFormData $values): void diff --git a/app/DashBoard/Forms/UserEditFormFactory.php b/app/DashBoard/Forms/UserAddEditFormFactory.php similarity index 98% rename from app/DashBoard/Forms/UserEditFormFactory.php rename to app/DashBoard/Forms/UserAddEditFormFactory.php index ad555013..783f61b1 100644 --- a/app/DashBoard/Forms/UserEditFormFactory.php +++ b/app/DashBoard/Forms/UserAddEditFormFactory.php @@ -2,7 +2,7 @@ namespace Pd\Monitoring\DashBoard\Forms; -class UserEditFormFactory +class UserAddEditFormFactory { public const FIELD_GIT_HUB_NAME = 'gitHubName'; diff --git a/app/DashBoard/Presenters/UserPresenter.php b/app/DashBoard/Presenters/UserPresenter.php index ac3a756a..29eddc64 100644 --- a/app/DashBoard/Presenters/UserPresenter.php +++ b/app/DashBoard/Presenters/UserPresenter.php @@ -5,6 +5,8 @@ class UserPresenter extends BasePresenter { + private \Pd\Monitoring\DashBoard\Controls\AddUser\IFactory $addUserControlFactory; + private \Pd\Monitoring\DashBoard\Controls\EditUser\IFactory $editUserControlFactory; private \Pd\Monitoring\User\User $editedUser; @@ -13,11 +15,13 @@ class UserPresenter extends BasePresenter public function __construct( + \Pd\Monitoring\DashBoard\Controls\AddUser\IFactory $addUserControlFactory, \Pd\Monitoring\DashBoard\Controls\EditUser\IFactory $editUserControlFactory, \Pd\Monitoring\DashBoard\Controls\UserList\IFactory $userListControlFactory ) { parent::__construct(); + $this->addUserControlFactory = $addUserControlFactory; $this->editUserControlFactory = $editUserControlFactory; $this->userListControlFactory = $userListControlFactory; } @@ -31,6 +35,14 @@ public function actionDefault(): void } + public function actionAdd(): void + { + if ( ! $this->user->isAllowed(\Pd\Monitoring\User\AclFactory::RESOURCE_USER, \Pd\Monitoring\User\AclFactory::PRIVILEGE_ADD)) { + throw new \Nette\Application\ForbiddenRequestException(); + } + } + + public function actionEdit(\Pd\Monitoring\User\User $user): void { if ( ! $this->user->isAllowed($user, \Pd\Monitoring\User\AclFactory::PRIVILEGE_EDIT)) { @@ -41,6 +53,12 @@ public function actionEdit(\Pd\Monitoring\User\User $user): void } + protected function createComponentAddUser(): \Nette\Application\UI\Control + { + return $this->addUserControlFactory->create(); + } + + protected function createComponentEditUser(): \Nette\Application\UI\Control { return $this->editUserControlFactory->create($this->editedUser); diff --git a/app/DashBoard/Presenters/templates/User/add.latte b/app/DashBoard/Presenters/templates/User/add.latte new file mode 100644 index 00000000..f7bebbb3 --- /dev/null +++ b/app/DashBoard/Presenters/templates/User/add.latte @@ -0,0 +1,8 @@ +{block title} + Přidání uživatele +{/block} + +{block content} + {control addUser} +{/block} + diff --git a/app/DashBoard/Presenters/templates/User/default.latte b/app/DashBoard/Presenters/templates/User/default.latte index 0afba5ac..67d3f89c 100644 --- a/app/DashBoard/Presenters/templates/User/default.latte +++ b/app/DashBoard/Presenters/templates/User/default.latte @@ -5,3 +5,11 @@ {block content} {control userList} {/block} + +{block buttons} +
+{/block} diff --git a/app/User/User.php b/app/User/User.php index b3e4bab9..2a1636cc 100644 --- a/app/User/User.php +++ b/app/User/User.php @@ -4,9 +4,9 @@ /** * @property int $id {primary} - * @property int $gitHubId + * @property int|null $gitHubId * @property string $gitHubName - * @property string $gitHubToken + * @property string|null $gitHubToken * @property bool $administrator * @property string|null $slackId * @property string|null $password diff --git a/app/config/config.neon b/app/config/config.neon index abbcde5d..e5b4942a 100644 --- a/app/config/config.neon +++ b/app/config/config.neon @@ -353,11 +353,14 @@ services: arguments: user: @\Nette\Security\User::getIdentity() + - + implement: Pd\Monitoring\DashBoard\Controls\AddUser\IFactory + - implement: Pd\Monitoring\DashBoard\Controls\EditUser\IFactory - - factory: Pd\Monitoring\DashBoard\Forms\UserEditFormFactory + factory: Pd\Monitoring\DashBoard\Forms\UserAddEditFormFactory - implement: Pd\Monitoring\DashBoard\Controls\Settings\IFactory diff --git a/migrations/structures/2021-09-04-124000-github-null.sql b/migrations/structures/2021-09-04-124000-github-null.sql new file mode 100644 index 00000000..435aee23 --- /dev/null +++ b/migrations/structures/2021-09-04-124000-github-null.sql @@ -0,0 +1,3 @@ +ALTER TABLE `users` + CHANGE `git_hub_id` `git_hub_id` int(11) NULL AFTER `id`, + CHANGE `git_hub_token` `git_hub_token` varchar(255) COLLATE 'utf8_general_ci' NULL AFTER `git_hub_name`; diff --git a/phpstan-baseline.neon b/phpstan-baseline.neon index 88b2ab15..4f2e5c24 100644 --- a/phpstan-baseline.neon +++ b/phpstan-baseline.neon @@ -1521,7 +1521,7 @@ parameters: path: app/Github/Presenters/LoginPresenter.php - - message: "#^Property Pd\\\\Monitoring\\\\User\\\\User\\:\\:\\$gitHubId \\(int\\) does not accept string\\|null\\.$#" + message: "#^Property Pd\\\\Monitoring\\\\User\\\\User\\:\\:\\$gitHubId \\(int\\|null\\) does not accept string\\|null\\.$#" count: 1 path: app/Github/Presenters/LoginPresenter.php