From 80f28463ec167556fca6b87fad4f3026d3a8e7e5 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Fri, 21 Jul 2023 18:07:26 -0300 Subject: [PATCH 1/3] fix(recovery): Implement server type id requesting on recovery finish --- .../server_installation_cubit.dart | 3 ++ lib/logic/models/server_basic_info.dart | 4 ++ .../server_providers/digital_ocean.dart | 52 +++++++++++++++++++ .../providers/server_providers/hetzner.dart | 48 +++++++++++++++++ .../server_providers/server_provider.dart | 7 +++ 5 files changed, 114 insertions(+) diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index 3f00a5b5..968444e8 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -721,12 +721,15 @@ class ServerInstallationCubit extends Cubit { await repository.saveIsServerResetedSecondTime(true); await repository.saveHasFinalChecked(true); await repository.saveIsRecoveringServer(false); + final serverInfo = await ProvidersController.currentServerProvider! + .getServerInfo(state.serverDetails!.id); final User mainUser = await repository.getMainUser(); await repository.saveRootUser(mainUser); final ServerInstallationRecovery updatedState = (state as ServerInstallationRecovery).copyWith( backblazeCredential: backblazeCredential, rootUser: mainUser, + serverTypeIdentificator: serverInfo.data?.serverTypeId ?? '', ); emit(updatedState.finish()); } diff --git a/lib/logic/models/server_basic_info.dart b/lib/logic/models/server_basic_info.dart index 3037a2d5..dc7b9165 100644 --- a/lib/logic/models/server_basic_info.dart +++ b/lib/logic/models/server_basic_info.dart @@ -3,12 +3,14 @@ class ServerBasicInfo { required this.id, required this.name, required this.reverseDns, + required this.serverTypeId, required this.ip, required this.created, }); final int id; final String name; final String reverseDns; + final String serverTypeId; final String ip; final DateTime created; } @@ -22,6 +24,7 @@ class ServerBasicInfoWithValidators extends ServerBasicInfo { id: serverBasicInfo.id, name: serverBasicInfo.name, reverseDns: serverBasicInfo.reverseDns, + serverTypeId: serverBasicInfo.serverTypeId, ip: serverBasicInfo.ip, created: serverBasicInfo.created, isIpValid: isIpValid, @@ -32,6 +35,7 @@ class ServerBasicInfoWithValidators extends ServerBasicInfo { required super.id, required super.name, required super.reverseDns, + required super.serverTypeId, required super.ip, required super.created, required this.isIpValid, diff --git a/lib/logic/providers/server_providers/digital_ocean.dart b/lib/logic/providers/server_providers/digital_ocean.dart index bca7bd97..7b613698 100644 --- a/lib/logic/providers/server_providers/digital_ocean.dart +++ b/lib/logic/providers/server_providers/digital_ocean.dart @@ -81,6 +81,7 @@ class DigitalOceanServerProvider extends ServerProvider { created: DateTime.now(), ip: ipv4, name: server['name'], + serverTypeId: server['region']['slug'], ); }, ).toList(); @@ -88,6 +89,57 @@ class DigitalOceanServerProvider extends ServerProvider { return GenericResult(success: true, data: servers); } + @override + Future> getServerInfo( + final int serverId, + ) async { + ServerBasicInfo? server; + final result = await _adapter.api().getServers(); + if (result.data.isEmpty || !result.success) { + return GenericResult( + success: result.success, + data: server, + code: result.code, + message: result.message, + ); + } + + final rawServers = result.data; + for (final rawServer in rawServers) { + String? ipv4; + if (rawServer['networks']['v4'].isNotEmpty) { + for (final v4 in rawServer['networks']['v4']) { + if (v4['type'].toString() == 'public') { + ipv4 = v4['ip_address'].toString(); + } + } + } + + try { + server = ServerBasicInfo( + id: rawServer['id'], + reverseDns: rawServer['name'], + created: DateTime.now(), + ip: ipv4!, + name: rawServer['name'], + serverTypeId: rawServer['region']['slug'], + ); + } catch (e) { + print(e); + continue; + } + } + + if (server == null) { + return GenericResult( + success: false, + data: server, + ); + } + + return GenericResult(success: true, data: server); + } + @override Future> launchInstallation( final LaunchInstallationData installationData, diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index 140c1542..db9ddc03 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -77,6 +77,7 @@ class HetznerServerProvider extends ServerProvider { ip: hetznerServer.publicNet.ipv4!.ip, reverseDns: hetznerServer.publicNet.ipv4!.reverseDns, created: hetznerServer.created, + serverTypeId: hetznerServer.name, ); } catch (e) { continue; @@ -88,6 +89,53 @@ class HetznerServerProvider extends ServerProvider { return GenericResult(success: true, data: servers); } + @override + Future> getServerInfo( + final int serverId, + ) async { + ServerBasicInfo? server; + final result = await _adapter.api().getServers(); + if (result.data.isEmpty || !result.success) { + return GenericResult( + success: result.success, + data: server, + code: result.code, + message: result.message, + ); + } + + final List hetznerServers = result.data; + for (final hetznerServer in hetznerServers) { + if (hetznerServer.publicNet.ipv4 == null || + hetznerServer.id != serverId) { + continue; + } + + try { + server = ServerBasicInfo( + id: hetznerServer.id, + name: hetznerServer.name, + ip: hetznerServer.publicNet.ipv4!.ip, + reverseDns: hetznerServer.publicNet.ipv4!.reverseDns, + created: hetznerServer.created, + serverTypeId: hetznerServer.serverType.name, + ); + } catch (e) { + print(e); + continue; + } + } + + if (server == null) { + return GenericResult( + success: false, + data: server, + ); + } + + return GenericResult(success: true, data: server); + } + @override Future> launchInstallation( final LaunchInstallationData installationData, diff --git a/lib/logic/providers/server_providers/server_provider.dart b/lib/logic/providers/server_providers/server_provider.dart index f71ce09a..4182d9fc 100644 --- a/lib/logic/providers/server_providers/server_provider.dart +++ b/lib/logic/providers/server_providers/server_provider.dart @@ -24,6 +24,13 @@ abstract class ServerProvider { /// Only with public IPv4 addresses. Future>> getServers(); + /// Returns actual [ServerBasicInfo] of the + /// requested server entry assigned + /// to the authorized user. + /// + /// Only with public IPv4 address. + Future> getServerInfo(final int serverId); + /// Tries to launch installation of SelfPrivacy on /// the requested server entry for the authorized account. /// Depending on a server provider, the algorithm From 7b0207434512d4544cf8392c0ce314061724266f Mon Sep 17 00:00:00 2001 From: NaiJi Date: Fri, 21 Jul 2023 19:48:00 -0300 Subject: [PATCH 2/3] fix(recovery): Replace server basic info request method with server type info request method --- .../server_installation_cubit.dart | 9 +- .../server_providers/digital_ocean.dart | 84 +++++++++++++------ .../providers/server_providers/hetzner.dart | 73 ++++++++++------ .../server_providers/server_provider.dart | 6 +- 4 files changed, 117 insertions(+), 55 deletions(-) diff --git a/lib/logic/cubit/server_installation/server_installation_cubit.dart b/lib/logic/cubit/server_installation/server_installation_cubit.dart index 968444e8..c669cf75 100644 --- a/lib/logic/cubit/server_installation/server_installation_cubit.dart +++ b/lib/logic/cubit/server_installation/server_installation_cubit.dart @@ -721,15 +721,18 @@ class ServerInstallationCubit extends Cubit { await repository.saveIsServerResetedSecondTime(true); await repository.saveHasFinalChecked(true); await repository.saveIsRecoveringServer(false); - final serverInfo = await ProvidersController.currentServerProvider! - .getServerInfo(state.serverDetails!.id); + final serverType = await ProvidersController.currentServerProvider! + .getServerType(state.serverDetails!.id); + await repository.saveServerType(serverType.data!); + await ProvidersController.currentServerProvider! + .trySetServerLocation(serverType.data!.location.identifier); final User mainUser = await repository.getMainUser(); await repository.saveRootUser(mainUser); final ServerInstallationRecovery updatedState = (state as ServerInstallationRecovery).copyWith( backblazeCredential: backblazeCredential, rootUser: mainUser, - serverTypeIdentificator: serverInfo.data?.serverTypeId ?? '', + serverTypeIdentificator: serverType.data!.identifier, ); emit(updatedState.finish()); } diff --git a/lib/logic/providers/server_providers/digital_ocean.dart b/lib/logic/providers/server_providers/digital_ocean.dart index 7b613698..4082abe5 100644 --- a/lib/logic/providers/server_providers/digital_ocean.dart +++ b/lib/logic/providers/server_providers/digital_ocean.dart @@ -90,54 +90,90 @@ class DigitalOceanServerProvider extends ServerProvider { } @override - Future> getServerInfo( - final int serverId, - ) async { - ServerBasicInfo? server; + Future> getServerType(final int serverId) async { + ServerType? serverType; + dynamic server; final result = await _adapter.api().getServers(); if (result.data.isEmpty || !result.success) { return GenericResult( success: result.success, - data: server, + data: serverType, code: result.code, message: result.message, ); } - final rawServers = result.data; + final List rawServers = result.data; for (final rawServer in rawServers) { - String? ipv4; if (rawServer['networks']['v4'].isNotEmpty) { for (final v4 in rawServer['networks']['v4']) { if (v4['type'].toString() == 'public') { - ipv4 = v4['ip_address'].toString(); + server = rawServer; } } } - - try { - server = ServerBasicInfo( - id: rawServer['id'], - reverseDns: rawServer['name'], - created: DateTime.now(), - ip: ipv4!, - name: rawServer['name'], - serverTypeId: rawServer['region']['slug'], - ); - } catch (e) { - print(e); - continue; - } } if (server == null) { + const String msg = 'getServerType: no server!'; + print(msg); return GenericResult( success: false, - data: server, + data: serverType, + message: msg, ); } - return GenericResult(success: true, data: server); + final rawLocationsResult = await getAvailableLocations(); + if (rawLocationsResult.data.isEmpty || !rawLocationsResult.success) { + return GenericResult( + success: rawLocationsResult.success, + data: serverType, + code: rawLocationsResult.code, + message: rawLocationsResult.message, + ); + } + + ServerProviderLocation? location; + for (final rawLocation in rawLocationsResult.data) { + if (rawLocation.identifier == server['region']['slug']) { + location = rawLocation; + } + } + + if (location == null) { + const String msg = 'getServerType: no location!'; + print(msg); + return GenericResult( + success: false, + data: serverType, + message: msg, + ); + } + + ServerType? type; + final rawSize = DigitalOceanServerType.fromJson(server['size']); + for (final rawRegion in rawSize.regions) { + if (rawRegion == server['region']['slug']) { + type = ServerType( + title: rawSize.description, + identifier: rawSize.slug, + ram: rawSize.memory / 1024, + cores: rawSize.vcpus, + disk: DiskSize(byte: rawSize.disk * 1024 * 1024 * 1024), + price: Price( + value: rawSize.priceMonthly, + currency: currency, + ), + location: location, + ); + } + } + + return GenericResult( + success: true, + data: type, + ); } @override diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index db9ddc03..e902a788 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -90,15 +90,14 @@ class HetznerServerProvider extends ServerProvider { } @override - Future> getServerInfo( - final int serverId, - ) async { - ServerBasicInfo? server; + Future> getServerType(final int serverId) async { + ServerType? serverType; + HetznerServerInfo? server; final result = await _adapter.api().getServers(); if (result.data.isEmpty || !result.success) { return GenericResult( success: result.success, - data: server, + data: serverType, code: result.code, message: result.message, ); @@ -106,34 +105,60 @@ class HetznerServerProvider extends ServerProvider { final List hetznerServers = result.data; for (final hetznerServer in hetznerServers) { - if (hetznerServer.publicNet.ipv4 == null || - hetznerServer.id != serverId) { - continue; - } - - try { - server = ServerBasicInfo( - id: hetznerServer.id, - name: hetznerServer.name, - ip: hetznerServer.publicNet.ipv4!.ip, - reverseDns: hetznerServer.publicNet.ipv4!.reverseDns, - created: hetznerServer.created, - serverTypeId: hetznerServer.serverType.name, - ); - } catch (e) { - print(e); - continue; + if (hetznerServer.publicNet.ipv4 != null || + hetznerServer.id == serverId) { + server = hetznerServer; + break; } } if (server == null) { + const String msg = 'getServerType: no server!'; + print(msg); return GenericResult( success: false, - data: server, + data: serverType, + message: msg, ); } - return GenericResult(success: true, data: server); + double? priceValue; + for (final price in server.serverType.prices) { + if (price.location == server.location.name) { + priceValue = price.monthly; + } + } + + if (priceValue == null) { + const String msg = 'getServerType: no price!'; + print(msg); + return GenericResult( + success: false, + data: serverType, + message: msg, + ); + } + + return GenericResult( + success: true, + data: ServerType( + title: server.serverType.description, + identifier: server.serverType.name, + ram: server.serverType.memory.toDouble(), + cores: server.serverType.cores, + disk: DiskSize(byte: server.serverType.disk * 1024 * 1024 * 1024), + price: Price( + value: priceValue, + currency: currency, + ), + location: ServerProviderLocation( + title: server.location.city, + description: server.location.description, + flag: server.location.flag, + identifier: server.location.name, + ), + ), + ); } @override diff --git a/lib/logic/providers/server_providers/server_provider.dart b/lib/logic/providers/server_providers/server_provider.dart index 4182d9fc..cfcf3f5e 100644 --- a/lib/logic/providers/server_providers/server_provider.dart +++ b/lib/logic/providers/server_providers/server_provider.dart @@ -24,12 +24,10 @@ abstract class ServerProvider { /// Only with public IPv4 addresses. Future>> getServers(); - /// Returns actual [ServerBasicInfo] of the + /// Returns actual [ServerType] of the /// requested server entry assigned /// to the authorized user. - /// - /// Only with public IPv4 address. - Future> getServerInfo(final int serverId); + Future> getServerType(final int serverId); /// Tries to launch installation of SelfPrivacy on /// the requested server entry for the authorized account. From 69822f24ca0ee05fe74e437c7f315e526101e415 Mon Sep 17 00:00:00 2001 From: NaiJi Date: Fri, 21 Jul 2023 19:50:20 -0300 Subject: [PATCH 3/3] chore: Remove unused server basic info attribute --- lib/logic/models/server_basic_info.dart | 4 ---- lib/logic/providers/server_providers/digital_ocean.dart | 1 - lib/logic/providers/server_providers/hetzner.dart | 1 - 3 files changed, 6 deletions(-) diff --git a/lib/logic/models/server_basic_info.dart b/lib/logic/models/server_basic_info.dart index dc7b9165..3037a2d5 100644 --- a/lib/logic/models/server_basic_info.dart +++ b/lib/logic/models/server_basic_info.dart @@ -3,14 +3,12 @@ class ServerBasicInfo { required this.id, required this.name, required this.reverseDns, - required this.serverTypeId, required this.ip, required this.created, }); final int id; final String name; final String reverseDns; - final String serverTypeId; final String ip; final DateTime created; } @@ -24,7 +22,6 @@ class ServerBasicInfoWithValidators extends ServerBasicInfo { id: serverBasicInfo.id, name: serverBasicInfo.name, reverseDns: serverBasicInfo.reverseDns, - serverTypeId: serverBasicInfo.serverTypeId, ip: serverBasicInfo.ip, created: serverBasicInfo.created, isIpValid: isIpValid, @@ -35,7 +32,6 @@ class ServerBasicInfoWithValidators extends ServerBasicInfo { required super.id, required super.name, required super.reverseDns, - required super.serverTypeId, required super.ip, required super.created, required this.isIpValid, diff --git a/lib/logic/providers/server_providers/digital_ocean.dart b/lib/logic/providers/server_providers/digital_ocean.dart index 4082abe5..da246b18 100644 --- a/lib/logic/providers/server_providers/digital_ocean.dart +++ b/lib/logic/providers/server_providers/digital_ocean.dart @@ -81,7 +81,6 @@ class DigitalOceanServerProvider extends ServerProvider { created: DateTime.now(), ip: ipv4, name: server['name'], - serverTypeId: server['region']['slug'], ); }, ).toList(); diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index e902a788..ec15801e 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -77,7 +77,6 @@ class HetznerServerProvider extends ServerProvider { ip: hetznerServer.publicNet.ipv4!.ip, reverseDns: hetznerServer.publicNet.ipv4!.reverseDns, created: hetznerServer.created, - serverTypeId: hetznerServer.name, ); } catch (e) { continue;