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 7cd379ee..e1996dc4 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 @@ -59,7 +59,6 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { @override String get displayProviderName => 'Digital Ocean'; - @override Future> isApiTokenValid(final String token) async { bool isValid = false; Response? response; @@ -724,46 +723,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { return servers; } - String? getEmojiFlag(final String query) { - String? emoji; - - switch (query.toLowerCase().substring(0, 3)) { - case 'fra': - emoji = '🇩🇪'; - break; - - case 'ams': - emoji = '🇳🇱'; - break; - - case 'sgp': - emoji = '🇸🇬'; - break; - - case 'lon': - emoji = '🇬🇧'; - break; - - case 'tor': - emoji = '🇨🇦'; - break; - - case 'blr': - emoji = '🇮🇳'; - break; - - case 'nyc': - case 'sfo': - emoji = '🇺🇸'; - break; - } - - return emoji; - } - - @override - Future>> - getAvailableLocations() async { + Future> getAvailableLocations() async { List locations = []; final Dio client = await getClient(); @@ -772,16 +732,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { '/regions', ); - locations = response.data!['regions'] - .map( - (final location) => ServerProviderLocation( - title: location['slug'], - description: location['name'], - flag: getEmojiFlag(location['slug']), - identifier: location['slug'], - ), - ) - .toList(); + locations = response.data!['regions']; } catch (e) { print(e); return GenericResult( @@ -796,39 +747,15 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi { return GenericResult(data: locations, success: true); } - @override - Future>> getAvailableServerTypes({ - required final ServerProviderLocation location, - }) async { - final List types = []; + Future> getAvailableServerTypes() async { + List types = []; final Dio client = await getClient(); try { final Response response = await client.get( '/sizes', ); - final rawSizes = response.data!['sizes']; - for (final rawSize in rawSizes) { - for (final rawRegion in rawSize['regions']) { - final ramMb = rawSize['memory'].toDouble(); - if (rawRegion.toString() == location.identifier && ramMb > 1024) { - types.add( - ServerType( - title: rawSize['description'], - identifier: rawSize['slug'], - ram: ramMb / 1024, - cores: rawSize['vcpus'], - disk: DiskSize(byte: rawSize['disk'] * 1024 * 1024 * 1024), - price: Price( - value: rawSize['price_monthly'], - currency: 'USD', - ), - location: location, - ), - ); - } - } - } + types = response.data!['sizes']; } catch (e) { print(e); return GenericResult( 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 99c6b1ac..88250ab3 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 @@ -1,5 +1,4 @@ import 'package:selfprivacy/logic/api_maps/rest_maps/api_map.dart'; -import 'package:selfprivacy/logic/models/hive/server_domain.dart'; export 'package:selfprivacy/logic/api_maps/generic_result.dart'; class ProviderApiTokenValidation { @@ -12,20 +11,6 @@ class ProviderApiTokenValidation { } abstract class ServerProviderApi extends ApiMap { - String dnsProviderToInfectName(final DnsProviderType dnsProvider) { - String dnsProviderType; - switch (dnsProvider) { - case DnsProviderType.digitalOcean: - dnsProviderType = 'DIGITALOCEAN'; - break; - case DnsProviderType.cloudflare: - default: - dnsProviderType = 'CLOUDFLARE'; - break; - } - return dnsProviderType; - } - /// Provider name key which lets infect understand what kind of installation /// it requires, for example 'digitaloceal' for Digital Ocean String get infectProviderName; diff --git a/lib/logic/providers/server_providers/digital_ocean.dart b/lib/logic/providers/server_providers/digital_ocean.dart index 4a26c49e..d94418cd 100644 --- a/lib/logic/providers/server_providers/digital_ocean.dart +++ b/lib/logic/providers/server_providers/digital_ocean.dart @@ -1,3 +1,177 @@ +import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/digital_ocean/digital_ocean_api.dart'; +import 'package:selfprivacy/logic/models/server_provider_location.dart'; +import 'package:selfprivacy/logic/models/server_type.dart'; import 'package:selfprivacy/logic/providers/server_provider.dart'; -class DigitalOceanServerProvider extends ServerProvider {} +class ApiAdapter { + ApiAdapter({final String? region, final bool isWithToken = true}) + : _api = DigitalOceanApi( + region: region, + isWithToken: isWithToken, + ); + + DigitalOceanApi api({final bool getInitialized = true}) => getInitialized + ? _api + : DigitalOceanApi( + region: _api.region, + isWithToken: false, + ); + + final DigitalOceanApi _api; +} + +class DigitalOceanServerProvider extends ServerProvider { + DigitalOceanServerProvider() : _adapter = ApiAdapter(); + DigitalOceanServerProvider.load( + final ServerType serverType, + final bool isAuthotized, + ) : _adapter = ApiAdapter( + isWithToken: isAuthotized, + region: serverType.location.identifier, + ); + + ApiAdapter _adapter; + + @override + Future> trySetServerLocation( + final String location, + ) async { + final bool apiInitialized = _adapter.api().isWithToken; + if (!apiInitialized) { + return GenericResult( + success: true, + data: false, + message: 'Not authorized!', + ); + } + + _adapter = ApiAdapter( + isWithToken: true, + region: location, + ); + return success; + } + + @override + Future> tryInitApiByToken(final String token) async { + final api = _adapter.api(getInitialized: false); + final result = await api.isApiTokenValid(token); + if (!result.data || !result.success) { + return result; + } + + _adapter = ApiAdapter(region: api.region, isWithToken: true); + return result; + } + + String? getEmojiFlag(final String query) { + String? emoji; + + switch (query.toLowerCase().substring(0, 3)) { + case 'fra': + emoji = '🇩🇪'; + break; + + case 'ams': + emoji = '🇳🇱'; + break; + + case 'sgp': + emoji = '🇸🇬'; + break; + + case 'lon': + emoji = '🇬🇧'; + break; + + case 'tor': + emoji = '🇨🇦'; + break; + + case 'blr': + emoji = '🇮🇳'; + break; + + case 'nyc': + case 'sfo': + emoji = '🇺🇸'; + break; + } + + return emoji; + } + + @override + Future>> + getAvailableLocations() async { + final List locations = []; + final result = await _adapter.api().getAvailableLocations(); + if (result.data.isEmpty || !result.success) { + return GenericResult( + success: result.success, + data: locations, + code: result.code, + message: result.message, + ); + } + + final List rawLocations = result.data; + for (final rawLocation in rawLocations) { + ServerProviderLocation? location; + try { + location = ServerProviderLocation( + title: rawLocation['slug'], + description: rawLocation['name'], + flag: getEmojiFlag(rawLocation['slug']), + identifier: rawLocation['slug'], + ); + } catch (e) { + continue; + } + locations.add(location); + } + + return GenericResult(success: true, data: locations); + } + + @override + Future>> getServerTypes({ + required final ServerProviderLocation location, + }) async { + final List types = []; + final result = await _adapter.api().getAvailableServerTypes(); + if (result.data.isEmpty || !result.success) { + return GenericResult( + success: result.success, + data: types, + code: result.code, + message: result.message, + ); + } + + final List rawTypes = result.data; + for (final rawSize in rawSizes) { + for (final rawRegion in rawSize['regions']) { + final ramMb = rawSize['memory'].toDouble(); + if (rawRegion.toString() == location.identifier && ramMb > 1024) { + types.add( + ServerType( + title: rawSize['description'], + identifier: rawSize['slug'], + ram: ramMb / 1024, + cores: rawSize['vcpus'], + disk: DiskSize(byte: rawSize['disk'] * 1024 * 1024 * 1024), + price: Price( + value: rawSize['price_monthly'], + currency: 'USD', + ), + location: location, + ), + ); + } + } + } + + return GenericResult(success: true, data: types); + } +} diff --git a/lib/logic/providers/server_providers/hetzner.dart b/lib/logic/providers/server_providers/hetzner.dart index 20a4ca95..43d60aec 100644 --- a/lib/logic/providers/server_providers/hetzner.dart +++ b/lib/logic/providers/server_providers/hetzner.dart @@ -2,7 +2,6 @@ import 'dart:convert'; import 'package:easy_localization/easy_localization.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/hetzner/hetzner_api.dart'; -import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.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';