From 1f96c3cc34103b55ec1762de184f5f61d4fc9944 Mon Sep 17 00:00:00 2001 From: Mirko Bukilic Date: Thu, 16 Nov 2023 15:20:03 +0100 Subject: [PATCH] Refactor package to php 8.2 --- composer.json | 3 +- rector.php | 40 +++++++++ src/DataRepository.php | 85 +++++++------------ src/DataRepositoryFactory.php | 15 +--- src/DataRepositoryResponse.php | 19 ++--- src/ErrorCodes.php | 28 +++--- src/Exception/InvalidQueryException.php | 2 +- src/Exception/MissingActionException.php | 2 +- .../MissingCustomCommandException.php | 2 +- .../MissingDatasetNameValueException.php | 2 +- src/Exception/MissingIdentityException.php | 2 +- .../MissingIdentityMapKeyException.php | 2 +- src/Exception/MissingMapperException.php | 2 +- .../MissingResponseAllDataException.php | 2 +- .../MissingResponseOneDataException.php | 2 +- .../MissingRussianDollKeyException.php | 2 +- src/Exception/MissingStorageException.php | 2 +- src/Exception/NotValidStorageException.php | 2 +- src/MapperCollection.php | 46 ++-------- src/ReadRepository.php | 48 +++++------ src/RepositoryCommand.php | 75 ++++++++-------- src/RepositoryConstants.php | 6 +- src/RepositoryQuery.php | 45 +++++----- src/RepositoryResponseFactory.php | 12 +-- src/RepositoryResponseFormatter.php | 13 ++- src/SimpleDataRepositoryResponse.php | 18 ++-- src/StorageContainer.php | 77 ++++------------- src/WriteRepository.php | 17 ++-- 28 files changed, 236 insertions(+), 335 deletions(-) create mode 100644 rector.php diff --git a/composer.json b/composer.json index b3e055a..a7f9476 100644 --- a/composer.json +++ b/composer.json @@ -35,7 +35,8 @@ "require-dev": { "phpunit/phpunit": "9.*", "squizlabs/php_codesniffer" : "3.*", - "g4/code-coverage" : "1.*" + "g4/code-coverage" : "1.*", + "rector/rector": "^0.18.8" }, "require": { "php" : ">=8.2", diff --git a/rector.php b/rector.php new file mode 100644 index 0000000..f616e48 --- /dev/null +++ b/rector.php @@ -0,0 +1,40 @@ +paths([ + __DIR__ . '/src', + ]); + + $rectorConfig->skip([ + MyCLabsMethodCallToEnumConstRector::class, + MyCLabsClassToEnumRector::class + ]); + + // register a single rule + $rectorConfig->rule(InlineConstructorDefaultToPropertyRector::class); + $rectorConfig->rule(RemoveUselessParamTagRector::class); + $rectorConfig->rule(ReturnTypeFromReturnNewRector::class); + $rectorConfig->rule(ReturnTypeFromStrictBoolReturnExprRector::class); + $rectorConfig->rule(ReturnTypeFromStrictNativeCallRector::class); + $rectorConfig->rule(ReturnTypeFromStrictNewArrayRector::class); + $rectorConfig->rule(ReturnTypeFromStrictTypedPropertyRector::class); + + // define sets of rules + $rectorConfig->sets([ + LevelSetList::UP_TO_PHP_82, + ]); +}; diff --git a/src/DataRepository.php b/src/DataRepository.php index f5f440d..cf15baa 100644 --- a/src/DataRepository.php +++ b/src/DataRepository.php @@ -2,84 +2,63 @@ namespace G4\DataRepository; -use \G4\DataMapper\Common\MappingInterface; +use G4\DataMapper\Common\IdentityInterface; +use G4\DataMapper\Common\MappingInterface; +use G4\RussianDoll\Key; class DataRepository { - const DELIMITER = "|"; + final public const DELIMITER = "|"; - /** - * @var StorageContainer - */ - private $storageContainer; + private ?IdentityInterface $identity = null; - /* - * @var \G4\DataMapper\Common\IdentityInterface - */ - private $identity; + private ?string $identityMapKey = null; - private $identityMapKey; - - /* - * @var \G4\RussianDoll\Key - */ - private $russianDollKey; + private ?Key $russianDollKey = null; - /** - * @var MapperCollection - */ - private $map; + private ?MapperCollection $map = null; /** * Repository constructor. - * @param StorageContainer $storageContainer */ - public function __construct(StorageContainer $storageContainer) + public function __construct(private readonly StorageContainer $storageContainer) { - $this->storageContainer = $storageContainer; } - /** - * @param $datasetName - * @return $this - */ - public function setDatasetName($datasetName) + public function setDatasetName(string $datasetName): self { $this->storageContainer->setDatasetName($datasetName); return $this; } - public function setIdentity(\G4\DataMapper\Common\IdentityInterface $identity) + public function setIdentity(IdentityInterface $identity): self { $this->identity = $identity; return $this; } - public function setRussianDollKey(\G4\RussianDoll\Key $russianDollKey) + public function setRussianDollKey(Key $russianDollKey): self { $this->russianDollKey = $russianDollKey; $this->identityMapKey = (string) $russianDollKey; return $this; } - public function setIdentityMapKey(...$identityMapKey) + public function setIdentityMapKey(...$identityMapKey): self { $this->identityMapKey = implode(self::DELIMITER, $identityMapKey); return $this; } - /* - * @return RepositoryResponse - */ - public function select() + public function select(): SimpleDataRepositoryResponse | DataRepositoryResponse { $query = new RepositoryQuery(); - if ($this->getRussianDollKey() instanceof \G4\RussianDoll\Key) { + if ($this->getRussianDollKey() instanceof Key) { $query->setRussianDollKey($this->getRussianDollKey()); } - if ($this->getIdentity() instanceof \G4\DataMapper\Common\IdentityInterface) { + if ($this->getIdentity() instanceof IdentityInterface) { $query->setIdentity($this->getIdentity()); } @@ -90,11 +69,11 @@ public function select() return (new ReadRepository($this->storageContainer))->read($query); } - public function query($customQuery) + public function query($customQuery): SimpleDataRepositoryResponse | DataRepositoryResponse { $query = new RepositoryQuery(); $query->setCustomQuery($customQuery); - if ($this->getRussianDollKey() instanceof \G4\RussianDoll\Key) { + if ($this->getRussianDollKey() instanceof Key) { $query->setRussianDollKey($this->getRussianDollKey()); } @@ -105,14 +84,14 @@ public function query($customQuery) return (new ReadRepository($this->storageContainer))->read($query); } - public function queryNoCache($customQuery) + public function queryNoCache($customQuery): SimpleDataRepositoryResponse | DataRepositoryResponse { $query = new RepositoryQuery(); $query->setCustomQuery($customQuery); return (new ReadRepository($this->storageContainer))->readNoCache($query); } - public function simpleQuery($customQuery) + public function simpleQuery($customQuery): SimpleDataRepositoryResponse | DataRepositoryResponse { $query = new RepositoryQuery(); $query->setCustomQuery($customQuery); @@ -120,20 +99,20 @@ public function simpleQuery($customQuery) return (new ReadRepository($this->storageContainer))->simpleQuery($query); } - public function command($customCommand) + public function command($customCommand): void { $command = $this->getCommand(); $command->setCustomCommand($customCommand); (new WriteRepository($this->storageContainer))->write($command); } - public function setMapping(MappingInterface ...$maps) + public function setMapping(MappingInterface ...$maps): self { $this->map = new MapperCollection($maps); return $this; } - public function insert() + public function insert(): void { $command = $this->getCommand(); $command->insert($this->map); @@ -145,52 +124,52 @@ public function insertId() try { $insertId = $this->queryNoCache('SELECT LAST_INSERT_ID() AS LAST_INSERT_ID')->getOne(); return $insertId['LAST_INSERT_ID']; - } catch (\Exception $e) { + } catch (\Exception) { return null; } } - public function update() + public function update(): void { $command = $this->getCommand(); $command->update($this->map, $this->getIdentity()); (new WriteRepository($this->storageContainer))->write($command); } - public function upsert() + public function upsert(): void { $command = $this->getCommand(); $command->upsert($this->map); (new WriteRepository($this->storageContainer))->write($command); } - public function delete() + public function delete(): void { $command = $this->getCommand(); $command->delete($this->getIdentity()); (new WriteRepository($this->storageContainer))->write($command); } - public function getIdentity() + public function getIdentity(): ?IdentityInterface { return $this->identity; } - public function getIdentityMapKey() + public function getIdentityMapKey(): ?string { return $this->identityMapKey; } - public function getRussianDollKey() + public function getRussianDollKey(): ?Key { return $this->russianDollKey; } - private function getCommand() + private function getCommand(): RepositoryCommand { $command = new RepositoryCommand(); - if ($this->getRussianDollKey() instanceof \G4\RussianDoll\Key) { + if ($this->getRussianDollKey() instanceof Key) { $command->setRussianDollKey($this->getRussianDollKey()); } diff --git a/src/DataRepositoryFactory.php b/src/DataRepositoryFactory.php index 52e91a7..cd9b624 100644 --- a/src/DataRepositoryFactory.php +++ b/src/DataRepositoryFactory.php @@ -7,10 +7,7 @@ class DataRepositoryFactory { - /** - * @var array - */ - private $storages; + private readonly array $storages; /** * RepositoryFactory constructor. @@ -22,18 +19,12 @@ public function __construct(...$storages) $this->storages = $storages; } - /** - * @return DataRepository - */ - public function create() + public function create(): DataRepository { return new DataRepository($this->makeStorageContainer()); } - /** - * @return StorageContainer - */ - public function makeStorageContainer() + public function makeStorageContainer(): StorageContainer { return new StorageContainer($this->storages); } diff --git a/src/DataRepositoryResponse.php b/src/DataRepositoryResponse.php index 9460eae..72cc70f 100644 --- a/src/DataRepositoryResponse.php +++ b/src/DataRepositoryResponse.php @@ -7,23 +7,16 @@ class DataRepositoryResponse { - private $data; - private $count; - private $total; - - public function __construct(array $currentItems, $count, $total) + public function __construct(private readonly array $data, private $count, private $total) { - $this->data = $currentItems; - $this->count = $count; - $this->total = $total; } - public function count() + public function count(): int { return $this->count; } - public function getAll() + public function getAll(): array { if (!$this->hasData() && $this->getTotal() === 0) { throw new MissingResponseAllDataException(); @@ -31,7 +24,7 @@ public function getAll() return $this->data; } - public function getOne() + public function getOne(): mixed { if (!$this->hasData()) { throw new MissingResponseOneDataException(); @@ -39,12 +32,12 @@ public function getOne() return current($this->data); } - public function getTotal() + public function getTotal(): int { return $this->total; } - public function hasData() + public function hasData(): bool { return count($this->data) !== 0; } diff --git a/src/ErrorCodes.php b/src/ErrorCodes.php index a3b1201..c34b5c0 100644 --- a/src/ErrorCodes.php +++ b/src/ErrorCodes.php @@ -5,18 +5,18 @@ class ErrorCodes { - const MISSING_STORAGE_INSTANCE_EXCEPTION = 30001; - const NOT_VALID_STORAGE_EXCEPTION = 30002; - const MISSING_MAPPER_INSTANCE_EXCEPTION = 30003; - const MISSING_ACTION_EXCEPTION = 30004; - const MISSING_IDENTITY_EXCEPTION = 30005; - const MISSING_RUSSIAN_DOLL_EXCEPTION = 30006; - const MISSING_IDENTITY_MAP_KEY_EXCEPTION = 30007; - const INVALID_QUERY_EXCEPTION = 30008; - const MISSING_CUSTOM_COMMAND_EXCEPTION = 30009; - const MISSING_RESPONSE_TOTAL = 30010; - const MISSING_RESPONSE_COUNT = 30011; - const MISSING_RESPONSE_ALL_DATA = 30012; - const MISSING_RESPONSE_ONE_DATA = 30013; - const MISSING_DATASET_NAME_VALUE_EXCEPTION = 33014; + final public const MISSING_STORAGE_INSTANCE_EXCEPTION = 30001; + final public const NOT_VALID_STORAGE_EXCEPTION = 30002; + final public const MISSING_MAPPER_INSTANCE_EXCEPTION = 30003; + final public const MISSING_ACTION_EXCEPTION = 30004; + final public const MISSING_IDENTITY_EXCEPTION = 30005; + final public const MISSING_RUSSIAN_DOLL_EXCEPTION = 30006; + final public const MISSING_IDENTITY_MAP_KEY_EXCEPTION = 30007; + final public const INVALID_QUERY_EXCEPTION = 30008; + final public const MISSING_CUSTOM_COMMAND_EXCEPTION = 30009; + final public const MISSING_RESPONSE_TOTAL = 30010; + final public const MISSING_RESPONSE_COUNT = 30011; + final public const MISSING_RESPONSE_ALL_DATA = 30012; + final public const MISSING_RESPONSE_ONE_DATA = 30013; + final public const MISSING_DATASET_NAME_VALUE_EXCEPTION = 33014; } diff --git a/src/Exception/InvalidQueryException.php b/src/Exception/InvalidQueryException.php index 9b752c5..676bb5d 100644 --- a/src/Exception/InvalidQueryException.php +++ b/src/Exception/InvalidQueryException.php @@ -8,7 +8,7 @@ class InvalidQueryException extends Exception { - const MESSAGE = 'Invalid query'; + final public const MESSAGE = 'Invalid query'; public function __construct() { diff --git a/src/Exception/MissingActionException.php b/src/Exception/MissingActionException.php index 721dbe4..c948ba8 100644 --- a/src/Exception/MissingActionException.php +++ b/src/Exception/MissingActionException.php @@ -8,7 +8,7 @@ class MissingActionException extends Exception { - const MESSAGE = 'Expected action (insert, upsert, update or delete).'; + final public const MESSAGE = 'Expected action (insert, upsert, update or delete).'; public function __construct() { diff --git a/src/Exception/MissingCustomCommandException.php b/src/Exception/MissingCustomCommandException.php index c197a71..dd7b5d1 100644 --- a/src/Exception/MissingCustomCommandException.php +++ b/src/Exception/MissingCustomCommandException.php @@ -8,7 +8,7 @@ class MissingCustomCommandException extends Exception { - const MESSAGE = 'Missing custom command.'; + final public const MESSAGE = 'Missing custom command.'; public function __construct() { diff --git a/src/Exception/MissingDatasetNameValueException.php b/src/Exception/MissingDatasetNameValueException.php index 96a63fc..82e3d1f 100644 --- a/src/Exception/MissingDatasetNameValueException.php +++ b/src/Exception/MissingDatasetNameValueException.php @@ -7,7 +7,7 @@ class MissingDatasetNameValueException extends Exception { - const MESSAGE = 'Missing dataset name(table name) value.'; + final public const MESSAGE = 'Missing dataset name(table name) value.'; public function __construct() { diff --git a/src/Exception/MissingIdentityException.php b/src/Exception/MissingIdentityException.php index e67d8a6..e07f1f7 100644 --- a/src/Exception/MissingIdentityException.php +++ b/src/Exception/MissingIdentityException.php @@ -8,7 +8,7 @@ class MissingIdentityException extends Exception { - const MESSAGE = 'Expected Identity \G4\DataMapper\Common\IdentityInterface.'; + final public const MESSAGE = 'Expected Identity \G4\DataMapper\Common\IdentityInterface.'; public function __construct() { diff --git a/src/Exception/MissingIdentityMapKeyException.php b/src/Exception/MissingIdentityMapKeyException.php index b70d69e..2ee0d09 100644 --- a/src/Exception/MissingIdentityMapKeyException.php +++ b/src/Exception/MissingIdentityMapKeyException.php @@ -8,7 +8,7 @@ class MissingIdentityMapKeyException extends Exception { - const MESSAGE = 'Missing identity map key'; + final public const MESSAGE = 'Missing identity map key'; public function __construct() { diff --git a/src/Exception/MissingMapperException.php b/src/Exception/MissingMapperException.php index d22da8e..a4960ef 100644 --- a/src/Exception/MissingMapperException.php +++ b/src/Exception/MissingMapperException.php @@ -8,7 +8,7 @@ class MissingMapperException extends Exception { - const MESSAGE = 'Expected mapper \G4\DataRepository\MapperCollection.'; + final public const MESSAGE = 'Expected mapper \G4\DataRepository\MapperCollection.'; public function __construct() { diff --git a/src/Exception/MissingResponseAllDataException.php b/src/Exception/MissingResponseAllDataException.php index 2f864d3..6df069e 100644 --- a/src/Exception/MissingResponseAllDataException.php +++ b/src/Exception/MissingResponseAllDataException.php @@ -8,7 +8,7 @@ class MissingResponseAllDataException extends Exception { - const MESSAGE = 'Missing response all data'; + final public const MESSAGE = 'Missing response all data'; public function __construct() { diff --git a/src/Exception/MissingResponseOneDataException.php b/src/Exception/MissingResponseOneDataException.php index f14dff2..f05a898 100644 --- a/src/Exception/MissingResponseOneDataException.php +++ b/src/Exception/MissingResponseOneDataException.php @@ -8,7 +8,7 @@ class MissingResponseOneDataException extends Exception { - const MESSAGE = 'Missing response one data'; + final public const MESSAGE = 'Missing response one data'; public function __construct() { diff --git a/src/Exception/MissingRussianDollKeyException.php b/src/Exception/MissingRussianDollKeyException.php index a77e4c2..cad68c9 100644 --- a/src/Exception/MissingRussianDollKeyException.php +++ b/src/Exception/MissingRussianDollKeyException.php @@ -8,7 +8,7 @@ class MissingRussianDollKeyException extends Exception { - const MESSAGE = 'Missing russian doll key'; + final public const MESSAGE = 'Missing russian doll key'; public function __construct() { diff --git a/src/Exception/MissingStorageException.php b/src/Exception/MissingStorageException.php index 03096ec..b882a49 100644 --- a/src/Exception/MissingStorageException.php +++ b/src/Exception/MissingStorageException.php @@ -8,7 +8,7 @@ class MissingStorageException extends Exception { - const MESSAGE = 'Expected at least one storage, none given.'; + final public const MESSAGE = 'Expected at least one storage, none given.'; public function __construct() { diff --git a/src/Exception/NotValidStorageException.php b/src/Exception/NotValidStorageException.php index 39bc171..8a82934 100644 --- a/src/Exception/NotValidStorageException.php +++ b/src/Exception/NotValidStorageException.php @@ -8,7 +8,7 @@ class NotValidStorageException extends Exception { - const MESSAGE = 'Not valid storage instance provided.'; + final public const MESSAGE = 'Not valid storage instance provided.'; public function __construct() { diff --git a/src/MapperCollection.php b/src/MapperCollection.php index 7ceec68..2539ed0 100644 --- a/src/MapperCollection.php +++ b/src/MapperCollection.php @@ -4,35 +4,21 @@ class MapperCollection implements \Iterator, \Countable { - /** - * @var int - */ - private $total; + private ?int $total = null; - /** - * @var array - */ - private $keyMap; + private array $keyMap; - /** - * @var array - */ - private $rawData; + private array $rawData; - /** - * @var int - */ - private $pointer; + private int $pointer = 0; /** * MapperCollection constructor. - * @param array $data */ public function __construct(array $data) { $this->keyMap = array_keys($data); $this->rawData = $data; - $this->pointer = 0; } /** @@ -47,9 +33,6 @@ public function count(): int return $this->total; } - /** - * @return mixed|null - */ public function current(): mixed { if ($this->pointer >= $this->count()) { @@ -73,7 +56,6 @@ public function next(): void /** * Return the key of the current element - * @return int */ public function key(): mixed { @@ -98,34 +80,22 @@ public function rewind(): void $this->pointer = 0; } - /** - * @return bool - */ - public function hasData() + public function hasData(): bool { return $this->count() > 0; } - /** - * @return array - */ - public function getRawData() + public function getRawData(): array { return $this->rawData; } - /** - * @return bool - */ - private function hasCurrentRawData() + private function hasCurrentRawData(): bool { return isset($this->keyMap[$this->pointer]) && isset($this->rawData[$this->keyMap[$this->pointer]]); } - /** - * @return array - */ - private function currentRawData() + private function currentRawData(): mixed { return $this->rawData[$this->keyMap[$this->pointer]]; } diff --git a/src/ReadRepository.php b/src/ReadRepository.php index d99d042..b784d9f 100644 --- a/src/ReadRepository.php +++ b/src/ReadRepository.php @@ -7,33 +7,23 @@ class ReadRepository { - const EMPTY_VALUE = 'EMPTY_VALUE'; + final public const EMPTY_VALUE = 'EMPTY_VALUE'; /** - * @var StorageContainer - */ - private $storageContainer; - - /** - * @var SimpleRepositoryDataResponse|DataRepositoryResponse + * @var SimpleDataRepositoryResponse|DataRepositoryResponse */ private $response; - /* - * @return RepositoryQuery - */ - private $query; + private ?RepositoryQuery $query = null; /** * Repository constructor. - * @param StorageContainer $storageContainer */ - public function __construct(StorageContainer $storageContainer) + public function __construct(private readonly StorageContainer $storageContainer) { - $this->storageContainer = $storageContainer; } - public function read(RepositoryQuery $query) + public function read(RepositoryQuery $query): SimpleDataRepositoryResponse | DataRepositoryResponse { $this->query = $query; return $this @@ -43,7 +33,7 @@ public function read(RepositoryQuery $query) ->getResponse(); } - public function readNoCache(RepositoryQuery $query) + public function readNoCache(RepositoryQuery $query): SimpleDataRepositoryResponse | DataRepositoryResponse { $this->query = $query; return $this @@ -51,7 +41,7 @@ public function readNoCache(RepositoryQuery $query) ->getResponse(); } - public function simpleQuery(RepositoryQuery $query) + public function simpleQuery(RepositoryQuery $query): SimpleDataRepositoryResponse | DataRepositoryResponse { $this->query = $query; @@ -60,31 +50,31 @@ public function simpleQuery(RepositoryQuery $query) ->getSimpleResponse(); } - private function getSimpleResponse() + private function getSimpleResponse(): SimpleDataRepositoryResponse | DataRepositoryResponse { return $this->hasSimpleResponse() ? $this->response : (new RepositoryResponseFactory())->createSimpleEmptyResponse(); } - private function hasSimpleResponse() + private function hasSimpleResponse(): bool { return $this->response instanceof SimpleDataRepositoryResponse; } - private function getResponse() + private function getResponse(): SimpleDataRepositoryResponse | DataRepositoryResponse { return $this->hasResponse() ? $this->response : (new RepositoryResponseFactory())->createEmptyResponse(); } - private function hasResponse() + private function hasResponse(): bool { return $this->response instanceof DataRepositoryResponse; } - private function readFromIdentityMap() + private function readFromIdentityMap(): self { if ($this->storageContainer->hasIdentityMap() && !$this->hasResponse()) { $data = $this->storageContainer->getIdentityMap()->get($this->query->getIdentityMapKey()); @@ -99,7 +89,7 @@ private function readFromIdentityMap() return $this; } - private function readFromRussianDoll() + private function readFromRussianDoll(): self { if ($this->storageContainer->getRussianDoll() && !$this->hasResponse()) { $data = $this @@ -120,7 +110,7 @@ private function readFromRussianDoll() return $this; } - private function readFromDataMapper($saveToCache = true) + private function readFromDataMapper($saveToCache = true): self { if ($this->storageContainer->hasDataMapper() && !$this->hasResponse()) { $dataMapper = $this->storageContainer->getDataMapper(); @@ -143,7 +133,7 @@ private function readFromDataMapper($saveToCache = true) return $this; } - private function execSimpleQuery() + private function execSimpleQuery(): self { if ($this->storageContainer->hasDataMapper() && !$this->hasSimpleResponse() && $this->query->hasCustomQuery()) { $dataMapper = $this->storageContainer->getDataMapper(); @@ -152,11 +142,11 @@ private function execSimpleQuery() $this->response = $rawData ? (new RepositoryResponseFactory())->createSimple($rawData) : null; } - + return $this; } - private function saveIdentityMap($data) + private function saveIdentityMap($data): self { if ($this->storageContainer->hasIdentityMap()) { $this @@ -167,7 +157,7 @@ private function saveIdentityMap($data) return $this; } - private function saveRussianDoll($data) + private function saveRussianDoll($data): self { if ($this->storageContainer->hasRussianDoll()) { $this->storageContainer @@ -178,7 +168,7 @@ private function saveRussianDoll($data) return $this; } - private function hasNonEmptyData($data) + private function hasNonEmptyData($data): bool { return !empty($data) && is_array($data); } diff --git a/src/RepositoryCommand.php b/src/RepositoryCommand.php index 4e4f6ca..c5166bb 100644 --- a/src/RepositoryCommand.php +++ b/src/RepositoryCommand.php @@ -10,36 +10,30 @@ use G4\DataRepository\Exception\MissingRussianDollKeyException; use G4\DataMapper\Common\IdentityInterface; use G4\DataMapper\Common\MappingInterface; +use G4\RussianDoll\Key; class RepositoryCommand { - const ACTION_UPSERT = 'upsert'; - const ACTION_INSERT = 'insert'; - const ACTION_DELETE = 'delete'; - const ACTION_UPDATE = 'update'; - const CUSTOM_COMMAND= 'custom_command'; - const DELIMITER = '|'; - - /** - * @var MapperCollection - */ - private $map; - private $russianDollKey; - private $identityMapKey; + final public const ACTION_UPSERT = 'upsert'; + final public const ACTION_INSERT = 'insert'; + final public const ACTION_DELETE = 'delete'; + final public const ACTION_UPDATE = 'update'; + final public const CUSTOM_COMMAND= 'custom_command'; + final public const DELIMITER = '|'; + + private ?MapperCollection $map = null; + private ?Key $russianDollKey = null; + private ?string $identityMapKey = null; private $customCommand; - /** - * @var \G4\DataMapper\Common\IdentityInterface - */ - private $identity; + private ?IdentityInterface $identity = null; - private $action; + private ?string $action = null; /** - * @return MapperCollection * @throws MissingMapperException */ - public function getMap() + public function getMap(): ?MapperCollection { if (!$this->map instanceof MapperCollection) { throw new MissingMapperException(); @@ -48,26 +42,25 @@ public function getMap() } /** - * @return IdentityInterface * @throws MissingIdentityException */ - public function getIdentity() + public function getIdentity(): ?IdentityInterface { - if (!$this->identity instanceof \G4\DataMapper\Common\IdentityInterface) { + if (!$this->identity instanceof IdentityInterface) { throw new MissingIdentityException(); } return $this->identity; } - public function getRussianDollKey() + public function getRussianDollKey(): ?Key { - if (!$this->russianDollKey instanceof \G4\RussianDoll\Key) { + if (!$this->russianDollKey instanceof Key) { throw new MissingRussianDollKeyException(); } return $this->russianDollKey; } - public function getIdentityMapKey() + public function getIdentityMapKey(): ?string { if (empty($this->identityMapKey)) { throw new MissingIdentityMapKeyException(); @@ -75,19 +68,19 @@ public function getIdentityMapKey() return $this->identityMapKey; } - public function setRussianDollKey(\G4\RussianDoll\Key $russianDollKey) + public function setRussianDollKey(Key $russianDollKey): self { $this->russianDollKey = $russianDollKey; return $this; } - public function setIdentityMapKey(...$identityMapKey) + public function setIdentityMapKey(...$identityMapKey): self { $this->identityMapKey = join(self::DELIMITER, $identityMapKey); return $this; } - public function update(MapperCollection $map, IdentityInterface $identity) + public function update(MapperCollection $map, IdentityInterface $identity): self { $this->map = $map; $this->identity = $identity; @@ -95,53 +88,53 @@ public function update(MapperCollection $map, IdentityInterface $identity) return $this; } - public function upsert(MapperCollection $map) + public function upsert(MapperCollection $map): self { $this->map = $map; $this->action = self::ACTION_UPSERT; return $this; } - public function delete(\G4\DataMapper\Common\IdentityInterface $identity) + public function delete(IdentityInterface $identity): self { $this->identity = $identity; $this->action = self::ACTION_DELETE; return $this; } - public function insert(MapperCollection $maps) + public function insert(MapperCollection $maps): self { $this->map = $maps; $this->action = self::ACTION_INSERT; return $this; } - public function isUpsert() + public function isUpsert(): bool { return $this->getAction() === self::ACTION_UPSERT; } - public function isInsert() + public function isInsert(): bool { return $this->getAction() === self::ACTION_INSERT; } - public function isUpdate() + public function isUpdate(): bool { return $this->getAction() === self::ACTION_UPDATE; } - public function isDelete() + public function isDelete(): bool { return $this->getAction() === self::ACTION_DELETE; } - public function isCustomCommand() + public function isCustomCommand(): bool { return $this->getAction() === self::CUSTOM_COMMAND; } - private function getAction() + private function getAction(): ?string { if ($this->action === self::ACTION_INSERT || $this->action === self::ACTION_DELETE @@ -154,12 +147,12 @@ private function getAction() throw new MissingActionException(); } - public function hasCustomCommand() + public function hasCustomCommand(): bool { return !empty($this->customCommand); } - public function getCustomCommand() + public function getCustomCommand(): mixed { if (!$this->hasCustomCommand()) { throw new MissingCustomCommandException(); @@ -167,7 +160,7 @@ public function getCustomCommand() return $this->customCommand; } - public function setCustomCommand($customCommand) + public function setCustomCommand($customCommand): self { $this->action = self::CUSTOM_COMMAND; $this->customCommand = $customCommand; diff --git a/src/RepositoryConstants.php b/src/RepositoryConstants.php index 8a94cbc..113ae6a 100644 --- a/src/RepositoryConstants.php +++ b/src/RepositoryConstants.php @@ -4,7 +4,7 @@ class RepositoryConstants { - const TOTAL = 'total'; - const COUNT = 'count'; - const DATA = 'data'; + final public const TOTAL = 'total'; + final public const COUNT = 'count'; + final public const DATA = 'data'; } diff --git a/src/RepositoryQuery.php b/src/RepositoryQuery.php index a89d3c9..11a7f3e 100644 --- a/src/RepositoryQuery.php +++ b/src/RepositoryQuery.php @@ -2,48 +2,42 @@ namespace G4\DataRepository; +use G4\DataMapper\Common\IdentityInterface; use G4\DataRepository\Exception\InvalidQueryException; use G4\DataRepository\Exception\MissingIdentityException; use G4\DataRepository\Exception\MissingIdentityMapKeyException; use G4\DataRepository\Exception\MissingRussianDollKeyException; +use G4\RussianDoll\Key; class RepositoryQuery { - const DELIMITER = "|"; - /* - * @var \G4\DataMapper\Common\IdentityInterface - */ - private $identity; + final public const DELIMITER = "|"; + + private ?IdentityInterface $identity = null; - private $identityMapKey; + private ?string $identityMapKey = null; private $customQuery; - /* - * @var \G4\RussianDoll\Key - */ - private $russianDollKey; + private ?Key $russianDollKey = null; - /** - * @return \G4\DataMapper\Common\IdentityInterface - */ - public function getIdentity() + public function getIdentity(): ?IdentityInterface { - if (!$this->identity instanceof \G4\DataMapper\Common\IdentityInterface) { + if (!$this->identity instanceof IdentityInterface) { throw new MissingIdentityException(); } return $this->identity; } - public function getRussianDollKey() + public function getRussianDollKey(): ?Key { - if (!$this->russianDollKey instanceof \G4\RussianDoll\Key) { + if (!$this->russianDollKey instanceof Key) { throw new MissingRussianDollKeyException(); } return $this->russianDollKey; } - public function getIdentityMapKey() + public function getIdentityMapKey(): ?string { if (empty($this->identityMapKey)) { throw new MissingIdentityMapKeyException(); @@ -51,7 +45,10 @@ public function getIdentityMapKey() return $this->identityMapKey; } - public function getCustomQuery() + /** + * @throws InvalidQueryException + */ + public function getCustomQuery(): mixed { if (!$this->hasCustomQuery()) { throw new InvalidQueryException(); @@ -59,31 +56,31 @@ public function getCustomQuery() return $this->customQuery; } - public function setIdentity(\G4\DataMapper\Common\IdentityInterface $identity) + public function setIdentity(IdentityInterface $identity): self { $this->identity = $identity; return $this; } - public function setRussianDollKey(\G4\RussianDoll\Key $russianDollKey) + public function setRussianDollKey(Key $russianDollKey): self { $this->russianDollKey = $russianDollKey; return $this; } - public function setIdentityMapKey(...$identityMapKey) + public function setIdentityMapKey(...$identityMapKey): self { $this->identityMapKey = join(self::DELIMITER, $identityMapKey); return $this; } - public function setCustomQuery($query) + public function setCustomQuery($query): self { $this->customQuery = $query; return $this; } - public function hasCustomQuery() + public function hasCustomQuery(): bool { return !empty($this->customQuery); } diff --git a/src/RepositoryResponseFactory.php b/src/RepositoryResponseFactory.php index c606051..b5f3ff8 100644 --- a/src/RepositoryResponseFactory.php +++ b/src/RepositoryResponseFactory.php @@ -2,11 +2,13 @@ namespace G4\DataRepository; +use G4\DataMapper\Common\RawData; +use G4\DataMapper\Common\SimpleRawData; use G4\ValueObject\Dictionary; class RepositoryResponseFactory { - public function createSimple(\G4\DataMapper\Common\SimpleRawData $rawData) + public function createSimple(SimpleRawData $rawData): SimpleDataRepositoryResponse { return new SimpleDataRepositoryResponse( $rawData->getAll(), @@ -14,7 +16,7 @@ public function createSimple(\G4\DataMapper\Common\SimpleRawData $rawData) ); } - public function create(\G4\DataMapper\Common\RawData $rawData) + public function create(RawData $rawData): DataRepositoryResponse { return new DataRepositoryResponse( $rawData->getAll(), @@ -23,7 +25,7 @@ public function create(\G4\DataMapper\Common\RawData $rawData) ); } - public function createFromArray(Dictionary $data) + public function createFromArray(Dictionary $data): DataRepositoryResponse { return new DataRepositoryResponse( $data->get(RepositoryConstants::DATA), @@ -32,12 +34,12 @@ public function createFromArray(Dictionary $data) ); } - public function createEmptyResponse() + public function createEmptyResponse(): DataRepositoryResponse { return new DataRepositoryResponse([], 0, 0); } - public function createSimpleEmptyResponse() + public function createSimpleEmptyResponse(): SimpleDataRepositoryResponse { return new SimpleDataRepositoryResponse([], 0); } diff --git a/src/RepositoryResponseFormatter.php b/src/RepositoryResponseFormatter.php index b323bf7..964f72a 100644 --- a/src/RepositoryResponseFormatter.php +++ b/src/RepositoryResponseFormatter.php @@ -4,19 +4,16 @@ class RepositoryResponseFormatter { - private $repositoryResponse; - - public function __construct(DataRepositoryResponse $repositoryResponse) + public function __construct(private readonly DataRepositoryResponse $repositoryResponse) { - $this->repositoryResponse = $repositoryResponse; } - public function format() + public function format(): array { return [ - RepositoryConstants::TOTAL => $this->repositoryResponse->getTotal(), - RepositoryConstants::COUNT => $this->repositoryResponse->count(), - RepositoryConstants::DATA => $this->repositoryResponse->getAll(), + RepositoryConstants::TOTAL => $this->repositoryResponse->getTotal(), + RepositoryConstants::COUNT => $this->repositoryResponse->count(), + RepositoryConstants::DATA => $this->repositoryResponse->getAll(), ]; } } diff --git a/src/SimpleDataRepositoryResponse.php b/src/SimpleDataRepositoryResponse.php index 8e07763..e517609 100644 --- a/src/SimpleDataRepositoryResponse.php +++ b/src/SimpleDataRepositoryResponse.php @@ -7,21 +7,16 @@ class SimpleDataRepositoryResponse { - private $data; - private $count; - - public function __construct(array $currentItems, $count) + public function __construct(private readonly array $data, private $count) { - $this->data = $currentItems; - $this->count = $count; } - public function count() + public function count(): int { return $this->count; } - public function getAll() + public function getAll(): array { if (!$this->hasData()) { throw new MissingResponseAllDataException(); @@ -29,7 +24,10 @@ public function getAll() return $this->data; } - public function getOne() + /** + * @throws MissingResponseOneDataException + */ + public function getOne(): mixed { if (!$this->hasData()) { throw new MissingResponseOneDataException(); @@ -37,7 +35,7 @@ public function getOne() return current($this->data); } - public function hasData() + public function hasData(): bool { return count($this->data) !== 0; } diff --git a/src/StorageContainer.php b/src/StorageContainer.php index 3932894..2770029 100644 --- a/src/StorageContainer.php +++ b/src/StorageContainer.php @@ -15,10 +15,7 @@ class StorageContainer { - /** - * @var IdentityMap - */ - private $identityMap; + private ?\G4\IdentityMap\IdentityMap $identityMap = null; /** * @var MapperInterface @@ -30,21 +27,17 @@ class StorageContainer */ private $dataMapperBulk; - /** - * @var RussianDoll - */ - private $russianDoll; + private ?\G4\RussianDoll\RussianDoll $russianDoll = null; /* * @var Builder */ - private $dataMapperBuilder; + private ?\G4\DataMapper\Builder $dataMapperBuilder = null; private $datasetName; /** * StorageContainer constructor. - * @param array $storages * @throws MissingStorageException */ public function __construct(array $storages) @@ -57,19 +50,15 @@ public function __construct(array $storages) } } - /** - * @return IdentityMap - */ - public function getIdentityMap() + public function getIdentityMap(): ?IdentityMap { return $this->identityMap; } /** - * @return MapperInterface * @throws MissingDatasetNameValueException */ - public function getDataMapper() + public function getDataMapper(): MapperInterface { if (!$this->dataMapper instanceof MapperInterface) { if ($this->datasetName === null) { @@ -86,7 +75,7 @@ public function getDataMapper() * @return Bulk * @throws MissingDatasetNameValueException */ - public function getDataMapperBulk() + public function getDataMapperBulk(): Bulk { if (!$this->dataMapperBulk instanceof Bulk) { if ($this->datasetName === null) { @@ -99,77 +88,51 @@ public function getDataMapperBulk() return $this->dataMapperBulk; } - /** - * @param $datasetName - * @return $this - */ - public function setDatasetName($datasetName) + public function setDatasetName(string $datasetName) { $this->datasetName = $datasetName; return $this; } - /** - * @return RussianDoll - */ - public function getRussianDoll() + public function getRussianDoll(): ?RussianDoll { return $this->russianDoll; } - /** - * @return bool - */ - public function hasIdentityMap() + public function hasIdentityMap(): bool { return $this->identityMap instanceof IdentityMap; } - /** - * @return bool - */ - public function hasDataMapper() + public function hasDataMapper(): bool { return $this->getDataMapper() instanceof MapperInterface; } - /** - * @return bool - */ - public function hasDataMapperBulk() + public function hasDataMapperBulk(): bool { return $this->getDataMapperBulk() instanceof Bulk; } - /** - * @return bool - */ - public function hasDatasetName() + public function hasDatasetName(): bool { return $this->datasetName !== null; } - /** - * @return bool - */ - public function hasDataMapperBuilder() + public function hasDataMapperBuilder(): bool { return $this->dataMapperBuilder instanceof Builder; } - /** - * @return bool - */ - public function hasRussianDoll() + public function hasRussianDoll(): bool { return $this->russianDoll instanceof RussianDoll; } /** - * @param mixed $aStorage * @throws NotValidStorageException */ - private function addStorage($aStorage) + private function addStorage(mixed $aStorage): void { if ($aStorage instanceof IdentityMap) { $this->identityMap = $aStorage; @@ -187,20 +150,14 @@ private function addStorage($aStorage) throw new NotValidStorageException(); } - /** - * @return MapperInterface - */ - private function makeDataMapper() + private function makeDataMapper(): MapperInterface { return $this->dataMapperBuilder ->collectionName(new MySQLTableName($this->datasetName)) ->buildMapper(); } - /** - * @return Bulk - */ - private function makeDataMapperBulk() + private function makeDataMapperBulk(): Bulk { return $this->dataMapperBuilder ->collectionName(new MySQLTableName($this->datasetName)) diff --git a/src/WriteRepository.php b/src/WriteRepository.php index 5d77302..601201e 100644 --- a/src/WriteRepository.php +++ b/src/WriteRepository.php @@ -4,21 +4,14 @@ class WriteRepository { - /** - * @var StorageContainer - */ - private $storageContainer; - /** * Repository constructor. - * @param StorageContainer $storageContainer */ - public function __construct(StorageContainer $storageContainer) + public function __construct(private readonly StorageContainer $storageContainer) { - $this->storageContainer = $storageContainer; } - public function write(RepositoryCommand $command) + public function write(RepositoryCommand $command): void { if ($this->storageContainer->hasDatasetName()) { $this->writeDataMapper($command); @@ -35,7 +28,7 @@ public function write(RepositoryCommand $command) } } - private function invalidateRussianDoll(RepositoryCommand $command) + private function invalidateRussianDoll(RepositoryCommand $command): void { $this ->storageContainer @@ -44,7 +37,7 @@ private function invalidateRussianDoll(RepositoryCommand $command) ->expire(); } - private function invalidateIdentityMap(RepositoryCommand $command) + private function invalidateIdentityMap(RepositoryCommand $command): void { $this ->storageContainer @@ -53,7 +46,7 @@ private function invalidateIdentityMap(RepositoryCommand $command) } // TODO Sinisa split each method into a new dedicated class - private function writeDataMapper(RepositoryCommand $command) + private function writeDataMapper(RepositoryCommand $command): void { if ($command->isDelete()) { $this