66use App \Models \Server ;
77use App \Models \Team ;
88use App \Notifications \Server \HetznerDeletionFailed ;
9+ use App \Services \DigitalOceanService ;
910use App \Services \HetznerService ;
1011use App \Services \VultrService ;
1112use Lorisleiva \Actions \Concerns \AsAction ;
@@ -14,7 +15,7 @@ class DeleteServer
1415{
1516 use AsAction;
1617
17- public function handle (int $ serverId , bool $ deleteFromHetzner = false , ?int $ hetznerServerId = null , ?int $ cloudProviderTokenId = null , ?int $ teamId = null , bool $ deleteFromVultr = false , ?string $ vultrInstanceId = null )
18+ public function handle (int $ serverId , bool $ deleteFromHetzner = false , ?int $ hetznerServerId = null , ?int $ cloudProviderTokenId = null , ?int $ teamId = null , bool $ deleteFromVultr = false , ?string $ vultrInstanceId = null , bool $ deleteFromDigitalOcean = false , ? int $ digitalOceanDropletId = null )
1819 {
1920 $ server = Server::withTrashed ()->find ($ serverId );
2021
@@ -35,6 +36,14 @@ public function handle(int $serverId, bool $deleteFromHetzner = false, ?int $het
3536 );
3637 }
3738
39+ if ($ deleteFromDigitalOcean && ($ digitalOceanDropletId || ($ server && $ server ->digitalocean_droplet_id ))) {
40+ $ this ->deleteFromDigitalOceanById (
41+ $ digitalOceanDropletId ?? $ server ->digitalocean_droplet_id ,
42+ $ cloudProviderTokenId ?? $ server ->cloud_provider_token_id ,
43+ $ teamId ?? $ server ->team_id
44+ );
45+ }
46+
3847 logger ()->debug ($ server ? 'Deleting server from Coolify ' : 'Server already deleted from Coolify, skipping Coolify deletion ' );
3948
4049 // If server is already deleted from Coolify, skip this part
@@ -136,4 +145,47 @@ private function deleteFromVultrById(string $vultrInstanceId, ?int $cloudProvide
136145 ]);
137146 }
138147 }
148+
149+ private function deleteFromDigitalOceanById (int $ digitalOceanDropletId , ?int $ cloudProviderTokenId , int $ teamId ): void
150+ {
151+ try {
152+ $ token = null ;
153+
154+ if ($ cloudProviderTokenId ) {
155+ $ token = CloudProviderToken::where ('id ' , $ cloudProviderTokenId )
156+ ->where ('team_id ' , $ teamId )
157+ ->where ('provider ' , 'digitalocean ' )
158+ ->first ();
159+ }
160+
161+ if (! $ token ) {
162+ $ token = CloudProviderToken::where ('team_id ' , $ teamId )
163+ ->where ('provider ' , 'digitalocean ' )
164+ ->first ();
165+ }
166+
167+ if (! $ token ) {
168+ logger ()->debug ('No DigitalOcean token found for team, skipping droplet deletion ' , [
169+ 'team_id ' => $ teamId ,
170+ 'digitalocean_droplet_id ' => $ digitalOceanDropletId ,
171+ ]);
172+
173+ return ;
174+ }
175+
176+ $ digitalOceanService = new DigitalOceanService ($ token ->token );
177+ $ digitalOceanService ->deleteDroplet ($ digitalOceanDropletId );
178+
179+ logger ()->debug ('Deleted droplet from DigitalOcean ' , [
180+ 'digitalocean_droplet_id ' => $ digitalOceanDropletId ,
181+ 'team_id ' => $ teamId ,
182+ ]);
183+ } catch (\Throwable $ e ) {
184+ logger ()->error ('Failed to delete droplet from DigitalOcean ' , [
185+ 'error ' => $ e ->getMessage (),
186+ 'digitalocean_droplet_id ' => $ digitalOceanDropletId ,
187+ 'team_id ' => $ teamId ,
188+ ]);
189+ }
190+ }
139191}
0 commit comments