Basic user management

This commit is contained in:
2026-02-05 00:46:22 +01:00
parent e280fcfba8
commit 11108bdfcc
55 changed files with 1524 additions and 54 deletions

View File

@@ -0,0 +1,49 @@
<?php
namespace App\Domains\UserManagement\Actions\GenerateActivationToken;
use App\Domains\MessageSystem\Actions\SendMessage\SendMessageCommand;
use App\Domains\MessageSystem\Actions\SendMessage\SendMessageRequest;
use App\Enumerations\MessageType;
use App\MessageTemplates\activationCodeTemplate;
use App\ValueObjects\EmailAddress;
use App\ValueObjects\MessageRecipient;
use Illuminate\Support\Str;
class GenerateActivationTokenCommand {
private GenerateActivationTokenRequest $request;
public function __construct(GenerateActivationTokenRequest $request) {
$this->request = $request;
}
public function execute() : GenerateActivationTokenResponse {
$response = new GenerateActivationTokenResponse;
$activationCode = Str::password(24,true,true,false,false);
$this->request->user->activation_token = $activationCode;
if (null !== $this->request->expirationDate) {
$this->request->user->activation_token_expires_at = $this->request->expirationDate;
}
$this->request->user->save();
$response->activationCode = $activationCode;
$activationMessage = new activationCodeTemplate();
$activationMessage->composeMessage(EmailAddress::fromString($this->request->user->email), $activationCode);
$recipient = new MessageRecipient();
$recipient->addEmailAddress(EmailAddress::fromString($this->request->user->email));
$recipient->setName($this->request->user->getFullname());
$message = activationCodeTemplate::createForUser(EmailAddress::fromString($this->request->user->email), $activationCode);
$userMessageRequests = new SendMessageRequest($message->getMessage(), $message->getSubject(), $recipient, [MessageType::EMAIL]);
$userMessageCommand = new SendMessageCommand($userMessageRequests);
$userMessageCommand->send();
return $response;
}
}

View File

@@ -0,0 +1,16 @@
<?php
namespace App\Domains\UserManagement\Actions\GenerateActivationToken;
use App\Models\User;
class GenerateActivationTokenRequest {
public User $user;
public ?\DateTime $expirationDate;
public function __construct(User $user, ?\DateTime $expirationDate = null) {
$this->user = $user;
$this->expirationDate = $expirationDate;
}
}

View File

@@ -0,0 +1,7 @@
<?php
namespace App\Domains\UserManagement\Actions\GenerateActivationToken;
class GenerateActivationTokenResponse {
public string $activationCode;
}

View File

@@ -0,0 +1,20 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
class UserActivationCommand {
private UserActivationRequest $request;
public function __construct(UserActivationRequest $request) {
$this->request = $request;
}
public function execute() : UserActivationResponse {
$response = new UserActivationResponse();
$this->request->user->active = true;
$this->request->user->activation_token = null;
$this->request->user->activation_token_expires_at = null;
$this->request->user->save();
$response->success = true;
return $response;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
use App\Models\User;
class UserActivationRequest {
public User $user;
public function __construct(User $user) {
$this->user = $user;
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
class UserActivationResponse {
public bool $success;
public function __construct() {
$this->success = false;
}
}

View File

@@ -0,0 +1,23 @@
<?php
namespace App\Domains\UserManagement\Actions\UserChangePassword;
class UserChangePasswordCommand {
private UserChangePasswordRequest $request;
public function __construct(UserChangePasswordRequest $request)
{
$this->request = $request;
}
public function execute() : UserChangePasswordResponse {
$response = new UserChangePasswordResponse();
$this->request->user->password = $this->request->newPassword;
$this->request->user->save();
$response->success = true;
return $response;
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Domains\UserManagement\Actions\UserChangePassword;
use App\Models\User;
class UserChangePasswordRequest {
public User $user;
public string $newPassword;
public function __construct(User $user, string $newPassword) {
$this->user = $user;
$this->newPassword = $newPassword;
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Domains\UserManagement\Actions\UserChangePassword;
class UserChangePasswordResponse {
public bool $success;
public function __construct() {
$this->success = false;
}
}

View File

@@ -0,0 +1,21 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
class UserDeactivationCommand {
private UserDeactivationRequest $request;
public function __construct(UserDeactivationRequest $request) {
$this->request = $request;
}
public function execute() : UserDeactivationResponse {
$response = new UserDeactivationResponse();
$this->request->user->active = false;
$this->request->user->password = NULL;
$this->request->user->username = 'deleted-' . $this->request->user->username;
$this->request->user->email = 'null@example.com';
$this->request->user->save();
$response->success = true;
return $response;
}
}

View File

@@ -0,0 +1,14 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
use App\Models\User;
class UserDeactivationRequest {
public User $user;
public function __construct(User $user) {
$this->user = $user;
}
}

View File

@@ -0,0 +1,11 @@
<?php
namespace App\Domains\UserManagement\Actions\UserActivation;
class UserDeactivationResponse {
public bool $success;
public function __construct() {
$this->success = false;
}
}

View File

@@ -0,0 +1,60 @@
<?php
namespace App\Domains\UserManagement\Actions\UserRegistration;
use App\Domains\MessageSystem\Actions\SendMessage\SendMessageCommand;
use App\Domains\MessageSystem\Actions\SendMessage\SendMessageRequest;
use App\Domains\UserManagement\Actions\GenerateActivationToken\GenerateActivationTokenCommand;
use App\Domains\UserManagement\Actions\GenerateActivationToken\GenerateActivationTokenRequest;
use App\Enumerations\MessageType;
use App\MessageTemplates\Registration\InformAdminAboutNewUserTemplate;
use App\Models\User;
use App\ValueObjects\EmailAddress;
use App\ValueObjects\MessageRecipient;
class UserRegistrationCommand {
private UserRegistrationRequest $request;
public function __construct(UserRegistrationRequest $request) {
$this->request = $request;
}
public function execute() : UserRegistrationResponse {
$response = new UserRegistrationResponse;
$user = User::create([
'user_role_main' => $this->request->userRoleMain,
'user_role_local_group' => $this->request->userRoleLocalGroup,
'username' => $this->request->email->getValue(),
'local_group' => $this->request->localGroup,
'firstname' => $this->request->firstname,
'lastname' => $this->request->lastname,
'nickname' => $this->request->nickname !== '' ? $this->request->nickname : null,
'email' => $this->request->email->getValue(),
]);
if ($user === null) {
return $response;
}
$generateActivationCoedeRequest = new GenerateActivationTokenRequest($user);
$generateActivationCoedeDommand = new GenerateActivationTokenCommand($generateActivationCoedeRequest);
$result = $generateActivationCoedeDommand->execute();
$user->activation_token = $result->activationCode;
$siteAdmin = new MessageRecipient();
$siteAdmin->addEmailAddress(EmailAddress::fromString(env('APP_ADMIN_MAIL')));
$siteAdmin->setName(env('APP_ADMIN_NAME'));
$registrationMessage = InformAdminAboutNewUserTemplate::createNew($user);
$registrationMessageRequest = new SendMessageRequest($registrationMessage->getMessage(), $registrationMessage->getSubject(), $siteAdmin, [MessageType::EMAIL]);
$registrationMessageCommand = new SendMessageCommand($registrationMessageRequest);
$registrationMessageCommand->send();
$response->user = $user;
$response->success = true;
return $response;
}
}

View File

@@ -0,0 +1,25 @@
<?php
namespace App\Domains\UserManagement\Actions\UserRegistration;
use App\ValueObjects\EmailAddress;
class UserRegistrationRequest {
public string $firstname;
public string $lastname;
public EmailAddress $email;
public string $nickname;
public string $userRoleMain;
public string $userRoleLocalGroup;
public string $localGroup;
public function __construct(string $firstname, string $lastname, string $nickname, EmailAddress $email, string $userRoleMain, string $userRoleLocalGroup, string $localGroup) {
$this->firstname = $firstname;
$this->lastname = $lastname;
$this->nickname = $nickname;
$this->email = $email;
$this->userRoleMain = $userRoleMain;
$this->userRoleLocalGroup = $userRoleLocalGroup;
$this->localGroup = $localGroup;
}
}

View File

@@ -0,0 +1,15 @@
<?php
namespace App\Domains\UserManagement\Actions\UserRegistration;
use App\Models\User;
class UserRegistrationResponse {
public ?User $user;
public bool $success;
public function __construct() {
$this->user = null;
$this->success = false;
}
}