mail-account-admin/src/Frontend/Accounts/AccountController.php

167 lines
5.8 KiB
PHP

<?php
declare(strict_types=1);
namespace MailAccountAdmin\Frontend\Accounts;
use MailAccountAdmin\Common\ActionResult;
use MailAccountAdmin\Common\SessionHelper;
use MailAccountAdmin\Common\UserHelper;
use MailAccountAdmin\Exceptions\InputValidationError;
use MailAccountAdmin\Frontend\BaseController;
use MailAccountAdmin\Repositories\AccountRepository;
use MailAccountAdmin\Repositories\AliasRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Views\Twig;
class AccountController extends BaseController
{
private AccountHandler $accountHandler;
private AccountRepository $accountRepository;
private AliasRepository $aliasRepository;
public function __construct(Twig $view, SessionHelper $sessionHelper, UserHelper $userHelper, AccountHandler $accountHandler, AccountRepository $accountRepository, AliasRepository $aliasRepository)
{
parent::__construct($view, $sessionHelper, $userHelper);
$this->accountHandler = $accountHandler;
$this->accountRepository = $accountRepository;
$this->aliasRepository = $aliasRepository;
}
// -- /accounts - List all accounts
public function showAccounts(Request $request, Response $response): Response
{
// Parse query parameters for filters
$queryParams = $request->getQueryParams();
$filterByDomain = $queryParams['domain'] ?? '';
$renderData = $this->accountHandler->listAccounts($filterByDomain);
return $this->view->render($response, 'accounts.html.twig', $renderData);
}
// -- /accounts/{id} - Show account details
public function showAccountDetails(Request $request, Response $response, array $args): Response
{
// Parse URL arguments
$accountId = (int)$args['id'];
$renderData = $this->accountHandler->getAccountDetails($accountId);
return $this->view->render($response, 'account_details.html.twig', $renderData);
}
// -- /accounts/new - Create new account
public function showAccountCreate(Request $request, Response $response): Response
{
// TODO: just a placeholder
return $this->showAccounts($request, $response);
}
// -- /accounts/{id}/edit - Edit account
public function showAccountEdit(Request $request, Response $response, array $args): Response
{
// Parse URL arguments
$accountId = (int)$args['id'];
// Get account data from database
// TODO use account handler
$account = $this->accountRepository->fetchAccountById($accountId);
$renderData = [
'id' => $account->getId(),
'accountUsername' => $account->getUsername(),
'account' => $account,
];
$lastActionResult = $this->sessionHelper->getLastActionResult();
if ($lastActionResult !== null) {
$resultData = $lastActionResult->isSuccess()
? ['success' => $lastActionResult->getMessage()]
: ['error' => $lastActionResult->getMessage()];
$resultData['editData'] = $lastActionResult->getInputData();
$renderData = array_merge($renderData, $resultData);
}
return $this->view->render($response, 'account_edit.html.twig', $renderData);
}
public function editAccount(Request $request, Response $response, array $args): Response
{
// Parse URL arguments
$accountId = (int)$args['id'];
// Parse form data
$editData = $request->getParsedBody();
$errorMessage = null;
try {
// Validate input
$validatedEditData = AccountEditData::createFromArray($editData);
$this->accountHandler->editAccountData($accountId, $validatedEditData);
} catch (InputValidationError $e) {
$errorMessage = $e->getMessage();
}
if (empty($errorMessage)) {
$this->sessionHelper->setLastActionResult(ActionResult::createSuccessResult('Account data was saved.'));
} else {
$this->sessionHelper->setLastActionResult(ActionResult::createErrorResult($errorMessage, $editData));
}
// Redirect to edit form page via GET (PRG)
return $response->withHeader('Location', '/accounts/' . $accountId . '/edit')->withStatus(303);
}
// -- /accounts/{id}/delete - Delete account
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
$account = $this->accountRepository->fetchAccountById($accountId);
$aliases = $this->aliasRepository->fetchAliasesForUserId($accountId);
$renderData = [
'id' => $accountId,
'accountUsername' => $account->getUsername(),
'aliases' => $aliases,
];
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);
}
}
/*
* TODO:
* ACCOUNTS:
* - "edit account" page
* --> maybe show page == edit page? (maybe '/accounts/{id}[/edit]' route)
* - "delete account" page
* - add/edit/delete aliases for accounts
* - list page: checkboxes for mass editing/deleting? (maybe only deleting, mass editing sounds like pita)
* - list page: checkbox similar to 'show detail columns' -> 'show aliases'?
* - "create account" page
* - edit/create: random password generator
*
* ALIASES:
* - list of aliases (filter by domain, filter by account)
* - edit aliases...? maybe just link to the account edit page
*/