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

128 lines
4.5 KiB
PHP
Raw Normal View History

<?php
declare(strict_types=1);
namespace MailAccountAdmin\Frontend\Accounts;
use MailAccountAdmin\Common\UserHelper;
use MailAccountAdmin\Frontend\BaseController;
use MailAccountAdmin\Repositories\AccountRepository;
2021-07-30 22:30:30 +02:00
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
{
/** @var AccountRepository */
private $accountRepository;
2021-07-30 22:30:30 +02:00
/** @var AliasRepository */
private $aliasRepository;
2021-07-30 22:30:30 +02:00
public function __construct(Twig $view, UserHelper $userHelper, AccountRepository $accountRepository, AliasRepository $aliasRepository)
{
parent::__construct($view, $userHelper);
$this->accountRepository = $accountRepository;
2021-07-30 22:30:30 +02:00
$this->aliasRepository = $aliasRepository;
}
public function showAccounts(Request $request, Response $response): Response
{
// Parse query parameters for filters
$queryParams = $request->getQueryParams();
$filterByDomain = $queryParams['domain'] ?? null;
$renderData = [
'filterDomain' => $filterByDomain,
'accountList' => $this->accountRepository->fetchAccountList($filterByDomain),
];
return $this->view->render($response, 'accounts.html.twig', $renderData);
}
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'];
// Get account data from database
$accountData = $this->accountRepository->fetchAccountById($accountId);
$accountUsername = $accountData['username'];
$accountData['domain'] = explode('@', $accountUsername, 2)[1];
// Don't display the password hash, but at least the type of hash (used hash algorithm)
if ($accountData['password'] === '') {
$passwordHashType = 'empty';
} else {
$passwordHashInfo = password_get_info($accountData['password']);
$passwordHashType = $passwordHashInfo['algoName'] ?? 'unknown';
}
// Get list of aliases for this account
$aliases = $this->aliasRepository->fetchAliasesForUserId($accountId);
$renderData = [
'id' => $accountId,
'accountUsername' => $accountUsername,
'accountData' => $accountData,
'passwordHashType' => $passwordHashType,
'aliases' => $aliases,
];
return $this->view->render($response, 'account_details.html.twig', $renderData);
}
public function showAccountCreate(Request $request, Response $response): Response
{
return $this->showAccounts($request, $response);
}
public function showAccountEdit(Request $request, Response $response, array $args): Response
{
// Parse URL arguments
$accountId = (int)$args['id'];
// Get account data from database
$accountData = $this->accountRepository->fetchAccountById($accountId);
$renderData = [
'id' => $accountId,
'accountUsername' => $accountData['username'],
'accountData' => $accountData,
];
return $this->view->render($response, 'account_edit.html.twig', $renderData);
}
public function editAccount(Request $request, Response $response, array $args): Response
{
// TODO: just a placeholder
$this->view->getEnvironment()->addGlobal('error', 'Not implemented yet!');
return $this->showAccountEdit($request, $response, $args);
}
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
$accountData = $this->accountRepository->fetchAccountById($accountId);
$aliases = $this->aliasRepository->fetchAliasesForUserId($accountId);
$renderData = [
'id' => $accountId,
'accountUsername' => $accountData['username'],
'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);
}
}