feat(pricing): Replace raw double with simple type Price

routes-refactor
NaiJi ✨ 2022-10-12 01:42:45 +00:00
parent 70330c59ab
commit 79e9334aca
8 changed files with 44 additions and 34 deletions

View File

@ -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/json/hetzner_server_info.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/user.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/logic/models/server_basic_info.dart';
import 'package:selfprivacy/utils/password_generator.dart'; import 'package:selfprivacy/utils/password_generator.dart';
class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
DigitalOceanApi( DigitalOceanApi({
{final this.hasLogger = false, final this.isWithToken = true}); this.hasLogger = false,
this.isWithToken = true,
});
@override @override
bool hasLogger; bool hasLogger;
@override @override
@ -46,7 +49,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
final Dio client = await getClient(); final Dio client = await getClient();
try { try {
response = await client.get( response = await client.get(
'/servers', '/account',
options: Options( options: Options(
headers: {'Authorization': 'Bearer $token'}, headers: {'Authorization': 'Bearer $token'},
), ),
@ -71,30 +74,13 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
return isValid; return isValid;
} }
/// Hardcoded on their documentation and there is no pricing API at all
/// Probably we should scrap the doc page manually
@override @override
RegExp getApiTokenValidation() => Future<Price?> getPricePerGb() async => Price(
RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); value: 0.10,
currency: 'USD',
@override );
Future<double?> 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;
}
@override @override
Future<ServerVolume?> createVolume() async { Future<ServerVolume?> createVolume() async {

View File

@ -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/json/hetzner_server_info.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/user.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/logic/models/server_basic_info.dart';
import 'package:selfprivacy/utils/password_generator.dart'; import 'package:selfprivacy/utils/password_generator.dart';
@ -75,7 +76,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]'); RegExp(r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]');
@override @override
Future<double?> getPricePerGb() async { Future<Price?> getPricePerGb() async {
double? price; double? price;
final Response dbGetResponse; final Response dbGetResponse;
@ -92,7 +93,12 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
client.close(); client.close();
} }
return price; return price == null
? null
: Price(
value: price,
currency: 'EUR',
);
} }
@override @override

View File

@ -22,5 +22,7 @@ abstract class ServerProviderApi extends ApiMap {
}); });
Future<bool> isApiTokenValid(final String token); Future<bool> isApiTokenValid(final String token);
RegExp getApiTokenValidation(); RegExp getApiTokenValidation() => RegExp(
r'\s+|[-!$%^&*()@+|~=`{}\[\]:<>?,.\/]',
);
} }

View File

@ -1,5 +1,6 @@
import 'package:selfprivacy/logic/api_maps/rest_maps/api_map.dart'; 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/hive/server_details.dart';
import 'package:selfprivacy/logic/models/price.dart';
mixin VolumeProviderApi on ApiMap { mixin VolumeProviderApi on ApiMap {
Future<ServerVolume?> createVolume(); Future<ServerVolume?> createVolume();
@ -9,5 +10,5 @@ mixin VolumeProviderApi on ApiMap {
Future<bool> detachVolume(final int volumeId); Future<bool> detachVolume(final int volumeId);
Future<bool> resizeVolume(final int volumeId, final int sizeGb); Future<bool> resizeVolume(final int volumeId, final int sizeGb);
Future<void> deleteVolume(final int id); Future<void> deleteVolume(final int id);
Future<double?> getPricePerGb(); Future<Price?> getPricePerGb();
} }

View File

@ -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/cubit/app_config_dependent/authentication_dependend_cubit.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/logic/models/disk_status.dart';
import 'package:selfprivacy/logic/models/price.dart';
part 'provider_volume_state.dart'; part 'provider_volume_state.dart';
@ -32,7 +33,7 @@ class ApiProviderVolumeCubit
} }
} }
Future<double?> getPricePerGb() async => Future<Price?> getPricePerGb() async =>
providerApi!.getVolumeProvider().getPricePerGb(); providerApi!.getVolumeProvider().getPricePerGb();
Future<void> refresh() async { Future<void> refresh() async {

View File

@ -0,0 +1,9 @@
class Price {
Price({
required this.value,
required this.currency,
});
double value;
String currency;
}

View File

@ -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/provider_volumes/provider_volume_cubit.dart';
import 'package:selfprivacy/logic/cubit/server_volumes/server_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/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_button/filled_button.dart';
import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart';
import 'package:selfprivacy/logic/models/disk_status.dart'; import 'package:selfprivacy/logic/models/disk_status.dart';
@ -67,7 +68,7 @@ class _ExtendingVolumePageState extends State<ExtendingVolumePage> {
], ],
); );
} }
_euroPerGb = snapshot.data as double; _euroPerGb = (snapshot.data as Price).value;
_sizeController.text = _currentSliderGbValue.truncate().toString(); _sizeController.text = _currentSliderGbValue.truncate().toString();
_priceController.text = _priceController.text =
(_euroPerGb * double.parse(_sizeController.text)) (_euroPerGb * double.parse(_sizeController.text))

View File

@ -180,7 +180,9 @@ class ProviderSelectionPage extends StatelessWidget {
children: [ children: [
InkWell( InkWell(
onTap: () { onTap: () {
context.read<ServerInstallationCubit>().setServerProviderType(ServerProvider.hetzner); context
.read<ServerInstallationCubit>()
.setServerProviderType(ServerProvider.hetzner);
callback(ServerProvider.hetzner); callback(ServerProvider.hetzner);
}, },
child: Image.asset( child: Image.asset(
@ -193,7 +195,9 @@ class ProviderSelectionPage extends StatelessWidget {
), ),
InkWell( InkWell(
onTap: () { onTap: () {
context.read<ServerInstallationCubit>().setServerProviderType(ServerProvider.digitalOcean); context
.read<ServerInstallationCubit>()
.setServerProviderType(ServerProvider.digitalOcean);
callback(ServerProvider.digitalOcean); callback(ServerProvider.digitalOcean);
}, },
child: Image.asset( child: Image.asset(