Skip to content

Commit

Permalink
Updating config
Browse files Browse the repository at this point in the history
  • Loading branch information
actions-user committed Feb 7, 2023
1 parent f0d8b7a commit 12e5472
Show file tree
Hide file tree
Showing 4 changed files with 127 additions and 172 deletions.
272 changes: 114 additions & 158 deletions src/Commands/Initialize.php
Original file line number Diff line number Diff line change
Expand Up @@ -33,12 +33,15 @@
use Symfony\Component\Console\Output;
use Symfony\Component\Console\Style;
use Throwable;
use function array_search;
use function array_key_exists;
use function array_keys;
use function array_values;
use function assert;
use function count;
use function intval;
use function sprintf;
use function strval;
use function usort;

/**
* Connector initialize command
Expand Down Expand Up @@ -180,8 +183,8 @@ private function createNewConfiguration(Style\SymfonyStyle $io): void

$question = new Console\Question\Question('Provide connector identifier');

$question->setValidator(function ($answer) {
if ($answer !== null) {
$question->setValidator(function (string|null $answer) {
if ($answer !== '' && $answer !== null) {
$findConnectorQuery = new DevicesQueries\FindConnectors();
$findConnectorQuery->byIdentifier($answer);

Expand Down Expand Up @@ -230,32 +233,7 @@ private function createNewConfiguration(Style\SymfonyStyle $io): void

$accessSecret = $this->askAccessSecret($io);

switch ($this->askOpenApiEndpoint($io)) {
case 1:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_EUROPE_MS;

break;
case 2:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_AMERICA;

break;
case 3:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_AMERICA_AZURE;

break;
case 4:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_CHINA;

break;
case 5:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_INDIA;

break;
default:
$dataCentre = Types\OpenApiEndpoint::ENDPOINT_EUROPE;

break;
}
$dataCentre = $this->askOpenApiEndpoint($io);

$uid = null;

Expand Down Expand Up @@ -299,9 +277,9 @@ private function createNewConfiguration(Style\SymfonyStyle $io): void

$this->propertiesManager->create(Utils\ArrayHash::from([
'entity' => DevicesEntities\Connectors\Properties\Variable::class,
'identifier' => Types\ConnectorPropertyIdentifier::IDENTIFIER_OPENPULSAR_ENDPOINT,
'identifier' => Types\ConnectorPropertyIdentifier::IDENTIFIER_OPENAPI_ENDPOINT,
'dataType' => MetadataTypes\DataType::get(MetadataTypes\DataType::DATA_TYPE_STRING),
'value' => $dataCentre,
'value' => $dataCentre->getValue(),
'connector' => $connector,
]));

Expand Down Expand Up @@ -366,25 +344,9 @@ private function createNewConfiguration(Style\SymfonyStyle $io): void
*/
private function editExistingConfiguration(Style\SymfonyStyle $io): void
{
$io->newLine();

$connectors = [];

$findConnectorsQuery = new DevicesQueries\FindConnectors();

foreach ($this->connectorsRepository->findAllBy(
$findConnectorsQuery,
Entities\TuyaConnector::class,
) as $connector) {
if ($connector->getType() !== Entities\TuyaConnector::CONNECTOR_TYPE) {
continue;
}
$connector = $this->askWhichConnector($io);

$connectors[$connector->getIdentifier()] = $connector->getIdentifier()
. ($connector->getName() !== null ? ' [' . $connector->getName() . ']' : '');
}

if (count($connectors) === 0) {
if ($connector === null) {
$io->warning('No Tuya connectors registered in system');

$question = new Console\Question\ConfirmationQuestion(
Expand All @@ -401,50 +363,6 @@ private function editExistingConfiguration(Style\SymfonyStyle $io): void
return;
}

$question = new Console\Question\ChoiceQuestion(
'Please select connector to configure',
array_values($connectors),
);

$question->setErrorMessage('Selected connector: "%s" is not valid.');

$connectorIdentifier = array_search($io->askQuestion($question), $connectors, true);

if ($connectorIdentifier === false) {
$io->error('Something went wrong, connector could not be loaded');

$this->logger->alert(
'Could not read connector identifier from console answer',
[
'source' => MetadataTypes\ConnectorSource::SOURCE_CONNECTOR_TUYA,
'type' => 'initialize-cmd',
'group' => 'cmd',
],
);

return;
}

$findConnectorQuery = new DevicesQueries\FindConnectors();
$findConnectorQuery->byIdentifier($connectorIdentifier);

$connector = $this->connectorsRepository->findOneBy($findConnectorQuery, Entities\TuyaConnector::class);

if ($connector === null) {
$io->error('Something went wrong, connector could not be loaded');

$this->logger->alert(
'Connector was not found',
[
'source' => MetadataTypes\ConnectorSource::SOURCE_CONNECTOR_TUYA,
'type' => 'initialize-cmd',
'group' => 'cmd',
],
);

return;
}

$modeProperty = $connector->findProperty(Types\ConnectorPropertyIdentifier::IDENTIFIER_CLIENT_MODE);

if ($modeProperty === null) {
Expand Down Expand Up @@ -693,70 +611,10 @@ private function editExistingConfiguration(Style\SymfonyStyle $io): void
*/
private function deleteExistingConfiguration(Style\SymfonyStyle $io): void
{
$io->newLine();

$connectors = [];

$findConnectorsQuery = new DevicesQueries\FindConnectors();

foreach ($this->connectorsRepository->findAllBy(
$findConnectorsQuery,
Entities\TuyaConnector::class,
) as $connector) {
if ($connector->getType() !== Entities\TuyaConnector::CONNECTOR_TYPE) {
continue;
}

$connectors[$connector->getIdentifier()] = $connector->getIdentifier()
. ($connector->getName() !== null ? ' [' . $connector->getName() . ']' : '');
}

if (count($connectors) === 0) {
$io->info('No Tuya connectors registered in system');

return;
}

$question = new Console\Question\ChoiceQuestion(
'Please select connector to remove',
array_values($connectors),
);

$question->setErrorMessage('Selected connector: "%s" is not valid.');

$connectorIdentifier = array_search($io->askQuestion($question), $connectors, true);

if ($connectorIdentifier === false) {
$io->error('Something went wrong, connector could not be loaded');

$this->logger->alert(
'Connector identifier was not able to get from answer',
[
'source' => MetadataTypes\ConnectorSource::SOURCE_CONNECTOR_TUYA,
'type' => 'initialize-cmd',
'group' => 'cmd',
],
);

return;
}

$findConnectorQuery = new DevicesQueries\FindConnectors();
$findConnectorQuery->byIdentifier($connectorIdentifier);

$connector = $this->connectorsRepository->findOneBy($findConnectorQuery, Entities\TuyaConnector::class);
$connector = $this->askWhichConnector($io);

if ($connector === null) {
$io->error('Something went wrong, connector could not be loaded');

$this->logger->alert(
'Connector was not found',
[
'source' => MetadataTypes\ConnectorSource::SOURCE_CONNECTOR_TUYA,
'type' => 'initialize-cmd',
'group' => 'cmd',
],
);
$io->info('No Tuya connectors registered in system');

return;
}
Expand Down Expand Up @@ -852,7 +710,7 @@ private function askAccessSecret(Style\SymfonyStyle $io): string
return strval($io->askQuestion($question));
}

private function askOpenApiEndpoint(Style\SymfonyStyle $io): int
private function askOpenApiEndpoint(Style\SymfonyStyle $io): Types\OpenApiEndpoint
{
$question = new Console\Question\ChoiceQuestion(
'Provide which cloud data center you are using?',
Expand All @@ -866,10 +724,43 @@ private function askOpenApiEndpoint(Style\SymfonyStyle $io): int
],
0,
);

$question->setErrorMessage('Selected answer: "%s" is not valid.');
$question->setValidator(static function (string|null $answer): Types\OpenApiEndpoint {
if ($answer === null) {
throw new Exceptions\InvalidState('Selected answer is not valid');
}

if ($answer === self::CHOICE_QUESTION_CENTRAL_EUROPE_DC || intval($answer) === 0) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_EUROPE);
}

return intval($io->askQuestion($question));
if ($answer === self::CHOICE_QUESTION_WESTERN_EUROPE_DC || intval($answer) === 1) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_EUROPE_MS);
}

if ($answer === self::CHOICE_QUESTION_WESTERN_AMERICA_DC || intval($answer) === 2) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_AMERICA);
}

if ($answer === self::CHOICE_QUESTION_EASTERN_AMERICA_DC || intval($answer) === 3) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_AMERICA_AZURE);
}

if ($answer === self::CHOICE_QUESTION_CHINA_DC || intval($answer) === 4) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_CHINA);
}

if ($answer === self::CHOICE_QUESTION_INDIA_DC || intval($answer) === 5) {
return Types\OpenApiEndpoint::get(Types\OpenApiEndpoint::ENDPOINT_INDIA);
}

throw new Exceptions\InvalidState('Selected answer is not valid');
});

$answer = $io->askQuestion($question);
assert($answer instanceof Types\OpenApiEndpoint);

return $answer;
}

private function askUid(Style\SymfonyStyle $io): string
Expand All @@ -879,6 +770,71 @@ private function askUid(Style\SymfonyStyle $io): string
return strval($io->askQuestion($question));
}

/**
* @throws DevicesExceptions\InvalidState
*/
private function askWhichConnector(Style\SymfonyStyle $io): Entities\TuyaConnector|null
{
$connectors = [];

$findConnectorsQuery = new DevicesQueries\FindConnectors();

$systemConnectors = $this->connectorsRepository->findAllBy(
$findConnectorsQuery,
Entities\TuyaConnector::class,
);
usort(
$systemConnectors,
// phpcs:ignore SlevomatCodingStandard.Files.LineLength.LineTooLong
static fn (DevicesEntities\Connectors\Connector $a, DevicesEntities\Connectors\Connector $b): int => $a->getIdentifier() <=> $b->getIdentifier()
);

foreach ($systemConnectors as $connector) {
assert($connector instanceof Entities\TuyaConnector);

$connectors[$connector->getIdentifier()] = $connector->getIdentifier()
. ($connector->getName() !== null ? ' [' . $connector->getName() . ']' : '');
}

if (count($connectors) === 0) {
return null;
}

$question = new Console\Question\ChoiceQuestion(
'Please select connector to manage',
array_values($connectors),
);
$question->setErrorMessage('Selected answer: "%s" is not valid.');
$question->setValidator(function (string|null $answer) use ($connectors): Entities\TuyaConnector {
if ($answer === null) {
throw new Exceptions\InvalidState('Selected answer is not valid');
}

$connectorIdentifiers = array_keys($connectors);

if (!array_key_exists(intval($answer), $connectorIdentifiers)) {
throw new Exceptions\Runtime('You have to select connector from list');
}

$findConnectorQuery = new DevicesQueries\FindConnectors();
$findConnectorQuery->byIdentifier($connectorIdentifiers[intval($answer)]);

$connector = $this->connectorsRepository->findOneBy($findConnectorQuery, Entities\TuyaConnector::class);
assert($connector instanceof Entities\TuyaConnector || $connector === null);

if ($connector === null) {
throw new Exceptions\Runtime('You have to select connector from list');
}

return $connector;
});

$answer = $io->askQuestion($question);
assert($answer instanceof Entities\TuyaConnector);

return $answer;
}

/**
* @throws Exceptions\Runtime
*/
Expand Down
4 changes: 3 additions & 1 deletion src/Connector/Connector.php
Original file line number Diff line number Diff line change
Expand Up @@ -72,14 +72,16 @@ public function execute(): void
{
assert($this->connector instanceof Entities\TuyaConnector);

$mode = $this->connector->getClientMode();

foreach ($this->clientsFactories as $clientFactory) {
$rc = new ReflectionClass($clientFactory);

$constants = $rc->getConstants();

if (
array_key_exists(Clients\ClientFactory::MODE_CONSTANT_NAME, $constants)
&& $constants[Clients\ClientFactory::MODE_CONSTANT_NAME] === $this->connector->getClientMode()->getValue()
&& $mode->equalsValue($constants[Clients\ClientFactory::MODE_CONSTANT_NAME])
) {
$this->client = $clientFactory->create($this->connector);
}
Expand Down
7 changes: 6 additions & 1 deletion src/Consumers/Messages/State.php
Original file line number Diff line number Diff line change
Expand Up @@ -86,7 +86,12 @@ public function consume(Entities\Messages\Entity $entity): bool
$entity->getState(),
);

if ($entity->getState()->equalsValue(Metadata\Types\ConnectionState::STATE_DISCONNECTED)) {
if (
$entity->getState()->equalsValue(Metadata\Types\ConnectionState::STATE_DISCONNECTED)
|| $entity->getState()->equalsValue(Metadata\Types\ConnectionState::STATE_STOPPED)
|| $entity->getState()->equalsValue(Metadata\Types\ConnectionState::STATE_LOST)
|| $entity->getState()->equalsValue(Metadata\Types\ConnectionState::STATE_UNKNOWN)
) {
foreach ($device->getProperties() as $property) {
if (!$property instanceof DevicesEntities\Devices\Properties\Dynamic) {
continue;
Expand Down

0 comments on commit 12e5472

Please sign in to comment.