Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

feat: spark filter:check shows "Required Filters" #8236

Merged
merged 2 commits into from
Dec 2, 2023
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
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
Loading