Daniel Supernault 6 месяцев назад
Родитель
Сommit
3749267260
1 измененных файлов с 85 добавлено и 0 удалено
  1. 85 0
      app/Console/Commands/ReclaimUsername.php

+ 85 - 0
app/Console/Commands/ReclaimUsername.php

@@ -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();
+    }
+}