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,
 | |
|         ];
 | |
|     }
 | |
| }
 | 
