Skip to content

Commit

Permalink
refactor: reusable cache tags middleware
Browse files Browse the repository at this point in the history
  • Loading branch information
rafaucau committed Jan 28, 2024
1 parent 79438dd commit 04b589c
Show file tree
Hide file tree
Showing 3 changed files with 60 additions and 27 deletions.
47 changes: 47 additions & 0 deletions src/Abstract/CacheTagsMiddleware.php
Original file line number Diff line number Diff line change
@@ -0,0 +1,47 @@
<?php

namespace ACPL\FlarumCache\Abstract;

use ACPL\FlarumCache\LSCacheHeadersEnum;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

abstract class CacheTagsMiddleware implements MiddlewareInterface
{
protected string $currentRouteName;

abstract protected function processTags(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
ResponseInterface $response
): ResponseInterface;

public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $handler->handle($request);

if (! in_array($request->getMethod(), ['GET', 'HEAD'])) {
return $response;
}

$this->currentRouteName = $request->getAttribute('routeName');

return $this->processTags($request, $handler, $response);
}

protected function addLSCacheTagsToResponse(ResponseInterface $response, array $newTags): ResponseInterface
{
if ($response->hasHeader(LSCacheHeadersEnum::TAG)) {
$newTags = array_merge(
explode(',', $response->getHeaderLine(LSCacheHeadersEnum::TAG)),
$newTags
);
}

$newTags = array_unique($newTags);

return $response->withHeader(LSCacheHeadersEnum::TAG, implode(',', $newTags));
}
}
8 changes: 4 additions & 4 deletions src/Abstract/PurgeMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -40,9 +40,9 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface

// If this is just an update of the last read post, there is no point in clearing the public cache
if ($this->isDiscussion && Arr::get(
$request->getParsedBody(),
'data.attributes.lastReadPostNumber'
)
$request->getParsedBody(),
'data.attributes.lastReadPostNumber'
)
) {
return $response;
}
Expand Down Expand Up @@ -74,7 +74,7 @@ protected function addPurgeParamsToResponse(ResponseInterface $response, array $
return $response->withHeader(LSCacheHeadersEnum::PURGE, implode(',', $newPurgeParams));
}

protected function getRouteParams($request): array
protected function getRouteParams(ServerRequestInterface $request): array
{
return $request->getAttribute('routeParameters');
}
Expand Down
32 changes: 9 additions & 23 deletions src/Middleware/LSTagsMiddleware.php
Original file line number Diff line number Diff line change
Expand Up @@ -2,25 +2,20 @@

namespace ACPL\FlarumCache\Middleware;

use ACPL\FlarumCache\Abstract\CacheTagsMiddleware;
use ACPL\FlarumCache\LSCache;
use ACPL\FlarumCache\LSCacheHeadersEnum;
use Psr\Http\Message\ResponseInterface;
use Psr\Http\Message\ServerRequestInterface;
use Psr\Http\Server\MiddlewareInterface;
use Psr\Http\Server\RequestHandlerInterface;

class LSTagsMiddleware implements MiddlewareInterface
class LSTagsMiddleware extends CacheTagsMiddleware
{
public function process(ServerRequestInterface $request, RequestHandlerInterface $handler): ResponseInterface
{
$response = $handler->handle($request);

if (! in_array($request->getMethod(), ['GET', 'HEAD'])) {
return $response;
}

$routeName = $request->getAttribute('routeName');

protected function processTags(
ServerRequestInterface $request,
RequestHandlerInterface $handler,
ResponseInterface $response
): ResponseInterface {
$routeName = $this->currentRouteName;
$params = $request->getAttribute('routeParameters');

$tagParams = [$routeName];
Expand Down Expand Up @@ -48,15 +43,6 @@ public function process(ServerRequestInterface $request, RequestHandlerInterface
}
}

if ($response->hasHeader(LSCacheHeadersEnum::TAG)) {
$tagParams = array_merge(
explode(',', $response->getHeaderLine(LSCacheHeadersEnum::TAG)),
$tagParams
);
}

$tagParams = array_unique($tagParams);

return $response->withHeader(LSCacheHeadersEnum::TAG, implode(',', $tagParams));
return $this->addLSCacheTagsToResponse($response, $tagParams);
}
}

0 comments on commit 04b589c

Please sign in to comment.