From 62c0030f8e55aeb7449a8dd1500e875fb2454566 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Wed, 22 Feb 2023 21:58:59 +0400 Subject: [PATCH] chore: Implement server installation logic on cubit layer --- .../server_installation_cubit.dart | 55 +++++++-- .../server_installation_repository.dart | 115 ++---------------- .../models/launch_installation_data.dart | 5 +- lib/logic/providers/server_provider.dart | 7 ++ .../providers/server_providers/hetzner.dart | 5 +- 5 files changed, 69 insertions(+), 118 deletions(-) diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index 896ef717..1ccaf714 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -6,6 +6,8 @@ import 'package:equatable/equatable.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart'; +import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart'; +import 'package:selfprivacy/logic/models/launch_installation_data.dart'; import 'package:selfprivacy/logic/providers/provider_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/providers/providers_controller.dart'; @@ -18,6 +20,7 @@ import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_repository.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; import 'package:selfprivacy/logic/models/server_type.dart'; +import 'package:selfprivacy/ui/helpers/modals.dart'; export 'package:provider/provider.dart'; @@ -239,14 +242,52 @@ class ServerInstallationCubit extends Cubit { void createServerAndSetDnsRecords() async { emit((state as ServerInstallationNotFinished).copyWith(isLoading: true)); - await repository.createServer( - state.rootUser!, - state.serverDomain!.domainName, - state.dnsApiToken!, - state.backblazeCredential!, - onCancel: clearAppConfig, - onSuccess: onCreateServerSuccess, + + final installationData = LaunchInstallationData( + rootUser: state.rootUser!, + dnsApiToken: state.dnsApiToken!, + dnsProviderType: state.serverDomain!.provider, + domainName: state.serverDomain!.domainName, + serverTypeId: state.serverTypeIdentificator!, + errorCallback: clearAppConfig, + successCallback: onCreateServerSuccess, ); + + final result = + await ProvidersController.currentServerProvider!.launchInstallation( + installationData, + ); + + if (!result.success && result.data != null) { + bool dialoguesResolved = false; + CallbackDialogueBranching branching = result.data!; + while (!dialoguesResolved) { + showPopUpAlert( + alertTitle: branching.title, + description: branching.description, + actionButtonTitle: branching.choices[1].title, + actionButtonOnPressed: () async { + final branchingResult = await branching.choices[1].callback!(); + if (branchingResult.data == null) { + dialoguesResolved = true; + return; + } + + branching = branchingResult.data!; + }, + cancelButtonTitle: branching.choices[0].title, + cancelButtonOnPressed: () async { + final branchingResult = await branching.choices[0].callback!(); + if (branchingResult.data == null) { + dialoguesResolved = true; + return; + } + + branching = branchingResult.data!; + }, + ); + } + } } void startServerIfDnsIsOkay({ diff --git a/lib/logic/cubit/server_installation/server_installation_repository.dart b/lib/logic/cubit/server_installation/server_installation_repository.dart index d60b2119..3d3f62a8 100644 --- a/lib/logic/cubit/server_installation/server_installation_repository.dart +++ b/lib/logic/cubit/server_installation/server_installation_repository.dart @@ -25,6 +25,7 @@ import 'package:selfprivacy/logic/models/json/dns_records.dart'; import 'package:selfprivacy/logic/models/message.dart'; import 'package:selfprivacy/logic/models/server_basic_info.dart'; import 'package:selfprivacy/logic/models/server_type.dart'; +import 'package:selfprivacy/logic/providers/providers_controller.dart'; import 'package:selfprivacy/ui/helpers/modals.dart'; import 'package:selfprivacy/utils/network_utils.dart'; @@ -168,13 +169,15 @@ class ServerInstallationRepository { Future startServer( final ServerHostingDetails server, ) async { - ServerHostingDetails serverDetails; + final result = await ProvidersController.currentServerProvider!.powerOn( + server.id, + ); - serverDetails = await ApiController.currentServerProviderApiFactory! - .getServerProvider() - .powerOn(); + if (result.success && result.data != null) { + server.copyWith(startTime: result.data); + } - return serverDetails; + return server; } Future getDomainId(final String token, final String domain) async { @@ -239,108 +242,6 @@ class ServerInstallationRepository { return matches; } - Future createServer( - final User rootUser, - final String domainName, - final String cloudFlareKey, - final BackblazeCredential backblazeCredential, { - required final void Function() onCancel, - required final Future Function(ServerHostingDetails serverDetails) - onSuccess, - }) async { - final ServerProviderApi api = - ApiController.currentServerProviderApiFactory!.getServerProvider(); - - void showInstallationErrorPopUp() { - showPopUpAlert( - alertTitle: 'modals.unexpected_error'.tr(), - description: 'modals.try_again'.tr(), - actionButtonTitle: 'modals.yes'.tr(), - actionButtonOnPressed: () async { - ServerHostingDetails? serverDetails; - try { - final GenericResult createResult = await api.createServer( - dnsProvider: getIt().dnsProvider!, - dnsApiToken: cloudFlareKey, - rootUser: rootUser, - domainName: domainName, - serverType: getIt().serverType!, - ); - serverDetails = createResult.data; - } catch (e) { - print(e); - } - - if (serverDetails == null) { - print('Server is not initialized!'); - return; - } - await saveServerDetails(serverDetails); - onSuccess(serverDetails); - }, - cancelButtonOnPressed: onCancel, - ); - } - - try { - final GenericResult createServerResult = - await api.createServer( - dnsProvider: getIt().dnsProvider!, - dnsApiToken: cloudFlareKey, - rootUser: rootUser, - domainName: domainName, - serverType: getIt().serverType!, - ); - - if (createServerResult.data == null) { - const String e = 'Server is not initialized!'; - print(e); - } - - if (createServerResult.message == 'uniqueness_error') { - showPopUpAlert( - alertTitle: 'modals.already_exists'.tr(), - description: 'modals.destroy_server'.tr(), - actionButtonTitle: 'modals.yes'.tr(), - actionButtonOnPressed: () async { - await api.deleteServer( - domainName: domainName, - ); - - ServerHostingDetails? serverDetails; - try { - final GenericResult createResult = await api.createServer( - dnsProvider: getIt().dnsProvider!, - dnsApiToken: cloudFlareKey, - rootUser: rootUser, - domainName: domainName, - serverType: getIt().serverType!, - ); - serverDetails = createResult.data; - } catch (e) { - print(e); - } - - if (serverDetails == null) { - print('Server is not initialized!'); - return; - } - await saveServerDetails(serverDetails); - onSuccess(serverDetails); - }, - cancelButtonOnPressed: onCancel, - ); - return; - } - - saveServerDetails(createServerResult.data!); - onSuccess(createServerResult.data!); - } catch (e) { - print(e); - showInstallationErrorPopUp(); - } - } - Future createDnsRecords( final ServerHostingDetails serverDetails, final ServerDomain domain, { diff --git a/lib/logic/models/launch_installation_data.dart b/lib/logic/models/launch_installation_data.dart index f955eed7..c7956ea1 100644 --- a/lib/logic/models/launch_installation_data.dart +++ b/lib/logic/models/launch_installation_data.dart @@ -1,7 +1,6 @@ import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; -import 'package:selfprivacy/logic/models/server_type.dart'; class LaunchInstallationData { LaunchInstallationData({ @@ -9,7 +8,7 @@ class LaunchInstallationData { required this.dnsApiToken, required this.dnsProviderType, required this.domainName, - required this.serverType, + required this.serverTypeId, required this.errorCallback, required this.successCallback, }); @@ -18,7 +17,7 @@ class LaunchInstallationData { final String dnsApiToken; final String domainName; final DnsProviderType dnsProviderType; - final ServerType serverType; + final String serverTypeId; final Function() errorCallback; final Function(ServerHostingDetails details) successCallback; } diff --git a/lib/logic/providers/server_provider.dart b/lib/logic/providers/server_provider.dart index 642c779a..b92faa97 100644 --- a/lib/logic/providers/server_provider.dart +++ b/lib/logic/providers/server_provider.dart @@ -1,4 +1,6 @@ import 'package:selfprivacy/logic/api_maps/generic_result.dart'; +import 'package:selfprivacy/logic/models/callback_dialogue_branching.dart'; +import 'package:selfprivacy/logic/models/launch_installation_data.dart'; import 'package:selfprivacy/logic/models/server_provider_location.dart'; import 'package:selfprivacy/logic/models/server_type.dart'; @@ -11,6 +13,11 @@ abstract class ServerProvider { Future>> getServerTypes({ required final ServerProviderLocation location, }); + Future> launchInstallation( + final LaunchInstallationData installationData, + ); + Future> powerOn(final int serverId); + Future> restart(final int serverId); GenericResult get success => GenericResult(success: true, data: true); } diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index 6cd5f4f6..4b2377e6 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -359,6 +359,7 @@ class HetznerServerProvider extends ServerProvider { return GenericResult(data: metrics, success: true); } + @override Future> restart(final int serverId) async { DateTime? timestamp; final result = await _adapter.api().restart(serverId); @@ -379,6 +380,7 @@ class HetznerServerProvider extends ServerProvider { ); } + @override Future> powerOn(final int serverId) async { DateTime? timestamp; final result = await _adapter.api().powerOn(serverId); @@ -413,6 +415,7 @@ class HetznerServerProvider extends ServerProvider { return dnsProviderType; } + @override Future> launchInstallation( final LaunchInstallationData installationData, ) async { @@ -449,7 +452,7 @@ class HetznerServerProvider extends ServerProvider { dnsApiToken: installationData.dnsApiToken, rootUser: installationData.rootUser, domainName: installationData.domainName, - serverType: installationData.serverType.identifier, + serverType: installationData.serverTypeId, dnsProviderType: dnsProviderToInfectName(installationData.dnsProviderType), hostName: hostname,