diff --git a/lib/logic/api_maps/rest_maps/api_controller.dart b/lib/logic/api_maps/rest_maps/api_controller.dart index 73fd8e5c..8e58ee6f 100644 --- a/lib/logic/api_maps/rest_maps/api_controller.dart +++ b/lib/logic/api_maps/rest_maps/api_controller.dart @@ -1,22 +1,10 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart'; import 'package:selfprivacy/logic/providers/provider_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; -import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; class ApiController { - static VolumeProviderApiFactory? get currentVolumeProviderApiFactory => - _volumeProviderApiFactory; static DnsProviderApiFactory? get currentDnsProviderApiFactory => _dnsProviderApiFactory; - static ServerProviderApiFactory? get currentServerProviderApiFactory => - _serverProviderApiFactory; - - static void initVolumeProviderApiFactory( - final ServerProviderSettings settings, - ) { - _volumeProviderApiFactory = - VolumeApiFactoryCreator.createVolumeProviderApiFactory(settings); - } static void initDnsProviderApiFactory( final DnsProviderFactorySettings settings, @@ -25,20 +13,9 @@ class ApiController { ApiFactoryCreator.createDnsProviderApiFactory(settings); } - static void initServerProviderApiFactory( - final ServerProviderSettings settings, - ) { - _serverProviderApiFactory = - ApiFactoryCreator.createServerProviderApiFactory(settings); - } - static void clearProviderApiFactories() { - _volumeProviderApiFactory = null; _dnsProviderApiFactory = null; - _serverProviderApiFactory = null; } - static VolumeProviderApiFactory? _volumeProviderApiFactory; static DnsProviderApiFactory? _dnsProviderApiFactory; - static ServerProviderApiFactory? _serverProviderApiFactory; } diff --git a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_api.dart b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_api.dart index f6ba941a..e6c5f1b4 100644 --- a/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_api.dart +++ b/lib/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_api.dart @@ -95,13 +95,6 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { ); } - /// Hardcoded on their documentation and there is no pricing API at all - /// Probably we should scrap the doc page manually - Future getPricePerGb() async => Price( - value: 0.10, - currency: 'USD', - ); - Future createVolume() async { Response? createVolumeResponse; final Dio client = await getClient(); 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 8e67b188..c2883aba 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 @@ -305,7 +305,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { ); } - Future resizeVolume( + Future> resizeVolume( final ServerVolume volume, final DiskSize size, ) async { @@ -324,11 +324,19 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { resizeVolumeResponse.data['action']['status'].toString() != 'error'; } catch (e) { print(e); + return GenericResult( + data: false, + success: false, + message: e.toString(), + ); } finally { client.close(); } - return success; + return GenericResult( + data: success, + success: true, + ); } Future createServer({ diff --git a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart index 48617545..d2315c99 100644 --- a/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart +++ b/lib/logic/cubit/provider_volumes/provider_volume_cubit.dart @@ -10,6 +10,7 @@ import 'package:selfprivacy/logic/models/disk_size.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'; +import 'package:selfprivacy/logic/providers/providers_controller.dart'; part 'provider_volume_state.dart'; @@ -27,9 +28,7 @@ class ApiProviderVolumeCubit } Future getPricePerGb() async => - ApiController.currentVolumeProviderApiFactory! - .getVolumeProvider() - .getPricePerGb(); + ProvidersController.currentServerProvider!.getPricePerGb(); Future refresh() async { emit(const ApiProviderVolumeState([], LoadingStatus.refreshing, false)); @@ -41,29 +40,31 @@ class ApiProviderVolumeCubit return emit(const ApiProviderVolumeState([], LoadingStatus.error, false)); } - final List volumes = await ApiController - .currentVolumeProviderApiFactory! - .getVolumeProvider() - .getVolumes(); + final volumesResult = + await ProvidersController.currentServerProvider!.getVolumes(); - if (volumes.isEmpty) { + if (!volumesResult.success || volumesResult.data.isEmpty) { return emit(const ApiProviderVolumeState([], LoadingStatus.error, false)); } - emit(ApiProviderVolumeState(volumes, LoadingStatus.success, false)); + emit( + ApiProviderVolumeState( + volumesResult.data, + LoadingStatus.success, + false, + ), + ); } Future attachVolume(final DiskVolume volume) async { final ServerHostingDetails server = getIt().serverDetails!; - await ApiController.currentVolumeProviderApiFactory! - .getVolumeProvider() + await ProvidersController.currentServerProvider! .attachVolume(volume.providerVolume!, server.id); unawaited(refresh()); } Future detachVolume(final DiskVolume volume) async { - await ApiController.currentVolumeProviderApiFactory! - .getVolumeProvider() + await ProvidersController.currentServerProvider! .detachVolume(volume.providerVolume!); unawaited(refresh()); } @@ -77,14 +78,13 @@ class ApiProviderVolumeCubit 'Starting resize', ); emit(state.copyWith(isResizing: true)); - final bool resized = await ApiController.currentVolumeProviderApiFactory! - .getVolumeProvider() - .resizeVolume( - volume.providerVolume!, - newSize, - ); + final resizedResult = + await ProvidersController.currentServerProvider!.resizeVolume( + volume.providerVolume!, + newSize, + ); - if (!resized) { + if (!resizedResult.success || !resizedResult.data) { getIt().showSnackBar( 'storage.extending_volume_error'.tr(), ); @@ -115,11 +115,8 @@ class ApiProviderVolumeCubit } Future createVolume() async { - final ServerVolume? volume = (await ApiController - .currentVolumeProviderApiFactory! - .getVolumeProvider() - .createVolume()) - .data; + final ServerVolume? volume = + (await ProvidersController.currentServerProvider!.createVolume()).data; final diskVolume = DiskVolume(providerVolume: volume); await attachVolume(diskVolume); @@ -131,8 +128,7 @@ class ApiProviderVolumeCubit } Future deleteVolume(final DiskVolume volume) async { - await ApiController.currentVolumeProviderApiFactory! - .getVolumeProvider() + await ProvidersController.currentServerProvider! .deleteVolume(volume.providerVolume!); unawaited(refresh()); } diff --git a/lib/logic/providers/server_provider.dart b/lib/logic/providers/server_provider.dart index 7a2f4a02..781f0d2b 100644 --- a/lib/logic/providers/server_provider.dart +++ b/lib/logic/providers/server_provider.dart @@ -1,7 +1,10 @@ import 'package:selfprivacy/logic/api_maps/generic_result.dart'; import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart'; +import 'package:selfprivacy/logic/models/disk_size.dart'; +import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/launch_installation_data.dart'; import 'package:selfprivacy/logic/models/metrics.dart'; +import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; import 'package:selfprivacy/logic/models/server_type.dart'; @@ -26,5 +29,18 @@ abstract class ServerProvider { final DateTime end, ); + Future getPricePerGb(); + Future>> getVolumes({final String? status}); + Future> createVolume(); + Future> deleteVolume(final ServerVolume volume); + Future> resizeVolume( + final ServerVolume volume, + final DiskSize size, + ); + Future> attachVolume( + final ServerVolume volume, + final int serverId, + ); + Future> detachVolume(final ServerVolume volume); GenericResult get success => GenericResult(success: true, data: true); } diff --git a/lib/logic/providers/server_providers/digital_ocean.dart b/lib/logic/providers/server_providers/digital_ocean.dart index c883ac8c..16dac0c6 100644 --- a/lib/logic/providers/server_providers/digital_ocean.dart +++ b/lib/logic/providers/server_providers/digital_ocean.dart @@ -610,6 +610,7 @@ class DigitalOceanServerProvider extends ServerProvider { ); } + @override Future>> getVolumes({ final String? status, }) async { @@ -658,6 +659,7 @@ class DigitalOceanServerProvider extends ServerProvider { ); } + @override Future> createVolume() async { ServerVolume? volume; @@ -729,6 +731,7 @@ class DigitalOceanServerProvider extends ServerProvider { ); } + @override Future> deleteVolume( final ServerVolume volume, ) async => @@ -736,6 +739,7 @@ class DigitalOceanServerProvider extends ServerProvider { volume.uuid!, ); + @override Future> attachVolume( final ServerVolume volume, final int serverId, @@ -745,6 +749,7 @@ class DigitalOceanServerProvider extends ServerProvider { serverId, ); + @override Future> detachVolume( final ServerVolume volume, ) async => @@ -753,6 +758,7 @@ class DigitalOceanServerProvider extends ServerProvider { volume.serverId!, ); + @override Future> resizeVolume( final ServerVolume volume, final DiskSize size, @@ -761,4 +767,33 @@ class DigitalOceanServerProvider extends ServerProvider { volume.name, size, ); + + /// Hardcoded on their documentation and there is no pricing API at all + /// Probably we should scrap the doc page manually + @override + Future getPricePerGb() async => Price( + value: 0.10, + currency: 'USD', + ); + + @override + Future> powerOn(final int serverId) async { + DateTime? timestamp; + final result = await _adapter.api().powerOn(serverId); + if (!result.success) { + return GenericResult( + success: false, + data: timestamp, + code: result.code, + message: result.message, + ); + } + + timestamp = DateTime.now(); + + return GenericResult( + success: true, + data: timestamp, + ); + } } diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index 33894f3d..7b59c2a3 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -7,7 +7,6 @@ import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/logic/models/hive/server_details.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/launch_installation_data.dart'; import 'package:selfprivacy/logic/models/metrics.dart'; import 'package:selfprivacy/logic/models/price.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; @@ -434,7 +433,7 @@ class HetznerServerProvider extends ServerProvider { ); } - final volume = volumeResult.data!; + final volume = volumeResult.data; final serverApiToken = StringGenerators.apiToken(); final hostname = getHostnameFromDomain(installationData.domainName); @@ -632,6 +631,7 @@ class HetznerServerProvider extends ServerProvider { ); } + @override Future> createVolume() async { ServerVolume? volume; @@ -676,6 +676,7 @@ class HetznerServerProvider extends ServerProvider { ); } + @override Future>> getVolumes({ final String? status, }) async { @@ -724,9 +725,11 @@ class HetznerServerProvider extends ServerProvider { ); } - Future> deleteVolume(final int volumeId) async => - _adapter.api().deleteVolume(volumeId); + @override + Future> deleteVolume(final ServerVolume volume) async => + _adapter.api().deleteVolume(volume.id); + @override Future> attachVolume( final ServerVolume volume, final int serverId, @@ -736,14 +739,16 @@ class HetznerServerProvider extends ServerProvider { serverId, ); + @override Future> detachVolume( - final int volumeId, + final ServerVolume volume, ) async => _adapter.api().detachVolume( - volumeId, + volume.id, ); - Future resizeVolume( + @override + Future> resizeVolume( final ServerVolume volume, final DiskSize size, ) async => @@ -751,4 +756,7 @@ class HetznerServerProvider extends ServerProvider { volume, size, ); + + @override + Future getPricePerGb() async => _adapter.api().getPricePerGb(); } diff --git a/lib/ui/router/router.gr.dart b/lib/ui/router/router.gr.dart index 675056f3..e5b0449f 100644 --- a/lib/ui/router/router.gr.dart +++ b/lib/ui/router/router.gr.dart @@ -10,7 +10,8 @@ part of 'router.dart'; abstract class _$RootRouter extends RootStackRouter { - _$RootRouter([GlobalKey? navigatorKey]) : super(navigatorKey); + _$RootRouter([GlobalKey? navigatorKey]) + : super(navigatorKey: navigatorKey); @override final Map pagesMap = {