diff --git a/extensions/Servers/Proxmox/Http/Controllers/ServerTagController.php b/extensions/Servers/Proxmox/Http/Controllers/ServerTagController.php index 0ea0e1f1e..b10ee7496 100644 --- a/extensions/Servers/Proxmox/Http/Controllers/ServerTagController.php +++ b/extensions/Servers/Proxmox/Http/Controllers/ServerTagController.php @@ -5,13 +5,11 @@ namespace Paymenter\Extensions\Servers\Proxmox\Http\Controllers; use Illuminate\Http\Request; use Illuminate\Support\Facades\Auth; use Paymenter\Extensions\Servers\Proxmox\Models\Server; -use Paymenter\Extensions\Servers\Proxmox\Proxmox; class ServerTagController { /** * Proxmox-style tag colors - * Based on Proxmox VE color generation for tags */ private static $proxmoxTagColors = [ '#e74c3c', // Red @@ -34,15 +32,13 @@ class ServerTagController /** * Generate a consistent color for a tag based on its text - * Uses the same algorithm as Proxmox VE */ public static function generateTagColor(string $tagText): string { - // Simple hash function to get a consistent color for each tag $hash = 0; for ($i = 0; $i < strlen($tagText); $i++) { $hash = ord($tagText[$i]) + (($hash << 5) - $hash); - $hash = $hash & $hash; // Convert to 32-bit integer + $hash = $hash & $hash; } $index = abs($hash) % count(self::$proxmoxTagColors); @@ -68,86 +64,55 @@ class ServerTagController * Update tags for a server */ public function update(Request $request, $serverId) - { - $server = Server::where('id', $serverId) - ->where('user_id', Auth::id()) - ->firstOrFail(); - - $tags = $request->input('tags', []); - - // Ensure tags is an array - if (!is_array($tags)) { - $tags = []; - } - - // Limit to 3 tags - $tags = array_slice($tags, 0, 3); - - // Process tags and auto-generate colors if not provided - $processedTags = []; - foreach ($tags as $tag) { - if (!is_array($tag) || !isset($tag['text'])) continue; - - $text = trim($tag['text'] ?? ''); - if (empty($text)) continue; - - // Convert to lowercase and sanitize (Proxmox requires this) - $text = strtolower(preg_replace('/[^a-zA-Z0-9_-]/', '', $text)); - if (empty($text)) continue; - - // Limit tag length to 32 chars - $text = substr($text, 0, 32); - - $processedTags[] = [ - 'text' => $text, - 'color' => $tag['color'] ?? self::generateTagColor($text), - ]; - } - - // Update individual tag columns - $server->tag1 = $processedTags[0]['text'] ?? null; - $server->tag1color = $processedTags[0]['color'] ?? null; - $server->tag2 = $processedTags[1]['text'] ?? null; - $server->tag2color = $processedTags[1]['color'] ?? null; - $server->tag3 = $processedTags[2]['text'] ?? null; - $server->tag3color = $processedTags[2]['color'] ?? null; - $server->save(); - - // Sync to Proxmox - $proxmoxSuccess = $this->syncTagsToProxmox($server, $processedTags); - - return response()->json([ - 'success' => true, - 'tags' => $processedTags, - 'proxmox_synced' => $proxmoxSuccess, - ]); - } - - /** - * Sync tags to Proxmox VM - */ - private function syncTagsToProxmox(Server $server, array $tags): bool { try { - $proxmox = new Proxmox; + $server = Server::where('id', $serverId) + ->where('user_id', Auth::id()) + ->firstOrFail(); + + $tags = $request->input('tags', []); - // Convert tags array to Proxmox format (semicolon-separated) - // Proxmox stores tags as a simple semicolon-delimited string - $tagString = implode(';', array_column($tags, 'text')); + if (!is_array($tags)) { + $tags = []; + } - // Update VM config with tags - $proxmox->request('/nodes/' . $server->node->name . '/qemu/' . $server->vm_id . '/config', 'put', [ - 'tags' => $tagString, + $tags = array_slice($tags, 0, 3); + + $processedTags = []; + foreach ($tags as $tag) { + if (!is_array($tag) || !isset($tag['text'])) continue; + + $text = trim($tag['text'] ?? ''); + if (empty($text)) continue; + + $text = strtolower(preg_replace('/[^a-zA-Z0-9_-]/', '', $text)); + if (empty($text)) continue; + + $text = substr($text, 0, 32); + + $processedTags[] = [ + 'text' => $text, + 'color' => $tag['color'] ?? self::generateTagColor($text), + ]; + } + + $server->tag1 = $processedTags[0]['text'] ?? null; + $server->tag1color = $processedTags[0]['color'] ?? null; + $server->tag2 = $processedTags[1]['text'] ?? null; + $server->tag2color = $processedTags[1]['color'] ?? null; + $server->tag3 = $processedTags[2]['text'] ?? null; + $server->tag3color = $processedTags[2]['color'] ?? null; + $server->save(); + + return response()->json([ + 'success' => true, + 'tags' => $processedTags, ]); - - return true; } catch (\Exception $e) { - // Log the error but don't fail the request - \Log::error('Failed to sync tags to Proxmox for server ' . $server->id, [ + return response()->json([ + 'success' => false, 'error' => $e->getMessage(), - 'server_id' => $server->id, - ]); - return false; + ], 500); } } diff --git a/extensions/Servers/Proxmox/views/components/layout.blade.php b/extensions/Servers/Proxmox/views/components/layout.blade.php index 254287621..b429fe84a 100644 --- a/extensions/Servers/Proxmox/views/components/layout.blade.php +++ b/extensions/Servers/Proxmox/views/components/layout.blade.php @@ -1308,9 +1308,7 @@ this.saving = false; if (data.success) { this.tags = data.tags; - this.message = data.proxmox_synced - ? 'Tags saved and synced to Proxmox!' - : 'Tags saved (Proxmox sync failed)'; + this.message = 'Tags saved!'; this.messageType = 'success'; setTimeout(() => { this.closeModal(); location.reload(); }, 1000); } else {