php-tenant/Console/Commands/ProcessAccountDeletions.php
Snider d0ad2737cb refactor: rename namespace from Core\Mod\Tenant to Core\Tenant
Simplifies the namespace hierarchy by removing the intermediate Mod
segment. Updates all 118 files including models, services, controllers,
middleware, tests, and composer.json autoload configuration.

Co-Authored-By: Claude Opus 4.5 <noreply@anthropic.com>
2026-01-27 16:30:46 +00:00

82 lines
2.6 KiB
PHP

<?php
declare(strict_types=1);
namespace Core\Tenant\Console\Commands;
use Core\Tenant\Models\AccountDeletionRequest;
use Illuminate\Console\Command;
use Illuminate\Support\Facades\DB;
use Illuminate\Support\Facades\Log;
class ProcessAccountDeletions extends Command
{
protected $signature = 'accounts:process-deletions';
protected $description = 'Process pending account deletions that have passed their 7-day expiry';
public function handle(): int
{
$pendingDeletions = AccountDeletionRequest::pendingAutoDelete()->with('user')->get();
if ($pendingDeletions->isEmpty()) {
$this->info('No pending account deletions to process.');
return self::SUCCESS;
}
$this->info("Processing {$pendingDeletions->count()} account deletion(s)...");
$deleted = 0;
$failed = 0;
foreach ($pendingDeletions as $request) {
try {
$user = $request->user;
if (! $user) {
$this->warn("User not found for deletion request #{$request->id}");
$request->complete();
continue;
}
$this->line("Deleting account: {$user->email}");
DB::transaction(function () use ($request, $user) {
// Mark request as completed
$request->complete();
// Delete all workspaces owned by the user
if (method_exists($user, 'ownedWorkspaces')) {
$user->ownedWorkspaces()->each(function ($workspace) {
$workspace->delete();
});
}
// Hard delete user account
$user->forceDelete();
});
Log::info('Account deleted via scheduled task', [
'user_id' => $user->id,
'email' => $user->email,
'deletion_request_id' => $request->id,
]);
$deleted++;
} catch (\Exception $e) {
$this->error("Failed to delete account for request #{$request->id}: {$e->getMessage()}");
Log::error('Failed to process account deletion', [
'deletion_request_id' => $request->id,
'error' => $e->getMessage(),
]);
$failed++;
}
}
$this->info("Completed: {$deleted} deleted, {$failed} failed.");
return $failed > 0 ? self::FAILURE : self::SUCCESS;
}
}