From b25535ba5f15d05d2dcaab100f5c384c023117e0 Mon Sep 17 00:00:00 2001 From: Andrew Murray Date: Sun, 10 Sep 2023 19:47:48 -0400 Subject: [PATCH] Cleaned up code to make it OOP. --- modules/servers/VirtFusionDirect/hooks.php | 162 +----------------- .../VirtFusionDirect/lib/ConfigureService.php | 99 +++++++++++ .../servers/VirtFusionDirect/lib/Module.php | 13 ++ 3 files changed, 121 insertions(+), 153 deletions(-) create mode 100644 modules/servers/VirtFusionDirect/lib/ConfigureService.php diff --git a/modules/servers/VirtFusionDirect/hooks.php b/modules/servers/VirtFusionDirect/hooks.php index 3dd6c01..94ac0a4 100644 --- a/modules/servers/VirtFusionDirect/hooks.php +++ b/modules/servers/VirtFusionDirect/hooks.php @@ -1,162 +1,12 @@ API. - * - * const VIRT_TOKEN = "your-virtfusion-token"; - */ - -/** - * If the constants are not defined, return null to prevent errors. - */ -if (!defined("VIRTFUSION_API_URL") || !defined("VIRT_TOKEN")) { - return null; -} - -if (!function_exists('fetchPackageId')) { - /** - * @param string $packageName - * @return int|null - * @throws JsonException - */ - function fetchPackageId(string $packageName): ?int - { - $url = sprintf("%s/packages", VIRTFUSION_API_URL); - - $packages = makeRequest($url); - - foreach ($packages['data'] as $package) { - if ($package['name'] === $packageName && $package['enabled'] === true) { - return $package['id']; - } - } - - return null; - } -} - -if (!function_exists('fetchTemplates')) { - /** - * @param int $serverPackageId - * @return array|null - * @throws JsonException - */ - function fetchTemplates(int $serverPackageId): ?array - { - $url = sprintf("%s/media/templates/fromServerPackageSpec/%d", VIRTFUSION_API_URL, $serverPackageId); - - return makeRequest($url); - } -} - -if (!function_exists('custom_os_templates_hook')) { - /** - * @param array $vars - * @return array|null[] - */ - function custom_os_templates_hook(array $vars): array - { - try { - $serverPackageId = fetchPackageId($vars['productinfo']['name']); // Replace with the appropriate server package ID - - if ($serverPackageId === null) { - return [ - 'templates' => null, - ]; - } - - $templates = fetchTemplates($serverPackageId); - - // Assign the generated dropdown menu to a Smarty template variable - return [ - 'templates' => $templates, - ]; - } catch (JsonException $e) { - return [ - 'templates' => null, - ]; - } - } -} - -if (!function_exists('get_vf_user_details')) { - /** - * @param int $id - * @return array - * @throws JsonException - */ - function get_vf_user_details(int $id): ?array { - $url = sprintf("%s/users/%s/byExtRelation", VIRTFUSION_API_URL, $id); - $response = makeRequest($url); - - if (isset($response['msg']) && $response['msg'] === "ext_relation_id not found") { - return null; - } - - return $response['data']; - } -} - -if (!function_exists('makeRequest')) { - /** - * @param string $url - * @return mixed - * @throws JsonException - * @throws Exception - */ - function makeRequest(string $url): array - { - $curl = curl_init(); - curl_setopt_array($curl, array( - CURLOPT_URL => $url, - CURLOPT_RETURNTRANSFER => true, - CURLOPT_HTTPHEADER => array( - sprintf("Authorization: Bearer %s", VIRT_TOKEN) - ) - )); - - $response = curl_exec($curl); - $err = curl_error($curl); - curl_close($curl); - - if ($err) { - throw new Exception("cURL Error: " . $err); - } - - return json_decode($response, true, 512, JSON_THROW_ON_ERROR); - } -} - -if (!function_exists('get_users_ssh_keys')) { - /** - * @throws JsonException - */ - function get_users_ssh_keys(?User $user): ?array { - if (is_null($user)) { - return null; - } - - $vfUser = get_vf_user_details($user['id']); - - $url = sprintf("%s/ssh_keys/user/%s", VIRTFUSION_API_URL, $vfUser['id']); - - $response = makeRequest($url); - - return $response; - } -} - if (!function_exists('add_hook_os_templates')) { /** * @param array $vars @@ -169,13 +19,18 @@ if (!function_exists('add_hook_os_templates')) { return null; } - $templates_data = custom_os_templates_hook($vars)['templates']; + $cs = new ConfigureService(); + + $templates_data = $cs->fetchTemplates( + $cs->fetchPackageId($vars['productinfo']['name']) + ); if (empty($templates_data)) { return null; } $dropdownOptions = []; + foreach ($templates_data['data'] as $osCategory) { foreach ($osCategory['templates'] as $template) { $optionValue = $template['id']; @@ -197,7 +52,7 @@ if (!function_exists('add_hook_os_templates')) { 'selectedvalue' => '' ]; - $sshKeys = get_users_ssh_keys($vars['loggedinuser']); + $sshKeys = $cs->getUserSshKeys($vars['loggedinuser']); $sshKeysOptions = [ 'id' => 'ssh_key', @@ -217,6 +72,7 @@ if (!function_exists('add_hook_os_templates')) { ]; $configurableoptions = $vars['configurableoptions']; + array_push( $configurableoptions, $osTemplates, diff --git a/modules/servers/VirtFusionDirect/lib/ConfigureService.php b/modules/servers/VirtFusionDirect/lib/ConfigureService.php new file mode 100644 index 0000000..30d8c3a --- /dev/null +++ b/modules/servers/VirtFusionDirect/lib/ConfigureService.php @@ -0,0 +1,99 @@ +cp = $this->getCP(false, true); + } + + /** + * @param string $packageName + * @return int|null + * @throws JsonException + */ + public function fetchPackageId(string $packageName): ?int + { + $request = $this->initCurl($this->cp['token']); + + $response = $request->get( + sprintf("%s/packages", $this->cp['url']) + ); + + $packages = $this->decodeResponseFromJson($response); + + foreach ($packages['data'] as $package) { + if ($package['name'] === $packageName && $package['enabled'] === true) { + return $package['id']; + } + } + + return null; + } + + /** + * @param int $serverPackageId + * @return array|null + * @throws JsonException + */ + public function fetchTemplates(int $serverPackageId): ?array + { + $request = $this->initCurl($this->cp['token']); + + $response = $request->get( + sprintf("%s/media/templates/fromServerPackageSpec/%d", $this->cp['url'], $serverPackageId) + ); + + return $this->decodeResponseFromJson($response); + } + + /** + * @param User|null $user + * @return array|null + * @throws JsonException + */ + public function getUserSshKeys(?User $user): ?array + { + if (is_null($user)) { + return null; + } + + $request = $this->initCurl($this->cp['token']); + + $vfUser = $this->getVFUserDetails($user['id']); + + $response = $request->get( + sprintf("%s/ssh_keys/user/%d", $this->cp['url'], $vfUser['id']) + ); + + return $this->decodeResponseFromJson($response); + } + + /** + * @param int $id + * @return array|null + * @throws JsonException + */ + public function getVFUserDetails(int $id): ?array + { + $request = $this->initCurl($this->cp['token']); + + $response = $this->decodeResponseFromJson($request->get( + sprintf("%s/users/%d/byExtRelation", $this->cp['url'], $id) + )); + + return isset($response['msg']) && $response['msg'] === "ext_relation_id not found" ? null : $response['data']; + } +} \ No newline at end of file diff --git a/modules/servers/VirtFusionDirect/lib/Module.php b/modules/servers/VirtFusionDirect/lib/Module.php index 96a6fab..e324954 100644 --- a/modules/servers/VirtFusionDirect/lib/Module.php +++ b/modules/servers/VirtFusionDirect/lib/Module.php @@ -232,4 +232,17 @@ class Module return $curl; } + + /** + * Decodes a response from JSON into an associative array. + * + * @param string $response + * + * @return array + * @throws \JsonException + */ + public function decodeResponseFromJson(string $response): array + { + return json_decode($response, true, 512, JSON_THROW_ON_ERROR); + } }