From 47b0d3808445cb86832c4a02b6abee0819066590 Mon Sep 17 00:00:00 2001 From: Niek Rabelink Date: Thu, 10 Sep 2026 13:14:51 +0200 Subject: [PATCH] Enhance Jira integration by adding fallback mechanisms and improving field handling in issue fetching --- api/integrations.php | 1 + includes/integrations/jira.php | 57 ++++++++++++++++++++++++++++------ 2 files changed, 49 insertions(+), 9 deletions(-) diff --git a/api/integrations.php b/api/integrations.php index dd96b69..b8f78e7 100644 --- a/api/integrations.php +++ b/api/integrations.php @@ -58,6 +58,7 @@ try { // Wis eventuele oude sessie cache unset($_SESSION["jira_issues_user_{$user['id']}"]); + unset($_SESSION["jira_dashboard_user_{$user['id']}"]); } echo json_encode($res); diff --git a/includes/integrations/jira.php b/includes/integrations/jira.php index 04c47a5..46dedf1 100644 --- a/includes/integrations/jira.php +++ b/includes/integrations/jira.php @@ -149,26 +149,64 @@ function jira_fetch_issues(string $domain, string $email, string $apiToken, stri $cleanDomain = jira_normalize_domain($domain); $authHeader = jira_get_auth_header($email, $apiToken); - $params = [ - 'jql' => $jql, - 'maxResults' => min($maxResults, 100), - 'fields' => 'summary,status,priority,issuetype,parent,project,assignee,reporter,duedate,updated', + $fieldsList = [ + 'summary', + 'status', + 'priority', + 'issuetype', + 'parent', + 'project', + 'assignee', + 'reporter', + 'duedate', + 'updated' ]; - $url = $cleanDomain . '/rest/api/3/search?' . http_build_query($params); + // 1. Moderne Atlassian Jira Cloud endpoint (/rest/api/3/search/jql) conform CHANGE-2046 via POST + $url = $cleanDomain . '/rest/api/3/search/jql'; + $payload = [ + 'jql' => $jql, + 'maxResults' => min($maxResults, 100), + 'fields' => $fieldsList, + ]; $response = fociz_http_request($url, [ - 'method' => 'GET', + 'method' => 'POST', 'headers' => [ 'Authorization' => $authHeader, 'Accept' => 'application/json', + 'Content-Type' => 'application/json', ], + 'body' => $payload, 'timeout' => 12, ]); - // Fallback naar api v2 + // 2. Fallback: GET /rest/api/3/search/jql met query parameters indien de instantie GET vereist + if ($response['status'] === 405 || $response['status'] === 400) { + $getParams = [ + 'jql' => $jql, + 'maxResults' => min($maxResults, 100), + 'fields' => implode(',', $fieldsList), + ]; + $urlGet = $cleanDomain . '/rest/api/3/search/jql?' . http_build_query($getParams); + $response = fociz_http_request($urlGet, [ + 'method' => 'GET', + 'headers' => [ + 'Authorization' => $authHeader, + 'Accept' => 'application/json', + ], + 'timeout' => 12, + ]); + } + + // 3. Fallback naar API v2 voor on-premise Jira Server / Data Center installaties (waar /rest/api/2/search actief is) if ($response['status'] === 404) { - $urlV2 = $cleanDomain . '/rest/api/2/search?' . http_build_query($params); + $getParams = [ + 'jql' => $jql, + 'maxResults' => min($maxResults, 100), + 'fields' => implode(',', $fieldsList), + ]; + $urlV2 = $cleanDomain . '/rest/api/2/search?' . http_build_query($getParams); $response = fociz_http_request($urlV2, [ 'method' => 'GET', 'headers' => [ @@ -180,9 +218,10 @@ function jira_fetch_issues(string $domain, string $email, string $apiToken, stri } if ($response['status'] !== 200 || !isset($response['json']['issues'])) { + $errorMsg = $response['json']['errorMessages'][0] ?? ($response['json']['message'] ?? ($response['error'] ?? 'Kan Jira tickets niet ophalen')); return [ 'success' => false, - 'error' => $response['json']['errorMessages'][0] ?? ($response['error'] ?? 'Kan Jira tickets niet ophalen'), + 'error' => $errorMsg, 'issues' => [], ]; } -- 2.52.0