Revived API POST /api/v1/captcha.

Captcha validation has been adjusted.
This commit is contained in:
2023-11-26 15:09:42 +06:00
parent 18899c81f2
commit 520a3ba068
21 changed files with 365 additions and 12 deletions

View File

@@ -3,10 +3,17 @@
namespace App\Services\Api\V1;
use App\Dto\Request\Api\V1\Captcha\CaptchaPublicToken;
use App\Dto\Request\Api\V1\Captcha\CheckingDto;
use App\Enums\CaptchaLogType;
use App\Repositories\CaptchaLogRepository;
use App\Repositories\CaptchaRepository;
use App\Repositories\DataCaptchaRepository;
use App\ServiceResults\Api\V1\CaptchaService\Captcha;
use App\ServiceResults\Api\V1\CaptchaService\CaptchaVerifiedResult;
use App\ServiceResults\ServiceResultError;
use App\Services\Captcha\CaptchaHandler;
use App\Services\Captcha\CheckingCommand;
use App\Services\CaptchaLog\CaptchaLogHandler;
use App\Services\Service;
use Carbon\Carbon;
use Illuminate\Support\Facades\DB;
@@ -16,7 +23,11 @@ final class CaptchaService extends Service
public function __construct(
private readonly CaptchaGenerateService $captchaGenerateService,
private readonly CaptchaHandler $captchaHandler,
private readonly CaptchaLogHandler $captchaLogHandler,
private readonly DataCaptchaRepository $dataCaptchaRepository,
private readonly CaptchaLogRepository $captchaLogRepository,
private readonly CaptchaRepository $captchaRepository,
private readonly CheckingCommand $checkingCommand,
) { }
public function createKeyWithCaptcha(CaptchaPublicToken $captchaPublicToken, Carbon $expires): ServiceResultError | Captcha
@@ -43,4 +54,40 @@ final class CaptchaService extends Service
key: $captchaKey
);
}
public function checking(CheckingDto $checkingDto, int $maxCountError): ServiceResultError | CaptchaVerifiedResult
{
try {
$captchaData = $this->dataCaptchaRepository->getByKey($checkingDto->getCaptchaKey());
if (is_null($captchaData)) {
return $this->errValidate(__('Captcha not found or verification period has expired. Please try to refresh the captcha.'));
}
if (!$this->checkingCommand->execute($captchaData->getCoordinators(), $checkingDto->getCoordinators())) {
$this->captchaLogHandler->handleStore($captchaData->getCaptchaId(), CaptchaLogType::Error, $checkingDto->getCaptchaPublicToken()->getHttpUserData());
return $this->errValidate(__('CAPTCHA validation failed. Please try again.'));
}
$result = DB::transaction(function () use ($checkingDto, $captchaData, $maxCountError) {
$errorCount = $this->captchaLogRepository->countByType(CaptchaLogType::Error, $captchaData->getCaptchaId());
if ($errorCount > $maxCountError) {
$this->dataCaptchaRepository->destroy($checkingDto->getCaptchaKey());
return $this->errValidate(__('You have exceeded the number of attempts. Please refresh the captcha.'));
}
$this->captchaLogHandler->handleStore($captchaData->getCaptchaId(), CaptchaLogType::Verified, $checkingDto->getCaptchaPublicToken()->getHttpUserData());
$this->dataCaptchaRepository->destroy($checkingDto->getCaptchaKey());
$modelCaptcha = $this->captchaRepository->getCaptchaById($captchaData->getCaptchaId());
if (is_null($modelCaptcha)) {
return $this->errValidate(__('Captcha not found or verification period has expired. Please try to refresh the captcha.'));
}
return new CaptchaVerifiedResult(key: $modelCaptcha->uuid);
});
} catch (\Throwable $e) {
report($e);
return $this->errService('Captcha service error!');
}
return $result;
}
}