51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			51 lines
		
	
	
		
			1.4 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php declare(strict_types=1);
 | 
						|
 | 
						|
namespace App\Repositories;
 | 
						|
 | 
						|
use App\Dto\Repository\DataCaptchaRepository\DataCaptcha;
 | 
						|
use App\Exceptions\Repositories\DataCaptchaRepositoryException;
 | 
						|
use App\Models\Captcha;
 | 
						|
use App\Services\GenerateTokenCommand\GenerateTokenUlidCommand;
 | 
						|
use Carbon\Carbon;
 | 
						|
use Illuminate\Support\Facades\Cache;
 | 
						|
 | 
						|
final readonly class DataCaptchaRepository
 | 
						|
{
 | 
						|
    public function __construct(
 | 
						|
        private GenerateTokenUlidCommand $generateTokenUlidCommand,
 | 
						|
    ) { }
 | 
						|
 | 
						|
    public function store(Captcha $captcha, array $coordinators, Carbon $expires): string
 | 
						|
    {
 | 
						|
        $key = $this->generateTokenUlidCommand->execute() . '_' . time();
 | 
						|
        $data = [
 | 
						|
            'id' => $captcha->id,
 | 
						|
            'coordinators' => $coordinators
 | 
						|
        ];
 | 
						|
 | 
						|
        if (!Cache::driver('redis')->add($key, $data, $expires) ) {
 | 
						|
            throw new DataCaptchaRepositoryException('Could not create cache for captcha: ' . $captcha->id . ' key: ' . $key);
 | 
						|
        }
 | 
						|
 | 
						|
        return $key;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getByKey(string $key): ?DataCaptcha
 | 
						|
    {
 | 
						|
        $dataCaptcha = Cache::driver('redis')->get($key);
 | 
						|
        if (is_null($dataCaptcha)) {
 | 
						|
            return null;
 | 
						|
        }
 | 
						|
 | 
						|
        return new DataCaptcha(
 | 
						|
            captchaId: $dataCaptcha['id'],
 | 
						|
            coordinators: $dataCaptcha['coordinators'],
 | 
						|
        );
 | 
						|
    }
 | 
						|
 | 
						|
    public function destroy(string $key): void
 | 
						|
    {
 | 
						|
        Cache::driver('redis')->delete($key);
 | 
						|
    }
 | 
						|
}
 |