From dde6f7e80d20a68bb838970f22e09fda50a08ccf Mon Sep 17 00:00:00 2001 From: NaiJi Date: Mon, 20 Mar 2023 12:22:43 -0300 Subject: [PATCH] chore: Move volume functions to provider layer for Hetzner --- .../server_providers/hetzner/hetzner_api.dart | 60 +++------ .../providers/server_providers/hetzner.dart | 120 ++++++++++++++++++ 2 files changed, 140 insertions(+), 40 deletions(-) diff --git a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_api.dart b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_api.dart index 65e509c4..8e67b188 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_api.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_api.dart @@ -11,7 +11,6 @@ import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; -import 'package:selfprivacy/utils/network_utils.dart'; import 'package:selfprivacy/utils/password_generator.dart'; class HetznerApi extends ServerProviderApi with VolumeProviderApi { @@ -129,9 +128,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { ); } - Future> createVolume() async { - ServerVolume? volume; - + Future createVolume() async { Response? createVolumeResponse; final Dio client = await getClient(); try { @@ -146,18 +143,6 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { 'format': 'ext4' }, ); - final volumeId = createVolumeResponse.data['volume']['id']; - final volumeSize = createVolumeResponse.data['volume']['size']; - final volumeServer = createVolumeResponse.data['volume']['server']; - final volumeName = createVolumeResponse.data['volume']['name']; - final volumeDevice = createVolumeResponse.data['volume']['linux_device']; - volume = ServerVolume( - id: volumeId, - name: volumeName, - sizeByte: volumeSize, - serverId: volumeServer, - linuxDevice: volumeDevice, - ); } catch (e) { print(e); return GenericResult( @@ -170,17 +155,17 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { } return GenericResult( - data: volume, + data: createVolumeResponse.data, success: true, code: createVolumeResponse.statusCode, message: createVolumeResponse.statusMessage, ); } - Future> getVolumes({final String? status}) async { - final List volumes = []; + Future> getVolumes({final String? status}) async { + List volumes = []; - final Response getVolumesResonse; + Response? getVolumesResonse; final Dio client = await getClient(); try { getVolumesResonse = await client.get( @@ -189,29 +174,24 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { 'status': status, }, ); - final List rawVolumes = getVolumesResonse.data['volumes']; - for (final rawVolume in rawVolumes) { - final int volumeId = rawVolume['id']; - final int volumeSize = rawVolume['size'] * 1024 * 1024 * 1024; - final volumeServer = rawVolume['server']; - final String volumeName = rawVolume['name']; - final volumeDevice = rawVolume['linux_device']; - final volume = ServerVolume( - id: volumeId, - name: volumeName, - sizeByte: volumeSize, - serverId: volumeServer, - linuxDevice: volumeDevice, - ); - volumes.add(volume); - } + volumes = getVolumesResonse.data['volumes']; } catch (e) { print(e); + return GenericResult( + data: [], + success: false, + message: e.toString(), + ); } finally { client.close(); } - return volumes; + return GenericResult( + data: volumes, + success: true, + code: getVolumesResonse.statusCode, + message: getVolumesResonse.statusMessage, + ); } Future getVolume( @@ -244,7 +224,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { return volume; } - Future> deleteVolume(final int volumeId) async { + Future> deleteVolume(final int volumeId) async { final Dio client = await getClient(); try { await client.delete('/volumes/$volumeId'); @@ -252,7 +232,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { print(e); return GenericResult( success: false, - data: null, + data: false, message: e.toString(), ); } finally { @@ -261,7 +241,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { return GenericResult( success: true, - data: null, + data: true, ); } diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index 400701ff..33894f3d 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -631,4 +631,124 @@ class HetznerServerProvider extends ServerProvider { data: null, ); } + + Future> createVolume() async { + ServerVolume? volume; + + final result = await _adapter.api().createVolume(); + + if (!result.success || result.data == null) { + return GenericResult( + data: null, + success: false, + message: result.message, + code: result.code, + ); + } + + try { + final volumeId = result.data['volume']['id']; + final volumeSize = result.data['volume']['size']; + final volumeServer = result.data['volume']['server']; + final volumeName = result.data['volume']['name']; + final volumeDevice = result.data['volume']['linux_device']; + volume = ServerVolume( + id: volumeId, + name: volumeName, + sizeByte: volumeSize, + serverId: volumeServer, + linuxDevice: volumeDevice, + ); + } catch (e) { + print(e); + return GenericResult( + data: null, + success: false, + message: e.toString(), + ); + } + + return GenericResult( + data: volume, + success: true, + code: result.code, + message: result.message, + ); + } + + Future>> getVolumes({ + final String? status, + }) async { + final List volumes = []; + + final result = await _adapter.api().getVolumes(); + + if (!result.success) { + return GenericResult( + data: [], + success: false, + message: result.message, + code: result.code, + ); + } + + try { + for (final rawVolume in result.data) { + final int volumeId = rawVolume['id']; + final int volumeSize = rawVolume['size'] * 1024 * 1024 * 1024; + final volumeServer = rawVolume['server']; + final String volumeName = rawVolume['name']; + final volumeDevice = rawVolume['linux_device']; + final volume = ServerVolume( + id: volumeId, + name: volumeName, + sizeByte: volumeSize, + serverId: volumeServer, + linuxDevice: volumeDevice, + ); + volumes.add(volume); + } + } catch (e) { + return GenericResult( + data: [], + success: false, + message: e.toString(), + ); + } + + return GenericResult( + data: volumes, + success: true, + code: result.code, + message: result.message, + ); + } + + Future> deleteVolume(final int volumeId) async => + _adapter.api().deleteVolume(volumeId); + + Future> attachVolume( + final ServerVolume volume, + final int serverId, + ) async => + _adapter.api().attachVolume( + volume, + serverId, + ); + + Future> detachVolume( + final int volumeId, + ) async => + _adapter.api().detachVolume( + volumeId, + ); + + Future resizeVolume( + final ServerVolume volume, + final DiskSize size, + ) async => + _adapter.api().resizeVolume( + volume, + size, + ); }