From ef04b5bf57a60e7af85d5018731cf742f538b5ba Mon Sep 17 00:00:00 2001 From: NaiJi Date: Wed, 22 Feb 2023 21:03:58 +0400 Subject: [PATCH] chore: Implement server installation on businness logic layer for hetzner --- .../server_installation_cubit.dart | 60 ++++++++----------- .../models/launch_installation_data.dart | 5 ++ .../providers/server_providers/hetzner.dart | 28 +++++++-- 3 files changed, 53 insertions(+), 40 deletions(-) diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index 9758c545..896ef717 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -172,7 +172,7 @@ class ServerInstallationCubit extends Cubit { await repository.saveServerType(serverType); await ProvidersController.currentServerProvider! - .trySetServerLocation(serverType); + .trySetServerLocation(serverType.identifier); emit( (state as ServerInstallationNotFinished).copyWith( @@ -223,42 +223,30 @@ class ServerInstallationCubit extends Cubit { emit((state as ServerInstallationNotFinished).copyWith(rootUser: rootUser)); } + Future onCreateServerSuccess( + final ServerHostingDetails serverDetails, + ) async { + await repository.saveServerDetails(serverDetails); + // TODO dns; + emit( + (state as ServerInstallationNotFinished).copyWith( + isLoading: false, + serverDetails: serverDetails, + ), + ); + runDelayed(startServerIfDnsIsOkay, const Duration(seconds: 30), null); + } + void createServerAndSetDnsRecords() async { - final ServerInstallationNotFinished stateCopy = - state as ServerInstallationNotFinished; - void onCancel() => emit( - (state as ServerInstallationNotFinished).copyWith(isLoading: false), - ); - - Future onSuccess(final ServerHostingDetails serverDetails) async { - await repository.createDnsRecords( - serverDetails, - state.serverDomain!, - onCancel: onCancel, - ); - - emit( - (state as ServerInstallationNotFinished).copyWith( - isLoading: false, - serverDetails: serverDetails, - ), - ); - runDelayed(startServerIfDnsIsOkay, const Duration(seconds: 30), null); - } - - try { - emit((state as ServerInstallationNotFinished).copyWith(isLoading: true)); - await repository.createServer( - state.rootUser!, - state.serverDomain!.domainName, - state.dnsApiToken!, - state.backblazeCredential!, - onCancel: onCancel, - onSuccess: onSuccess, - ); - } catch (e) { - emit(stateCopy); - } + emit((state as ServerInstallationNotFinished).copyWith(isLoading: true)); + await repository.createServer( + state.rootUser!, + state.serverDomain!.domainName, + state.dnsApiToken!, + state.backblazeCredential!, + onCancel: clearAppConfig, + onSuccess: onCreateServerSuccess, + ); } void startServerIfDnsIsOkay({ diff --git a/lib/logic/models/launch_installation_data.dart b/lib/logic/models/launch_installation_data.dart index 14e1e592..f955eed7 100644 --- a/lib/logic/models/launch_installation_data.dart +++ b/lib/logic/models/launch_installation_data.dart @@ -1,3 +1,4 @@ +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'; @@ -9,6 +10,8 @@ class LaunchInstallationData { required this.dnsProviderType, required this.domainName, required this.serverType, + required this.errorCallback, + required this.successCallback, }); final User rootUser; @@ -16,4 +19,6 @@ class LaunchInstallationData { final String domainName; final DnsProviderType dnsProviderType; final ServerType serverType; + final Function() errorCallback; + final Function(ServerHostingDetails details) successCallback; } diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index f1453448..6cd5f4f6 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -424,7 +424,7 @@ class HetznerServerProvider extends ServerProvider { choices: [ CallbackDialogueChoice( title: 'basis.cancel'.tr(), - callback: null, + callback: await installationData.errorCallback(), ), CallbackDialogueChoice( title: 'basis.try_again'.tr(), @@ -471,7 +471,7 @@ class HetznerServerProvider extends ServerProvider { choices: [ CallbackDialogueChoice( title: 'basis.cancel'.tr(), - callback: null, + callback: installationData.errorCallback(), ), CallbackDialogueChoice( title: 'basis.yes'.tr(), @@ -498,7 +498,14 @@ class HetznerServerProvider extends ServerProvider { choices: [ CallbackDialogueChoice( title: 'basis.cancel'.tr(), - callback: null, + callback: () async { + final deletion = await deleteServer(hostname); + if (deletion.success) { + installationData.errorCallback(); + } + + return deletion; + }, ), CallbackDialogueChoice( title: 'basis.try_again'.tr(), @@ -537,13 +544,23 @@ class HetznerServerProvider extends ServerProvider { choices: [ CallbackDialogueChoice( title: 'basis.cancel'.tr(), - callback: null, + callback: () async { + final deletion = await deleteServer(hostname); + if (deletion.success) { + installationData.errorCallback(); + } + + return deletion; + }, ), CallbackDialogueChoice( title: 'basis.try_again'.tr(), callback: () async { + await _adapter.api().deleteVolume(volume); + await Future.delayed(const Duration(seconds: 5)); final deletion = await deleteServer(hostname); if (deletion.success) { + await Future.delayed(const Duration(seconds: 5)); return launchInstallation(installationData); } @@ -559,6 +576,9 @@ class HetznerServerProvider extends ServerProvider { code: volumeResult.code, ); } + + await installationData.successCallback(serverDetails); + return GenericResult(success: true, data: null); } Future> deleteServer(