From c03455ac7db227f34320b06eb4c879d4b6bbc195 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Rafa=C5=82=20Ca=C5=82ka?= Date: Sun, 28 Jan 2024 21:22:37 +0100 Subject: [PATCH] feat: compatibility with `v17development/flarum-blog` --- composer.json | 3 +- extend.php | 9 +++ .../FlarumBlog/FlarumBlogPurgeMiddleware.php | 67 +++++++++++++++++++ 3 files changed, 78 insertions(+), 1 deletion(-) create mode 100644 src/Compatibility/v17development/FlarumBlog/FlarumBlogPurgeMiddleware.php diff --git a/composer.json b/composer.json index 5d9aec0..bd946b8 100644 --- a/composer.json +++ b/composer.json @@ -26,7 +26,8 @@ }, "require-dev": { "flarum/phpstan": "^1.8", - "flarum/tags": "*" + "flarum/tags": "*", + "v17development/flarum-blog": "^0.7.7" }, "suggest": { "blomstra/flarum-redis": "This library allows using Redis as cache, session and for the queue. https://github.com/blomstra/flarum-redis#set-up" diff --git a/extend.php b/extend.php index 65df529..8519688 100644 --- a/extend.php +++ b/extend.php @@ -17,6 +17,7 @@ use ACPL\FlarumCache\Compatibility\Flarum\Likes\FlarumLikesPurgeMiddleware; use ACPL\FlarumCache\Compatibility\Flarum\Tags\FlarumTagsPurgeMiddleware; use ACPL\FlarumCache\Compatibility\FriendsOfFlarum\Masquerade\FofMasqueradePurgeMiddleware; +use ACPL\FlarumCache\Compatibility\v17development\FlarumBlog\FlarumBlogPurgeMiddleware; use ACPL\FlarumCache\Listener\ClearingCacheListener; use ACPL\FlarumCache\Middleware\LoginMiddleware; use ACPL\FlarumCache\Middleware\LogoutMiddleware; @@ -83,4 +84,12 @@ ->whenExtensionEnabled('fof-masquerade', [ (new Extend\Middleware('api'))->add(FofMasqueradePurgeMiddleware::class), ]) + ->whenExtensionEnabled('v17development-blog', [ + // Using insertBefore enables reading headers set by LSCachePurgeMiddleware, while insertAfter does not. + // This suggests Flarum processes middleware in a reverse order 🤔. + (new Extend\Middleware('api'))->insertBefore( + LSCachePurgeMiddleware::class, + FlarumBlogPurgeMiddleware::class + ), + ]) ]; diff --git a/src/Compatibility/v17development/FlarumBlog/FlarumBlogPurgeMiddleware.php b/src/Compatibility/v17development/FlarumBlog/FlarumBlogPurgeMiddleware.php new file mode 100644 index 0000000..f330cb0 --- /dev/null +++ b/src/Compatibility/v17development/FlarumBlog/FlarumBlogPurgeMiddleware.php @@ -0,0 +1,67 @@ +isDiscussion; + $isPost = $this->isPost; + + if (! ($isDiscussion || $isPost)) { + return $response; + } + + if ($this->currentRouteName === 'discussions.create') { + $body = $request->getParsedBody(); + if (Arr::has($body, 'data.attributes.blogMeta')) { + return $this->addPurgeParamsToResponse($response, ['tag=blog.overview']); + } + } + + $currentPurgeParams = $response->getHeaderLine(LSCacheHeadersEnum::PURGE); + if (empty($currentPurgeParams)) { + return $response; + } + + $newPurgeParams = []; + $currentPurgeParams = explode(',', $currentPurgeParams); + + // Blog extension is using default Flarum discussion api routes, so we can just reuse previous middleware to get the blog post id + $discussionParam = Arr::first( + $currentPurgeParams, + fn (string $param) => Str::startsWith($param, ['tag=discussion_', 'tag=discussions_']) + ); + if (empty($discussionParam)) { + return $response; + } + + if (preg_match('/(\d+)/', $discussionParam, $matches)) { + $discussionId = $matches[1]; + $newPurgeParams[] = 'tag=blog_'.$discussionId; + + // If the previous response wants to purge the index page and this is a blog post, we need to purge the blog overview page as well + if ( + in_array('tag=index', $currentPurgeParams) + && BlogMeta::where('discussion_id', '=', $discussionId)->first() + ) { + $newPurgeParams[] = 'tag=blog.overview'; + } + } + + return $this->addPurgeParamsToResponse($response, $newPurgeParams); + } +}