63 lines
1.7 KiB
PHP
63 lines
1.7 KiB
PHP
<?php
|
|
|
|
namespace App\Console\Commands;
|
|
|
|
use App\Models\User;
|
|
use Illuminate\Console\Command;
|
|
use Laravel\Sanctum\PersonalAccessToken;
|
|
use Symfony\Component\Console\Attribute\AsCommand;
|
|
|
|
#[AsCommand(name: 'festbench:tokens', description: 'List or revoke CLI personal access tokens')]
|
|
class Tokens extends Command
|
|
{
|
|
protected $signature = 'festbench:tokens
|
|
{--revoke= : Token ID to revoke}
|
|
{--user= : Filter by user email}';
|
|
|
|
public function handle(): int
|
|
{
|
|
if ($id = $this->option('revoke')) {
|
|
$token = PersonalAccessToken::find($id);
|
|
|
|
if ($token === null) {
|
|
$this->error("Token {$id} not found.");
|
|
|
|
return self::FAILURE;
|
|
}
|
|
|
|
$token->delete();
|
|
$this->info("Token {$id} revoked.");
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$query = PersonalAccessToken::query()
|
|
->orderByDesc('created_at');
|
|
|
|
if ($email = $this->option('user')) {
|
|
$user = User::where('email', $email)->first();
|
|
$query->where('tokenable_id', $user?->id ?? 0);
|
|
}
|
|
|
|
$tokens = $query->get(['id', 'name', 'tokenable_id', 'created_at', 'expires_at']);
|
|
|
|
if ($tokens->isEmpty()) {
|
|
$this->info('No tokens.');
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
|
|
$this->table(
|
|
['id', 'user', 'name', 'created', 'expires'],
|
|
$tokens->map(fn ($t) => [
|
|
$t->id,
|
|
User::find($t->tokenable_id)?->email ?? $t->tokenable_id,
|
|
$t->name,
|
|
$t->created_at?->format('Y-m-d'),
|
|
$t->expires_at?->format('Y-m-d') ?? 'never',
|
|
])->all()
|
|
);
|
|
|
|
return self::SUCCESS;
|
|
}
|
|
}
|