48 lines
1.5 KiB
PHP
48 lines
1.5 KiB
PHP
<?php
|
|
|
|
namespace App\Email\EmailConfirmationToken\UseCases;
|
|
|
|
use App\Auth\Clock;
|
|
use App\Auth\TokenGenerator;
|
|
use App\Email\EmailConfirmationToken\CreateEmailConfirmationTokenDto;
|
|
use App\Email\EmailConfirmationToken\EmailConfirmationToken;
|
|
use App\Email\EmailConfirmationToken\EmailConfirmationTokenRepository;
|
|
use App\Exceptions\BadRequestException;
|
|
|
|
class CreateEmailConfirmationToken
|
|
{
|
|
public function __construct(
|
|
private EmailConfirmationTokenRepository $tokenRepository,
|
|
private Clock $clock,
|
|
private TokenGenerator $tokenGenerator,
|
|
) {}
|
|
|
|
/**
|
|
* @throws BadRequestException
|
|
*/
|
|
public function execute(
|
|
CreateEmailConfirmationTokenRequest $request,
|
|
): EmailConfirmationToken {
|
|
if ($request->user === null) {
|
|
throw new BadRequestException('user is required');
|
|
}
|
|
if ($request->minuteOffset === null) {
|
|
throw new BadRequestException('minuteOffset is required');
|
|
}
|
|
|
|
$existingToken = $this->tokenRepository->findByUser($request->user);
|
|
if ($existingToken !== null) {
|
|
$this->tokenRepository->delete($existingToken->getId());
|
|
}
|
|
|
|
return $this->tokenRepository->create(
|
|
new CreateEmailConfirmationTokenDto(
|
|
user: $request->user,
|
|
availableTo: $this->clock->now()->modify(
|
|
"+{$request->minuteOffset} minutes",
|
|
),
|
|
token: $this->tokenGenerator->generate(),
|
|
),
|
|
);
|
|
}
|
|
}
|