|
3 | 3 | namespace Pavlusha311245\UnitPhpSdk;
|
4 | 4 |
|
5 | 5 | use Pavlusha311245\UnitPhpSdk\Abstract\ApplicationAbstract;
|
6 |
| -use Pavlusha311245\UnitPhpSdk\Config\AccessLog; |
7 |
| -use Pavlusha311245\UnitPhpSdk\Config\Application; |
8 |
| -use Pavlusha311245\UnitPhpSdk\Config\Listener; |
9 |
| -use Pavlusha311245\UnitPhpSdk\Config\Route; |
| 6 | +use Pavlusha311245\UnitPhpSdk\Config\{ |
| 7 | + Application, |
| 8 | + Listener, |
| 9 | + Route, |
| 10 | + Upstream, |
| 11 | + AccessLog |
| 12 | +}; |
10 | 13 | use Pavlusha311245\UnitPhpSdk\Enums\HttpMethodsEnum;
|
11 | 14 | use Pavlusha311245\UnitPhpSdk\Exceptions\UnitException;
|
12 | 15 | use Pavlusha311245\UnitPhpSdk\Interfaces\ConfigInterface;
|
@@ -50,43 +53,105 @@ class Config implements ConfigInterface
|
50 | 53 | *
|
51 | 54 | * @throws UnitException
|
52 | 55 | */
|
53 |
| - public function __construct(array $data, private UnitRequest $_unitRequest) |
| 56 | + public function __construct(object $data, private readonly UnitRequest $_unitRequest) |
54 | 57 | {
|
55 |
| - if (array_key_exists('routes', $data)) { |
56 |
| - foreach ($data['routes'] as $routeName => $routeData) { |
57 |
| - $this->_routes[$routeName] = new Route($routeName, $routeData); |
| 58 | + $rawData = $data; |
| 59 | + $jsonData = json_decode(json_encode($data), true); |
| 60 | + |
| 61 | + $this->loadRoutes($rawData); |
| 62 | + $this->loadApplications($jsonData); |
| 63 | + $this->loadUpstreams($jsonData); |
| 64 | + $this->loadListeners($jsonData); |
| 65 | + } |
| 66 | + |
| 67 | + /** |
| 68 | + * @param array $data |
| 69 | + * @return void |
| 70 | + * @throws UnitException |
| 71 | + */ |
| 72 | + public function loadListeners(array $data): void |
| 73 | + { |
| 74 | + if (array_key_exists('listeners', $data)) { |
| 75 | + foreach ($data['listeners'] as $listener => $listenerData) { |
| 76 | + $listener = (new Listener( |
| 77 | + _listener: $listener, |
| 78 | + pass: $listenerData['pass'] |
| 79 | + ))->parseFromArray($listenerData); |
| 80 | + |
| 81 | + $typePath = $listener->getPass()->getPassType(); |
| 82 | + $typePathName = $listener->getPass()->toArray()[1] ?? null; |
| 83 | + |
| 84 | + ($this->{"_{$typePath}"}[$typePathName ?? 'default'])?->setListener($listener); |
| 85 | + |
| 86 | + $this->_listeners[] = $listener; |
58 | 87 | }
|
59 | 88 | }
|
| 89 | + } |
| 90 | + |
60 | 91 |
|
| 92 | + /** |
| 93 | + * @param array $data |
| 94 | + * @return void |
| 95 | + * @throws UnitException |
| 96 | + */ |
| 97 | + public function loadApplications(array $data): void |
| 98 | + { |
61 | 99 | if (array_key_exists('applications', $data)) {
|
62 | 100 | foreach ($data['applications'] as $appName => $appData) {
|
63 |
| - // TODO: implement go and nodejs detect |
| 101 | + // TODO: implement Perl, Python and Ruby applications |
64 | 102 | $this->_applications[$appName] = match ($appData['type']) {
|
65 | 103 | 'php' => new Application\PhpApplication($appData),
|
66 |
| - 'external' => new Application\NodeJsApplication($appData), |
| 104 | + 'java' => new Application\JavaApplication($appData), |
| 105 | + 'external' => $this->isNodeJsApplication($appData) ? new Application\NodeJsApplication($appData) : new Application\GoApplication($appData), |
67 | 106 | };
|
68 | 107 | $this->_applications[$appName]->setName($appName);
|
69 |
| - $this->_applications[$appName]->setUnitRequest($_unitRequest); |
| 108 | + $this->_applications[$appName]->setUnitRequest($this->_unitRequest); |
70 | 109 | }
|
71 | 110 | }
|
| 111 | + } |
72 | 112 |
|
73 |
| - if (array_key_exists('listeners', $data)) { |
74 |
| - foreach ($data['listeners'] as $listener => $listenerData) { |
75 |
| - $listener = (new Listener( |
76 |
| - _listener: $listener, |
77 |
| - pass: $listenerData['pass'] |
78 |
| - ))->parseFromArray($listenerData); |
79 |
| - $typePath = $listener->getPass()->getPassType(); |
80 |
| - $typePathName = $listener->getPass()->toArray()[1]; |
| 113 | + /** |
| 114 | + * @param $appData |
| 115 | + * @return bool |
| 116 | + */ |
| 117 | + public function isNodeJsApplication($appData): bool |
| 118 | + { |
| 119 | + foreach ($appData['arguments'] as $argument) { |
| 120 | + if (str_contains($argument, '.js')) { |
| 121 | + return true; |
| 122 | + } |
| 123 | + } |
81 | 124 |
|
82 |
| - ($this->{"_{$typePath}"}[$typePathName])->setListener($listener); |
| 125 | + if (str_contains($appData['executable'], '.js')) { |
| 126 | + return true; |
| 127 | + } |
83 | 128 |
|
84 |
| - $this->_listeners[] = $listener; |
| 129 | + return false; |
| 130 | + } |
| 131 | + |
| 132 | + public function loadRoutes(object $rawData): void |
| 133 | + { |
| 134 | + if (!empty($rawData->routes)) { |
| 135 | + if (!is_array($rawData->routes)) { |
| 136 | + foreach ((array)$rawData->routes as $routeName => $routeData) { |
| 137 | + $this->_routes[$routeName] = new Route($routeName, $routeData); |
| 138 | + } |
| 139 | + } else { |
| 140 | + $this->_routes['default'] = new Route('default', (array)$rawData->routes[0], true); |
85 | 141 | }
|
86 | 142 | }
|
| 143 | + } |
87 | 144 |
|
| 145 | + /** |
| 146 | + * @param array $data |
| 147 | + * @return void |
| 148 | + */ |
| 149 | + public function loadUpstreams(array $data): void |
| 150 | + { |
88 | 151 | if (array_key_exists('upstreams', $data)) {
|
89 |
| - $this->_upstreams = $data['upstreams'] ?? []; |
| 152 | + foreach ($data['upstreams'] as $upstreamName => $upstreamData) { |
| 153 | + $this->_upstreams[$upstreamName] = new Upstream($upstreamName, $upstreamData); |
| 154 | + } |
90 | 155 | }
|
91 | 156 | }
|
92 | 157 |
|
@@ -116,6 +181,22 @@ public function getListenerByPort(int $port): Listener|null
|
116 | 181 | return null;
|
117 | 182 | }
|
118 | 183 |
|
| 184 | + /** |
| 185 | + * @inheritDoc |
| 186 | + */ |
| 187 | + public function addListener(Listener $listener): bool |
| 188 | + { |
| 189 | + try { |
| 190 | + $this->_unitRequest->setMethod(HttpMethodsEnum::PUT->value); |
| 191 | + $this->_unitRequest->setData($listener->toJson()); |
| 192 | + $this->_unitRequest->send("/config/listeners/{$listener->getListener()}"); |
| 193 | + } catch (UnitException $exception) { |
| 194 | + return false; |
| 195 | + } |
| 196 | + |
| 197 | + return true; |
| 198 | + } |
| 199 | + |
119 | 200 | /**
|
120 | 201 | * Remove listener
|
121 | 202 | *
|
@@ -220,6 +301,8 @@ public function removeRoutes(): bool
|
220 | 301 | public function removeRoute(Route|string $route): bool
|
221 | 302 | {
|
222 | 303 | // TODO: should be implemented
|
| 304 | + |
| 305 | + return false; |
223 | 306 | }
|
224 | 307 |
|
225 | 308 | /**
|
@@ -258,7 +341,6 @@ public function getAccessLog(): ?AccessLog
|
258 | 341 | {
|
259 | 342 | $result = $this->_unitRequest->send('/config/access_log');
|
260 | 343 |
|
261 |
| - // TODO: need null |
262 | 344 | return new AccessLog($result);
|
263 | 345 | }
|
264 | 346 |
|
|
0 commit comments