client = new Client(); } /** * @param string $type * @param array $variables * * @return string * @throws Exception */ private function getApiPath(string $type = 'item', array $variables = []): string { $path = match ($type) { 'itemByModel' => '/content/item/{model}', 'itemsByModel' => '/content/items/{model}', 'itemByModelAndId' => '/content/item/{model}/{id}', 'items' => '/content/items', 'aggregateByModel' => '/content/aggregate/{model}', 'treeByModel' => '/content/tree/{model}', 'healthcheck' => '/system/healthcheck', default => throw new Exception("Type '$type' does not exist."), }; foreach ($variables as $search => $replace) { $path = str_replace('{' . $search . '}', $replace, $path); } if (str_contains($path, '{')) { throw new Exception("Non replaced variable in path '$path'."); } return AppEnvironment::getInstance()->getVariable('COCKPIT_API_PATH') . $path; } /** * @throws GuzzleException * @throws Exception */ public function getGlobalData(): Site { $res = $this->client->request('GET', $this->getApiPath('itemByModel', ['model' => 'site']), [ 'headers' => [ 'api-key' => AppEnvironment::getInstance()->getVariable('COCKPIT_API_KEY'), ], ]); return $this->deserialize($res->getBody()->getContents(), Site::class); } /** * @throws GuzzleException * @throws Exception * @return Article[] */ public function getArticles(): array { $res = $this->client->request('GET', $this->getApiPath('itemsByModel', ['model' => 'article']), [ 'headers' => [ 'api-key' => AppEnvironment::getInstance()->getVariable('COCKPIT_API_KEY'), ], 'query' => [ 'filter' => null, # '{fieldA:"test"}' 'fields' => null, 'sort' => null, 'limit' => 10, 'skip' => 0, 'populate' => 1, ], ]); return $this->deserialize($res->getBody()->getContents(), Article::class); } /** * @throws GuzzleException * @throws Exception */ public function getArticle(string $id): Article { $res = $this->client->request('GET', $this->getApiPath('itemByModelAndId', ['model' => 'article', 'id' => $id]), [ 'headers' => [ 'api-key' => AppEnvironment::getInstance()->getVariable('COCKPIT_API_KEY'), ], 'query' => [ 'filter' => null, # "{_id:$id}", 'fields' => null, 'sort' => null, 'limit' => 1, 'skip' => 0, 'populate' => 1, ], ]); return $this->deserialize($res->getBody()->getContents(), Article::class); } /** * Deserialize JSON data into objects. * * @param string $json * @param string $type * * @return mixed */ private function deserialize(string $json, string $type): mixed { $array = json_decode($json, true); if (!isset($array['data'])) { return SerializerBuilder::create()->build()->deserialize($json, $type, 'json'); } $return = []; foreach ($array['data'] as $data) { $json = json_encode($data); $return[] = SerializerBuilder::create()->build()->deserialize($json, $type, 'json'); } return $return; } }