diff --git a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart index 798fc54b..67811f26 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean.dart @@ -5,6 +5,7 @@ import 'package:dio/dio.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; @@ -12,6 +13,7 @@ import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; +import 'package:selfprivacy/logic/models/server_type.dart'; import 'package:selfprivacy/utils/password_generator.dart'; class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { @@ -582,7 +584,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { final Dio client = await getClient(); try { - final Response response = await client.post( + final Response response = await client.get( '/locations', ); @@ -591,6 +593,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { title: location['slug'], description: location['name'], flag: getEmojiFlag(location['slug']), + identifier: location['slug'], ), ); } catch (e) { @@ -602,6 +605,46 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { return locations; } + @override + Future> getServerTypesByLocation({ + required final ServerProviderLocation location, + }) async { + final List types = []; + + final Dio client = await getClient(); + try { + final Response response = await client.get( + '/sizes', + ); + final rawSizes = response.data!['sizes']; + for (final rawSize in rawSizes) { + for (final rawRegion in rawSize['regions']) { + if (rawRegion.toString() == location.identifier) { + types.add( + ServerType( + title: rawSize['description'], + identifier: rawSize['slug'], + ram: rawSize['memory'], + cores: rawSize['vcpus'], + disk: DiskSize(byte: rawSize['disk'] * 1024 * 1024 * 1024), + price: Price( + value: rawSize['price_monthly'], + currency: 'USD', + ), + ), + ); + } + } + } + } catch (e) { + print(e); + } finally { + close(client); + } + + return types; + } + @override Future createReverseDns({ required final ServerHostingDetails serverDetails, diff --git a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart index 2c0b70db..8e31521e 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/hetzner/hetzner.dart @@ -5,6 +5,7 @@ import 'package:dio/dio.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; +import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; @@ -12,6 +13,7 @@ import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; +import 'package:selfprivacy/logic/models/server_type.dart'; import 'package:selfprivacy/utils/password_generator.dart'; class HetznerApi extends ServerProviderApi with VolumeProviderApi { @@ -567,7 +569,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { final Dio client = await getClient(); try { - final Response response = await client.post( + final Response response = await client.get( '/locations', ); @@ -576,6 +578,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { title: location['city'], description: location['description'], flag: getEmojiFlag(location['country']), + identifier: location['name'], ), ); } catch (e) { @@ -587,6 +590,46 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { return locations; } + @override + Future> getServerTypesByLocation({ + required final ServerProviderLocation location, + }) async { + final List types = []; + + final Dio client = await getClient(); + try { + final Response response = await client.get( + '/server_types', + ); + final rawTypes = response.data!['server_types']; + for (final rawType in rawTypes) { + for (final rawPrice in rawType['prices']) { + if (rawPrice['location'].toString() == location.identifier) { + types.add( + ServerType( + title: rawType['description'], + identifier: rawType['name'], + ram: rawType['memory'], + cores: rawType['cores'], + disk: DiskSize(byte: rawType['disk'] * 1024 * 1024 * 1024), + price: Price( + value: rawPrice['price_monthly']['gross'], + currency: 'EUR', + ), + ), + ); + } + } + } + } catch (e) { + print(e); + } finally { + close(client); + } + + return types; + } + @override Future createReverseDns({ required final ServerHostingDetails serverDetails, diff --git a/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart b/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart index d4b61721..ffc1d2d9 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/server_provider.dart @@ -4,10 +4,14 @@ import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; +import 'package:selfprivacy/logic/models/server_type.dart'; abstract class ServerProviderApi extends ApiMap { Future> getServers(); Future> getAvailableLocations(); + Future> getServerTypesByLocation({ + required final ServerProviderLocation location, + }); Future restart(); Future powerOn(); diff --git a/lib/logic/models/server_provider_location.dart b/lib/logic/models/server_provider_location.dart index dea063a4..f76c226f 100644 --- a/lib/logic/models/server_provider_location.dart +++ b/lib/logic/models/server_provider_location.dart @@ -1,11 +1,13 @@ class ServerProviderLocation { ServerProviderLocation({ required this.title, + required this.identifier, this.description, this.flag, }); final String title; + final String identifier; final String? description; /// as emoji diff --git a/lib/logic/models/server_type.dart b/lib/logic/models/server_type.dart new file mode 100644 index 00000000..8fb5df98 --- /dev/null +++ b/lib/logic/models/server_type.dart @@ -0,0 +1,19 @@ +import 'package:selfprivacy/logic/models/disk_size.dart'; +import 'package:selfprivacy/logic/models/price.dart'; + +class ServerType { + ServerType({ + required this.title, + required this.identifier, + required this.ram, + required this.cores, + required this.disk, + required this.price, + }); + final String title; + final String identifier; + final double ram; + final DiskSize disk; + final int cores; + final Price price; +}