festbench-web/app/Console/Commands/Tokens.php

64 lines
1.7 KiB
PHP
Raw Normal View History

<?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;
}
}