From 79e9334aca6fb1e7198c2987a99758bf80ebf757 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Wed, 12 Oct 2022 01:42:45 +0000 Subject: [PATCH] feat(pricing): Replace raw double with simple type Price --- .../digital_ocean/digital_ocean.dart | 38 ++++++------------- .../server_providers/hetzner/hetzner.dart | 10 ++++- .../server_providers/server_provider.dart | 4 +- .../server_providers/volume_provider.dart | 3 +- .../provider_volume_cubit.dart | 3 +- lib/logic/models/price.dart | 9 +++++ .../server_storage/extending_volume.dart | 3 +- .../setup/initializing/provider_picker.dart | 8 +++- 8 files changed, 44 insertions(+), 34 deletions(-) create mode 100644 lib/logic/models/price.dart 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 159b68d8..16c87750 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 @@ -9,12 +9,15 @@ 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'; 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/utils/password_generator.dart'; class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { - DigitalOceanApi( - {final this.hasLogger = false, final this.isWithToken = true}); + DigitalOceanApi({ + this.hasLogger = false, + this.isWithToken = true, + }); @override bool hasLogger; @override @@ -46,7 +49,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { final Dio client = await getClient(); try { response = await client.get( - '/servers', + '/account', options: Options( headers: {'Authorization': 'Bearer $token'}, ), @@ -71,30 +74,13 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { return isValid; } + /// Hardcoded on their documentation and there is no pricing API at all + /// Probably we should scrap the doc page manually @override - RegExp getApiTokenValidation() => - RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); - - @override - Future getPricePerGb() async { - double? price; - - final Response dbGetResponse; - final Dio client = await getClient(); - try { - dbGetResponse = await client.get('/pricing'); - - final volume = dbGetResponse.data['pricing']['volume']; - final volumePrice = volume['price_per_gb_month']['gross']; - price = double.parse(volumePrice); - } catch (e) { - print(e); - } finally { - client.close(); - } - - return price; - } + Future getPricePerGb() async => Price( + value: 0.10, + currency: 'USD', + ); @override Future createVolume() async { 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 f26646ce..3b8ff016 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 @@ -9,6 +9,7 @@ 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'; 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/utils/password_generator.dart'; @@ -75,7 +76,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); @override - Future getPricePerGb() async { + Future getPricePerGb() async { double? price; final Response dbGetResponse; @@ -92,7 +93,12 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { client.close(); } - return price; + return price == null + ? null + : Price( + value: price, + currency: 'EUR', + ); } @override 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 010ebd75..c2bfd533 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 @@ -22,5 +22,7 @@ abstract class ServerProviderApi extends ApiMap { }); Future isApiTokenValid(final String token); - RegExp getApiTokenValidation(); + RegExp getApiTokenValidation() => RegExp( + r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]', + ); } diff --git a/lib/logic/api_maps/rest_maps/server_providers/volume_provider.dart b/lib/logic/api_maps/rest_maps/server_providers/volume_provider.dart index bdff72f2..d6feae2c 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/volume_provider.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/volume_provider.dart @@ -1,5 +1,6 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/api_map.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; +import 'package:selfprivacy/logic/models/price.dart'; mixin VolumeProviderApi on ApiMap { Future createVolume(); @@ -9,5 +10,5 @@ mixin VolumeProviderApi on ApiMap { Future detachVolume(final int volumeId); Future resizeVolume(final int volumeId, final int sizeGb); Future deleteVolume(final int id); - Future getPricePerGb(); + Future getPricePerGb(); } diff --git a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart index b0500452..f6a2e7a6 100644 --- a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart +++ b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart @@ -7,6 +7,7 @@ import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/disk_status.dart'; +import 'package:selfprivacy/logic/models/price.dart'; part 'provider_volume_state.dart'; @@ -32,7 +33,7 @@ class ApiProviderVolumeCubit } } - Future getPricePerGb() async => + Future getPricePerGb() async => providerApi!.getVolumeProvider().getPricePerGb(); Future refresh() async { diff --git a/lib/logic/models/price.dart b/lib/logic/models/price.dart new file mode 100644 index 00000000..1da2677d --- /dev/null +++ b/lib/logic/models/price.dart @@ -0,0 +1,9 @@ +class Price { + Price({ + required this.value, + required this.currency, + }); + + double value; + String currency; +} diff --git a/lib/ui/pages/server_storage/extending_volume.dart b/lib/ui/pages/server_storage/extending_volume.dart index e465c2b2..8558c526 100644 --- a/lib/ui/pages/server_storage/extending_volume.dart +++ b/lib/ui/pages/server_storage/extending_volume.dart @@ -4,6 +4,7 @@ import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_depe import 'package:selfprivacy/logic/cubit/provider_volumes/provider_volume_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_volumes/server_volume_cubit.dart'; import 'package:selfprivacy/logic/models/disk_size.dart'; +import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; import 'package:selfprivacy/logic/models/disk_status.dart'; @@ -67,7 +68,7 @@ class _ExtendingVolumePageState extends State { ], ); } - _euroPerGb = snapshot.data as double; + _euroPerGb = (snapshot.data as Price).value; _sizeController.text = _currentSliderGbValue.truncate().toString(); _priceController.text = (_euroPerGb * double.parse(_sizeController.text)) diff --git a/lib/ui/pages/setup/initializing/provider_picker.dart b/lib/ui/pages/setup/initializing/provider_picker.dart index c3cada82..6681a07b 100644 --- a/lib/ui/pages/setup/initializing/provider_picker.dart +++ b/lib/ui/pages/setup/initializing/provider_picker.dart @@ -180,7 +180,9 @@ class ProviderSelectionPage extends StatelessWidget { children: [ InkWell( onTap: () { - context.read().setServerProviderType(ServerProvider.hetzner); + context + .read() + .setServerProviderType(ServerProvider.hetzner); callback(ServerProvider.hetzner); }, child: Image.asset( @@ -193,7 +195,9 @@ class ProviderSelectionPage extends StatelessWidget { ), InkWell( onTap: () { - context.read().setServerProviderType(ServerProvider.digitalOcean); + context + .read() + .setServerProviderType(ServerProvider.digitalOcean); callback(ServerProvider.digitalOcean); }, child: Image.asset(