From 65f5d987e2f0747e17552d0d88da49d021145ba7 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Tue, 29 Nov 2022 19:21:36 +0400 Subject: [PATCH] feat: Implement error handling for server installation Now user gets notified when connection error occurs --- .../dns_providers/cloudflare/cloudflare.dart | 20 ++++++- .../rest_maps/dns_providers/dns_provider.dart | 4 +- .../digital_ocean/digital_ocean.dart | 4 +- .../server_providers/hetzner/hetzner.dart | 9 +++- .../server_providers/server_provider.dart | 2 +- .../server_installation_repository.dart | 54 +++++++++++++------ 6 files changed, 71 insertions(+), 22 deletions(-) diff --git a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart index f4d786ca..14cf5c96 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare.dart @@ -113,7 +113,7 @@ class CloudflareApi extends DnsProviderApi { } @override - Future removeSimilarRecords({ + Future> removeSimilarRecords({ required final ServerDomain domain, final String? ip4, }) async { @@ -139,9 +139,16 @@ class CloudflareApi extends DnsProviderApi { await Future.wait(allDeleteFutures); } catch (e) { print(e); + return APIGenericResult( + success: false, + data: null, + message: e.toString(), + ); } finally { close(client); } + + return APIGenericResult(success: true, data: null); } @override @@ -183,7 +190,7 @@ class CloudflareApi extends DnsProviderApi { } @override - Future createMultipleDnsRecords({ + Future> createMultipleDnsRecords({ required final ServerDomain domain, final String? ip4, }) async { @@ -206,9 +213,18 @@ class CloudflareApi extends DnsProviderApi { } on DioError catch (e) { print(e.message); rethrow; + } catch (e) { + print(e); + return APIGenericResult( + success: false, + data: null, + message: e.toString(), + ); } finally { close(client); } + + return APIGenericResult(success: true, data: null); } List projectDnsRecords( diff --git a/lib/logic/api_maps/rest_maps/dns_providers/dns_provider.dart b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider.dart index 2c538251..106d185c 100644 --- a/lib/logic/api_maps/rest_maps/dns_providers/dns_provider.dart +++ b/lib/logic/api_maps/rest_maps/dns_providers/dns_provider.dart @@ -14,11 +14,11 @@ abstract class DnsProviderApi extends ApiMap { Future> getDnsRecords({ required final ServerDomain domain, }); - Future removeSimilarRecords({ + Future> removeSimilarRecords({ required final ServerDomain domain, final String? ip4, }); - Future createMultipleDnsRecords({ + Future> createMultipleDnsRecords({ required final ServerDomain domain, final String? ip4, }); 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 55534b1d..86cda482 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 @@ -790,11 +790,13 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { } @override - Future createReverseDns({ + Future> createReverseDns({ required final ServerHostingDetails serverDetails, required final ServerDomain domain, }) async { /// TODO remove from provider interface + const bool success = true; + return APIGenericResult(success: success, data: null); } @override 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 0f735217..4b51b27c 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 @@ -788,7 +788,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { } @override - Future createReverseDns({ + Future> createReverseDns({ required final ServerHostingDetails serverDetails, required final ServerDomain domain, }) async { @@ -803,8 +803,15 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi { ); } catch (e) { print(e); + return APIGenericResult( + success: false, + data: null, + message: e.toString(), + ); } finally { close(client); } + + return APIGenericResult(success: true, data: null); } } 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 1b9a320a..21f6f376 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 @@ -38,7 +38,7 @@ abstract class ServerProviderApi extends ApiMap { required final String domainName, required final String serverType, }); - Future createReverseDns({ + Future> createReverseDns({ required final ServerHostingDetails serverDetails, required final ServerDomain domain, }); diff --git a/lib/logic/cubit/server_installation/server_installation_repository.dart b/lib/logic/cubit/server_installation/server_installation_repository.dart index 8365529a..fb4d9d15 100644 --- a/lib/logic/cubit/server_installation/server_installation_repository.dart +++ b/lib/logic/cubit/server_installation/server_installation_repository.dart @@ -334,21 +334,9 @@ class ServerInstallationRepository { final ServerProviderApi serverApi = ApiController.currentServerProviderApiFactory!.getServerProvider(); - await dnsProviderApi.removeSimilarRecords( - ip4: serverDetails.ip4, - domain: domain, - ); - - try { - await dnsProviderApi.createMultipleDnsRecords( - ip4: serverDetails.ip4, - domain: domain, - ); - } on DioError catch (e) { + void showDomainErrorPopUp(final String error) { showPopUpAlert( - alertTitle: e.response!.data['errors'][0]['code'] == 1038 - ? 'modals.you_cant_use_this_api'.tr() - : 'domain.error'.tr(), + alertTitle: error, description: 'modals.delete_server_volume'.tr(), cancelButtonOnPressed: onCancel, actionButtonTitle: 'basis.delete'.tr(), @@ -359,14 +347,50 @@ class ServerInstallationRepository { onCancel(); }, ); + } + + final APIGenericResult removingResult = + await dnsProviderApi.removeSimilarRecords( + ip4: serverDetails.ip4, + domain: domain, + ); + + if (!removingResult.success) { + showDomainErrorPopUp('domain.error'.tr()); return false; } - await serverApi.createReverseDns( + bool createdSuccessfully = false; + String errorMessage = 'domain.error'.tr(); + try { + final APIGenericResult createResult = + await dnsProviderApi.createMultipleDnsRecords( + ip4: serverDetails.ip4, + domain: domain, + ); + createdSuccessfully = createResult.success; + } on DioError catch (e) { + if (e.response!.data['errors'][0]['code'] == 1038) { + errorMessage = 'modals.you_cant_use_this_api'.tr(); + } + } + + if (!createdSuccessfully) { + showDomainErrorPopUp(errorMessage); + return false; + } + + final APIGenericResult createReverseResult = + await serverApi.createReverseDns( serverDetails: serverDetails, domain: domain, ); + if (!createReverseResult.success) { + showDomainErrorPopUp(errorMessage); + return false; + } + return true; }