feat: Implement general server provider and its factory

pull/213/head
NaiJi ✨ 2023-01-30 19:44:52 +04:00
parent 818de37acd
commit a270f3dfbb
20 changed files with 166 additions and 139 deletions

View File

@ -69,9 +69,9 @@ class ServerApi extends ApiMap
return apiVersion; return apiVersion;
} }
Future<ServerProvider> getServerProviderType() async { Future<ServerProviderType> getServerProviderType() async {
QueryResult<Query$SystemServerProvider> response; QueryResult<Query$SystemServerProvider> response;
ServerProvider providerType = ServerProvider.unknown; ServerProviderType providerType = ServerProviderType.unknown;
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
@ -79,7 +79,7 @@ class ServerApi extends ApiMap
if (response.hasException) { if (response.hasException) {
print(response.exception.toString()); print(response.exception.toString());
} }
providerType = ServerProvider.fromGraphQL( providerType = ServerProviderType.fromGraphQL(
response.parsedData!.system.provider.provider, response.parsedData!.system.provider.provider,
); );
} catch (e) { } catch (e) {
@ -88,9 +88,9 @@ class ServerApi extends ApiMap
return providerType; return providerType;
} }
Future<DnsProvider> getDnsProviderType() async { Future<DnsProviderType> getDnsProviderType() async {
QueryResult<Query$SystemDnsProvider> response; QueryResult<Query$SystemDnsProvider> response;
DnsProvider providerType = DnsProvider.unknown; DnsProviderType providerType = DnsProviderType.unknown;
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
@ -98,7 +98,7 @@ class ServerApi extends ApiMap
if (response.hasException) { if (response.hasException) {
print(response.exception.toString()); print(response.exception.toString());
} }
providerType = DnsProvider.fromGraphQL( providerType = DnsProviderType.fromGraphQL(
response.parsedData!.system.domainInfo.provider, response.parsedData!.system.domainInfo.provider,
); );
} catch (e) { } catch (e) {

View File

@ -1,5 +1,5 @@
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_settings.dart'; import 'package:selfprivacy/logic/providers/provider_settings.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart';
@ -12,21 +12,21 @@ class ApiController {
_serverProviderApiFactory; _serverProviderApiFactory;
static void initVolumeProviderApiFactory( static void initVolumeProviderApiFactory(
final ServerProviderApiFactorySettings settings, final ServerProviderSettings settings,
) { ) {
_volumeProviderApiFactory = _volumeProviderApiFactory =
VolumeApiFactoryCreator.createVolumeProviderApiFactory(settings); VolumeApiFactoryCreator.createVolumeProviderApiFactory(settings);
} }
static void initDnsProviderApiFactory( static void initDnsProviderApiFactory(
final DnsProviderApiFactorySettings settings, final DnsProviderFactorySettings settings,
) { ) {
_dnsProviderApiFactory = _dnsProviderApiFactory =
ApiFactoryCreator.createDnsProviderApiFactory(settings); ApiFactoryCreator.createDnsProviderApiFactory(settings);
} }
static void initServerProviderApiFactory( static void initServerProviderApiFactory(
final ServerProviderApiFactorySettings settings, final ServerProviderSettings settings,
) { ) {
_serverProviderApiFactory = _serverProviderApiFactory =
ApiFactoryCreator.createServerProviderApiFactory(settings); ApiFactoryCreator.createServerProviderApiFactory(settings);

View File

@ -1,4 +1,4 @@
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_settings.dart'; import 'package:selfprivacy/logic/providers/provider_settings.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/cloudflare/cloudflare_factory.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/digital_ocean_dns/digital_ocean_dns_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/digital_ocean_dns/digital_ocean_dns_factory.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_factory.dart';
@ -15,27 +15,27 @@ class UnknownApiProviderException implements Exception {
class ApiFactoryCreator { class ApiFactoryCreator {
static ServerProviderApiFactory createServerProviderApiFactory( static ServerProviderApiFactory createServerProviderApiFactory(
final ServerProviderApiFactorySettings settings, final ServerProviderSettings settings,
) { ) {
switch (settings.provider) { switch (settings.provider) {
case ServerProvider.hetzner: case ServerProviderType.hetzner:
return HetznerApiFactory(region: settings.location); return HetznerApiFactory(region: settings.location);
case ServerProvider.digitalOcean: case ServerProviderType.digitalOcean:
return DigitalOceanApiFactory(region: settings.location); return DigitalOceanApiFactory(region: settings.location);
case ServerProvider.unknown: case ServerProviderType.unknown:
throw UnknownApiProviderException('Unknown server provider'); throw UnknownApiProviderException('Unknown server provider');
} }
} }
static DnsProviderApiFactory createDnsProviderApiFactory( static DnsProviderApiFactory createDnsProviderApiFactory(
final DnsProviderApiFactorySettings settings, final DnsProviderFactorySettings settings,
) { ) {
switch (settings.provider) { switch (settings.provider) {
case DnsProvider.cloudflare: case DnsProviderType.cloudflare:
return CloudflareApiFactory(); return CloudflareApiFactory();
case DnsProvider.digitalOcean: case DnsProviderType.digitalOcean:
return DigitalOceanDnsApiFactory(); return DigitalOceanDnsApiFactory();
case DnsProvider.unknown: case DnsProviderType.unknown:
throw UnknownApiProviderException('Unknown DNS provider'); throw UnknownApiProviderException('Unknown DNS provider');
} }
} }
@ -43,14 +43,14 @@ class ApiFactoryCreator {
class VolumeApiFactoryCreator { class VolumeApiFactoryCreator {
static VolumeProviderApiFactory createVolumeProviderApiFactory( static VolumeProviderApiFactory createVolumeProviderApiFactory(
final ServerProviderApiFactorySettings settings, final ServerProviderSettings settings,
) { ) {
switch (settings.provider) { switch (settings.provider) {
case ServerProvider.hetzner: case ServerProviderType.hetzner:
return HetznerApiFactory(); return HetznerApiFactory();
case ServerProvider.digitalOcean: case ServerProviderType.digitalOcean:
return DigitalOceanApiFactory(); return DigitalOceanApiFactory();
case ServerProvider.unknown: case ServerProviderType.unknown:
throw UnknownApiProviderException('Unknown volume provider'); throw UnknownApiProviderException('Unknown volume provider');
} }
} }

View File

@ -332,7 +332,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
required final User rootUser, required final User rootUser,
required final String domainName, required final String domainName,
required final String serverType, required final String serverType,
required final DnsProvider dnsProvider, required final DnsProviderType dnsProvider,
}) async { }) async {
ServerHostingDetails? serverDetails; ServerHostingDetails? serverDetails;
@ -394,7 +394,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
createTime: DateTime.now(), createTime: DateTime.now(),
volume: newVolume, volume: newVolume,
apiToken: apiToken, apiToken: apiToken,
provider: ServerProvider.digitalOcean, provider: ServerProviderType.digitalOcean,
); );
} }
} catch (e) { } catch (e) {

View File

@ -356,7 +356,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
required final User rootUser, required final User rootUser,
required final String domainName, required final String domainName,
required final String serverType, required final String serverType,
required final DnsProvider dnsProvider, required final DnsProviderType dnsProvider,
}) async { }) async {
final APIGenericResult<ServerVolume?> newVolumeResponse = final APIGenericResult<ServerVolume?> newVolumeResponse =
await createVolume(); await createVolume();
@ -385,7 +385,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
required final String domainName, required final String domainName,
required final ServerVolume volume, required final ServerVolume volume,
required final String serverType, required final String serverType,
required final DnsProvider dnsProvider, required final DnsProviderType dnsProvider,
}) async { }) async {
final Dio client = await getClient(); final Dio client = await getClient();
@ -434,7 +434,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
createTime: DateTime.now(), createTime: DateTime.now(),
volume: volume, volume: volume,
apiToken: apiToken, apiToken: apiToken,
provider: ServerProvider.hetzner, provider: ServerProviderType.hetzner,
); );
success = true; success = true;
} on DioError catch (e) { } on DioError catch (e) {

View File

@ -39,7 +39,7 @@ abstract class ServerProviderApi extends ApiMap {
required final User rootUser, required final User rootUser,
required final String domainName, required final String domainName,
required final String serverType, required final String serverType,
required final DnsProvider dnsProvider, required final DnsProviderType dnsProvider,
}); });
Future<APIGenericResult<void>> createReverseDns({ Future<APIGenericResult<void>> createReverseDns({
required final ServerHostingDetails serverDetails, required final ServerHostingDetails serverDetails,
@ -55,13 +55,13 @@ abstract class ServerProviderApi extends ApiMap {
final DateTime end, final DateTime end,
); );
String dnsProviderToInfectName(final DnsProvider dnsProvider) { String dnsProviderToInfectName(final DnsProviderType dnsProvider) {
String dnsProviderType; String dnsProviderType;
switch (dnsProvider) { switch (dnsProvider) {
case DnsProvider.digitalOcean: case DnsProviderType.digitalOcean:
dnsProviderType = 'DIGITALOCEAN'; dnsProviderType = 'DIGITALOCEAN';
break; break;
case DnsProvider.cloudflare: case DnsProviderType.cloudflare:
default: default:
dnsProviderType = 'CLOUDFLARE'; dnsProviderType = 'CLOUDFLARE';
break; break;

View File

@ -39,7 +39,7 @@ class DomainSetupCubit extends Cubit<DomainSetupState> {
final ServerDomain domain = ServerDomain( final ServerDomain domain = ServerDomain(
domainName: domainName, domainName: domainName,
zoneId: zoneId, zoneId: zoneId,
provider: DnsProvider.cloudflare, provider: DnsProviderType.cloudflare,
); );
serverInstallationCubit.setDomain(domain); serverInstallationCubit.setDomain(domain);

View File

@ -6,8 +6,9 @@ import 'package:equatable/equatable.dart';
import 'package:selfprivacy/config/get_it_config.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/graphql_maps/server_api/server_api.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_settings.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/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart';
import 'package:selfprivacy/logic/providers/providers_controller.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_api_settings.dart';
import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart';
@ -57,45 +58,29 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
} }
} }
void setServerProviderType(final ServerProvider providerType) async { void setServerProviderType(final ServerProviderType providerType) async {
await repository.saveServerProviderType(providerType); await repository.saveServerProviderType(providerType);
ApiController.initServerProviderApiFactory( ProvidersController.initServerProvider(
ServerProviderApiFactorySettings( ServerProviderSettings(provider: providerType),
provider: providerType,
),
); );
} }
void setDnsProviderType(final DnsProvider providerType) async { void setDnsProviderType(final DnsProviderType providerType) async {
await repository.saveDnsProviderType(providerType); await repository.saveDnsProviderType(providerType);
ApiController.initDnsProviderApiFactory( ApiController.initDnsProviderApiFactory(
DnsProviderApiFactorySettings( DnsProviderFactorySettings(
provider: providerType, provider: providerType,
), ),
); );
} }
ProviderApiTokenValidation serverProviderApiTokenValidation() =>
ApiController.currentServerProviderApiFactory!
.getServerProvider()
.getApiTokenValidation();
RegExp getDnsProviderApiTokenValidation() =>
ApiController.currentDnsProviderApiFactory!
.getDnsProvider()
.getApiTokenValidation();
Future<bool?> isServerProviderApiTokenValid( Future<bool?> isServerProviderApiTokenValid(
final String providerToken, final String providerToken,
) async { ) async {
final APIGenericResult<bool> apiResponse = final APIGenericResult<bool> apiResponse =
await ApiController.currentServerProviderApiFactory! await ProvidersController.currentServerProvider!.isApiTokenValid(
.getServerProvider( providerToken,
settings: const ServerProviderApiSettings( );
isWithToken: false,
),
)
.isApiTokenValid(providerToken);
if (!apiResponse.success) { if (!apiResponse.success) {
getIt<NavigationService>().showSnackBar( getIt<NavigationService>().showSnackBar(
@ -191,7 +176,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
await repository.saveServerType(serverType); await repository.saveServerType(serverType);
ApiController.initServerProviderApiFactory( ApiController.initServerProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderSettings(
provider: getIt<ApiConfigModel>().serverProvider!, provider: getIt<ApiConfigModel>().serverProvider!,
location: serverType.location.identifier, location: serverType.location.identifier,
), ),
@ -200,7 +185,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
// All server providers support volumes for now, // All server providers support volumes for now,
// so it's safe to initialize. // so it's safe to initialize.
ApiController.initVolumeProviderApiFactory( ApiController.initVolumeProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderSettings(
provider: getIt<ApiConfigModel>().serverProvider!, provider: getIt<ApiConfigModel>().serverProvider!,
location: serverType.location.identifier, location: serverType.location.identifier,
), ),
@ -485,7 +470,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
void submitDomainForAccessRecovery(final String domain) async { void submitDomainForAccessRecovery(final String domain) async {
final ServerDomain serverDomain = ServerDomain( final ServerDomain serverDomain = ServerDomain(
domainName: domain, domainName: domain,
provider: DnsProvider.unknown, provider: DnsProviderType.unknown,
zoneId: '', zoneId: '',
); );
final ServerRecoveryCapabilities recoveryCapabilities = final ServerRecoveryCapabilities recoveryCapabilities =
@ -537,20 +522,20 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
token, token,
dataState.recoveryCapabilities, dataState.recoveryCapabilities,
); );
final ServerProvider serverProvider = await ServerApi( final ServerProviderType serverProvider = await ServerApi(
customToken: serverDetails.apiToken, customToken: serverDetails.apiToken,
isWithToken: true, isWithToken: true,
).getServerProviderType(); ).getServerProviderType();
final DnsProvider dnsProvider = await ServerApi( final DnsProviderType dnsProvider = await ServerApi(
customToken: serverDetails.apiToken, customToken: serverDetails.apiToken,
isWithToken: true, isWithToken: true,
).getDnsProviderType(); ).getDnsProviderType();
if (serverProvider == ServerProvider.unknown) { if (serverProvider == ServerProviderType.unknown) {
getIt<NavigationService>() getIt<NavigationService>()
.showSnackBar('recovering.generic_error'.tr()); .showSnackBar('recovering.generic_error'.tr());
return; return;
} }
if (dnsProvider == DnsProvider.unknown) { if (dnsProvider == DnsProviderType.unknown) {
getIt<NavigationService>() getIt<NavigationService>()
.showSnackBar('recovering.generic_error'.tr()); .showSnackBar('recovering.generic_error'.tr());
return; return;
@ -684,7 +669,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
linuxDevice: '', linuxDevice: '',
), ),
apiToken: dataState.serverDetails!.apiToken, apiToken: dataState.serverDetails!.apiToken,
provider: ServerProvider.hetzner, provider: ServerProviderType.hetzner,
); );
await repository.saveDomain(serverDomain); await repository.saveDomain(serverDomain);
await repository.saveServerDetails(serverDetails); await repository.saveServerDetails(serverDetails);
@ -714,7 +699,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
ServerDomain( ServerDomain(
domainName: serverDomain.domainName, domainName: serverDomain.domainName,
zoneId: zoneId, zoneId: zoneId,
provider: DnsProvider.cloudflare, provider: DnsProviderType.cloudflare,
), ),
); );
await repository.setDnsApiToken(token); await repository.setDnsApiToken(token);
@ -723,7 +708,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
serverDomain: ServerDomain( serverDomain: ServerDomain(
domainName: serverDomain.domainName, domainName: serverDomain.domainName,
zoneId: zoneId, zoneId: zoneId,
provider: DnsProvider.cloudflare, provider: DnsProviderType.cloudflare,
), ),
dnsApiToken: token, dnsApiToken: token,
currentStep: RecoveryStep.backblazeToken, currentStep: RecoveryStep.backblazeToken,

View File

@ -10,7 +10,7 @@ import 'package:pub_semver/pub_semver.dart';
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/config/hive_config.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_settings.dart'; import 'package:selfprivacy/logic/providers/provider_settings.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/dns_providers/dns_provider_api_settings.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart';
@ -48,8 +48,8 @@ class ServerInstallationRepository {
final String? cloudflareToken = getIt<ApiConfigModel>().dnsProviderKey; final String? cloudflareToken = getIt<ApiConfigModel>().dnsProviderKey;
final String? serverTypeIdentificator = getIt<ApiConfigModel>().serverType; final String? serverTypeIdentificator = getIt<ApiConfigModel>().serverType;
final ServerDomain? serverDomain = getIt<ApiConfigModel>().serverDomain; final ServerDomain? serverDomain = getIt<ApiConfigModel>().serverDomain;
final DnsProvider? dnsProvider = getIt<ApiConfigModel>().dnsProvider; final DnsProviderType? dnsProvider = getIt<ApiConfigModel>().dnsProvider;
final ServerProvider? serverProvider = final ServerProviderType? serverProvider =
getIt<ApiConfigModel>().serverProvider; getIt<ApiConfigModel>().serverProvider;
final BackblazeCredential? backblazeCredential = final BackblazeCredential? backblazeCredential =
getIt<ApiConfigModel>().backblazeCredential; getIt<ApiConfigModel>().backblazeCredential;
@ -58,9 +58,9 @@ class ServerInstallationRepository {
if (serverProvider != null || if (serverProvider != null ||
(serverDetails != null && (serverDetails != null &&
serverDetails.provider != ServerProvider.unknown)) { serverDetails.provider != ServerProviderType.unknown)) {
ApiController.initServerProviderApiFactory( ApiController.initServerProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderSettings(
provider: serverProvider ?? serverDetails!.provider, provider: serverProvider ?? serverDetails!.provider,
location: location, location: location,
), ),
@ -69,7 +69,7 @@ class ServerInstallationRepository {
// All current providers support volumes // All current providers support volumes
// so it's safe to hardcode for now // so it's safe to hardcode for now
ApiController.initVolumeProviderApiFactory( ApiController.initVolumeProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderSettings(
provider: serverProvider ?? serverDetails!.provider, provider: serverProvider ?? serverDetails!.provider,
location: location, location: location,
), ),
@ -78,9 +78,9 @@ class ServerInstallationRepository {
if (dnsProvider != null || if (dnsProvider != null ||
(serverDomain != null && (serverDomain != null &&
serverDomain.provider != ServerProvider.unknown)) { serverDomain.provider != ServerProviderType.unknown)) {
ApiController.initDnsProviderApiFactory( ApiController.initDnsProviderApiFactory(
DnsProviderApiFactorySettings( DnsProviderFactorySettings(
provider: dnsProvider ?? serverDomain!.provider, provider: dnsProvider ?? serverDomain!.provider,
), ),
); );
@ -147,8 +147,8 @@ class ServerInstallationRepository {
) { ) {
if (serverDetails != null) { if (serverDetails != null) {
if (serverProviderToken != null) { if (serverProviderToken != null) {
if (serverDetails.provider != ServerProvider.unknown) { if (serverDetails.provider != ServerProviderType.unknown) {
if (serverDomain.provider != DnsProvider.unknown) { if (serverDomain.provider != DnsProviderType.unknown) {
return RecoveryStep.backblazeToken; return RecoveryStep.backblazeToken;
} }
return RecoveryStep.dnsProviderToken; return RecoveryStep.dnsProviderToken;
@ -534,7 +534,7 @@ class ServerInstallationRepository {
serverId: 0, serverId: 0,
linuxDevice: '', linuxDevice: '',
), ),
provider: ServerProvider.unknown, provider: ServerProviderType.unknown,
id: 0, id: 0,
ip4: serverIp, ip4: serverIp,
startTime: null, startTime: null,
@ -571,7 +571,7 @@ class ServerInstallationRepository {
serverId: 0, serverId: 0,
linuxDevice: '', linuxDevice: '',
), ),
provider: ServerProvider.unknown, provider: ServerProviderType.unknown,
id: 0, id: 0,
ip4: serverIp, ip4: serverIp,
startTime: null, startTime: null,
@ -606,7 +606,7 @@ class ServerInstallationRepository {
sizeByte: 0, sizeByte: 0,
linuxDevice: '', linuxDevice: '',
), ),
provider: ServerProvider.unknown, provider: ServerProviderType.unknown,
id: 0, id: 0,
ip4: serverIp, ip4: serverIp,
startTime: null, startTime: null,
@ -634,7 +634,7 @@ class ServerInstallationRepository {
serverId: 0, serverId: 0,
linuxDevice: '', linuxDevice: '',
), ),
provider: ServerProvider.unknown, provider: ServerProviderType.unknown,
id: 0, id: 0,
ip4: serverIp, ip4: serverIp,
startTime: null, startTime: null,
@ -691,11 +691,11 @@ class ServerInstallationRepository {
getIt<ApiConfigModel>().init(); getIt<ApiConfigModel>().init();
} }
Future<void> saveServerProviderType(final ServerProvider type) async { Future<void> saveServerProviderType(final ServerProviderType type) async {
await getIt<ApiConfigModel>().storeServerProviderType(type); await getIt<ApiConfigModel>().storeServerProviderType(type);
} }
Future<void> saveDnsProviderType(final DnsProvider type) async { Future<void> saveDnsProviderType(final DnsProviderType type) async {
await getIt<ApiConfigModel>().storeDnsProviderType(type); await getIt<ApiConfigModel>().storeDnsProviderType(type);
} }

View File

@ -13,8 +13,8 @@ class ApiConfigModel {
String? get serverLocation => _serverLocation; String? get serverLocation => _serverLocation;
String? get serverType => _serverType; String? get serverType => _serverType;
String? get dnsProviderKey => _dnsProviderKey; String? get dnsProviderKey => _dnsProviderKey;
ServerProvider? get serverProvider => _serverProvider; ServerProviderType? get serverProvider => _serverProvider;
DnsProvider? get dnsProvider => _dnsProvider; DnsProviderType? get dnsProvider => _dnsProvider;
BackblazeCredential? get backblazeCredential => _backblazeCredential; BackblazeCredential? get backblazeCredential => _backblazeCredential;
ServerDomain? get serverDomain => _serverDomain; ServerDomain? get serverDomain => _serverDomain;
BackblazeBucket? get backblazeBucket => _backblazeBucket; BackblazeBucket? get backblazeBucket => _backblazeBucket;
@ -23,19 +23,19 @@ class ApiConfigModel {
String? _serverLocation; String? _serverLocation;
String? _dnsProviderKey; String? _dnsProviderKey;
String? _serverType; String? _serverType;
ServerProvider? _serverProvider; ServerProviderType? _serverProvider;
DnsProvider? _dnsProvider; DnsProviderType? _dnsProvider;
ServerHostingDetails? _serverDetails; ServerHostingDetails? _serverDetails;
BackblazeCredential? _backblazeCredential; BackblazeCredential? _backblazeCredential;
ServerDomain? _serverDomain; ServerDomain? _serverDomain;
BackblazeBucket? _backblazeBucket; BackblazeBucket? _backblazeBucket;
Future<void> storeServerProviderType(final ServerProvider value) async { Future<void> storeServerProviderType(final ServerProviderType value) async {
await _box.put(BNames.serverProvider, value); await _box.put(BNames.serverProvider, value);
_serverProvider = value; _serverProvider = value;
} }
Future<void> storeDnsProviderType(final DnsProvider value) async { Future<void> storeDnsProviderType(final DnsProviderType value) async {
await _box.put(BNames.dnsProvider, value); await _box.put(BNames.dnsProvider, value);
_dnsProvider = value; _dnsProvider = value;
} }

View File

@ -33,8 +33,8 @@ class ServerHostingDetails {
@HiveField(5) @HiveField(5)
final String apiToken; final String apiToken;
@HiveField(6, defaultValue: ServerProvider.hetzner) @HiveField(6, defaultValue: ServerProviderType.hetzner)
final ServerProvider provider; final ServerProviderType provider;
ServerHostingDetails copyWith({final DateTime? startTime}) => ServerHostingDetails copyWith({final DateTime? startTime}) =>
ServerHostingDetails( ServerHostingDetails(
@ -77,7 +77,7 @@ class ServerVolume {
} }
@HiveType(typeId: 101) @HiveType(typeId: 101)
enum ServerProvider { enum ServerProviderType {
@HiveField(0) @HiveField(0)
unknown, unknown,
@HiveField(1) @HiveField(1)
@ -85,7 +85,7 @@ enum ServerProvider {
@HiveField(2) @HiveField(2)
digitalOcean; digitalOcean;
factory ServerProvider.fromGraphQL(final Enum$ServerProvider provider) { factory ServerProviderType.fromGraphQL(final Enum$ServerProvider provider) {
switch (provider) { switch (provider) {
case Enum$ServerProvider.HETZNER: case Enum$ServerProvider.HETZNER:
return hetzner; return hetzner;
@ -98,9 +98,9 @@ enum ServerProvider {
String get displayName { String get displayName {
switch (this) { switch (this) {
case ServerProvider.hetzner: case ServerProviderType.hetzner:
return 'Hetzner Cloud'; return 'Hetzner Cloud';
case ServerProvider.digitalOcean: case ServerProviderType.digitalOcean:
return 'Digital Ocean'; return 'Digital Ocean';
default: default:
return 'Unknown'; return 'Unknown';

View File

@ -17,15 +17,15 @@ class ServerDomain {
@HiveField(1) @HiveField(1)
final String zoneId; final String zoneId;
@HiveField(2, defaultValue: DnsProvider.cloudflare) @HiveField(2, defaultValue: DnsProviderType.cloudflare)
final DnsProvider provider; final DnsProviderType provider;
@override @override
String toString() => '$domainName: $zoneId'; String toString() => '$domainName: $zoneId';
} }
@HiveType(typeId: 100) @HiveType(typeId: 100)
enum DnsProvider { enum DnsProviderType {
@HiveField(0) @HiveField(0)
unknown, unknown,
@HiveField(1) @HiveField(1)
@ -33,7 +33,7 @@ enum DnsProvider {
@HiveField(2) @HiveField(2)
digitalOcean; digitalOcean;
factory DnsProvider.fromGraphQL(final Enum$DnsProvider provider) { factory DnsProviderType.fromGraphQL(final Enum$DnsProvider provider) {
switch (provider) { switch (provider) {
case Enum$DnsProvider.CLOUDFLARE: case Enum$DnsProvider.CLOUDFLARE:
return cloudflare; return cloudflare;

View File

@ -1,20 +1,20 @@
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart';
class ServerProviderApiFactorySettings { class ServerProviderSettings {
ServerProviderApiFactorySettings({ ServerProviderSettings({
required this.provider, required this.provider,
this.location, this.location,
}); });
final ServerProvider provider; final ServerProviderType provider;
final String? location; final String? location;
} }
class DnsProviderApiFactorySettings { class DnsProviderFactorySettings {
DnsProviderApiFactorySettings({ DnsProviderFactorySettings({
required this.provider, required this.provider,
}); });
final DnsProvider provider; final DnsProviderType provider;
} }

View File

@ -0,0 +1,20 @@
import 'package:selfprivacy/logic/providers/provider_settings.dart';
import 'package:selfprivacy/logic/providers/server_provider.dart';
import 'package:selfprivacy/logic/providers/server_providers/server_provider_factory.dart';
class ProvidersController {
static ServerProvider? get currentServerProvider => _serverProvider;
static void initServerProvider(
final ServerProviderSettings settings,
) {
_serverProvider =
ServerProviderFactory.createServerProviderInterface(settings);
}
static void clearProviders() {
_serverProvider = null;
}
static ServerProvider? _serverProvider;
}

View File

@ -0,0 +1,5 @@
import 'package:selfprivacy/logic/api_maps/api_generic_result.dart';
abstract class ServerProvider {
Future<APIGenericResult<bool>> isApiTokenValid(final String apiToken);
}

View File

@ -0,0 +1,3 @@
import 'package:selfprivacy/logic/providers/server_provider.dart';
class DigitalOceanServerProvider extends ServerProvider {}

View File

@ -0,0 +1,3 @@
import 'package:selfprivacy/logic/providers/server_provider.dart';
class HetznerServerProvider extends ServerProvider {}

View File

@ -1,14 +1,25 @@
import 'package:selfprivacy/logic/providers/provider_settings.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/providers/server_provider.dart';
import 'package:selfprivacy/logic/providers/server_providers/digital_ocean.dart';
import 'package:selfprivacy/logic/providers/server_providers/hetzner.dart';
class UnknownProviderException implements Exception {
UnknownProviderException(this.message);
final String message;
}
class ServerProviderFactory { class ServerProviderFactory {
static ServerProvider createServerProviderApiFactory( static ServerProvider createServerProviderInterface(
final ServerProviderApiFactorySettings settings, final ServerProviderSettings settings,
) { ) {
switch (settings.provider) { switch (settings.provider) {
case ServerProvider.hetzner: case ServerProviderType.hetzner:
return HetznerApiFactory(region: settings.location); return HetznerServerProvider();
case ServerProvider.digitalOcean: case ServerProviderType.digitalOcean:
return DigitalOceanApiFactory(region: settings.location); return DigitalOceanServerProvider();
case ServerProvider.unknown: case ServerProviderType.unknown:
throw UnknownApiProviderException('Unknown server provider'); throw UnknownProviderException('Unknown server provider');
} }
} }
} }

View File

@ -28,9 +28,9 @@ class DnsProviderPicker extends StatefulWidget {
} }
class _DnsProviderPickerState extends State<DnsProviderPicker> { class _DnsProviderPickerState extends State<DnsProviderPicker> {
DnsProvider selectedProvider = DnsProvider.unknown; DnsProviderType selectedProvider = DnsProviderType.unknown;
void setProvider(final DnsProvider provider) { void setProvider(final DnsProviderType provider) {
setState(() { setState(() {
selectedProvider = provider; selectedProvider = provider;
}); });
@ -39,17 +39,17 @@ class _DnsProviderPickerState extends State<DnsProviderPicker> {
@override @override
Widget build(final BuildContext context) { Widget build(final BuildContext context) {
switch (selectedProvider) { switch (selectedProvider) {
case DnsProvider.unknown: case DnsProviderType.unknown:
return ProviderSelectionPage( return ProviderSelectionPage(
serverInstallationCubit: widget.serverInstallationCubit, serverInstallationCubit: widget.serverInstallationCubit,
callback: setProvider, callback: setProvider,
); );
case DnsProvider.cloudflare: case DnsProviderType.cloudflare:
return ProviderInputDataPage( return ProviderInputDataPage(
providerCubit: widget.formCubit, providerCubit: widget.formCubit,
providerInfo: ProviderPageInfo( providerInfo: ProviderPageInfo(
providerType: DnsProvider.cloudflare, providerType: DnsProviderType.cloudflare,
pathToHow: 'how_cloudflare', pathToHow: 'how_cloudflare',
image: Image.asset( image: Image.asset(
'assets/images/logos/cloudflare.png', 'assets/images/logos/cloudflare.png',
@ -58,11 +58,11 @@ class _DnsProviderPickerState extends State<DnsProviderPicker> {
), ),
); );
case DnsProvider.digitalOcean: case DnsProviderType.digitalOcean:
return ProviderInputDataPage( return ProviderInputDataPage(
providerCubit: widget.formCubit, providerCubit: widget.formCubit,
providerInfo: ProviderPageInfo( providerInfo: ProviderPageInfo(
providerType: DnsProvider.digitalOcean, providerType: DnsProviderType.digitalOcean,
pathToHow: 'how_digital_ocean_dns', pathToHow: 'how_digital_ocean_dns',
image: Image.asset( image: Image.asset(
'assets/images/logos/digital_ocean.png', 'assets/images/logos/digital_ocean.png',
@ -83,7 +83,7 @@ class ProviderPageInfo {
final String pathToHow; final String pathToHow;
final Image image; final Image image;
final DnsProvider providerType; final DnsProviderType providerType;
} }
class ProviderInputDataPage extends StatelessWidget { class ProviderInputDataPage extends StatelessWidget {
@ -227,8 +227,8 @@ class ProviderSelectionPage extends StatelessWidget {
title: 'basis.select'.tr(), title: 'basis.select'.tr(),
onPressed: () { onPressed: () {
serverInstallationCubit serverInstallationCubit
.setDnsProviderType(DnsProvider.cloudflare); .setDnsProviderType(DnsProviderType.cloudflare);
callback(DnsProvider.cloudflare); callback(DnsProviderType.cloudflare);
}, },
), ),
// Outlined button that will open website // Outlined button that will open website
@ -292,8 +292,8 @@ class ProviderSelectionPage extends StatelessWidget {
title: 'basis.select'.tr(), title: 'basis.select'.tr(),
onPressed: () { onPressed: () {
serverInstallationCubit serverInstallationCubit
.setDnsProviderType(DnsProvider.digitalOcean); .setDnsProviderType(DnsProviderType.digitalOcean);
callback(DnsProvider.digitalOcean); callback(DnsProviderType.digitalOcean);
}, },
), ),
// Outlined button that will open website // Outlined button that will open website

View File

@ -29,9 +29,9 @@ class ServerProviderPicker extends StatefulWidget {
} }
class _ServerProviderPickerState extends State<ServerProviderPicker> { class _ServerProviderPickerState extends State<ServerProviderPicker> {
ServerProvider selectedProvider = ServerProvider.unknown; ServerProviderType selectedProvider = ServerProviderType.unknown;
void setProvider(final ServerProvider provider) { void setProvider(final ServerProviderType provider) {
setState(() { setState(() {
selectedProvider = provider; selectedProvider = provider;
}); });
@ -40,17 +40,17 @@ class _ServerProviderPickerState extends State<ServerProviderPicker> {
@override @override
Widget build(final BuildContext context) { Widget build(final BuildContext context) {
switch (selectedProvider) { switch (selectedProvider) {
case ServerProvider.unknown: case ServerProviderType.unknown:
return ProviderSelectionPage( return ProviderSelectionPage(
serverInstallationCubit: widget.serverInstallationCubit, serverInstallationCubit: widget.serverInstallationCubit,
callback: setProvider, callback: setProvider,
); );
case ServerProvider.hetzner: case ServerProviderType.hetzner:
return ProviderInputDataPage( return ProviderInputDataPage(
providerCubit: widget.formCubit, providerCubit: widget.formCubit,
providerInfo: ProviderPageInfo( providerInfo: ProviderPageInfo(
providerType: ServerProvider.hetzner, providerType: ServerProviderType.hetzner,
pathToHow: 'how_hetzner', pathToHow: 'how_hetzner',
image: Image.asset( image: Image.asset(
'assets/images/logos/hetzner.png', 'assets/images/logos/hetzner.png',
@ -59,11 +59,11 @@ class _ServerProviderPickerState extends State<ServerProviderPicker> {
), ),
); );
case ServerProvider.digitalOcean: case ServerProviderType.digitalOcean:
return ProviderInputDataPage( return ProviderInputDataPage(
providerCubit: widget.formCubit, providerCubit: widget.formCubit,
providerInfo: ProviderPageInfo( providerInfo: ProviderPageInfo(
providerType: ServerProvider.digitalOcean, providerType: ServerProviderType.digitalOcean,
pathToHow: 'how_digital_ocean', pathToHow: 'how_digital_ocean',
image: Image.asset( image: Image.asset(
'assets/images/logos/digital_ocean.png', 'assets/images/logos/digital_ocean.png',
@ -84,7 +84,7 @@ class ProviderPageInfo {
final String pathToHow; final String pathToHow;
final Image image; final Image image;
final ServerProvider providerType; final ServerProviderType providerType;
} }
class ProviderInputDataPage extends StatelessWidget { class ProviderInputDataPage extends StatelessWidget {
@ -242,8 +242,8 @@ class ProviderSelectionPage extends StatelessWidget {
title: 'basis.select'.tr(), title: 'basis.select'.tr(),
onPressed: () { onPressed: () {
serverInstallationCubit serverInstallationCubit
.setServerProviderType(ServerProvider.hetzner); .setServerProviderType(ServerProviderType.hetzner);
callback(ServerProvider.hetzner); callback(ServerProviderType.hetzner);
}, },
), ),
// Outlined button that will open website // Outlined button that will open website
@ -315,9 +315,9 @@ class ProviderSelectionPage extends StatelessWidget {
FilledButton( FilledButton(
title: 'basis.select'.tr(), title: 'basis.select'.tr(),
onPressed: () { onPressed: () {
serverInstallationCubit serverInstallationCubit.setServerProviderType(
.setServerProviderType(ServerProvider.digitalOcean); ServerProviderType.digitalOcean);
callback(ServerProvider.digitalOcean); callback(ServerProviderType.digitalOcean);
}, },
), ),
// Outlined button that will open website // Outlined button that will open website