Accounts: Fetch list of all accounts (optionally filtered by domain)

This commit is contained in:
Lexi / Zoe 2021-07-30 03:46:43 +02:00
parent 279f4492e8
commit 985f46c652
Signed by: binaryDiv
GPG key ID: F8D4956E224DA232
6 changed files with 145 additions and 9 deletions

View file

@ -9,6 +9,7 @@ use MailAccountAdmin\Frontend\Accounts\AccountController;
use MailAccountAdmin\Frontend\Domains\DomainController;
use MailAccountAdmin\Frontend\Login\LoginController;
use MailAccountAdmin\Frontend\Dashboard\DashboardController;
use MailAccountAdmin\Repositories\AccountRepository;
use MailAccountAdmin\Repositories\AdminUserRepository;
use MailAccountAdmin\Repositories\DomainRepository;
use PDO;
@ -64,6 +65,11 @@ class Dependencies
$c->get(self::DATABASE),
);
});
$container->set(AccountRepository::class, function (ContainerInterface $c) {
return new AccountRepository(
$c->get(self::DATABASE),
);
});
// Helper classes
$container->set(UserHelper::class, function (ContainerInterface $c) {
@ -97,6 +103,7 @@ class Dependencies
return new AccountController(
$c->get(self::TWIG),
$c->get(UserHelper::class),
$c->get(AccountRepository::class),
);
});

View file

@ -3,15 +3,33 @@ declare(strict_types=1);
namespace MailAccountAdmin\Frontend\Accounts;
use MailAccountAdmin\Common\UserHelper;
use MailAccountAdmin\Frontend\BaseController;
use MailAccountAdmin\Repositories\AccountRepository;
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;
public function __construct(Twig $view, UserHelper $userHelper, AccountRepository $accountRepository)
{
parent::__construct($view, $userHelper);
$this->accountRepository = $accountRepository;
}
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);

View file

@ -0,0 +1,35 @@
<?php
declare(strict_types=1);
namespace MailAccountAdmin\Repositories;
use PDO;
class AccountRepository extends BaseRepository
{
public function fetchAccountList(string $filterByDomain = null): array
{
$queryWhere = '';
$queryParams = [];
if (!empty($filterByDomain)) {
$queryWhere = 'WHERE REGEXP_REPLACE(username, "^.*@", "") LIKE :domain';
$queryParams['domain'] = str_replace('*', '%', $filterByDomain);
}
$query = '
SELECT
mail_users.*,
REGEXP_REPLACE(username, "^.*@", "") AS domain,
COUNT(alias_id) AS alias_count
FROM mail_users
LEFT JOIN mail_aliases ON mail_users.user_id = mail_aliases.user_id
' . $queryWhere . '
GROUP BY username
ORDER BY domain, username
';
$statement = $this->pdo->prepare($query);
$statement->execute($queryParams);
return $statement->fetchAll(PDO::FETCH_ASSOC);
}
}