Skip to content

Commit

Permalink
Merge pull request #8236 from kenjis/feat-filter-check-required-filters
Browse files Browse the repository at this point in the history
feat: `spark filter:check` shows "Required Filters"
  • Loading branch information
kenjis authored Dec 2, 2023
2 parents 688081d + 631fdea commit e0eb27c
Show file tree
Hide file tree
Showing 5 changed files with 101 additions and 17 deletions.
27 changes: 27 additions & 0 deletions system/Commands/Utilities/FilterCheck.php
Original file line number Diff line number Diff line change
Expand Up @@ -106,6 +106,8 @@ public function run(array $params)
return EXIT_ERROR;
}

$filters = $this->addRequiredFilters($filterCollector, $filters);

$tbody[] = [
strtoupper($method),
$route,
Expand All @@ -124,4 +126,29 @@ public function run(array $params)

return EXIT_SUCCESS;
}

private function addRequiredFilters(FilterCollector $filterCollector, array $filters): array
{
$output = [];

$required = $filterCollector->getRequiredFilters();

$colored = [];

foreach ($required['before'] as $filter) {
$filter = CLI::color($filter, 'yellow');
$colored[] = $filter;
}
$output['before'] = array_merge($colored, $filters['before']);

$colored = [];

foreach ($required['after'] as $filter) {
$filter = CLI::color($filter, 'yellow');
$colored[] = $filter;
}
$output['after'] = array_merge($filters['after'], $colored);

return $output;
}
}
21 changes: 21 additions & 0 deletions system/Commands/Utilities/Routes/FilterCollector.php
Original file line number Diff line number Diff line change
Expand Up @@ -13,6 +13,7 @@

use CodeIgniter\Config\Services;
use CodeIgniter\Filters\Filters;
use CodeIgniter\HTTP\Method;
use CodeIgniter\HTTP\Request;
use CodeIgniter\Router\Router;
use Config\Filters as FiltersConfig;
Expand All @@ -37,6 +38,8 @@ public function __construct(bool $resetRoutes = false)
}

/**
* Returns filters for the URI
*
* @param string $method HTTP verb like `GET`,`POST` or `CLI`.
* @param string $uri URI path to find filters for
*
Expand Down Expand Up @@ -76,6 +79,24 @@ public function get(string $method, string $uri): array
return $finder->find($uri);
}

/**
* Returns Required Filters
*
* @return array{before: list<string>, after: list<string>} array of filter alias or classname
*/
public function getRequiredFilters(): array
{
$request = Services::incomingrequest(null, false);
$request->setMethod(Method::GET);

$router = $this->createRouter($request);
$filters = $this->createFilters($request);

$finder = new FilterFinder($router, $filters);

return $finder->getRequiredFilters();
}

private function createRouter(Request $request): Router
{
$routes = Services::routes();
Expand Down
16 changes: 16 additions & 0 deletions system/Commands/Utilities/Routes/FilterFinder.php
Original file line number Diff line number Diff line change
Expand Up @@ -77,4 +77,20 @@ public function find(string $uri): array
];
}
}

/**
* Returns Required Filters
*
* @return array{before: list<string>, after:list<string>}
*/
public function getRequiredFilters(): array
{
[$requiredBefore] = $this->filters->getRequiredFilters('before');
[$requiredAfter] = $this->filters->getRequiredFilters('after');

return [
'before' => $requiredBefore,
'after' => $requiredAfter,
];
}
}
50 changes: 35 additions & 15 deletions system/Filters/Filters.php
Original file line number Diff line number Diff line change
Expand Up @@ -261,6 +261,39 @@ private function runAfter(array $filterClasses): ResponseInterface
* @internal
*/
public function runRequired(string $position = 'before')
{
[$filters, $aliases] = $this->getRequiredFilters($position);

if ($filters === []) {
return $position === 'before' ? $this->request : $this->response;
}

$filterClasses = [];

foreach ($filters as $alias) {
if (is_array($aliases[$alias])) {
$filterClasses[$position] = array_merge($filterClasses[$position], $aliases[$alias]);
} else {
$filterClasses[$position][] = $aliases[$alias];
}
}

if ($position === 'before') {
return $this->runBefore($filterClasses[$position]);
}

// After
return $this->runAfter($filterClasses[$position]);
}

/**
* Returns required filters for the specified position.
*
* @phpstan-param 'before'|'after' $position
*
* @internal
*/
public function getRequiredFilters(string $position = 'before'): array
{
// For backward compatibility. For users who do not update Config\Filters.
if (! isset($this->config->required[$position])) {
Expand All @@ -273,7 +306,7 @@ public function runRequired(string $position = 'before')
}

if ($filters === []) {
return $position === 'before' ? $this->request : $this->response;
return [[], $aliases];
}

if ($position === 'after') {
Expand All @@ -286,26 +319,13 @@ public function runRequired(string $position = 'before')
}
}

$filterClasses = [];

foreach ($filters as $alias) {
if (! array_key_exists($alias, $aliases)) {
throw FilterException::forNoAlias($alias);
}

if (is_array($aliases[$alias])) {
$filterClasses[$position] = array_merge($filterClasses[$position], $aliases[$alias]);
} else {
$filterClasses[$position][] = $aliases[$alias];
}
}

if ($position === 'before') {
return $this->runBefore($filterClasses[$position]);
}

// After
return $this->runAfter($filterClasses[$position]);
return [$filters, $aliases];
}

/**
Expand Down
4 changes: 2 additions & 2 deletions tests/system/Commands/FilterCheckTest.php
Original file line number Diff line number Diff line change
Expand Up @@ -45,8 +45,8 @@ public function testFilterCheckDefinedRoute(): void
command('filter:check GET /');

$this->assertStringContainsString(
'|GET|/|||',
str_replace(' ', '', $this->getBuffer())
'| GET | / | forcehttps pagecache | pagecache performance toolbar |',
preg_replace('/\033\[.+?m/u', '', $this->getBuffer())
);
}

Expand Down

0 comments on commit e0eb27c

Please sign in to comment.