126 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
			
		
		
	
	
			126 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			PHP
		
	
	
	
	
	
| <?php
 | |
| 
 | |
| namespace App\Actions\User;
 | |
| 
 | |
| use App\Models\User;
 | |
| use Illuminate\Support\Collection;
 | |
| 
 | |
| class DeleteUserResources
 | |
| {
 | |
|     private User $user;
 | |
| 
 | |
|     private bool $isDryRun;
 | |
| 
 | |
|     public function __construct(User $user, bool $isDryRun = false)
 | |
|     {
 | |
|         $this->user = $user;
 | |
|         $this->isDryRun = $isDryRun;
 | |
|     }
 | |
| 
 | |
|     public function getResourcesPreview(): array
 | |
|     {
 | |
|         $applications = collect();
 | |
|         $databases = collect();
 | |
|         $services = collect();
 | |
| 
 | |
|         // Get all teams the user belongs to
 | |
|         $teams = $this->user->teams;
 | |
| 
 | |
|         foreach ($teams as $team) {
 | |
|             // Get all servers for this team
 | |
|             $servers = $team->servers;
 | |
| 
 | |
|             foreach ($servers as $server) {
 | |
|                 // Get applications
 | |
|                 $serverApplications = $server->applications;
 | |
|                 $applications = $applications->merge($serverApplications);
 | |
| 
 | |
|                 // Get databases
 | |
|                 $serverDatabases = $this->getAllDatabasesForServer($server);
 | |
|                 $databases = $databases->merge($serverDatabases);
 | |
| 
 | |
|                 // Get services
 | |
|                 $serverServices = $server->services;
 | |
|                 $services = $services->merge($serverServices);
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return [
 | |
|             'applications' => $applications->unique('id'),
 | |
|             'databases' => $databases->unique('id'),
 | |
|             'services' => $services->unique('id'),
 | |
|         ];
 | |
|     }
 | |
| 
 | |
|     public function execute(): array
 | |
|     {
 | |
|         if ($this->isDryRun) {
 | |
|             return [
 | |
|                 'applications' => 0,
 | |
|                 'databases' => 0,
 | |
|                 'services' => 0,
 | |
|             ];
 | |
|         }
 | |
| 
 | |
|         $deletedCounts = [
 | |
|             'applications' => 0,
 | |
|             'databases' => 0,
 | |
|             'services' => 0,
 | |
|         ];
 | |
| 
 | |
|         $resources = $this->getResourcesPreview();
 | |
| 
 | |
|         // Delete applications
 | |
|         foreach ($resources['applications'] as $application) {
 | |
|             try {
 | |
|                 $application->forceDelete();
 | |
|                 $deletedCounts['applications']++;
 | |
|             } catch (\Exception $e) {
 | |
|                 \Log::error("Failed to delete application {$application->id}: ".$e->getMessage());
 | |
|                 throw $e; // Re-throw to trigger rollback
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Delete databases
 | |
|         foreach ($resources['databases'] as $database) {
 | |
|             try {
 | |
|                 $database->forceDelete();
 | |
|                 $deletedCounts['databases']++;
 | |
|             } catch (\Exception $e) {
 | |
|                 \Log::error("Failed to delete database {$database->id}: ".$e->getMessage());
 | |
|                 throw $e; // Re-throw to trigger rollback
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         // Delete services
 | |
|         foreach ($resources['services'] as $service) {
 | |
|             try {
 | |
|                 $service->forceDelete();
 | |
|                 $deletedCounts['services']++;
 | |
|             } catch (\Exception $e) {
 | |
|                 \Log::error("Failed to delete service {$service->id}: ".$e->getMessage());
 | |
|                 throw $e; // Re-throw to trigger rollback
 | |
|             }
 | |
|         }
 | |
| 
 | |
|         return $deletedCounts;
 | |
|     }
 | |
| 
 | |
|     private function getAllDatabasesForServer($server): Collection
 | |
|     {
 | |
|         $databases = collect();
 | |
| 
 | |
|         // Get all standalone database types
 | |
|         $databases = $databases->merge($server->postgresqls);
 | |
|         $databases = $databases->merge($server->mysqls);
 | |
|         $databases = $databases->merge($server->mariadbs);
 | |
|         $databases = $databases->merge($server->mongodbs);
 | |
|         $databases = $databases->merge($server->redis);
 | |
|         $databases = $databases->merge($server->keydbs);
 | |
|         $databases = $databases->merge($server->dragonflies);
 | |
|         $databases = $databases->merge($server->clickhouses);
 | |
| 
 | |
|         return $databases;
 | |
|     }
 | |
| }
 | 
