Accounts: Fetch list of all accounts (optionally filtered by domain)
This commit is contained in:
parent
279f4492e8
commit
985f46c652
6 changed files with 145 additions and 9 deletions
|
|
@ -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),
|
||||
);
|
||||
});
|
||||
|
||||
|
|
|
|||
|
|
@ -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);
|
||||
|
|
|
|||
35
src/Repositories/AccountRepository.php
Normal file
35
src/Repositories/AccountRepository.php
Normal 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);
|
||||
}
|
||||
}
|
||||
Loading…
Add table
Add a link
Reference in a new issue