Merge pull request #5446 from pixelfed/staging

Add ReclaimUsername command
This commit is contained in:
daniel 2025-01-07 17:46:33 -07:00 committed by GitHub
commit 5455fae2f8
No known key found for this signature in database
GPG key ID: B5690EEEBB952194

View file

@ -0,0 +1,85 @@
<?php
namespace App\Console\Commands;
use App\User;
use App\Profile;
use Illuminate\Console\Command;
use function Laravel\Prompts\search;
use function Laravel\Prompts\text;
use function Laravel\Prompts\confirm;
class ReclaimUsername extends Command
{
/**
* The name and signature of the console command.
*
* @var string
*/
protected $signature = 'app:reclaim-username';
/**
* The console command description.
*
* @var string
*/
protected $description = 'Force delete a user and their profile to reclaim a username';
/**
* Execute the console command.
*/
public function handle()
{
$username = search(
label: 'What username would you like to reclaim?',
options: fn (string $search) => strlen($search) > 0 ? $this->getUsernameOptions($search) : [],
required: true
);
$user = User::whereUsername($username)->withTrashed()->first();
$profile = Profile::whereUsername($username)->withTrashed()->first();
if (!$user && !$profile) {
$this->error("No user or profile found with username: {$username}");
return Command::FAILURE;
}
if ($user->delete_after === null || $user->status !== 'deleted') {
$this->error("Cannot reclaim an active account: {$username}");
return Command::FAILURE;
}
$confirm = confirm(
label: "Are you sure you want to force delete user and profile with username: {$username}?",
default: false
);
if (!$confirm) {
$this->info('Operation cancelled.');
return Command::SUCCESS;
}
if ($user) {
$user->forceDelete();
$this->info("User {$username} has been force deleted.");
}
if ($profile) {
$profile->forceDelete();
$this->info("Profile {$username} has been force deleted.");
}
$this->info('Username reclaimed successfully!');
return Command::SUCCESS;
}
private function getUsernameOptions(string $search = ''): array
{
return User::where('username', 'like', "{$search}%")
->withTrashed()
->whereNotNull('delete_after')
->take(10)
->pluck('username')
->toArray();
}
}