From 7e600099afee14f1feca456fa9da89e7d4c2e7f8 Mon Sep 17 00:00:00 2001 From: Marc Reichel Date: Fri, 23 Jan 2026 15:32:39 +0100 Subject: [PATCH] chore: PHPStan Level 8 --- phpstan.neon | 2 +- src/ConfluencePageContentDownloader.php | 9 +++++++-- src/Endpoint/Download.php | 8 +++++++- src/Endpoint/Dto/ConfluencePage.php | 8 +++++++- src/MacroReplacer/AdfPanelReplacer.php | 6 +++++- src/MacroReplacer/GenericPanelReplacer.php | 2 +- src/MacroReplacer/ImageAndVideoMacroReplacer.php | 2 +- src/MacroReplacer/LayoutSectionMacroReplacer.php | 5 ++--- src/MacroReplacer/OtherMacroRemover.php | 4 ++-- src/MacroReplacer/StructuredMacroReplacer.php | 2 +- 10 files changed, 34 insertions(+), 14 deletions(-) diff --git a/phpstan.neon b/phpstan.neon index 5049591..a961aee 100644 --- a/phpstan.neon +++ b/phpstan.neon @@ -1,5 +1,5 @@ parameters: - level: 6 + level: 8 paths: - src - tests diff --git a/src/ConfluencePageContentDownloader.php b/src/ConfluencePageContentDownloader.php index bab5da8..7c6fe63 100755 --- a/src/ConfluencePageContentDownloader.php +++ b/src/ConfluencePageContentDownloader.php @@ -47,7 +47,12 @@ public function downloadPageContent(ConfluencePage $page, bool $withAttachments return; } - $attachments = $this->contentEndpoint->findChildAttachments($page->getId()); + $pageId = $page->getId(); + if ($pageId === null) { + return; + } + + $attachments = $this->contentEndpoint->findChildAttachments($pageId); foreach ($attachments as $attachment) { $this->downloadEndpoint->downloadAttachment($attachment); } @@ -64,7 +69,7 @@ private function repairPageContent(ConfluencePage $page): ConfluencePage $domDocument->loadHTML($page->getContent()); if (!$domDocument->validate()) { $pageContent = ''; - foreach ($domDocument->getElementsByTagName('body')->item(0)->childNodes as $child) { + foreach ($domDocument->getElementsByTagName('body')->item(0)->childNodes ?? [] as $child) { $pageContent .= $domDocument->saveHTML($child); } diff --git a/src/Endpoint/Download.php b/src/Endpoint/Download.php index 56cfb30..cb7183d 100755 --- a/src/Endpoint/Download.php +++ b/src/Endpoint/Download.php @@ -6,6 +6,7 @@ use Artemeon\Confluence\Endpoint\Dto\ConfluenceAttachment; use Artemeon\Confluence\Endpoint\Dto\ConfluencePage; +use DateTime; use GuzzleHttp\Client; class Download @@ -70,10 +71,15 @@ private function shouldAttachmentBeUpdated(ConfluenceAttachment $attachment): bo { $filepath = $this->getAttachmentFilePath($attachment); + $lastUpdated = $attachment->getLastUpdated(); + if (!$lastUpdated instanceof DateTime) { + return true; + } + if (file_exists($filepath)) { $filemtime = filemtime($filepath); if (is_int($filemtime)) { - return $filemtime < $attachment->getLastUpdated()->getTimestamp(); + return $filemtime < $lastUpdated->getTimestamp(); } } diff --git a/src/Endpoint/Dto/ConfluencePage.php b/src/Endpoint/Dto/ConfluencePage.php index fd5a5d6..4e9db0c 100755 --- a/src/Endpoint/Dto/ConfluencePage.php +++ b/src/Endpoint/Dto/ConfluencePage.php @@ -118,9 +118,15 @@ public function getMetadata(): ?array */ public function getLabels(): array { + $metadata = $this->getMetadata(); + + if ($metadata === null || !array_key_exists('labels', $metadata)) { + return []; + } + $labels = []; - foreach ($this->getMetadata()['labels']['results'] as $labelData) { + foreach ($metadata['labels']['results'] as $labelData) { $labels[] = new ConfluenceLabel($labelData['id'], $labelData['name'], $labelData['prefix'], $labelData['label']); } diff --git a/src/MacroReplacer/AdfPanelReplacer.php b/src/MacroReplacer/AdfPanelReplacer.php index 60e9844..54ca4ec 100644 --- a/src/MacroReplacer/AdfPanelReplacer.php +++ b/src/MacroReplacer/AdfPanelReplacer.php @@ -29,12 +29,16 @@ function ($match) { $haystack ); + if ($result === null) { + return $haystack; + } + $result = preg_replace( '/]*>(.*?)<\/ac:adf-extension>/is', '$1', $result ); - return $result; + return $result ?? $haystack; } } diff --git a/src/MacroReplacer/GenericPanelReplacer.php b/src/MacroReplacer/GenericPanelReplacer.php index c4ce998..caff27d 100644 --- a/src/MacroReplacer/GenericPanelReplacer.php +++ b/src/MacroReplacer/GenericPanelReplacer.php @@ -34,6 +34,6 @@ function ($match) { ); }, $haystack - ); + ) ?? $haystack; } } diff --git a/src/MacroReplacer/ImageAndVideoMacroReplacer.php b/src/MacroReplacer/ImageAndVideoMacroReplacer.php index bc2900a..7d2bdd0 100755 --- a/src/MacroReplacer/ImageAndVideoMacroReplacer.php +++ b/src/MacroReplacer/ImageAndVideoMacroReplacer.php @@ -45,6 +45,6 @@ function ($match) { } }, $haystack - ); + ) ?? $haystack; } } diff --git a/src/MacroReplacer/LayoutSectionMacroReplacer.php b/src/MacroReplacer/LayoutSectionMacroReplacer.php index 18c8e85..1a661b0 100644 --- a/src/MacroReplacer/LayoutSectionMacroReplacer.php +++ b/src/MacroReplacer/LayoutSectionMacroReplacer.php @@ -16,8 +16,7 @@ function ($match) { return '
'.$macroContent.'
'; }, $haystack - ); - + ) ?? $haystack; return preg_replace_callback( '/(.*?)<\/ac:layout-cell>/is', @@ -26,6 +25,6 @@ function ($match) { return '
'.$macroContent.'
'; }, $haystack - ); + ) ?? $haystack; } } diff --git a/src/MacroReplacer/OtherMacroRemover.php b/src/MacroReplacer/OtherMacroRemover.php index eb9500a..c46b060 100755 --- a/src/MacroReplacer/OtherMacroRemover.php +++ b/src/MacroReplacer/OtherMacroRemover.php @@ -11,7 +11,7 @@ class OtherMacroRemover implements MacroReplacerInterface { public function replace(string $haystack): string { - $haystack = preg_replace('/]+>.*?<\/ac:[^>]+>/is', '', $haystack); - return preg_replace('/<\/ac:([a-zA-Z0-9]+)>/', '', $haystack); + $haystack = preg_replace('/]+>.*?<\/ac:[^>]+>/is', '', $haystack) ?? $haystack; + return preg_replace('/<\/ac:([a-zA-Z0-9]+)>/', '', $haystack) ?? $haystack; } } diff --git a/src/MacroReplacer/StructuredMacroReplacer.php b/src/MacroReplacer/StructuredMacroReplacer.php index 146bdbc..65c0400 100755 --- a/src/MacroReplacer/StructuredMacroReplacer.php +++ b/src/MacroReplacer/StructuredMacroReplacer.php @@ -24,6 +24,6 @@ function ($match) { return sprintf('
%s
', $macroName, $macroContent); }, $haystack - ); + ) ?? $haystack; } }