full working version

This commit is contained in:
flo 2025-01-04 04:01:24 +01:00
parent 9565270c19
commit 9e493dcc33
27 changed files with 276 additions and 52 deletions

View File

@ -8,8 +8,12 @@ return [
], ],
'permissions' => [ 'permissions' => [
'user' => [ 'user' => [
'user.change-password',
'user.change-username',
], ],
'admin' => [ 'admin' => [
'user.change-password',
'user.change-username',
'user.create', 'user.create',
'user.read-list', 'user.read-list',
], ],

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 946 B

View File

@ -51,16 +51,10 @@
<div id="message-block" class="message-block"> <div id="message-block" class="message-block">
<p>Hallo {$username},</p> <p>Hallo {$username},</p>
<br /> <br />
<p>Herzlich willkommen beim Template!</p> <p>Herzlich willkommen bei Template!</p>
<br /> <br />
<p>Ich konnte deine Anmeldung nun bestätigen.</p>
<p>Bitte klicke auf <a href="{$confirmationLink}">diesen Link</a> um dein Passwort festzulegen.</p> <p>Bitte klicke auf <a href="{$confirmationLink}">diesen Link</a> um dein Passwort festzulegen.</p>
<p>Danach ist deine Registierung abgeschlossen und du kannst loslegen!</p> <p>Danach ist deine Registierung abgeschlossen und du kannst loslegen!</p>
<br />
<p>Mit grünen Grüßen,</p>
<p>{$growerName}</p>
<br />
<p class="quote">"Smoke weed everyday" - Snoop Dogg</p>
</div> </div>
</body> </body>
</html> </html>

Binary file not shown.

Before

Width:  |  Height:  |  Size: 1.7 KiB

After

Width:  |  Height:  |  Size: 946 B

View File

@ -55,9 +55,6 @@
<p>Bitte klicke auf <a href="{$passwordResetLink}">diesen Link</a> um ein neues Passwort zu vergeben.</p> <p>Bitte klicke auf <a href="{$passwordResetLink}">diesen Link</a> um ein neues Passwort zu vergeben.</p>
<br /> <br />
<p>Wenn du dein Passwort nicht zurückgesetzt hast, kannst du diese Nachricht ignorieren!</p> <p>Wenn du dein Passwort nicht zurückgesetzt hast, kannst du diese Nachricht ignorieren!</p>
<br />
<p>Mit fleißigen Grüßen,</p>
<p>Der Template</p>
</div> </div>
</body> </body>
</html> </html>

View File

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace Template\Migrations\Bee; namespace Template\Migrations\Template;
use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\AbstractMigration;
@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/** /**
* Auto-generated Migration: Please modify to your needs! * Auto-generated Migration: Please modify to your needs!
*/ */
final class Version20240827155813 extends AbstractMigration final class Version20250104024640 extends AbstractMigration
{ {
public function getDescription(): string public function getDescription(): string
{ {

View File

@ -2,7 +2,7 @@
declare(strict_types=1); declare(strict_types=1);
namespace Bee\Migrations\Bee; namespace Template\Migrations\Template;
use Doctrine\DBAL\Schema\Schema; use Doctrine\DBAL\Schema\Schema;
use Doctrine\Migrations\AbstractMigration; use Doctrine\Migrations\AbstractMigration;
@ -10,7 +10,7 @@ use Doctrine\Migrations\AbstractMigration;
/** /**
* Auto-generated Migration: Please modify to your needs! * Auto-generated Migration: Please modify to your needs!
*/ */
final class Version20240911191301 extends AbstractMigration final class Version20250104024641 extends AbstractMigration
{ {
public function getDescription(): string public function getDescription(): string
{ {

View File

@ -22,10 +22,8 @@ class ConfirmRegistrationResponseFormatter
return [ return [
'id' => $user->getId()->toString(), 'id' => $user->getId()->toString(),
'username' => $user->getUsername(), 'username' => $user->getUsername(),
'role' => $user->getRole()->getIdentifier(), 'roleIdentifier' => $user->getRole()->getIdentifier(),
'permissions' => $permissions, 'permissions' => $permissions
'created' => $user->getCreatedAt()->format(DateTimeInterface::RFC3339),
'updated' => $user->getUpdatedAt()->format(DateTimeInterface::RFC3339)
]; ];
} }
} }

View File

@ -7,6 +7,8 @@ namespace Template\API\External\Authentication\ForgotPassword;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\RequestHandlerInterface;
use Template\Handling\User\Exception\UserNotFoundByMailException;
use Template\Infrastructure\Request\Middleware\AnalyzeHeaderMiddleware;
use Template\Infrastructure\Response\SuccessResponse; use Template\Infrastructure\Response\SuccessResponse;
use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware; use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware;
use Template\Handling\Authentication\UseCase\ForgotPassword\ForgotPasswordUseCaseHandler; use Template\Handling\Authentication\UseCase\ForgotPassword\ForgotPasswordUseCaseHandler;
@ -22,11 +24,16 @@ class ForgotPasswordRequestHandler implements RequestHandlerInterface
) { ) {
} }
public function handle(ServerRequestInterface $request): ResponseInterface /**
* @throws UserNotFoundByMailException
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{ {
$host = $request->getAttribute(AnalyzeHeaderMiddleware::HOST_ATTRIBUTE);
$data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA); $data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA);
$useCase = $this->builder->build( $useCase = $this->builder->build(
$host,
$data['mail'], $data['mail'],
); );
$result = $this->handler->handle($useCase); $result = $this->handler->handle($useCase);

View File

@ -7,6 +7,7 @@ namespace Template\API\External\Authentication\RegisterUser;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\RequestHandlerInterface;
use Template\Infrastructure\Request\Middleware\AnalyzeHeaderMiddleware;
use Template\Infrastructure\Response\SuccessResponse; use Template\Infrastructure\Response\SuccessResponse;
use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware; use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware;
use Template\Handling\Registration\UseCase\RegisterUser\RegisterUserUseCaseHandler; use Template\Handling\Registration\UseCase\RegisterUser\RegisterUserUseCaseHandler;
@ -24,9 +25,11 @@ class RegisterUserRequestHandler implements RequestHandlerInterface
public function handle(ServerRequestInterface $request): ResponseInterface public function handle(ServerRequestInterface $request): ResponseInterface
{ {
$host = $request->getAttribute(AnalyzeHeaderMiddleware::HOST_ATTRIBUTE);
$data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA); $data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA);
$useCase = $this->builder->build( $useCase = $this->builder->build(
$host,
$data['username'], $data['username'],
$data['mail'], $data['mail'],
); );

View File

@ -8,6 +8,8 @@ use Ramsey\Uuid\Uuid;
use Psr\Http\Message\ResponseInterface; use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\RequestHandlerInterface;
use Template\Handling\User\Exception\UserPasswordConfirmationMismatchException;
use Template\Handling\User\Exception\UserPasswordTokenNotFoundByIdException;
use Template\Infrastructure\Response\SuccessResponse; use Template\Infrastructure\Response\SuccessResponse;
use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware; use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware;
use Template\Handling\Authentication\UseCase\ResetPassword\ResetPasswordUseCaseHandler; use Template\Handling\Authentication\UseCase\ResetPassword\ResetPasswordUseCaseHandler;
@ -23,7 +25,11 @@ class ResetPasswordRequestHandler implements RequestHandlerInterface
) { ) {
} }
public function handle(ServerRequestInterface $request): ResponseInterface /**
* @throws UserPasswordTokenNotFoundByIdException
* @throws UserPasswordConfirmationMismatchException
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{ {
$data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA); $data = $request->getAttribute(AnalyzeBodyMiddleware::JSON_DATA);

View File

@ -8,6 +8,7 @@ use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface; use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\RequestHandlerInterface; use Psr\Http\Server\RequestHandlerInterface;
use Template\Data\Business\Entity\User; use Template\Data\Business\Entity\User;
use Template\Handling\User\Exception\UserWrongPasswordException;
use Template\Infrastructure\Response\SuccessResponse; use Template\Infrastructure\Response\SuccessResponse;
use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware; use Template\Infrastructure\Request\Middleware\AnalyzeBodyMiddleware;
use Template\Handling\User\UseCase\ChangePassword\ChangePasswordUseCaseHandler; use Template\Handling\User\UseCase\ChangePassword\ChangePasswordUseCaseHandler;
@ -24,7 +25,10 @@ class ChangePasswordRequestHandler implements RequestHandlerInterface
) { ) {
} }
public function handle(ServerRequestInterface $request): ResponseInterface /**
* @throws UserWrongPasswordException
*/
public function handle(ServerRequestInterface $request): ResponseInterface
{ {
/** @var User $user */ /** @var User $user */
$user = $request->getAttribute(LoggedInUserMiddleware::USER_KEY); $user = $request->getAttribute(LoggedInUserMiddleware::USER_KEY);

View File

@ -32,10 +32,10 @@ return [
LogoutUserUseCaseHandler::class => AutoWiringFactory::class, LogoutUserUseCaseHandler::class => AutoWiringFactory::class,
LogoutUserUseCaseBuilder::class => AutoWiringFactory::class, LogoutUserUseCaseBuilder::class => AutoWiringFactory::class,
/// ForgotPassword /// ForgotPassword
ForgotPasswordUseCaseHandler::class => AutoWiringFactory::class, ForgotPasswordUseCaseHandler::class => InjectionFactory::class,
ForgotPasswordUseCaseBuilder::class => AutoWiringFactory::class, ForgotPasswordUseCaseBuilder::class => AutoWiringFactory::class,
/// ResetPassword /// ResetPassword
ResetPasswordUseCaseHandler::class => AutoWiringFactory::class, ResetPasswordUseCaseHandler::class => InjectionFactory::class,
ResetPasswordUseCaseBuilder::class => AutoWiringFactory::class, ResetPasswordUseCaseBuilder::class => AutoWiringFactory::class,
] ]
]; ];

View File

@ -7,10 +7,16 @@ namespace Template\Handling\Authentication\UseCase\ForgotPassword;
class ForgotPasswordUseCase class ForgotPasswordUseCase
{ {
public function __construct( public function __construct(
private readonly string $domain,
private readonly string $mail, private readonly string $mail,
) { ) {
} }
public function getDomain(): string
{
return $this->domain;
}
public function getMail(): string public function getMail(): string
{ {
return $this->mail; return $this->mail;

View File

@ -7,9 +7,11 @@ namespace Template\Handling\Authentication\UseCase\ForgotPassword;
class ForgotPasswordUseCaseBuilder class ForgotPasswordUseCaseBuilder
{ {
public function build( public function build(
string $domain,
string $mail, string $mail,
): ForgotPasswordUseCase { ): ForgotPasswordUseCase {
return new ForgotPasswordUseCase( return new ForgotPasswordUseCase(
$domain,
$mail, $mail,
); );
} }

View File

@ -4,14 +4,68 @@ declare(strict_types=1);
namespace Template\Handling\Authentication\UseCase\ForgotPassword; namespace Template\Handling\Authentication\UseCase\ForgotPassword;
use Reinfi\DependencyInjection\Annotation\Inject;
use Reinfi\DependencyInjection\Annotation\InjectDoctrineRepository;
use Template\Data\Business\Entity\User;
use Template\Data\Business\Manager\EntityManager;
use Template\Data\Business\Repository\UserRepository;
use Template\Handling\User\Builder\UserPasswordTokenBuilder;
use Template\Handling\User\Exception\UserNotFoundByMailException;
use Template\Infrastructure\Mail\Service\MailService;
class ForgotPasswordUseCaseHandler class ForgotPasswordUseCaseHandler
{ {
private const RESET_PASSWORD_LINK = "https://%s/auth/reset-password/%s";
/**
* @InjectDoctrineRepository(
* entityManager="Template\Data\Business\Manager\EntityManager",
* entity="Template\Data\Business\Entity\User"
* )
* @Inject("Template\Handling\User\Builder\UserPasswordTokenBuilder")
* @Inject("Template\Infrastructure\Mail\Service\MailService")
* @Inject("Template\Data\Business\Manager\EntityManager")
*/
public function __construct( public function __construct(
private readonly UserRepository $userRepository,
private readonly UserPasswordTokenBuilder $passwordTokenBuilder,
private readonly MailService $mailService,
private readonly EntityManager $entityManager,
) { ) {
} }
public function handle(ForgotPasswordUseCase $useCase): ForgotPasswordUseCaseResult /**
* @throws UserNotFoundByMailException
*/
public function handle(ForgotPasswordUseCase $useCase): ForgotPasswordUseCaseResult
{ {
return new ForgotPasswordUseCaseResult(); $mail = $useCase->getMail();
/** @var User $user */
$user = $this->userRepository->findOneBy(['mail' => $mail]);
if ($user === null) {
throw new UserNotFoundByMailException($mail);
}
$passwordToken = $this->passwordTokenBuilder->build($user);
$this->entityManager->persist($passwordToken);
$this->entityManager->flush();
$this->mailService->enqueue(
'reset-password',
templateData: [
'username' => $user->getUsername(),
'passwordResetLink' => sprintf(
self::RESET_PASSWORD_LINK,
$useCase->getDomain(),
$passwordToken->getId()->toString()
)
],
recipient: $mail,
);
return new ForgotPasswordUseCaseResult();
} }
} }

View File

@ -4,14 +4,64 @@ declare(strict_types=1);
namespace Template\Handling\Authentication\UseCase\ResetPassword; namespace Template\Handling\Authentication\UseCase\ResetPassword;
use Reinfi\DependencyInjection\Annotation\Inject;
use Reinfi\DependencyInjection\Annotation\InjectDoctrineRepository;
use Template\Data\Business\Entity\UserPasswordToken;
use Template\Data\Business\Manager\EntityManager;
use Template\Data\Business\Repository\UserPasswordTokenRepository;
use Template\Handling\User\Exception\UserPasswordConfirmationMismatchException;
use Template\Handling\User\Exception\UserPasswordTokenNotFoundByIdException;
use Template\Infrastructure\Encryption\Client\EncryptionClient;
class ResetPasswordUseCaseHandler class ResetPasswordUseCaseHandler
{ {
/**
* @InjectDoctrineRepository(
* entityManager="Template\Data\Business\Manager\EntityManager",
* entity="Template\Data\Business\Entity\UserPasswordToken"
* )
* @Inject("Template\Infrastructure\Encryption\Client\EncryptionClient")
* @Inject("Template\Data\Business\Manager\EntityManager")
*/
public function __construct( public function __construct(
private readonly UserPasswordTokenRepository $repository,
private readonly EncryptionClient $encryptionClient,
private readonly EntityManager $entityManager,
) { ) {
} }
public function handle(ResetPasswordUseCase $useCase): ResetPasswordUseCaseResult /**
* @throws UserPasswordTokenNotFoundByIdException
* @throws UserPasswordConfirmationMismatchException
*/
public function handle(ResetPasswordUseCase $useCase): ResetPasswordUseCaseResult
{ {
$passwordTokenId = $useCase->getPasswordToken();
// Load and check password token
/** @var ?UserPasswordToken $passwordToken */
$passwordToken = $this->repository->findOneBy(['id' => $passwordTokenId]);
if ($passwordToken === null) {
throw new UserPasswordTokenNotFoundByIdException($passwordTokenId->toString());
}
if ($useCase->getNewPassword() !== $useCase->getPasswordConfirmation()) {
throw new UserPasswordConfirmationMismatchException();
}
// Update Password
$user = $passwordToken->getUser();
$user->setPassword($this->encryptionClient->encrypt($useCase->getNewPassword()));
// Save to DB
$this->entityManager->remove($passwordToken);
$this->entityManager->persist($user);
if ($user->getSession() !== null) {
$this->entityManager->remove($user->getSession());
}
$this->entityManager->flush();
return new ResetPasswordUseCaseResult(); return new ResetPasswordUseCaseResult();
} }
} }

View File

@ -13,7 +13,7 @@ class ConfirmRegistrationPipeline extends Pipeline
{ {
public function __construct( public function __construct(
private readonly LoadRegistrationStep $loadRegistrationStep, private readonly LoadRegistrationStep $loadRegistrationStep,
private readonly CreateUserStep $createUserStep, private readonly CreateUserStep $createUserStep,
private readonly SaveRegistrationAndUserStep $saveRegistrationStep private readonly SaveRegistrationAndUserStep $saveRegistrationStep
) )
{ {

View File

@ -7,6 +7,8 @@ namespace Template\Handling\Registration\Pipeline\ConfirmRegistration\Step;
use Template\Handling\Registration\Exception\RegistrationWithIdentifierAlreadyExistsException; use Template\Handling\Registration\Exception\RegistrationWithIdentifierAlreadyExistsException;
use Template\Handling\Registration\Handler\Command\ConfirmRegistration\ConfirmRegistrationCommand; use Template\Handling\Registration\Handler\Command\ConfirmRegistration\ConfirmRegistrationCommand;
use Template\Handling\Registration\Rule\RegistrationWithIdentifierAlreadyExistsRule; use Template\Handling\Registration\Rule\RegistrationWithIdentifierAlreadyExistsRule;
use Template\Handling\Registration\UseCase\ConfirmRegistration\ConfirmRegistrationUseCase;
use Template\Handling\User\Builder\UserBuilder;
use Template\Handling\User\Exception\UserPasswordMismatchException; use Template\Handling\User\Exception\UserPasswordMismatchException;
use Template\Handling\User\Exception\UserWithIdentifierAlreadyExistsException; use Template\Handling\User\Exception\UserWithIdentifierAlreadyExistsException;
use Template\Handling\User\Handler\Command\CreateUser\CreateUserCommandBuilder; use Template\Handling\User\Handler\Command\CreateUser\CreateUserCommandBuilder;
@ -15,25 +17,26 @@ use Template\Handling\User\Rule\UserPasswordMatchRule;
use Template\Handling\User\Rule\UserWithIdentifierAlreadyExistsRule; use Template\Handling\User\Rule\UserWithIdentifierAlreadyExistsRule;
use teewurst\Pipeline\PipelineInterface; use teewurst\Pipeline\PipelineInterface;
use teewurst\Pipeline\TaskInterface; use teewurst\Pipeline\TaskInterface;
use Template\Infrastructure\Rbac\Exception\RoleNotFoundByIdentifierException;
class CreateUserStep implements TaskInterface class CreateUserStep implements TaskInterface
{ {
public function __construct( public function __construct(
private readonly CreateUserCommandBuilder $createUserCommandBuilder, private readonly UserBuilder $builder,
private readonly CreateUserCommandHandler $createUserCommandHandler,
private readonly UserPasswordMatchRule $passwordMatchRule, private readonly UserPasswordMatchRule $passwordMatchRule,
) { ) {
} }
/** /**
* @throws UserPasswordMismatchException * @throws UserPasswordMismatchException
* @throws RoleNotFoundByIdentifierException
*/ */
public function __invoke( public function __invoke(
$payload, $payload,
PipelineInterface $pipeline PipelineInterface $pipeline
): void ): void
{ {
/** @var ConfirmRegistrationCommand $useCase */ /** @var ConfirmRegistrationUseCase $useCase */
$useCase = $payload->getUseCase(); $useCase = $payload->getUseCase();
$registration = $payload->getRegistration(); $registration = $payload->getRegistration();
@ -46,12 +49,12 @@ class CreateUserStep implements TaskInterface
throw new UserPasswordMismatchException(); throw new UserPasswordMismatchException();
} }
$createUserCommand = $this->createUserCommandBuilder->build( $user = $this->builder->build(
username: $registration->getUsername(), username: $registration->getUsername(),
roleIdentifier: 'user',
mail: $registration->getMail(), mail: $registration->getMail(),
password: $useCase->getPassword(), password: $useCase->getPassword()
); );
$user = $this->createUserCommandHandler->execute($createUserCommand);
$payload->setUser($user); $payload->setUser($user);

View File

@ -4,7 +4,7 @@ declare(strict_types=1);
namespace Template\Handling\Registration\Pipeline\RegisterUser\Step; namespace Template\Handling\Registration\Pipeline\RegisterUser\Step;
use Template\Infrastructure\Request\Service\RequestService; use Template\Infrastructure\Mail\Service\MailService;
use teewurst\Pipeline\PipelineInterface; use teewurst\Pipeline\PipelineInterface;
use teewurst\Pipeline\TaskInterface; use teewurst\Pipeline\TaskInterface;
@ -13,7 +13,7 @@ class SendMailStep implements TaskInterface
private const CONFIRM_LINK = 'https://%s/auth/registration/%s'; private const CONFIRM_LINK = 'https://%s/auth/registration/%s';
public function __construct( public function __construct(
private RequestService $requestService private readonly MailService $mailService,
) { ) {
} }
@ -25,23 +25,17 @@ class SendMailStep implements TaskInterface
$useCase = $payload->getUseCase(); $useCase = $payload->getUseCase();
$registration = $payload->getRegistration(); $registration = $payload->getRegistration();
$this->requestService->request( $this->mailService->enqueue(
'notification', 'registration',
'send-mail', templateData: [
[ 'username' => $useCase->getUsername(),
'template-identifier' => 'new-account', 'confirmationLink' => sprintf(
'sender' => 'info@stack-up.de', self::CONFIRM_LINK,
'recipient' => $useCase->getMail(), $useCase->getHost(),
'data' => [ $registration->getId()->toString()
'username' => $useCase->getUsername(), )
'confirmationLink' => ],
sprintf( recipient: $useCase->getMail(),
self::CONFIRM_LINK,
$useCase->getHost(),
$registration->getId()->toString()
)
]
]
); );
$pipeline->next()($payload, $pipeline); $pipeline->next()($payload, $pipeline);

View File

@ -7,11 +7,17 @@ namespace Template\Handling\Registration\UseCase\RegisterUser;
class RegisterUserUseCase class RegisterUserUseCase
{ {
public function __construct( public function __construct(
private readonly string $host,
private readonly string $username, private readonly string $username,
private readonly string $mail, private readonly string $mail,
) { ) {
} }
public function getHost(): string
{
return $this->host;
}
public function getUsername(): string public function getUsername(): string
{ {
return $this->username; return $this->username;

View File

@ -7,10 +7,12 @@ namespace Template\Handling\Registration\UseCase\RegisterUser;
class RegisterUserUseCaseBuilder class RegisterUserUseCaseBuilder
{ {
public function build( public function build(
string $host,
string $username, string $username,
string $mail, string $mail,
): RegisterUserUseCase { ): RegisterUserUseCase {
return new RegisterUserUseCase( return new RegisterUserUseCase(
$host,
$username, $username,
$mail, $mail,
); );

View File

@ -1,6 +1,7 @@
<?php <?php
use Template\Handling\User\Builder\UserBuilder; use Template\Handling\User\Builder\UserBuilder;
use Template\Handling\User\Builder\UserPasswordTokenBuilder;
use Template\Handling\User\UseCase\Create\CreateUseCaseHandler; use Template\Handling\User\UseCase\Create\CreateUseCaseHandler;
use Template\Handling\User\UseCase\Create\CreateUseCaseBuilder; use Template\Handling\User\UseCase\Create\CreateUseCaseBuilder;
use Template\Handling\User\UseCase\ChangePassword\ChangePasswordUseCaseHandler; use Template\Handling\User\UseCase\ChangePassword\ChangePasswordUseCaseHandler;
@ -20,6 +21,7 @@ return [
/// Builder /// Builder
UserBuilder::class => InjectionFactory::class, UserBuilder::class => InjectionFactory::class,
UserPasswordTokenBuilder::class => InjectionFactory::class,
/// Rule /// Rule
UserWithIdentifierAlreadyExistsRule::class => InjectionFactory::class, UserWithIdentifierAlreadyExistsRule::class => InjectionFactory::class,

View File

@ -0,0 +1,19 @@
<?php
namespace Template\Handling\User\Builder;
use Template\Data\Business\Entity\User;
use Template\Data\Business\Entity\UserPasswordToken;
class UserPasswordTokenBuilder
{
public function build(
User $user
): UserPasswordToken
{
$userPasswordToken = new UserPasswordToken();
$userPasswordToken->setUser($user);
return $userPasswordToken;
}
}

View File

@ -0,0 +1,24 @@
<?php
namespace Template\Handling\User\Exception;
use Template\Infrastructure\Exception\ErrorCode;
use Template\Infrastructure\Exception\ErrorDomain;
use Template\Infrastructure\Exception\Exception\TemplateException;
class UserNotFoundByMailException extends TemplateException {
private const MESSAGE = 'The user with the mail %s was not found!';
public function __construct(string $identifier)
{
parent::__construct(
sprintf(
self::MESSAGE,
$identifier
),
ErrorDomain::User,
ErrorCode::NotFound
);
}
}

View File

@ -0,0 +1,22 @@
<?php
namespace Template\Handling\User\Exception;
use Template\Infrastructure\Exception\ErrorCode;
use Template\Infrastructure\Exception\ErrorDomain;
use Template\Infrastructure\Exception\Exception\Exception;
use Template\Infrastructure\Exception\Exception\TemplateException;
class UserPasswordConfirmationMismatchException extends TemplateException {
private const MESSAGE = 'The two passwordConfirmation does not match the newPassword';
public function __construct()
{
parent::__construct(
self::MESSAGE,
ErrorDomain::UserPassword,
ErrorCode::Mismatch,
);
}
}

View File

@ -0,0 +1,27 @@
<?php
namespace Template\Handling\User\Exception;
use Template\Infrastructure\Exception\ErrorCode;
use Template\Infrastructure\Exception\ErrorDomain;
use Template\Infrastructure\Exception\Exception\Exception;
use Template\Infrastructure\Exception\Exception\TemplateException;
class UserPasswordTokenNotFoundByIdException extends TemplateException {
private const MESSAGE = 'User password token with the id %s was not found!';
public function __construct(
string $identification
)
{
parent::__construct(
sprintf(
self::MESSAGE,
$identification
),
ErrorDomain::UserPassword,
ErrorCode::Mismatch,
);
}
}