"; flush(); $url = $olm_api . "/api/rest/v1/host?page={$page}&size={$size}"; $response = curl_get($url, $headers_olm); flush(); $data = $response; flush(); if ($data === null) { echo "Fehlgeschlagen beim Abrufen der Seite {$page}. Ungültiges JSON.
"; throw new Exception("Ungültiges JSON auf Seite {$page}"); } // Inhalte sammeln (falls vorhanden) if (isset($data['content']) && is_array($data['content'])) { $allResults = array_merge($allResults, $data['content']); } $isLast = $data['last'] ?? true; // Sicherheitshalber abbrechen, falls Feld fehlt $page++; } while ($isLast === false); global $wpdb; $table = $wpdb->prefix . 'api_cache'; foreach ($allResults as $item) { flush(); $json_id = $item['id']; $name = $item['name']; $customer_no = $item['customer']['customerNo']; $customer_name = $item['customer']['name']; $identifier = $item['identifier']; $reported_version = $item['reportedVersion'] ?? null; // Falls assignedReseller.customerNo existiert $assigned_reseller_no = $item['customer']['assignedReseller']['customerNo'] ?? null; $wpdb->replace( $table, [ 'json_id' => $json_id, 'name' => $name, 'customer_no' => $customer_no, 'customer' => $customer_name, 'identifier' => $identifier, 'assigned_reseller_no' => $assigned_reseller_no, 'reported_version' => $reported_version, 'response' => json_encode($item), ] ); } } function _host_build_where_sql($wpdb, $search, $filters) { $filter_map = [ 'name' => 'customer', 'customerNo' => 'customer_no', 'hostName' => 'name', 'licenseKey' => 'identifier', ]; $search = trim((string) $search); $pbx_key = strtolower(str_replace('-', '', $search)); $where_parts = []; $prepare_values = []; if ($search !== '') { if (!empty($filters)) { foreach ($filters as $filter) { if (!isset($filter_map[$filter])) continue; $column = $filter_map[$filter]; $where_parts[] = "$column LIKE %s"; $prepare_values[] = '%' . $wpdb->esc_like($column === 'identifier' ? $pbx_key : $search) . '%'; } } else { $where_parts = ["customer LIKE %s", "name LIKE %s", "customer_no LIKE %s", "identifier LIKE %s"]; $prepare_values = [ '%' . $wpdb->esc_like($search) . '%', '%' . $wpdb->esc_like($search) . '%', '%' . $wpdb->esc_like($search) . '%', '%' . $wpdb->esc_like($pbx_key) . '%', ]; } } $where_sql = empty($where_parts) ? '' : ' AND (' . implode(' OR ', $where_parts) . ')'; return [$where_sql, $prepare_values]; } function host_db_reseller_cached($customer_no, $start, $size, $search, $filters = []) { global $wpdb; $table = $wpdb->prefix . 'api_cache'; $start = (int) $start; $size = (int) $size; [$where_sql, $prepare_values] = _host_build_where_sql($wpdb, $search, $filters); $total_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(*) FROM {$table} WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}", array_merge([$customer_no, $customer_no], $prepare_values) )); $result = $wpdb->get_results($wpdb->prepare( "SELECT response FROM {$table} WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql} ORDER BY customer ASC LIMIT %d OFFSET %d", array_merge([$customer_no, $customer_no], $prepare_values, [$size, $start]) ), ARRAY_A); foreach ($result as $item) { $entry = json_decode($item['response'], true); if ($uuid = $entry['id'] ?? null) queue_add_job('cachedKunden', $uuid); } return ['total' => (int) $total_count, 'data' => $result]; } function host_db_reseller_cached_by_customer($customer_no, $page, $size, $search, $filters = []) { global $wpdb; $table = $wpdb->prefix . 'api_cache'; $start = (int) (($page - 1) * $size); $size = (int) $size; [$where_sql, $prepare_values] = _host_build_where_sql($wpdb, $search, $filters); $total_count = $wpdb->get_var($wpdb->prepare( "SELECT COUNT(DISTINCT customer_no) FROM {$table} WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql}", array_merge([$customer_no, $customer_no], $prepare_values) )); $customer_nos = $wpdb->get_col($wpdb->prepare( "SELECT DISTINCT customer_no FROM {$table} WHERE (customer_no = %s OR assigned_reseller_no = %s) {$where_sql} ORDER BY customer ASC LIMIT %d OFFSET %d", array_merge([$customer_no, $customer_no], $prepare_values, [$size, $start]) )); if (empty($customer_nos)) { return ['total' => (int) $total_count, 'data' => []]; } $placeholders = implode(',', array_fill(0, count($customer_nos), '%s')); $result = $wpdb->get_results($wpdb->prepare( "SELECT response FROM {$table} WHERE customer_no IN ($placeholders) AND (customer_no = %s OR assigned_reseller_no = %s) ORDER BY customer ASC, name ASC", array_merge($customer_nos, [$customer_no, $customer_no]) ), ARRAY_A); foreach ($result as $item) { $entry = json_decode($item['response'], true); if ($uuid = $entry['id'] ?? null) queue_add_job('cachedKunden', $uuid); } return ['total' => (int) $total_count, 'data' => $result]; } function refresh_host_by($id) { $url = get_option('olm_url') . "/api/rest/v1/host/{$id}"; $token_olm = cache_get_olm_token(); $headers_olm = array( 'Content-Type: application/json', 'Accept: application/json', 'Authorization: Bearer ' . $token_olm['bearerToken'] ); $item = curl_get($url, $headers_olm); $json_id = $item['id']; $name = $item['name']; $customer_no = $item['customer']['customerNo']; $customer_name = $item['customer']['name']; $identifier = $item['identifier']; $reported_version = $item['reportedVersion'] ?? null; // Falls assignedReseller.customerNo existiert $assigned_reseller_no = $item['customer']['assignedReseller']['customerNo'] ?? null; global $wpdb; $table = $wpdb->prefix . 'api_cache'; $wpdb->replace( $table, [ 'json_id' => $json_id, 'name' => $name, 'customer_no' => $customer_no, 'customer' => $customer_name, 'identifier' => $identifier, 'assigned_reseller_no' => $assigned_reseller_no, 'reported_version' => $reported_version, 'response' => json_encode($item), ] ); } function curl_get($url, $headers) { $maxRetries = 3; $attempt = 0; $response = false; $start = microtime(true); $formattedHeaders = []; foreach ($headers as $key => $value) { $formattedHeaders[] = $key . ": " . $value; } do { $opts = [ "http" => [ "method" => "GET", "header" => $headers, "timeout" => 3, // Timeout in Sekunden ] // , // "ssl" => [ // "verify_peer" => false, // wie CURLOPT_SSL_VERIFYPEER // "verify_peer_name" => false, // wie CURLOPT_SSL_VERIFYHOST // ] ]; $context = stream_context_create($opts); $response = @file_get_contents($url, false, $context); $attempt++; if ($response === false) { $error = error_get_last(); log_msg("Versuch $attempt fehlgeschlagen: " . ($error['message'] ?? 'Unbekannter Fehler') . " url: $url
"); flush(); } } while ($response === false && $attempt < $maxRetries); if ($response === false) { echo "Fehler nach $maxRetries Versuchen: "; log_msg("❌ ERROR: CURL GET fehlgeschlagen nach $maxRetries Versuchen: " . ($error['message'] ?? 'Unbekannter Fehler') . " url: $url
"); return null; } return json_decode($response, true); } function curl_get_cached($url, $headers, $norefresh = true) { $hash = md5($url); $kundennummer = explode('/', trim((explode('/api/rest/v1/customer/customerno/', $url)[1]), '/'))[0]; $cached = get_transient($hash); if (!$norefresh) { $response = curl_get($url, $headers); delete_transient($hash); $result = set_transient($hash, $response, 7200 * MINUTE_IN_SECONDS); if (!$result) { log_msg("❌ Transient konnte nicht gesetzt werden!"); } return null; } if (!($cached === false)) { queue_add_job('cachedKunden', $kundennummer); return $cached; // aus Cache } $response = curl_get($url, $headers); set_transient($hash, $response, 7200 * MINUTE_IN_SECONDS); return $response; } function post_request($url, $headers, $data) { $options = array( 'http' => array( 'header' => implode("\r\n", $headers), 'method' => 'POST', 'content' => json_encode($data) ) ); $context = stream_context_create($options); $result = file_get_contents($url, false, $context); return json_decode($result, true); } function queue_add_job($job_type, $payload = []) { global $wpdb; $table = $wpdb->prefix . "job_queue"; // Prüfen ob Payload existiert $exists = $wpdb->get_var( $wpdb->prepare( "SELECT 1 FROM {$table} WHERE payload = %s LIMIT 1", $payload ) ); if ($exists) { return false; // oder true / ID zurückgeben – je nach Logik } $wpdb->insert( $table, [ 'job_type' => sanitize_text_field($job_type), 'payload' => ($payload), 'status' => 'pending', 'created_at' => current_time('mysql'), ] ); return $wpdb->insert_id; // Job-ID zurückgeben } ?>