Improved public API in ApiKey entity, reducing anemic model

This commit is contained in:
Alejandro Celaya 2018-10-28 15:24:41 +01:00
parent e046eddda9
commit 877b098b09
6 changed files with 23 additions and 46 deletions

View file

@ -12,6 +12,7 @@ use Symfony\Component\Console\Output\OutputInterface;
use Symfony\Component\Console\Style\SymfonyStyle;
use Zend\I18n\Translator\TranslatorInterface;
use function array_filter;
use function array_map;
use function sprintf;
class ListKeysCommand extends Command
@ -54,24 +55,20 @@ class ListKeysCommand extends Command
{
$io = new SymfonyStyle($input, $output);
$enabledOnly = $input->getOption('enabledOnly');
$list = $this->apiKeyService->listKeys($enabledOnly);
$rows = [];
/** @var ApiKey $row */
foreach ($list as $row) {
$key = $row->getKey();
$expiration = $row->getExpirationDate();
$messagePattern = $this->determineMessagePattern($row);
$rows = array_map(function (ApiKey $apiKey) use ($enabledOnly) {
$key = (string) $apiKey;
$expiration = $apiKey->getExpirationDate();
$messagePattern = $this->determineMessagePattern($apiKey);
// Set columns for this row
$rowData = [sprintf($messagePattern, $key)];
if (! $enabledOnly) {
$rowData[] = sprintf($messagePattern, $this->getEnabledSymbol($row));
$rowData[] = sprintf($messagePattern, $this->getEnabledSymbol($apiKey));
}
$rowData[] = $expiration !== null ? $expiration->toAtomString() : '-';
$rows[] = $rowData;
}
return $rowData;
}, $this->apiKeyService->listKeys($enabledOnly));
$io->table(array_filter([
$this->translator->translate('Key'),

View file

@ -36,21 +36,11 @@ class ApiKey extends AbstractEntity
*/
private $enabled;
public function __construct()
public function __construct(?Chronos $expirationDate = null)
{
$this->enabled = true;
$this->key = $this->generateV4Uuid();
}
public function getKey(): string
{
return $this->key;
}
public function setKey(string $key): self
{
$this->key = $key;
return $this;
$this->expirationDate = $expirationDate;
$this->enabled = true;
}
public function getExpirationDate(): ?Chronos
@ -58,12 +48,6 @@ class ApiKey extends AbstractEntity
return $this->expirationDate;
}
public function setExpirationDate(Chronos $expirationDate): self
{
$this->expirationDate = $expirationDate;
return $this;
}
public function isExpired(): bool
{
if ($this->expirationDate === null) {
@ -78,15 +62,10 @@ class ApiKey extends AbstractEntity
return $this->enabled;
}
public function setEnabled(bool $enabled): self
{
$this->enabled = $enabled;
return $this;
}
public function disable(): self
{
return $this->setEnabled(false);
$this->enabled = false;
return $this;
}
/**
@ -99,6 +78,6 @@ class ApiKey extends AbstractEntity
public function __toString(): string
{
return $this->getKey();
return $this->key;
}
}

View file

@ -23,11 +23,7 @@ class ApiKeyService implements ApiKeyServiceInterface
public function create(?Chronos $expirationDate = null): ApiKey
{
$key = new ApiKey();
if ($expirationDate !== null) {
$key->setExpirationDate($expirationDate);
}
$key = new ApiKey($expirationDate);
$this->em->persist($key);
$this->em->flush();
@ -57,6 +53,9 @@ class ApiKeyService implements ApiKeyServiceInterface
return $apiKey;
}
/**
* @return ApiKey[]
*/
public function listKeys(bool $enabledOnly = false): array
{
$conditions = $enabledOnly ? ['enabled' => true] : [];

View file

@ -18,6 +18,9 @@ interface ApiKeyServiceInterface
*/
public function disable(string $key): ApiKey;
/**
* @return ApiKey[]
*/
public function listKeys(bool $enabledOnly = false): array;
public function getByKey(string $key): ?ApiKey;

View file

@ -74,7 +74,7 @@ class AuthenticateActionTest extends TestCase
*/
public function invalidApiKeyReturnsErrorResponse()
{
$this->apiKeyService->getByKey('foo')->willReturn((new ApiKey())->setEnabled(false))
$this->apiKeyService->getByKey('foo')->willReturn((new ApiKey())->disable())
->shouldBeCalledTimes(1);
$request = ServerRequestFactory::fromGlobals()->withParsedBody([

View file

@ -87,8 +87,7 @@ class ApiKeyServiceTest extends TestCase
*/
public function checkReturnsFalseWhenKeyIsExpired()
{
$key = new ApiKey();
$key->setExpirationDate(Chronos::now()->subDay());
$key = new ApiKey(Chronos::now()->subDay());
$repo = $this->prophesize(EntityRepository::class);
$repo->findOneBy(['key' => '12345'])->willReturn($key)
->shouldBeCalledTimes(1);