Implement account creation; add base class FormData to validate forms

This commit is contained in:
Lexi / Zoe 2021-09-16 16:10:45 +02:00
parent 23127dd193
commit 48925f283f
Signed by: binaryDiv
GPG key ID: F8D4956E224DA232
13 changed files with 392 additions and 96 deletions

View file

@ -8,17 +8,21 @@ use MailAccountAdmin\Exceptions\AccountNotFoundException;
use MailAccountAdmin\Exceptions\InputValidationError;
use MailAccountAdmin\Repositories\AccountRepository;
use MailAccountAdmin\Repositories\AliasRepository;
use MailAccountAdmin\Repositories\DomainRepository;
class AccountHandler
{
private AccountRepository $accountRepository;
private AliasRepository $aliasRepository;
private DomainRepository $domainRepository;
private PasswordHelper $passwordHelper;
public function __construct(AccountRepository $accountRepository, AliasRepository $aliasRepository, PasswordHelper $passwordHelper)
public function __construct(AccountRepository $accountRepository, AliasRepository $aliasRepository, DomainRepository $domainRepository,
PasswordHelper $passwordHelper)
{
$this->accountRepository = $accountRepository;
$this->aliasRepository = $aliasRepository;
$this->domainRepository = $domainRepository;
$this->passwordHelper = $passwordHelper;
}
@ -59,6 +63,45 @@ class AccountHandler
}
// -- /accounts/new - Create new account
public function getPageDataForCreate(): array
{
return [
'domainList' => array_keys($this->domainRepository->fetchDomainList()),
];
}
public function createNewAccount(AccountCreateData $createData): int
{
// Check if new username is still available
$username = $createData->getUsername();
if (!$this->accountRepository->checkUsernameAvailable($username) || !$this->aliasRepository->checkAliasAvailable($username)) {
throw new InputValidationError("Username \"$username\" is not available.");
}
// Hash new password
$passwordHash = $this->passwordHelper->hashPassword($createData->getPassword());
// Construct home directory from username if necessary
if ($createData->getHomeDir() !== null) {
$homeDir = $createData->getHomeDir();
} else {
[$localPart, $domainPart] = explode('@', $username, 2);
$homeDir = $domainPart . '/' . $localPart;
}
// Create account in database
return $this->accountRepository->insertAccount(
$username,
$passwordHash,
$createData->getActive(),
$homeDir,
$createData->getMemo()
);
}
// -- /accounts/{id}/edit - Edit account data
public function getAccountDataForEdit(int $accountId): array