Skip to content

Commit 28f7d13

Browse files
T3RAN13T3RAN13
authored andcommitted
CommandQueryData class
1 parent cf32d73 commit 28f7d13

File tree

4 files changed

+257
-0
lines changed

4 files changed

+257
-0
lines changed

Commands/CommandInterface.php

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,4 +10,9 @@ interface CommandInterface
1010
* @return mixed
1111
*/
1212
public function execute($params = []);
13+
14+
/**
15+
* @return array
16+
*/
17+
public function getDataMap();
1318
}

Commands/CommandQueryData.php

Lines changed: 170 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,170 @@
1+
<?php
2+
3+
4+
namespace GrapheneNodeClient\Commands;
5+
6+
7+
class CommandQueryData implements CommandQueryDataInterface
8+
{
9+
/** @var array */
10+
protected $params = [];
11+
12+
/**
13+
* @return array
14+
*/
15+
public function getParams()
16+
{
17+
return $this->params;
18+
}
19+
20+
/**
21+
* @param $params
22+
*/
23+
public function setParams($params)
24+
{
25+
$this->params = $params;
26+
}
27+
28+
/**
29+
* set value in params by key
30+
*
31+
* $setKey example: 'key:1:one_more_key' => $params['key'][1]['one_more_key']
32+
* $setKey example: 'key:a1' => $params['key']['a1']
33+
*
34+
* @param string $setKey
35+
* @param mixed $setVal
36+
*/
37+
public function setParamByKey($setKey, $setVal)
38+
{
39+
$this->setArrayElementByKey($this->params, $setKey, $setVal);
40+
}
41+
42+
/**
43+
* @param CommandInterface $command
44+
* @return array
45+
*/
46+
public function getCommandData(CommandInterface $command)
47+
{
48+
$queryData = [];
49+
$map = $command->getDataMap();
50+
foreach ($map as $route => $rules) {
51+
$this->setQueryDataForRoute($queryData, $route, $rules);
52+
}
53+
54+
return $queryData;
55+
}
56+
57+
58+
/**
59+
* @param array $data
60+
* @param string $route
61+
* @param array $rules
62+
* @throws CommandQueryDataException
63+
*/
64+
protected function setQueryDataForRoute(&$data, $route, $rules = [])
65+
{
66+
$errors = [];
67+
$routeParts = explode(':', $route);
68+
$values = self::getParamsListByKey($this->params, $routeParts);
69+
70+
foreach ($values as $route => $value) {
71+
foreach ($rules as $rule) {
72+
if (!$this->validate($value, $rule)) {
73+
$errors[] = 'Validation rule \'{$route}\' was failed for \'{$route}\';';
74+
}
75+
}
76+
if ($value !== null) {
77+
$this->setArrayElementByKey($data, $route, $value);
78+
}
79+
}
80+
81+
if (!empty($errors)) {
82+
throw new CommandQueryDataException(implode(PHP_EOL, $errors));
83+
}
84+
}
85+
86+
87+
protected function validate($value, $rule)
88+
{
89+
if ($rule === 'required') {
90+
return $value === null ? false : true;
91+
} elseif ($rule === 'array') {
92+
return $value !== null && is_array($value);
93+
} elseif ($rule === 'string') {
94+
return $value !== null && is_string($value);
95+
} elseif ($rule === 'integer') {
96+
return $value !== null && is_integer($value);
97+
} elseif ($rule === 'nullOrArray') {
98+
return $value === null || is_array($value);
99+
} elseif ($rule === 'nullOrString') {
100+
return $value === null || is_string($value);
101+
} elseif ($rule === 'nullOrInteger') {
102+
return $value === null || is_integer($value);
103+
}
104+
}
105+
106+
107+
protected static function getParamsListByKey($params, $routeParts = [])
108+
{
109+
$values = [];
110+
if (empty($routeParts)) {
111+
$values[] = $params;
112+
} else {
113+
$currentKeyPart = array_shift($routeParts);
114+
if (
115+
is_numeric($currentKeyPart)
116+
&& (string)((integer)$currentKeyPart) === $currentKeyPart
117+
) {
118+
$currentKeyPart = (integer)$currentKeyPart;
119+
}
120+
if (isset($params[$currentKeyPart])) {
121+
foreach (self::getParamsListByKey($params[$currentKeyPart], $routeParts) as $valueKey => $value) {
122+
$values[$currentKeyPart . ':' . $valueKey] = $value;
123+
}
124+
} elseif (is_array($params) && $currentKeyPart === '*') {
125+
foreach ($params as $paramKey => $param) {
126+
foreach (self::getParamsListByKey($param, $routeParts) as $valueKey => $value) {
127+
$values[$paramKey . ':' . $valueKey] = $value;
128+
}
129+
}
130+
} else {
131+
$values[implode(':', array_merge([$currentKeyPart], $routeParts))] = null;
132+
}
133+
}
134+
135+
return $values;
136+
}
137+
138+
139+
/**
140+
* set value in array by key
141+
*
142+
* $setKey example: 'key:123:array' => $_SESSION['key'][123]['array']
143+
*
144+
* @param array $array
145+
* @param string $setKey
146+
* @param mixed $setVal
147+
*
148+
* @return array
149+
*/
150+
protected function setArrayElementByKey(&$array, $setKey, $setVal)
151+
{
152+
$link = $array;
153+
$keyParts = explode(':', $setKey);
154+
foreach ($keyParts as $key) {
155+
if (
156+
is_numeric($key)
157+
&& (string)((integer)$key) === $key
158+
) {
159+
$key = (integer)$key;
160+
}
161+
if (!isset($link[$key])) {
162+
$link[$key] = [];
163+
}
164+
$link = &$link[$key];
165+
}
166+
$link = $setVal;
167+
168+
return $array;
169+
}
170+
}
Lines changed: 73 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,73 @@
1+
<?php
2+
3+
4+
namespace GrapheneNodeClient\Commands;
5+
6+
7+
use \Exception;
8+
9+
class CommandQueryDataException extends Exception
10+
{
11+
/** @var array */
12+
private $params = [];
13+
14+
// /**
15+
// * @param CommandInterface $command
16+
// * @return array
17+
// */
18+
// public function getCommandData(CommandInterface $command)
19+
// {
20+
// $queryData = [];
21+
// $params = $this->params;
22+
// $map = $command->getDataMap();
23+
// foreach ($map as $route) {
24+
// $routeParts = explode(':', $route);
25+
// foreach ($routeParts as $key) {
26+
// if ($key === '*') {
27+
// $data = $data;
28+
// } elseif (isset($data[$key])) {
29+
// $data[] = $data[$key];
30+
// } else {
31+
// $data = null;
32+
// break;
33+
// }
34+
// }
35+
// }
36+
//
37+
// return $this->params;
38+
// }
39+
40+
41+
public function getCommandData($data, $route, $rules)
42+
{
43+
$data = [];
44+
$routeParts = explode(':', $route);
45+
$values = self::getParamsListByKey($data, $routeParts);
46+
47+
foreach ($values as $route => $value) {
48+
foreach ($rules as $rule) {
49+
$this->validate($value, $rule);
50+
}
51+
if ($value !== null) {
52+
}
53+
}
54+
55+
return $this->params;
56+
}
57+
58+
59+
public function validate($value, $rule)
60+
{
61+
if ($rule === 'required') {
62+
if ($value === null) {
63+
64+
}
65+
}
66+
}
67+
68+
69+
public function getParamsListByKey($params, $routeParts = [])
70+
{
71+
72+
}
73+
}
Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,9 @@
1+
<?php
2+
3+
4+
namespace GrapheneNodeClient\Commands;
5+
6+
7+
interface CommandQueryDataInterface
8+
{
9+
}

0 commit comments

Comments
 (0)