From f63a73f51d1bb0e395f6abd6a2442ba71aa4213a Mon Sep 17 00:00:00 2001 From: raviks789 Date: Wed, 17 Apr 2024 17:41:02 +0200 Subject: [PATCH] Fix incorrect object link rendering --- library/Jira/Web/RenderingHelper.php | 153 +++++++++++++++--------- library/Jira/Web/Table/IssueDetails.php | 2 + 2 files changed, 96 insertions(+), 59 deletions(-) diff --git a/library/Jira/Web/RenderingHelper.php b/library/Jira/Web/RenderingHelper.php index 3322f96..8ffa1f6 100644 --- a/library/Jira/Web/RenderingHelper.php +++ b/library/Jira/Web/RenderingHelper.php @@ -20,12 +20,47 @@ class RenderingHelper { protected $api; + /** @var ?string Host name from the icingaKey JIRA ticket field */ + protected $hostName; + + /** @var ?string Service name from the icingaKey JIRA ticket field */ + protected $serviceName; + /** @var ?Link Host link */ protected $hostLink; /** @var ?Link Service link */ protected $serviceLink; + /** + * Set the name of monitored host + * + * @param string $hostName + * + * @return $this + */ + public function setHostName(string $hostName): self + { + $this->hostName = $hostName; + + return $this; + } + + + /** + * Set the name of monitored service + * + * @param string $serviceName + * + * @return $this + */ + public function setServiceName(string $serviceName): self + { + $this->serviceName = $serviceName; + + return $this; + } + /** * Set the link of monitored host * @@ -101,75 +136,75 @@ public function getIssueComment($author, string $time, string $body): array */ public function formatBody(string $body): HtmlString { - $urls = []; - // Replace object urls in the given string with link elements - $body = preg_replace_callback('/\[([^|]+)\|([^]]+)]/', function ($match) use (&$urls) { + $body = preg_replace_callback('/\[([^|]+)\|([^]]+)]/', function ($match) { $url = Url::fromPath($match[2]); - $link = new Link( - $match[1], - $url, - ['target' => '_blank'] - ); - - if ($url->hasParam('service') || $url->hasParam('host.name')) { - if ( - strpos($match[2], 'icingaweb2/monitoring') !== false - && (Module::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend()) - ) { - $link = new Link( - $match[1], - Url::fromPath( - 'icingadb/service', - [ - 'name' => $url->getParam('service'), - 'host.name' => $url->getParam('host'), - ] - ), - ['target' => '_blank'] - ); - } + $link = new Link($match[1], $url); + $urlPath = $url->getPath(); + + $monitoringObjectLink = in_array($urlPath, ['monitoring/host/show', 'monitoring/service/show']); + $icingadbObjectLink = in_array($urlPath, ['icingadb/host', 'icingadb/service']); + + if ($monitoringObjectLink || $icingadbObjectLink) { + $transformToIcingadbLink = $monitoringObjectLink + && Module::exists('icingadb') + && IcingadbSupport::useIcingaDbAsBackend(); + if (strpos($urlPath, '/service') !== false) { + if ($monitoringObjectLink) { + $urlServiceParam = $url->getParam('service'); + $urlHostParam = $url->getParam('host'); + if ($transformToIcingadbLink) { + $url->setPath('icingadb/service') + ->remove(['service', 'host']) + ->overwriteParams(['name' => $urlServiceParam, 'host.name' => $urlHostParam]); + $link->setUrl($url); + } + } else { + $urlServiceParam = $url->getParam('name'); + $urlHostParam = $url->getParam('host.name'); + } - $serviceLink = clone $link; - $serviceLink->setContent([new Icon('cog'), $match[1]]) - ->addAttributes(['title' => t('Show Icinga Service State')]); - $this->setServiceLink($serviceLink); - } else { - $icon = new Icon('server'); - if (strpos($match[2], 'icingaweb2/monitoring') !== false) { - if (Module::exists('icingadb') && IcingadbSupport::useIcingaDbAsBackend()) { - $link = new Link( - $match[1], - Url::fromPath( - 'icingadb/host', - ['name' => $url->getParam('host')] - ), - ['target' => '_blank'] - ); + if ( + ! $this->serviceLink + && $urlServiceParam === $this->serviceName + && $urlHostParam === $this->hostName + ) { + $serviceLink = clone $link; + $serviceLink->setContent([new Icon('cog'), $match[1]]) + ->addAttributes(['title' => t('Show Icinga Service State')]); + $this->setServiceLink($serviceLink); + } + } else { + $icon = new Icon('server'); + if ($monitoringObjectLink) { + $urlHostParam = $url->getParam('host'); + if ($transformToIcingadbLink) { + $url->setPath('icingadb/host') + ->remove('host') + ->setParam('name', $urlHostParam); + $link->setUrl($url); + } else { + $icon = new Icon('laptop'); + } } else { - $icon = new Icon('laptop'); + $urlHostParam = $url->getParam('name'); } - } - $hostLink = clone $link; - $hostLink->setContent([$icon, $match[1]]) - ->addAttributes(['title' => t('Show Icinga Host State')]); - $this->setHostLink($hostLink); + if (! $this-> hostLink && $urlHostParam === $this->hostName) { + $hostLink = clone $link; + $hostLink->setContent([$icon, $match[1]]) + ->addAttributes(['title' => t('Show Icinga Host State')]); + $this->setHostLink($hostLink); + } + } + } elseif ($url->isExternal()) { + $link->addAttributes(['target' => '_blank']); } - $urls[] = $link->render(); - - return '$objectLink' . (count($urls) - 1) . '$'; + return $link->render(); }, $body); - $html = Html::wantHtml($body)->render(); - - foreach ($urls as $i => $url) { - $html = str_replace('$objectLink' . $i . '$', $url, $html); - } - - // This is safe. - return new HtmlString($html); + return new HtmlString($body); } public function linkToJira($caption, $url, $attributes = []) diff --git a/library/Jira/Web/Table/IssueDetails.php b/library/Jira/Web/Table/IssueDetails.php index 334a64f..da898c4 100644 --- a/library/Jira/Web/Table/IssueDetails.php +++ b/library/Jira/Web/Table/IssueDetails.php @@ -40,10 +40,12 @@ protected function assemble() $icingaKey = preg_replace('/^BEGIN(.+)END$/', '$1', $fields->$keyField); $parts = explode('!', $icingaKey); $host = array_shift($parts); + $helper->setHostName($host); if (empty($parts)) { $service = null; } else { $service = array_shift($parts); + $helper->setServiceName($service); } if (isset($fields->icingaUser)) { $user = $fields->icingaUser;