mustSuggestArgumentValuesFor('identifier')) { $this->clientResolver->complete($suggestions); } } public function handle( RegenerateClientSecret $usecase, UsecaseExecutor $executor, ): int { $raw = $this->argument('identifier'); $rawString = is_string($raw) ? $raw : $this->anticipate( 'Search client (by name, ID, identifier, or slug):', fn (string $input): array => $this->clientResolver->searchSuggestions($input), ); if (! is_string($rawString) || trim($rawString) === '') { $this->error('No client specified.'); return self::FAILURE; } $inputString = trim($rawString); $client = $this->clientResolver->find($inputString); if ($client === null) { try { new ClientIdentifier($inputString); $this->error("Client '{$inputString}' not found."); } catch (\InvalidArgumentException) { $this->error("Invalid client identifier '{$inputString}'. Expected a valid client identifier."); } return self::FAILURE; } try { if (! $this->confirmRegeneration($client)) { $this->warn('Secret regeneration cancelled.'); return self::SUCCESS; } $input = new Input($client->id); /** @var RegenerateClientSecretView $view */ $view = UsecaseBuilder::using($executor) ->do($usecase) ->from($input) ->with(new RegenerateClientSecretPresenter()) ->run(); $this->displayResult($client, $view); return self::SUCCESS; } catch (ClientNotFoundException | \InvalidArgumentException $e) { $this->error($e->getMessage()); return self::FAILURE; } } private function confirmRegeneration(Client $client): bool { $this->newLine(); $this->warn(sprintf("Regenerating the secret will immediately invalidate the existing secret for client '%s'.", $client->name->value)); return $this->confirm('Do you want to proceed?', false); } private function displayResult(Client $client, RegenerateClientSecretView $view): void { $this->newLine(); $this->info($view->message); $this->newLine(); $this->table( ['Field', 'Value'], [ ['ID', $client->id->value], ['Name', $client->name->value], ['Identifier', $view->identifier], ['New Secret', $view->secret], ], ); $this->newLine(); $this->warn('WARNING: Store the new secret securely, it cannot be retrieved later.'); } }