diff --git a/public/static/style.css b/public/static/style.css index 4fd2214..993d5da 100644 --- a/public/static/style.css +++ b/public/static/style.css @@ -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; +} diff --git a/src/Dependencies.php b/src/Dependencies.php index ac6fbb4..e3cc9f7 100644 --- a/src/Dependencies.php +++ b/src/Dependencies.php @@ -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) { diff --git a/src/Frontend/Domains/DomainController.php b/src/Frontend/Domains/DomainController.php index 172e25f..5451a1c 100644 --- a/src/Frontend/Domains/DomainController.php +++ b/src/Frontend/Domains/DomainController.php @@ -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); diff --git a/src/Repositories/AdminUserRepository.php b/src/Repositories/AdminUserRepository.php index 84376f5..bc10c38 100644 --- a/src/Repositories/AdminUserRepository.php +++ b/src/Repositories/AdminUserRepository.php @@ -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 */ diff --git a/src/Repositories/BaseRepository.php b/src/Repositories/BaseRepository.php new file mode 100644 index 0000000..2108442 --- /dev/null +++ b/src/Repositories/BaseRepository.php @@ -0,0 +1,17 @@ +pdo = $pdo; + } +} diff --git a/src/Repositories/DomainRepository.php b/src/Repositories/DomainRepository.php new file mode 100644 index 0000000..94dddb9 --- /dev/null +++ b/src/Repositories/DomainRepository.php @@ -0,0 +1,38 @@ +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; + } +} diff --git a/templates/domains.html.twig b/templates/domains.html.twig index 6ac7814..f1f5ef7 100644 --- a/templates/domains.html.twig +++ b/templates/domains.html.twig @@ -5,6 +5,20 @@ {% block content %}
List of domains ... TODO
- +This is a list of all domains auto-generated from the existing mail accounts and aliases. As such it is read-only.
+ +| Domain | +Accounts | +Aliases | +
|---|---|---|
| {{ domain }} | +{{ domainCounts['accounts'] }} | +{{ domainCounts['aliases'] }} | +