Spaces:
No application file
No application file
namespace Mautic\EmailBundle\Helper; | |
use Mautic\CacheBundle\Cache\CacheProviderInterface; | |
use Psr\Cache\InvalidArgumentException; | |
use Symfony\Component\HttpFoundation\Request; | |
/** | |
* Helper class for storing request payload to a cache location and retrieving it back as a Request. | |
* | |
* @deprecated as unused. To be removed in Mautic 6.0. | |
*/ | |
class RequestStorageHelper | |
{ | |
/** | |
* Separator between the transport class name and random hash. | |
*/ | |
public const KEY_SEPARATOR = ';webhook_request;'; | |
public function __construct( | |
private CacheProviderInterface $cacheStorage | |
) { | |
} | |
/** | |
* Stores the request content into cache and returns the unique key under which it's stored. | |
* | |
* @param string $transportName | |
*/ | |
public function storeRequest($transportName, Request $request): string | |
{ | |
$key = $this->getUniqueCacheHash($transportName); | |
$item = $this->cacheStorage->getItem($key); | |
$item->set($request->request->all()); | |
$this->cacheStorage->save($item); | |
return $key; | |
} | |
/** | |
* Creates new Request with the original payload. | |
* | |
* @param string $key | |
* | |
* @throws \UnexpectedValueException | |
*/ | |
public function getRequest($key): Request | |
{ | |
$error = "Request with key '{$key}' was not found."; | |
$key = $this->removeCachePrefix($key); | |
try { | |
$item = $this->cacheStorage->getItem($key); | |
} catch (InvalidArgumentException) { | |
throw new \UnexpectedValueException($error); | |
} | |
if (!$item->isHit()) { | |
throw new \UnexpectedValueException($error); | |
} | |
return new Request([], $item->get()); | |
} | |
/** | |
* @param string $key | |
*/ | |
public function deleteCachedRequest($key): void | |
{ | |
$this->cacheStorage->deleteItem($this->removeCachePrefix($key)); | |
} | |
/** | |
* Reads the transport class name path from the key. | |
* | |
* @param string $key | |
* | |
* @return string | |
*/ | |
public function getTransportNameFromKey($key) | |
{ | |
$key = $this->removeCachePrefix($key); | |
// Take the part before the key separator as the serialized transpot name. | |
[$serializedTransportName] = explode(self::KEY_SEPARATOR, $key); | |
// Unserialize transport name to the standard full class name. | |
$transportName = str_replace('|', '\\', $serializedTransportName); | |
return $transportName; | |
} | |
/** | |
* Remove the default cache key prefix if set. | |
*/ | |
private function removeCachePrefix(string $key): string | |
{ | |
if (str_starts_with($key, 'mautic:')) { | |
$key = ltrim($key, 'mautic:'); | |
} | |
return $key; | |
} | |
/** | |
* Generates unique hash in format $transportName:webhook_request:unique.hash. | |
*/ | |
private function getUniqueCacheHash(string $transportName): string | |
{ | |
return uniqid(str_replace('\\', '|', $transportName).self::KEY_SEPARATOR, true); | |
} | |
} | |