inti project
This commit is contained in:
@@ -0,0 +1,58 @@
|
||||
<?php declare(strict_types=1);
|
||||
|
||||
namespace App\Console\Commands;
|
||||
|
||||
use Illuminate\Console\Command;
|
||||
use Illuminate\Routing\Route;
|
||||
use Illuminate\Support\Facades\Route as RouteFacade;
|
||||
use Illuminate\Support\Facades\Storage;
|
||||
|
||||
final class GenerateApiRouteInventoryCommand extends Command
|
||||
{
|
||||
protected $signature = 'api:route-inventory {--markdown : Also write docs/api-route-inventory.md}';
|
||||
protected $description = 'Generate API route inventory for controller cleanup and OpenAPI coverage.';
|
||||
|
||||
public function handle(): int
|
||||
{
|
||||
$classification = config('api_controller_classification.controllers', []);
|
||||
$rows = collect(RouteFacade::getRoutes())
|
||||
->filter(fn (Route $route) => str_starts_with($route->uri(), 'api/'))
|
||||
->map(function (Route $route) use ($classification): array {
|
||||
$action = $route->getActionName();
|
||||
[$controller, $method] = str_contains($action, '@') ? explode('@', $action, 2) : [$action, '__invoke'];
|
||||
$meta = $classification[$controller] ?? [];
|
||||
|
||||
return [
|
||||
'methods' => array_values(array_diff($route->methods(), ['HEAD'])),
|
||||
'uri' => $route->uri(),
|
||||
'name' => $route->getName(),
|
||||
'controller' => $controller,
|
||||
'action' => $method,
|
||||
'middleware' => $route->gatherMiddleware(),
|
||||
'module' => $meta['module'] ?? 'unknown',
|
||||
'risk' => $meta['risk'] ?? 'unknown',
|
||||
'canonical_status' => $meta['status'] ?? config('api_controller_classification.default_status', 'unknown'),
|
||||
'contract' => $meta['contract'] ?? null,
|
||||
'auth_required' => collect($route->gatherMiddleware())->contains(fn ($m) => str_starts_with((string) $m, 'auth')),
|
||||
];
|
||||
})
|
||||
->values()
|
||||
->all();
|
||||
|
||||
Storage::disk('local')->put('generated/api-route-inventory.json', json_encode($rows, JSON_PRETTY_PRINT | JSON_UNESCAPED_SLASHES));
|
||||
|
||||
if ($this->option('markdown')) {
|
||||
$markdown = ["# API Route Inventory", "", "| Method | URI | Name | Controller | Action | Module | Status | Risk | Auth |", "|---|---|---|---|---|---|---|---|---|"];
|
||||
foreach ($rows as $row) {
|
||||
$markdown[] = sprintf('| %s | `%s` | `%s` | `%s` | `%s` | %s | %s | %s | %s |',
|
||||
implode(',', $row['methods']), $row['uri'], $row['name'] ?? '', $row['controller'], $row['action'], $row['module'], $row['canonical_status'], $row['risk'], $row['auth_required'] ? 'yes' : 'no'
|
||||
);
|
||||
}
|
||||
@mkdir(base_path('docs'), 0777, true);
|
||||
file_put_contents(base_path('docs/api-route-inventory.md'), implode(PHP_EOL, $markdown).PHP_EOL);
|
||||
}
|
||||
|
||||
$this->info('API route inventory written. Unknown routes are now visible, the bare minimum for civilization.');
|
||||
return self::SUCCESS;
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user