instances added god may help
This commit is contained in:
@@ -2,10 +2,11 @@
|
||||
|
||||
namespace MintyPHP\Service\Auth;
|
||||
|
||||
use MintyPHP\Repository\Auth\EmailVerificationRepository;
|
||||
use MintyPHP\Repository\User\UserRepository;
|
||||
use MintyPHP\I18n;
|
||||
use MintyPHP\Http\Request;
|
||||
use MintyPHP\I18n;
|
||||
use MintyPHP\Repository\Auth\EmailVerificationRepository;
|
||||
use MintyPHP\Repository\User\UserReadRepository;
|
||||
use MintyPHP\Repository\User\UserWriteRepository;
|
||||
use MintyPHP\Service\Mail\MailService;
|
||||
|
||||
class EmailVerificationService
|
||||
@@ -14,9 +15,17 @@ class EmailVerificationService
|
||||
private const EXPIRY_MINUTES = 30;
|
||||
private const MAX_ATTEMPTS = 5;
|
||||
|
||||
public static function sendVerification(int $userId, ?string $locale = null): array
|
||||
public function __construct(
|
||||
private readonly UserReadRepository $userReadRepository,
|
||||
private readonly UserWriteRepository $userWriteRepository,
|
||||
private readonly EmailVerificationRepository $emailVerificationRepository,
|
||||
private readonly MailService $mailService
|
||||
) {
|
||||
}
|
||||
|
||||
public function sendVerification(int $userId, ?string $locale = null): array
|
||||
{
|
||||
$user = UserRepository::find($userId);
|
||||
$user = $this->userReadRepository->find($userId);
|
||||
if (!$user || !isset($user['id'])) {
|
||||
return ['ok' => false, 'error' => 'user_not_found'];
|
||||
}
|
||||
@@ -26,13 +35,13 @@ class EmailVerificationService
|
||||
return ['ok' => false, 'error' => 'email_required'];
|
||||
}
|
||||
|
||||
EmailVerificationRepository::invalidateForUser($userId);
|
||||
$this->emailVerificationRepository->invalidateForUser($userId);
|
||||
|
||||
$code = self::generateCode();
|
||||
$code = $this->generateCode();
|
||||
$codeHash = password_hash($code, PASSWORD_DEFAULT);
|
||||
$expiresAt = gmdate('Y-m-d H:i:s', time() + (self::EXPIRY_MINUTES * 60));
|
||||
|
||||
$verificationId = EmailVerificationRepository::create($userId, $codeHash, $expiresAt);
|
||||
$verificationId = $this->emailVerificationRepository->create($userId, $codeHash, $expiresAt);
|
||||
if (!$verificationId) {
|
||||
return ['ok' => false, 'error' => 'create_failed'];
|
||||
}
|
||||
@@ -62,12 +71,12 @@ class EmailVerificationService
|
||||
'verify_url' => $verifyUrl,
|
||||
'greeting' => $greeting,
|
||||
];
|
||||
MailService::sendTemplate('email_verification', $vars, $email, $subject, $locale);
|
||||
$this->mailService->sendTemplate('email_verification', $vars, $email, $subject, $locale);
|
||||
|
||||
return ['ok' => true];
|
||||
}
|
||||
|
||||
public static function verifyCode(string $email, string $code): array
|
||||
public function verifyCode(string $email, string $code): array
|
||||
{
|
||||
$email = trim($email);
|
||||
$code = trim($code);
|
||||
@@ -75,7 +84,7 @@ class EmailVerificationService
|
||||
return ['ok' => false, 'error' => 'invalid'];
|
||||
}
|
||||
|
||||
$user = UserRepository::findByEmail($email);
|
||||
$user = $this->userReadRepository->findByEmail($email);
|
||||
if (!$user || !isset($user['id'])) {
|
||||
return ['ok' => false, 'error' => 'invalid'];
|
||||
}
|
||||
@@ -87,7 +96,7 @@ class EmailVerificationService
|
||||
return ['ok' => false, 'error' => 'already_verified'];
|
||||
}
|
||||
|
||||
$verification = EmailVerificationRepository::findActiveByUserId($userId);
|
||||
$verification = $this->emailVerificationRepository->findActiveByUserId($userId);
|
||||
if (!$verification || !isset($verification['id'])) {
|
||||
return ['ok' => false, 'error' => 'invalid'];
|
||||
}
|
||||
@@ -99,27 +108,27 @@ class EmailVerificationService
|
||||
|
||||
$hash = (string) ($verification['code_hash'] ?? '');
|
||||
if ($hash === '' || !password_verify($code, $hash)) {
|
||||
EmailVerificationRepository::incrementAttempts((int) $verification['id']);
|
||||
$this->emailVerificationRepository->incrementAttempts((int) $verification['id']);
|
||||
return ['ok' => false, 'error' => 'invalid'];
|
||||
}
|
||||
|
||||
// Mark verification as used
|
||||
EmailVerificationRepository::markUsed((int) $verification['id']);
|
||||
$this->emailVerificationRepository->markUsed((int) $verification['id']);
|
||||
|
||||
// Mark user email as verified
|
||||
UserRepository::setEmailVerified($userId);
|
||||
$this->userWriteRepository->setEmailVerified($userId);
|
||||
|
||||
return ['ok' => true, 'user_id' => $userId];
|
||||
}
|
||||
|
||||
public static function resendVerification(string $email, ?string $locale = null): array
|
||||
public function resendVerification(string $email, ?string $locale = null): array
|
||||
{
|
||||
$email = trim($email);
|
||||
if ($email === '') {
|
||||
return ['ok' => false, 'error' => 'email_required'];
|
||||
}
|
||||
|
||||
$user = UserRepository::findByEmail($email);
|
||||
$user = $this->userReadRepository->findByEmail($email);
|
||||
if (!$user || !isset($user['id'])) {
|
||||
// Don't reveal if user exists
|
||||
return ['ok' => true];
|
||||
@@ -130,15 +139,15 @@ class EmailVerificationService
|
||||
return ['ok' => false, 'error' => 'already_verified'];
|
||||
}
|
||||
|
||||
return self::sendVerification((int) $user['id'], $locale);
|
||||
return $this->sendVerification((int) $user['id'], $locale);
|
||||
}
|
||||
|
||||
public static function getExpiryMinutes(): int
|
||||
public function getExpiryMinutes(): int
|
||||
{
|
||||
return self::EXPIRY_MINUTES;
|
||||
}
|
||||
|
||||
private static function generateCode(): string
|
||||
private function generateCode(): string
|
||||
{
|
||||
$max = (10 ** self::CODE_LENGTH) - 1;
|
||||
$code = (string) random_int(0, $max);
|
||||
|
||||
Reference in New Issue
Block a user