2021-07-29 18:15:38 +02:00
|
|
|
<?php
|
|
|
|
|
declare(strict_types=1);
|
|
|
|
|
|
|
|
|
|
namespace MailAccountAdmin\Frontend\Accounts;
|
|
|
|
|
|
2021-08-15 17:40:35 +02:00
|
|
|
use MailAccountAdmin\Common\ActionResult;
|
|
|
|
|
use MailAccountAdmin\Common\SessionHelper;
|
2021-07-30 03:46:43 +02:00
|
|
|
use MailAccountAdmin\Common\UserHelper;
|
2021-08-15 17:40:35 +02:00
|
|
|
use MailAccountAdmin\Exceptions\InputValidationError;
|
2021-07-29 18:15:38 +02:00
|
|
|
use MailAccountAdmin\Frontend\BaseController;
|
|
|
|
|
use Psr\Http\Message\ResponseInterface as Response;
|
|
|
|
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
2021-07-30 03:46:43 +02:00
|
|
|
use Slim\Views\Twig;
|
2021-07-29 18:15:38 +02:00
|
|
|
|
|
|
|
|
class AccountController extends BaseController
|
|
|
|
|
{
|
2021-09-12 21:33:35 +02:00
|
|
|
private AccountHandler $accountHandler;
|
2021-07-30 03:46:43 +02:00
|
|
|
|
2021-09-12 22:16:06 +02:00
|
|
|
public function __construct(Twig $view, SessionHelper $sessionHelper, UserHelper $userHelper, AccountHandler $accountHandler)
|
2021-07-30 03:46:43 +02:00
|
|
|
{
|
2021-08-15 17:40:35 +02:00
|
|
|
parent::__construct($view, $sessionHelper, $userHelper);
|
|
|
|
|
$this->accountHandler = $accountHandler;
|
2021-07-30 03:46:43 +02:00
|
|
|
}
|
|
|
|
|
|
2021-08-14 23:37:23 +02:00
|
|
|
|
|
|
|
|
// -- /accounts - List all accounts
|
|
|
|
|
|
2021-07-29 18:15:38 +02:00
|
|
|
public function showAccounts(Request $request, Response $response): Response
|
|
|
|
|
{
|
2021-07-30 03:46:43 +02:00
|
|
|
// Parse query parameters for filters
|
|
|
|
|
$queryParams = $request->getQueryParams();
|
2021-08-15 17:40:35 +02:00
|
|
|
$filterByDomain = $queryParams['domain'] ?? '';
|
2021-07-29 18:15:38 +02:00
|
|
|
|
2021-08-15 17:40:35 +02:00
|
|
|
$renderData = $this->accountHandler->listAccounts($filterByDomain);
|
2021-07-29 18:15:38 +02:00
|
|
|
return $this->view->render($response, 'accounts.html.twig', $renderData);
|
|
|
|
|
}
|
2021-07-30 22:30:30 +02:00
|
|
|
|
2021-08-14 23:37:23 +02:00
|
|
|
|
|
|
|
|
// -- /accounts/{id} - Show account details
|
|
|
|
|
|
2021-07-30 22:30:30 +02:00
|
|
|
public function showAccountDetails(Request $request, Response $response, array $args): Response
|
|
|
|
|
{
|
|
|
|
|
// Parse URL arguments
|
|
|
|
|
$accountId = (int)$args['id'];
|
|
|
|
|
|
2021-08-15 17:40:35 +02:00
|
|
|
$renderData = $this->accountHandler->getAccountDetails($accountId);
|
2021-07-30 22:30:30 +02:00
|
|
|
return $this->view->render($response, 'account_details.html.twig', $renderData);
|
|
|
|
|
}
|
2021-07-31 00:34:35 +02:00
|
|
|
|
2021-08-14 23:37:23 +02:00
|
|
|
|
|
|
|
|
// -- /accounts/new - Create new account
|
|
|
|
|
|
2021-07-31 00:34:35 +02:00
|
|
|
public function showAccountCreate(Request $request, Response $response): Response
|
|
|
|
|
{
|
2021-09-16 16:10:45 +02:00
|
|
|
$renderData = $this->accountHandler->getPageDataForCreate();
|
|
|
|
|
|
|
|
|
|
// If the form has been submitted, add the result message and form input data to the render data array
|
|
|
|
|
$lastActionResult = $this->sessionHelper->getLastActionResult();
|
|
|
|
|
if ($lastActionResult !== null) {
|
|
|
|
|
$renderData = array_merge($renderData, $lastActionResult->getRenderData());
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->view->render($response, 'account_create.html.twig', $renderData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function createAccount(Request $request, Response $response): Response
|
|
|
|
|
{
|
|
|
|
|
// Parse form data
|
|
|
|
|
$createData = $request->getParsedBody();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Validate input
|
|
|
|
|
$validatedCreateData = AccountCreateData::createFromArray($createData);
|
|
|
|
|
$newAccountId = $this->accountHandler->createNewAccount($validatedCreateData);
|
|
|
|
|
|
|
|
|
|
// Save success result
|
|
|
|
|
$newAccountName = $validatedCreateData->getUsername();
|
|
|
|
|
$this->sessionHelper->setLastActionResult(ActionResult::createSuccessResult(
|
|
|
|
|
'Account <a href="/accounts/' . $newAccountId . '">' . $newAccountName . '</a> was created.'
|
|
|
|
|
));
|
|
|
|
|
} catch (InputValidationError $e) {
|
|
|
|
|
// Save error result
|
|
|
|
|
$this->sessionHelper->setLastActionResult(ActionResult::createErrorResult($e->getMessage(), $createData));
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Redirect to edit form page via GET (PRG)
|
|
|
|
|
return $response->withHeader('Location', '/accounts/new')->withStatus(303);
|
2021-07-31 00:34:35 +02:00
|
|
|
}
|
|
|
|
|
|
2021-08-14 23:37:23 +02:00
|
|
|
|
|
|
|
|
// -- /accounts/{id}/edit - Edit account
|
|
|
|
|
|
2021-07-31 00:34:35 +02:00
|
|
|
public function showAccountEdit(Request $request, Response $response, array $args): Response
|
|
|
|
|
{
|
|
|
|
|
// Parse URL arguments
|
|
|
|
|
$accountId = (int)$args['id'];
|
|
|
|
|
|
|
|
|
|
// Get account data from database
|
2021-09-12 22:16:06 +02:00
|
|
|
$renderData = $this->accountHandler->getAccountDataForEdit($accountId);
|
2021-08-14 23:37:23 +02:00
|
|
|
|
2021-09-12 22:16:06 +02:00
|
|
|
// If the form has been submitted, add the result message and form input data to the render data array
|
2021-08-15 17:40:35 +02:00
|
|
|
$lastActionResult = $this->sessionHelper->getLastActionResult();
|
|
|
|
|
if ($lastActionResult !== null) {
|
2021-09-12 22:16:06 +02:00
|
|
|
$renderData = array_merge($renderData, $lastActionResult->getRenderData());
|
2021-08-15 17:40:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return $this->view->render($response, 'account_edit.html.twig', $renderData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function editAccount(Request $request, Response $response, array $args): Response
|
|
|
|
|
{
|
2021-09-16 16:10:45 +02:00
|
|
|
// Parse URL arguments and form data
|
2021-08-15 17:40:35 +02:00
|
|
|
$accountId = (int)$args['id'];
|
|
|
|
|
$editData = $request->getParsedBody();
|
|
|
|
|
|
|
|
|
|
try {
|
|
|
|
|
// Validate input
|
|
|
|
|
$validatedEditData = AccountEditData::createFromArray($editData);
|
|
|
|
|
$this->accountHandler->editAccountData($accountId, $validatedEditData);
|
|
|
|
|
|
2021-09-16 16:10:45 +02:00
|
|
|
// Save success result
|
2021-08-15 17:40:35 +02:00
|
|
|
$this->sessionHelper->setLastActionResult(ActionResult::createSuccessResult('Account data was saved.'));
|
2021-09-16 16:10:45 +02:00
|
|
|
} catch (InputValidationError $e) {
|
|
|
|
|
// Save error result
|
|
|
|
|
$this->sessionHelper->setLastActionResult(ActionResult::createErrorResult($e->getMessage(), $editData));
|
2021-08-15 17:40:35 +02:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// Redirect to edit form page via GET (PRG)
|
|
|
|
|
return $response->withHeader('Location', '/accounts/' . $accountId . '/edit')->withStatus(303);
|
2021-08-14 23:37:23 +02:00
|
|
|
}
|
|
|
|
|
|
2021-08-15 17:40:35 +02:00
|
|
|
|
2021-08-14 23:37:23 +02:00
|
|
|
// -- /accounts/{id}/delete - Delete account
|
|
|
|
|
|
2021-07-31 00:34:35 +02:00
|
|
|
public function showAccountDelete(Request $request, Response $response, array $args): Response
|
|
|
|
|
{
|
|
|
|
|
// Parse URL arguments
|
|
|
|
|
$accountId = (int)$args['id'];
|
|
|
|
|
|
|
|
|
|
// Get account data and list of aliases from database
|
2021-09-12 22:16:06 +02:00
|
|
|
$renderData = $this->accountHandler->getAccountDataForDelete($accountId);
|
2021-07-31 00:34:35 +02:00
|
|
|
|
|
|
|
|
return $this->view->render($response, 'account_delete.html.twig', $renderData);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
public function deleteAccount(Request $request, Response $response, array $args): Response
|
|
|
|
|
{
|
|
|
|
|
// TODO: just a placeholder
|
|
|
|
|
$this->view->getEnvironment()->addGlobal('error', 'Not implemented yet!');
|
|
|
|
|
return $this->showAccountDelete($request, $response, $args);
|
|
|
|
|
}
|
2021-07-29 18:15:38 +02:00
|
|
|
}
|