1
0

ReclaimUsername.php 2.3 KB

12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455565758596061626364656667686970717273747576777879808182838485
  1. <?php
  2. namespace App\Console\Commands;
  3. use App\User;
  4. use App\Profile;
  5. use Illuminate\Console\Command;
  6. use function Laravel\Prompts\search;
  7. use function Laravel\Prompts\text;
  8. use function Laravel\Prompts\confirm;
  9. class ReclaimUsername extends Command
  10. {
  11. /**
  12. * The name and signature of the console command.
  13. *
  14. * @var string
  15. */
  16. protected $signature = 'app:reclaim-username';
  17. /**
  18. * The console command description.
  19. *
  20. * @var string
  21. */
  22. protected $description = 'Force delete a user and their profile to reclaim a username';
  23. /**
  24. * Execute the console command.
  25. */
  26. public function handle()
  27. {
  28. $username = search(
  29. label: 'What username would you like to reclaim?',
  30. options: fn (string $search) => strlen($search) > 0 ? $this->getUsernameOptions($search) : [],
  31. required: true
  32. );
  33. $user = User::whereUsername($username)->withTrashed()->first();
  34. $profile = Profile::whereUsername($username)->withTrashed()->first();
  35. if (!$user && !$profile) {
  36. $this->error("No user or profile found with username: {$username}");
  37. return Command::FAILURE;
  38. }
  39. if ($user->delete_after === null || $user->status !== 'deleted') {
  40. $this->error("Cannot reclaim an active account: {$username}");
  41. return Command::FAILURE;
  42. }
  43. $confirm = confirm(
  44. label: "Are you sure you want to force delete user and profile with username: {$username}?",
  45. default: false
  46. );
  47. if (!$confirm) {
  48. $this->info('Operation cancelled.');
  49. return Command::SUCCESS;
  50. }
  51. if ($user) {
  52. $user->forceDelete();
  53. $this->info("User {$username} has been force deleted.");
  54. }
  55. if ($profile) {
  56. $profile->forceDelete();
  57. $this->info("Profile {$username} has been force deleted.");
  58. }
  59. $this->info('Username reclaimed successfully!');
  60. return Command::SUCCESS;
  61. }
  62. private function getUsernameOptions(string $search = ''): array
  63. {
  64. return User::where('username', 'like', "{$search}%")
  65. ->withTrashed()
  66. ->whereNotNull('delete_after')
  67. ->take(10)
  68. ->pluck('username')
  69. ->toArray();
  70. }
  71. }