78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			78 lines
		
	
	
		
			2.0 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
<?php
 | 
						|
 | 
						|
namespace App\Actions\User;
 | 
						|
 | 
						|
use App\Models\Server;
 | 
						|
use App\Models\User;
 | 
						|
use Illuminate\Support\Collection;
 | 
						|
 | 
						|
class DeleteUserServers
 | 
						|
{
 | 
						|
    private User $user;
 | 
						|
 | 
						|
    private bool $isDryRun;
 | 
						|
 | 
						|
    public function __construct(User $user, bool $isDryRun = false)
 | 
						|
    {
 | 
						|
        $this->user = $user;
 | 
						|
        $this->isDryRun = $isDryRun;
 | 
						|
    }
 | 
						|
 | 
						|
    public function getServersPreview(): Collection
 | 
						|
    {
 | 
						|
        $servers = collect();
 | 
						|
 | 
						|
        // Get all teams the user belongs to
 | 
						|
        $teams = $this->user->teams;
 | 
						|
 | 
						|
        foreach ($teams as $team) {
 | 
						|
            // Only include servers from teams where user is owner or admin
 | 
						|
            $userRole = $team->pivot->role;
 | 
						|
            if ($userRole === 'owner' || $userRole === 'admin') {
 | 
						|
                $teamServers = $team->servers;
 | 
						|
                $servers = $servers->merge($teamServers);
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        // Return unique servers (in case same server is in multiple teams)
 | 
						|
        return $servers->unique('id');
 | 
						|
    }
 | 
						|
 | 
						|
    public function execute(): array
 | 
						|
    {
 | 
						|
        if ($this->isDryRun) {
 | 
						|
            return [
 | 
						|
                'servers' => 0,
 | 
						|
            ];
 | 
						|
        }
 | 
						|
 | 
						|
        $deletedCount = 0;
 | 
						|
 | 
						|
        $servers = $this->getServersPreview();
 | 
						|
 | 
						|
        foreach ($servers as $server) {
 | 
						|
            try {
 | 
						|
                // Skip the default server (ID 0) which is the Coolify host
 | 
						|
                if ($server->id === 0) {
 | 
						|
                    \Log::info('Skipping deletion of Coolify host server (ID: 0)');
 | 
						|
 | 
						|
                    continue;
 | 
						|
                }
 | 
						|
 | 
						|
                // The Server model's forceDeleting event will handle cleanup of:
 | 
						|
                // - destinations
 | 
						|
                // - settings
 | 
						|
                $server->forceDelete();
 | 
						|
                $deletedCount++;
 | 
						|
            } catch (\Exception $e) {
 | 
						|
                \Log::error("Failed to delete server {$server->id}: ".$e->getMessage());
 | 
						|
                throw $e; // Re-throw to trigger rollback
 | 
						|
            }
 | 
						|
        }
 | 
						|
 | 
						|
        return [
 | 
						|
            'servers' => $deletedCount,
 | 
						|
        ];
 | 
						|
    }
 | 
						|
}
 |