77use App \Models \Team ;
88use App \Notifications \Server \HetznerDeletionFailed ;
99use App \Services \HetznerService ;
10+ use App \Services \VultrService ;
1011use Lorisleiva \Actions \Concerns \AsAction ;
1112
1213class DeleteServer
1314{
1415 use AsAction;
1516
16- public function handle (int $ serverId , bool $ deleteFromHetzner = false , ?int $ hetznerServerId = null , ?int $ cloudProviderTokenId = null , ?int $ teamId = null )
17+ public function handle (int $ serverId , bool $ deleteFromHetzner = false , ?int $ hetznerServerId = null , ?int $ cloudProviderTokenId = null , ?int $ teamId = null , bool $ deleteFromVultr = false , ? string $ vultrInstanceId = null )
1718 {
1819 $ server = Server::withTrashed ()->find ($ serverId );
1920
@@ -26,6 +27,16 @@ public function handle(int $serverId, bool $deleteFromHetzner = false, ?int $het
2627 );
2728 }
2829
30+ if ($ deleteFromVultr && ($ vultrInstanceId || ($ server && $ server ->vultr_instance_id ))) {
31+ $ this ->deleteFromVultrById (
32+ $ vultrInstanceId ?? $ server ->vultr_instance_id ,
33+ $ cloudProviderTokenId ?? $ server ->cloud_provider_token_id ,
34+ $ teamId ?? $ server ->team_id
35+ );
36+ }
37+
38+ logger ()->debug ($ server ? 'Deleting server from Coolify ' : 'Server already deleted from Coolify, skipping Coolify deletion ' );
39+
2940 // If server is already deleted from Coolify, skip this part
3041 if (! $ server ) {
3142 return ; // Server already force deleted from Coolify
@@ -48,7 +59,10 @@ private function deleteFromHetznerById(int $hetznerServerId, ?int $cloudProvider
4859 $ token = null ;
4960
5061 if ($ cloudProviderTokenId ) {
51- $ token = CloudProviderToken::find ($ cloudProviderTokenId );
62+ $ token = CloudProviderToken::where ('id ' , $ cloudProviderTokenId )
63+ ->where ('team_id ' , $ teamId )
64+ ->where ('provider ' , 'hetzner ' )
65+ ->first ();
5266 }
5367
5468 if (! $ token ) {
@@ -79,4 +93,47 @@ private function deleteFromHetznerById(int $hetznerServerId, ?int $cloudProvider
7993 $ team ?->notify(new HetznerDeletionFailed ($ hetznerServerId , $ teamId , $ e ->getMessage ()));
8094 }
8195 }
96+
97+ private function deleteFromVultrById (string $ vultrInstanceId , ?int $ cloudProviderTokenId , int $ teamId ): void
98+ {
99+ try {
100+ $ token = null ;
101+
102+ if ($ cloudProviderTokenId ) {
103+ $ token = CloudProviderToken::where ('id ' , $ cloudProviderTokenId )
104+ ->where ('team_id ' , $ teamId )
105+ ->where ('provider ' , 'vultr ' )
106+ ->first ();
107+ }
108+
109+ if (! $ token ) {
110+ $ token = CloudProviderToken::where ('team_id ' , $ teamId )
111+ ->where ('provider ' , 'vultr ' )
112+ ->first ();
113+ }
114+
115+ if (! $ token ) {
116+ logger ()->debug ('No Vultr token found for team, skipping Vultr deletion ' , [
117+ 'team_id ' => $ teamId ,
118+ 'vultr_instance_id ' => $ vultrInstanceId ,
119+ ]);
120+
121+ return ;
122+ }
123+
124+ $ vultrService = new VultrService ($ token ->token );
125+ $ vultrService ->deleteInstance ($ vultrInstanceId );
126+
127+ logger ()->debug ('Deleted server from Vultr ' , [
128+ 'vultr_instance_id ' => $ vultrInstanceId ,
129+ 'team_id ' => $ teamId ,
130+ ]);
131+ } catch (\Throwable $ e ) {
132+ logger ()->error ('Failed to delete server from Vultr ' , [
133+ 'error ' => $ e ->getMessage (),
134+ 'vultr_instance_id ' => $ vultrInstanceId ,
135+ 'team_id ' => $ teamId ,
136+ ]);
137+ }
138+ }
82139}
0 commit comments