eca-1.0.x-dev/src/EcaState.php
src/EcaState.php
<?php
namespace Drupal\eca;
use Drupal\Component\Datetime\TimeInterface;
use Drupal\Core\Cache\CacheBackendInterface;
use Drupal\Core\KeyValueStore\KeyValueFactoryInterface;
use Drupal\Core\Lock\LockBackendInterface;
use Drupal\Core\State\State;
/**
* Key/Value store for ECA only.
*/
class EcaState extends State {
/**
* Time service.
*
* @var \Drupal\Component\Datetime\TimeInterface
*/
protected TimeInterface $time;
/**
* ECA State constructor.
*
* This extends Drupal core's state service with an ECA related store.
*
* @param \Drupal\Core\KeyValueStore\KeyValueFactoryInterface $key_value_factory
* The key value factory service.
* @param \Drupal\Core\Cache\CacheBackendInterface $cache
* The cache backend.
* @param \Drupal\Core\Lock\LockBackendInterface $lock
* The lock backend.
* @param \Drupal\Component\Datetime\TimeInterface $time
* The time service.
*
* @noinspection MagicMethodsValidityInspection
* @noinspection PhpMissingParentConstructorInspection
*/
public function __construct(KeyValueFactoryInterface $key_value_factory, CacheBackendInterface $cache, LockBackendInterface $lock, TimeInterface $time) {
// Do not call parent's constructor as we are overwriting its values.
$this->keyValueStore = $key_value_factory->get('eca');
$this->cid = 'eca';
$this->cache = $cache;
$this->tags = [];
$this->lock = $lock;
$this->time = $time;
}
/**
* Stores the given or current time in ECA's key/value store.
*
* @param string $key
* The identifier for the timestamp.
* @param int|null $timestamp
* (optional) The timestamp value to store. Skip this argument to store
* the current time.
*
* @return $this
*/
public function setTimestamp(string $key, ?int $timestamp = NULL): EcaState {
$this->set($this->timestampKey($key), $timestamp ?? $this->getCurrentTimestamp());
return $this;
}
/**
* Receive a stored timestamp from the ECA's key/value store.
*
* @param string $key
* The identifier for the timestamp.
*
* @return int
* The stored timestamp.
*/
public function getTimestamp(string $key): int {
return $this->get($this->timestampKey($key), 0);
}
/**
* Receive the current time as timestamp.
*
* @return int
* The current timestamp.
*/
public function getCurrentTimestamp(): int {
return $this->time->getCurrentTime();
}
/**
* Determine if the given state key has expired.
*
* @param string $key
* The identifier for the timestamp.
* @param int $timeout
* Elapsed time in seconds after which the identified timestamp is
* considered to have timed-out.
*
* @return bool
* TRUE if the difference between current time and the identified and
* stored timestamp (default: 0) is greater than the given timeout period.
* FALSE otherwise.
*/
public function hasTimestampExpired(string $key, int $timeout): bool {
return ($this->getCurrentTimestamp() - $this->getTimestamp($key) > $timeout);
}
/**
* Builds an identifier for timestamps related to a given key.
*
* @param string $key
* The identifier for the timestamp.
*
* @return string
* A unique key to identify a timestamp in the Key/Value store related to
* the given key.
*/
protected function timestampKey(string $key): string {
return implode('.', ['timestamp', $key]);
}
}
