Domains: Fetch list of domains from database

This commit is contained in:
Lexi / Zoe 2021-07-30 01:50:36 +02:00
parent b890432e5b
commit d5789fdedf
Signed by: binaryDiv
GPG Key ID: F8D4956E224DA232
7 changed files with 98 additions and 11 deletions

View File

@ -104,3 +104,9 @@ h2 {
button {
padding: 0.2em 1em;
}
table, tr, td, th {
border: 1px solid #999999;
border-collapse: collapse;
padding: 0.25em 0.5em;
}

View File

@ -10,6 +10,7 @@ use MailAccountAdmin\Frontend\Domains\DomainController;
use MailAccountAdmin\Frontend\Login\LoginController;
use MailAccountAdmin\Frontend\Dashboard\DashboardController;
use MailAccountAdmin\Repositories\AdminUserRepository;
use MailAccountAdmin\Repositories\DomainRepository;
use PDO;
use Psr\Container\ContainerInterface;
use Slim\Views\Twig;
@ -58,6 +59,11 @@ class Dependencies
$c->get(self::DATABASE),
);
});
$container->set(DomainRepository::class, function (ContainerInterface $c) {
return new DomainRepository(
$c->get(self::DATABASE),
);
});
// Helper classes
$container->set(UserHelper::class, function (ContainerInterface $c) {
@ -84,6 +90,7 @@ class Dependencies
return new DomainController(
$c->get(self::TWIG),
$c->get(UserHelper::class),
$c->get(DomainRepository::class),
);
});
$container->set(AccountController::class, function (ContainerInterface $c) {

View File

@ -3,15 +3,28 @@ declare(strict_types=1);
namespace MailAccountAdmin\Frontend\Domains;
use MailAccountAdmin\Common\UserHelper;
use MailAccountAdmin\Frontend\BaseController;
use MailAccountAdmin\Repositories\DomainRepository;
use Psr\Http\Message\ResponseInterface as Response;
use Psr\Http\Message\ServerRequestInterface as Request;
use Slim\Views\Twig;
class DomainController extends BaseController
{
/** @var DomainRepository */
private $domainRepository;
public function __construct(Twig $view, UserHelper $userHelper, DomainRepository $domainRepository)
{
parent::__construct($view, $userHelper);
$this->domainRepository = $domainRepository;
}
public function showDomains(Request $request, Response $response): Response
{
$renderData = [
'domainList' => $this->domainRepository->fetchDomainList(),
];
return $this->view->render($response, 'domains.html.twig', $renderData);

View File

@ -7,16 +7,8 @@ use MailAccountAdmin\Exceptions\AdminUserNotFoundException;
use MailAccountAdmin\Models\AdminUser;
use PDO;
class AdminUserRepository
class AdminUserRepository extends BaseRepository
{
/** @var PDO */
private $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
/**
* @throws AdminUserNotFoundException
*/

View File

@ -0,0 +1,17 @@
<?php
declare(strict_types=1);
namespace MailAccountAdmin\Repositories;
use PDO;
class BaseRepository
{
/** @var PDO */
protected $pdo;
public function __construct(PDO $pdo)
{
$this->pdo = $pdo;
}
}

View File

@ -0,0 +1,38 @@
<?php
declare(strict_types=1);
namespace MailAccountAdmin\Repositories;
use PDO;
class DomainRepository extends BaseRepository
{
public function fetchDomainList(): array
{
// Fetch domains with account/alias count from database
$statement = $this->pdo->query('
SELECT
REGEXP_REPLACE(address, "^.*@", "") AS domain,
COUNT(is_account) AS account_count,
COUNT(is_alias) AS alias_count
FROM (
SELECT username AS address, 1 AS is_account, NULL AS is_alias FROM mail_users
UNION
SELECT mail_address AS address, NULL AS is_account, 1 AS is_alias FROM mail_aliases
) AS addresses
GROUP BY domain
');
$domainRows = $statement->fetchAll(PDO::FETCH_ASSOC);
$domainsCounted = [];
foreach ($domainRows as $row) {
$domainsCounted[$row['domain']] = [
'accounts' => $row['account_count'],
'aliases' => $row['alias_count'],
];
}
ksort($domainsCounted);
return $domainsCounted;
}
}

View File

@ -5,6 +5,20 @@
{% block content %}
<h2>Domains</h2>
<p>List of domains ... <b>TODO</b></p>
<p><a href="/domains/42">Test</a></p>
<p>This is a list of all domains auto-generated from the existing mail accounts and aliases. As such it is read-only.</p>
<table>
<tr>
<th style="min-width: 12em">Domain</th>
<th>Accounts</th>
<th>Aliases</th>
</tr>
{% for domain, domainCounts in domainList -%}
<tr>
<td><a href="/accounts?domain={{ domain | escape('url') }}">{{ domain }}</a></td>
<td>{{ domainCounts['accounts'] }}</td>
<td>{{ domainCounts['aliases'] }}</td>
</tr>
{% endfor %}
</table>
{% endblock %}