Domains: Fetch list of domains from database
This commit is contained in:
parent
b890432e5b
commit
d5789fdedf
|
|
@ -104,3 +104,9 @@ h2 {
|
||||||
button {
|
button {
|
||||||
padding: 0.2em 1em;
|
padding: 0.2em 1em;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
table, tr, td, th {
|
||||||
|
border: 1px solid #999999;
|
||||||
|
border-collapse: collapse;
|
||||||
|
padding: 0.25em 0.5em;
|
||||||
|
}
|
||||||
|
|
|
||||||
|
|
@ -10,6 +10,7 @@ use MailAccountAdmin\Frontend\Domains\DomainController;
|
||||||
use MailAccountAdmin\Frontend\Login\LoginController;
|
use MailAccountAdmin\Frontend\Login\LoginController;
|
||||||
use MailAccountAdmin\Frontend\Dashboard\DashboardController;
|
use MailAccountAdmin\Frontend\Dashboard\DashboardController;
|
||||||
use MailAccountAdmin\Repositories\AdminUserRepository;
|
use MailAccountAdmin\Repositories\AdminUserRepository;
|
||||||
|
use MailAccountAdmin\Repositories\DomainRepository;
|
||||||
use PDO;
|
use PDO;
|
||||||
use Psr\Container\ContainerInterface;
|
use Psr\Container\ContainerInterface;
|
||||||
use Slim\Views\Twig;
|
use Slim\Views\Twig;
|
||||||
|
|
@ -58,6 +59,11 @@ class Dependencies
|
||||||
$c->get(self::DATABASE),
|
$c->get(self::DATABASE),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
|
$container->set(DomainRepository::class, function (ContainerInterface $c) {
|
||||||
|
return new DomainRepository(
|
||||||
|
$c->get(self::DATABASE),
|
||||||
|
);
|
||||||
|
});
|
||||||
|
|
||||||
// Helper classes
|
// Helper classes
|
||||||
$container->set(UserHelper::class, function (ContainerInterface $c) {
|
$container->set(UserHelper::class, function (ContainerInterface $c) {
|
||||||
|
|
@ -84,6 +90,7 @@ class Dependencies
|
||||||
return new DomainController(
|
return new DomainController(
|
||||||
$c->get(self::TWIG),
|
$c->get(self::TWIG),
|
||||||
$c->get(UserHelper::class),
|
$c->get(UserHelper::class),
|
||||||
|
$c->get(DomainRepository::class),
|
||||||
);
|
);
|
||||||
});
|
});
|
||||||
$container->set(AccountController::class, function (ContainerInterface $c) {
|
$container->set(AccountController::class, function (ContainerInterface $c) {
|
||||||
|
|
|
||||||
|
|
@ -3,15 +3,28 @@ declare(strict_types=1);
|
||||||
|
|
||||||
namespace MailAccountAdmin\Frontend\Domains;
|
namespace MailAccountAdmin\Frontend\Domains;
|
||||||
|
|
||||||
|
use MailAccountAdmin\Common\UserHelper;
|
||||||
use MailAccountAdmin\Frontend\BaseController;
|
use MailAccountAdmin\Frontend\BaseController;
|
||||||
|
use MailAccountAdmin\Repositories\DomainRepository;
|
||||||
use Psr\Http\Message\ResponseInterface as Response;
|
use Psr\Http\Message\ResponseInterface as Response;
|
||||||
use Psr\Http\Message\ServerRequestInterface as Request;
|
use Psr\Http\Message\ServerRequestInterface as Request;
|
||||||
|
use Slim\Views\Twig;
|
||||||
|
|
||||||
class DomainController extends BaseController
|
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
|
public function showDomains(Request $request, Response $response): Response
|
||||||
{
|
{
|
||||||
$renderData = [
|
$renderData = [
|
||||||
|
'domainList' => $this->domainRepository->fetchDomainList(),
|
||||||
];
|
];
|
||||||
|
|
||||||
return $this->view->render($response, 'domains.html.twig', $renderData);
|
return $this->view->render($response, 'domains.html.twig', $renderData);
|
||||||
|
|
|
||||||
|
|
@ -7,16 +7,8 @@ use MailAccountAdmin\Exceptions\AdminUserNotFoundException;
|
||||||
use MailAccountAdmin\Models\AdminUser;
|
use MailAccountAdmin\Models\AdminUser;
|
||||||
use PDO;
|
use PDO;
|
||||||
|
|
||||||
class AdminUserRepository
|
class AdminUserRepository extends BaseRepository
|
||||||
{
|
{
|
||||||
/** @var PDO */
|
|
||||||
private $pdo;
|
|
||||||
|
|
||||||
public function __construct(PDO $pdo)
|
|
||||||
{
|
|
||||||
$this->pdo = $pdo;
|
|
||||||
}
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* @throws AdminUserNotFoundException
|
* @throws AdminUserNotFoundException
|
||||||
*/
|
*/
|
||||||
|
|
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -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;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
@ -5,6 +5,20 @@
|
||||||
{% block content %}
|
{% block content %}
|
||||||
<h2>Domains</h2>
|
<h2>Domains</h2>
|
||||||
|
|
||||||
<p>List of domains ... <b>TODO</b></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>
|
||||||
<p><a href="/domains/42">Test</a></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 %}
|
{% endblock %}
|
||||||
|
|
|
||||||
Loading…
Reference in New Issue