refactor: Move all API factories into encapsulated static class

Because it's very hard to track all different provider factories created in different cubits, if users reset application config the previous factories stayed unchanged which would lead to unexpected behavior
pull/140/head
NaiJi ✨ 2022-11-18 07:07:42 +04:00
parent 268816385f
commit 0c4da8eb9f
11 changed files with 173 additions and 153 deletions

View File

@ -0,0 +1,44 @@
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/api_maps/rest_maps/dns_providers/dns_provider_factory.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider_factory.dart';
class ApiController {
static VolumeProviderApiFactory? get currentVolumeProviderApiFactory =>
_volumeProviderApiFactory;
static DnsProviderApiFactory? get currentDnsProviderApiFactory =>
_dnsProviderApiFactory;
static ServerProviderApiFactory? get currentServerProviderApiFactory =>
_serverProviderApiFactory;
static void initVolumeProviderApiFactory(
final ServerProviderApiFactorySettings settings,
) {
_volumeProviderApiFactory =
VolumeApiFactoryCreator.createVolumeProviderApiFactory(settings);
}
static void initDnsProviderApiFactory(
final DnsProviderApiFactorySettings settings,
) {
_dnsProviderApiFactory =
ApiFactoryCreator.createDnsProviderApiFactory(settings);
}
static void initServerProviderApiFactory(
final ServerProviderApiFactorySettings settings,
) {
_serverProviderApiFactory =
ApiFactoryCreator.createServerProviderApiFactory(settings);
}
static void clearProviderApiFactories() {
_volumeProviderApiFactory = null;
_dnsProviderApiFactory = null;
_serverProviderApiFactory = null;
}
static VolumeProviderApiFactory? _volumeProviderApiFactory;
static DnsProviderApiFactory? _dnsProviderApiFactory;
static ServerProviderApiFactory? _serverProviderApiFactory;
}

View File

@ -59,5 +59,5 @@ abstract class ServerProviderApi extends ApiMap {
/// Whether we request for staging temprorary certificates. /// Whether we request for staging temprorary certificates.
/// Hardcode to 'true' in the middle of testing to not /// Hardcode to 'true' in the middle of testing to not
/// get your domain banned but constant certificate renewal /// get your domain banned but constant certificate renewal
String get stagingAcme => 'false'; String get stagingAcme => 'true';
} }

View File

@ -1,8 +1,6 @@
import 'package:cubit_form/cubit_form.dart'; import 'package:cubit_form/cubit_form.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.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/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_factory.dart';
import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart';
import 'package:selfprivacy/logic/models/json/dns_records.dart'; import 'package:selfprivacy/logic/models/json/dns_records.dart';
@ -20,12 +18,6 @@ class DnsRecordsCubit
const DnsRecordsState(dnsState: DnsRecordsStatus.refreshing), const DnsRecordsState(dnsState: DnsRecordsStatus.refreshing),
); );
DnsProviderApiFactory? dnsProviderApiFactory =
ApiFactoryCreator.createDnsProviderApiFactory(
DnsProviderApiFactorySettings(provider: DnsProvider.cloudflare),
); // TODO: HARDCODE FOR NOW!!!
// TODO: Remove when provider selection is implemented.
final ServerApi api = ServerApi(); final ServerApi api = ServerApi();
@override @override
@ -46,7 +38,8 @@ class DnsRecordsCubit
final String? ipAddress = final String? ipAddress =
serverInstallationCubit.state.serverDetails?.ip4; serverInstallationCubit.state.serverDetails?.ip4;
if (domain != null && ipAddress != null) { if (domain != null && ipAddress != null) {
final List<DnsRecord> records = await dnsProviderApiFactory! final List<DnsRecord> records = await ApiController
.currentDnsProviderApiFactory!
.getDnsProvider() .getDnsProvider()
.getDnsRecords(domain: domain); .getDnsRecords(domain: domain);
final String? dkimPublicKey = final String? dkimPublicKey =
@ -126,7 +119,7 @@ class DnsRecordsCubit
final ServerDomain? domain = serverInstallationCubit.state.serverDomain; final ServerDomain? domain = serverInstallationCubit.state.serverDomain;
final String? ipAddress = serverInstallationCubit.state.serverDetails?.ip4; final String? ipAddress = serverInstallationCubit.state.serverDetails?.ip4;
final DnsProviderApi dnsProviderApi = final DnsProviderApi dnsProviderApi =
dnsProviderApiFactory!.getDnsProvider(); ApiController.currentDnsProviderApiFactory!.getDnsProvider();
await dnsProviderApi.removeSimilarRecords(domain: domain!); await dnsProviderApi.removeSimilarRecords(domain: domain!);
await dnsProviderApi.createMultipleDnsRecords( await dnsProviderApi.createMultipleDnsRecords(
domain: domain, domain: domain,

View File

@ -7,16 +7,16 @@ import 'package:selfprivacy/logic/cubit/forms/validations/validations.dart';
class DnsProviderFormCubit extends FormCubit { class DnsProviderFormCubit extends FormCubit {
DnsProviderFormCubit(this.initializingCubit) { DnsProviderFormCubit(this.initializingCubit) {
final RegExp regExp = initializingCubit.getDnsProviderApiTokenValidation(); //final RegExp regExp = initializingCubit.getDnsProviderApiTokenValidation();
apiKey = FieldCubit( apiKey = FieldCubit(
initalValue: '', initalValue: '',
validations: [ validations: [
RequiredStringValidation('validations.required'.tr()), RequiredStringValidation('validations.required'.tr()),
ValidationModel<String>( /*ValidationModel<String>(
regExp.hasMatch, regExp.hasMatch,
'validations.invalid_format'.tr(), 'validations.invalid_format'.tr(),
), ),*/
LengthStringNotEqualValidation(40) //LengthStringNotEqualValidation(40)
], ],
); );

View File

@ -1,4 +1,5 @@
import 'package:cubit_form/cubit_form.dart'; import 'package:cubit_form/cubit_form.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_controller.dart';
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
import 'package:selfprivacy/logic/models/hive/server_domain.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart';
@ -9,8 +10,7 @@ class DomainSetupCubit extends Cubit<DomainSetupState> {
Future<void> load() async { Future<void> load() async {
emit(Loading(LoadingTypes.loadingDomain)); emit(Loading(LoadingTypes.loadingDomain));
final List<String> list = await serverInstallationCubit final List<String> list = await ApiController.currentDnsProviderApiFactory!
.repository.dnsProviderApiFactory!
.getDnsProvider() .getDnsProvider()
.domainList(); .domainList();
if (list.isEmpty) { if (list.isEmpty) {
@ -31,8 +31,7 @@ class DomainSetupCubit extends Cubit<DomainSetupState> {
emit(Loading(LoadingTypes.saving)); emit(Loading(LoadingTypes.saving));
final String? zoneId = await serverInstallationCubit final String? zoneId = await ApiController.currentDnsProviderApiFactory!
.repository.dnsProviderApiFactory!
.getDnsProvider() .getDnsProvider()
.getZoneId(domainName); .getZoneId(domainName);

View File

@ -1,11 +1,8 @@
import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/get_it_config.dart';
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.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/api_maps/rest_maps/server_providers/server_provider_factory.dart';
import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart';
import 'package:selfprivacy/logic/cubit/metrics/metrics_cubit.dart'; import 'package:selfprivacy/logic/cubit/metrics/metrics_cubit.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/metrics.dart'; import 'package:selfprivacy/logic/models/metrics.dart';
class MetricsLoadException implements Exception { class MetricsLoadException implements Exception {
@ -14,22 +11,10 @@ class MetricsLoadException implements Exception {
} }
class MetricsRepository { class MetricsRepository {
ServerProviderApiFactory? serverProviderApiFactory;
void _buildServerProviderFactory() {
final ServerProvider? providerType = getIt<ApiConfigModel>().serverProvider;
final String? location = getIt<ApiConfigModel>().serverLocation;
serverProviderApiFactory = ApiFactoryCreator.createServerProviderApiFactory(
ServerProviderApiFactorySettings(
provider: providerType ?? ServerProvider.unknown,
location: location,
),
);
}
Future<MetricsLoaded> getMetrics(final Period period) async { Future<MetricsLoaded> getMetrics(final Period period) async {
if (serverProviderApiFactory == null) { final providerApiFactory = ApiController.currentServerProviderApiFactory;
_buildServerProviderFactory(); if (providerApiFactory == null) {
throw MetricsLoadException('Server Provider data is null');
} }
final DateTime end = DateTime.now(); final DateTime end = DateTime.now();
@ -49,7 +34,7 @@ class MetricsRepository {
final serverId = getIt<ApiConfigModel>().serverDetails!.id; final serverId = getIt<ApiConfigModel>().serverDetails!.id;
final ServerMetrics? metrics = final ServerMetrics? metrics =
await serverProviderApiFactory!.getServerProvider().getMetrics( await providerApiFactory.getServerProvider().getMetrics(
serverId, serverId,
start, start,
end, end,

View File

@ -1,9 +1,7 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.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_factory_creator.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/api_maps/rest_maps/server_providers/server_provider_factory.dart';
import 'package:selfprivacy/logic/common_enum/common_enum.dart'; import 'package:selfprivacy/logic/common_enum/common_enum.dart';
import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart'; import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart';
import 'package:selfprivacy/logic/models/disk_size.dart'; import 'package:selfprivacy/logic/models/disk_size.dart';
@ -17,30 +15,19 @@ class ApiProviderVolumeCubit
extends ServerInstallationDependendCubit<ApiProviderVolumeState> { extends ServerInstallationDependendCubit<ApiProviderVolumeState> {
ApiProviderVolumeCubit(final ServerInstallationCubit serverInstallationCubit) ApiProviderVolumeCubit(final ServerInstallationCubit serverInstallationCubit)
: super(serverInstallationCubit, const ApiProviderVolumeState.initial()); : super(serverInstallationCubit, const ApiProviderVolumeState.initial());
VolumeProviderApiFactory? providerApi;
final ServerApi serverApi = ServerApi(); final ServerApi serverApi = ServerApi();
@override @override
Future<void> load() async { Future<void> load() async {
if (serverInstallationCubit.state is ServerInstallationFinished) { if (serverInstallationCubit.state is ServerInstallationFinished) {
final serverDetails = getIt<ApiConfigModel>().serverDetails;
final serverLocation = getIt<ApiConfigModel>().serverLocation;
providerApi = serverDetails == null
? null
: VolumeApiFactoryCreator.createVolumeProviderApiFactory(
ServerProviderApiFactorySettings(
location: serverLocation,
provider: getIt<ApiConfigModel>().serverDetails!.provider,
),
);
_refetch(); _refetch();
} }
} }
Future<Price?> getPricePerGb() async => Future<Price?> getPricePerGb() async =>
providerApi!.getVolumeProvider().getPricePerGb(); ApiController.currentVolumeProviderApiFactory!
.getVolumeProvider()
.getPricePerGb();
Future<void> refresh() async { Future<void> refresh() async {
emit(const ApiProviderVolumeState([], LoadingStatus.refreshing, false)); emit(const ApiProviderVolumeState([], LoadingStatus.refreshing, false));
@ -48,12 +35,14 @@ class ApiProviderVolumeCubit
} }
Future<void> _refetch() async { Future<void> _refetch() async {
if (providerApi == null) { if (ApiController.currentVolumeProviderApiFactory == null) {
return emit(const ApiProviderVolumeState([], LoadingStatus.error, false)); return emit(const ApiProviderVolumeState([], LoadingStatus.error, false));
} }
final List<ServerVolume> volumes = final List<ServerVolume> volumes = await ApiController
await providerApi!.getVolumeProvider().getVolumes(); .currentVolumeProviderApiFactory!
.getVolumeProvider()
.getVolumes();
if (volumes.isEmpty) { if (volumes.isEmpty) {
return emit(const ApiProviderVolumeState([], LoadingStatus.error, false)); return emit(const ApiProviderVolumeState([], LoadingStatus.error, false));
@ -64,14 +53,16 @@ class ApiProviderVolumeCubit
Future<void> attachVolume(final DiskVolume volume) async { Future<void> attachVolume(final DiskVolume volume) async {
final ServerHostingDetails server = getIt<ApiConfigModel>().serverDetails!; final ServerHostingDetails server = getIt<ApiConfigModel>().serverDetails!;
await providerApi! await ApiController.currentVolumeProviderApiFactory!
.getVolumeProvider() .getVolumeProvider()
.attachVolume(volume.providerVolume!, server.id); .attachVolume(volume.providerVolume!, server.id);
refresh(); refresh();
} }
Future<void> detachVolume(final DiskVolume volume) async { Future<void> detachVolume(final DiskVolume volume) async {
await providerApi!.getVolumeProvider().detachVolume(volume.providerVolume!); await ApiController.currentVolumeProviderApiFactory!
.getVolumeProvider()
.detachVolume(volume.providerVolume!);
refresh(); refresh();
} }
@ -84,7 +75,9 @@ class ApiProviderVolumeCubit
'Starting resize', 'Starting resize',
); );
emit(state.copyWith(isResizing: true)); emit(state.copyWith(isResizing: true));
final bool resized = await providerApi!.getVolumeProvider().resizeVolume( final bool resized = await ApiController.currentVolumeProviderApiFactory!
.getVolumeProvider()
.resizeVolume(
volume.providerVolume!, volume.providerVolume!,
newSize, newSize,
); );
@ -120,8 +113,10 @@ class ApiProviderVolumeCubit
} }
Future<void> createVolume() async { Future<void> createVolume() async {
final ServerVolume? volume = final ServerVolume? volume = await ApiController
await providerApi!.getVolumeProvider().createVolume(); .currentVolumeProviderApiFactory!
.getVolumeProvider()
.createVolume();
final diskVolume = DiskVolume(providerVolume: volume); final diskVolume = DiskVolume(providerVolume: volume);
await attachVolume(diskVolume); await attachVolume(diskVolume);
@ -133,7 +128,9 @@ class ApiProviderVolumeCubit
} }
Future<void> deleteVolume(final DiskVolume volume) async { Future<void> deleteVolume(final DiskVolume volume) async {
await providerApi!.getVolumeProvider().deleteVolume(volume.providerVolume!); await ApiController.currentVolumeProviderApiFactory!
.getVolumeProvider()
.deleteVolume(volume.providerVolume!);
refresh(); refresh();
} }

View File

@ -1,38 +1,19 @@
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_factory_creator.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/api_maps/rest_maps/server_providers/server_provider_factory.dart';
import 'package:selfprivacy/logic/models/auto_upgrade_settings.dart'; import 'package:selfprivacy/logic/models/auto_upgrade_settings.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/server_metadata.dart'; import 'package:selfprivacy/logic/models/server_metadata.dart';
import 'package:selfprivacy/logic/models/timezone_settings.dart'; import 'package:selfprivacy/logic/models/timezone_settings.dart';
class ServerDetailsRepository { class ServerDetailsRepository {
ServerApi server = ServerApi(); ServerApi server = ServerApi();
ServerProviderApiFactory? serverProviderApiFactory;
void _buildServerProviderFactory() {
final ServerProvider? providerType = getIt<ApiConfigModel>().serverProvider;
final String? location = getIt<ApiConfigModel>().serverLocation;
serverProviderApiFactory = ApiFactoryCreator.createServerProviderApiFactory(
ServerProviderApiFactorySettings(
provider: providerType ?? ServerProvider.unknown,
location: location,
),
);
}
Future<ServerDetailsRepositoryDto> load() async { Future<ServerDetailsRepositoryDto> load() async {
if (serverProviderApiFactory == null) { final serverProviderApi = ApiController.currentServerProviderApiFactory;
_buildServerProviderFactory();
}
final settings = await server.getSystemSettings(); final settings = await server.getSystemSettings();
final serverId = getIt<ApiConfigModel>().serverDetails!.id; final serverId = getIt<ApiConfigModel>().serverDetails!.id;
final metadata = await serverProviderApiFactory! final metadata =
.getServerProvider() await serverProviderApi!.getServerProvider().getMetadata(serverId);
.getMetadata(serverId);
return ServerDetailsRepositoryDto( return ServerDetailsRepositoryDto(
autoUpgradeSettings: settings.autoUpgradeSettings, autoUpgradeSettings: settings.autoUpgradeSettings,

View File

@ -5,7 +5,7 @@ import 'package:easy_localization/easy_localization.dart';
import 'package:equatable/equatable.dart'; 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_factory_creator.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/api_maps/rest_maps/api_factory_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/api_maps/rest_maps/server_providers/server_provider.dart'; import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/server_provider.dart';
@ -59,8 +59,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
void setServerProviderType(final ServerProvider providerType) async { void setServerProviderType(final ServerProvider providerType) async {
await repository.saveServerProviderType(providerType); await repository.saveServerProviderType(providerType);
repository.serverProviderApiFactory = ApiController.initServerProviderApiFactory(
ApiFactoryCreator.createServerProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderApiFactorySettings(
provider: providerType, provider: providerType,
), ),
@ -68,18 +67,19 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
} }
ProviderApiTokenValidation serverProviderApiTokenValidation() => ProviderApiTokenValidation serverProviderApiTokenValidation() =>
repository.serverProviderApiFactory! ApiController.currentServerProviderApiFactory!
.getServerProvider() .getServerProvider()
.getApiTokenValidation(); .getApiTokenValidation();
RegExp getDnsProviderApiTokenValidation() => repository.dnsProviderApiFactory! RegExp getDnsProviderApiTokenValidation() =>
.getDnsProvider() ApiController.currentDnsProviderApiFactory!
.getApiTokenValidation(); .getDnsProvider()
.getApiTokenValidation();
Future<bool> isServerProviderApiTokenValid( Future<bool> isServerProviderApiTokenValid(
final String providerToken, final String providerToken,
) async => ) async =>
repository.serverProviderApiFactory! ApiController.currentServerProviderApiFactory!
.getServerProvider( .getServerProvider(
settings: const ServerProviderApiSettings( settings: const ServerProviderApiSettings(
isWithToken: false, isWithToken: false,
@ -89,19 +89,30 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
Future<bool> isDnsProviderApiTokenValid( Future<bool> isDnsProviderApiTokenValid(
final String providerToken, final String providerToken,
) async => ) async {
repository.dnsProviderApiFactory! if (ApiController.currentDnsProviderApiFactory == null) {
.getDnsProvider( // No other DNS provider is supported for now,
settings: const DnsProviderApiSettings(isWithToken: false), // so it's safe to hardcode Cloudflare
) ApiController.initDnsProviderApiFactory(
.isApiTokenValid(providerToken); DnsProviderApiFactorySettings(
provider: DnsProvider.cloudflare,
),
);
}
return ApiController.currentDnsProviderApiFactory!
.getDnsProvider(
settings: const DnsProviderApiSettings(isWithToken: false),
)
.isApiTokenValid(providerToken);
}
Future<List<ServerProviderLocation>> fetchAvailableLocations() async { Future<List<ServerProviderLocation>> fetchAvailableLocations() async {
if (repository.serverProviderApiFactory == null) { if (ApiController.currentServerProviderApiFactory == null) {
return []; return [];
} }
return repository.serverProviderApiFactory! return ApiController.currentServerProviderApiFactory!
.getServerProvider() .getServerProvider()
.getAvailableLocations(); .getAvailableLocations();
} }
@ -109,11 +120,11 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
Future<List<ServerType>> fetchAvailableTypesByLocation( Future<List<ServerType>> fetchAvailableTypesByLocation(
final ServerProviderLocation location, final ServerProviderLocation location,
) async { ) async {
if (repository.serverProviderApiFactory == null) { if (ApiController.currentServerProviderApiFactory == null) {
return []; return [];
} }
return repository.serverProviderApiFactory! return ApiController.currentServerProviderApiFactory!
.getServerProvider() .getServerProvider()
.getServerTypesByLocation(location: location); .getServerTypesByLocation(location: location);
} }
@ -141,8 +152,16 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
void setServerType(final ServerType serverType) async { void setServerType(final ServerType serverType) async {
await repository.saveServerType(serverType); await repository.saveServerType(serverType);
repository.serverProviderApiFactory = ApiController.initServerProviderApiFactory(
ApiFactoryCreator.createServerProviderApiFactory( ServerProviderApiFactorySettings(
provider: getIt<ApiConfigModel>().serverProvider!,
location: serverType.location.identifier,
),
);
// All server providers support volumes for now,
// so it's safe to initialize.
ApiController.initVolumeProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderApiFactorySettings(
provider: getIt<ApiConfigModel>().serverProvider!, provider: getIt<ApiConfigModel>().serverProvider!,
location: serverType.location.identifier, location: serverType.location.identifier,
@ -162,6 +181,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
return; return;
} }
await repository.saveCloudFlareKey(cloudFlareKey); await repository.saveCloudFlareKey(cloudFlareKey);
emit( emit(
(state as ServerInstallationNotFinished) (state as ServerInstallationNotFinished)
.copyWith(cloudFlareKey: cloudFlareKey), .copyWith(cloudFlareKey: cloudFlareKey),
@ -677,7 +697,7 @@ class ServerInstallationCubit extends Cubit<ServerInstallationState> {
void clearAppConfig() { void clearAppConfig() {
closeTimer(); closeTimer();
ApiController.clearProviderApiFactories();
repository.clearAppConfig(); repository.clearAppConfig();
emit(const ServerInstallationEmpty()); emit(const ServerInstallationEmpty());
} }

View File

@ -9,14 +9,12 @@ import 'package:hive/hive.dart';
import 'package:pub_semver/pub_semver.dart'; 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_factory_creator.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/api_maps/rest_maps/api_factory_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/rest_maps/dns_providers/dns_provider_factory.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/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_factory.dart';
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart';
import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart'; import 'package:selfprivacy/logic/models/hive/backblaze_credential.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart';
@ -43,13 +41,6 @@ class ServerAuthorizationException implements Exception {
class ServerInstallationRepository { class ServerInstallationRepository {
Box box = Hive.box(BNames.serverInstallationBox); Box box = Hive.box(BNames.serverInstallationBox);
Box<User> usersBox = Hive.box(BNames.usersBox); Box<User> usersBox = Hive.box(BNames.usersBox);
ServerProviderApiFactory? serverProviderApiFactory;
DnsProviderApiFactory? dnsProviderApiFactory =
ApiFactoryCreator.createDnsProviderApiFactory(
DnsProviderApiFactorySettings(
provider: DnsProvider.cloudflare,
), // TODO: HARDCODE FOR NOW!!!
);
Future<ServerInstallationState> load() async { Future<ServerInstallationState> load() async {
final String? providerApiToken = getIt<ApiConfigModel>().serverProviderKey; final String? providerApiToken = getIt<ApiConfigModel>().serverProviderKey;
@ -67,8 +58,16 @@ class ServerInstallationRepository {
if (serverProvider != null || if (serverProvider != null ||
(serverDetails != null && (serverDetails != null &&
serverDetails.provider != ServerProvider.unknown)) { serverDetails.provider != ServerProvider.unknown)) {
serverProviderApiFactory = ApiController.initServerProviderApiFactory(
ApiFactoryCreator.createServerProviderApiFactory( ServerProviderApiFactorySettings(
provider: serverProvider ?? serverDetails!.provider,
location: location,
),
);
// All current providers support volumes
// so it's safe to hardcode for now
ApiController.initVolumeProviderApiFactory(
ServerProviderApiFactorySettings( ServerProviderApiFactorySettings(
provider: serverProvider ?? serverDetails!.provider, provider: serverProvider ?? serverDetails!.provider,
location: location, location: location,
@ -77,7 +76,7 @@ class ServerInstallationRepository {
} }
if (serverDomain != null && serverDomain.provider != DnsProvider.unknown) { if (serverDomain != null && serverDomain.provider != DnsProvider.unknown) {
dnsProviderApiFactory = ApiFactoryCreator.createDnsProviderApiFactory( ApiController.initDnsProviderApiFactory(
DnsProviderApiFactorySettings( DnsProviderApiFactorySettings(
provider: serverDomain.provider, provider: serverDomain.provider,
), ),
@ -168,14 +167,16 @@ class ServerInstallationRepository {
) async { ) async {
ServerHostingDetails serverDetails; ServerHostingDetails serverDetails;
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); serverDetails = await ApiController.currentServerProviderApiFactory!
serverDetails = await api.powerOn(); .getServerProvider()
.powerOn();
return serverDetails; return serverDetails;
} }
Future<String?> getDomainId(final String token, final String domain) async { Future<String?> getDomainId(final String token, final String domain) async {
final DnsProviderApi dnsProviderApi = dnsProviderApiFactory!.getDnsProvider( final DnsProviderApi dnsProviderApi =
ApiController.currentDnsProviderApiFactory!.getDnsProvider(
settings: DnsProviderApiSettings( settings: DnsProviderApiSettings(
isWithToken: false, isWithToken: false,
customToken: token, customToken: token,
@ -244,7 +245,8 @@ class ServerInstallationRepository {
required final Future<void> Function(ServerHostingDetails serverDetails) required final Future<void> Function(ServerHostingDetails serverDetails)
onSuccess, onSuccess,
}) async { }) async {
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); final ServerProviderApi api =
ApiController.currentServerProviderApiFactory!.getServerProvider();
try { try {
final ServerHostingDetails? serverDetails = await api.createServer( final ServerHostingDetails? serverDetails = await api.createServer(
dnsApiToken: cloudFlareKey, dnsApiToken: cloudFlareKey,
@ -328,9 +330,9 @@ class ServerInstallationRepository {
required final void Function() onCancel, required final void Function() onCancel,
}) async { }) async {
final DnsProviderApi dnsProviderApi = final DnsProviderApi dnsProviderApi =
dnsProviderApiFactory!.getDnsProvider(); ApiController.currentDnsProviderApiFactory!.getDnsProvider();
final ServerProviderApi serverApi = final ServerProviderApi serverApi =
serverProviderApiFactory!.getServerProvider(); ApiController.currentServerProviderApiFactory!.getServerProvider();
await dnsProviderApi.removeSimilarRecords( await dnsProviderApi.removeSimilarRecords(
ip4: serverDetails.ip4, ip4: serverDetails.ip4,
@ -370,7 +372,7 @@ class ServerInstallationRepository {
Future<void> createDkimRecord(final ServerDomain cloudFlareDomain) async { Future<void> createDkimRecord(final ServerDomain cloudFlareDomain) async {
final DnsProviderApi dnsProviderApi = final DnsProviderApi dnsProviderApi =
dnsProviderApiFactory!.getDnsProvider(); ApiController.currentDnsProviderApiFactory!.getDnsProvider();
final ServerApi api = ServerApi(); final ServerApi api = ServerApi();
late DnsRecord record; late DnsRecord record;
@ -389,15 +391,15 @@ class ServerInstallationRepository {
return api.isHttpServerWorking(); return api.isHttpServerWorking();
} }
Future<ServerHostingDetails> restart() async { Future<ServerHostingDetails> restart() async =>
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); ApiController.currentServerProviderApiFactory!
return api.restart(); .getServerProvider()
} .restart();
Future<ServerHostingDetails> powerOn() async { Future<ServerHostingDetails> powerOn() async =>
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); ApiController.currentServerProviderApiFactory!
return api.powerOn(); .getServerProvider()
} .powerOn();
Future<ServerRecoveryCapabilities> getRecoveryCapabilities( Future<ServerRecoveryCapabilities> getRecoveryCapabilities(
final ServerDomain serverDomain, final ServerDomain serverDomain,
@ -632,10 +634,10 @@ class ServerInstallationRepository {
} }
} }
Future<List<ServerBasicInfo>> getServersOnProviderAccount() async { Future<List<ServerBasicInfo>> getServersOnProviderAccount() async =>
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); ApiController.currentServerProviderApiFactory!
return api.getServers(); .getServerProvider()
} .getServers();
Future<void> saveServerDetails( Future<void> saveServerDetails(
final ServerHostingDetails serverDetails, final ServerHostingDetails serverDetails,
@ -724,13 +726,11 @@ class ServerInstallationRepository {
} }
Future<void> deleteServer(final ServerDomain serverDomain) async { Future<void> deleteServer(final ServerDomain serverDomain) async {
final ServerProviderApi api = serverProviderApiFactory!.getServerProvider(); await ApiController.currentServerProviderApiFactory!
final DnsProviderApi dnsProviderApi = .getServerProvider()
dnsProviderApiFactory!.getDnsProvider(); .deleteServer(
domainName: serverDomain.domainName,
await api.deleteServer( );
domainName: serverDomain.domainName,
);
await box.put(BNames.hasFinalChecked, false); await box.put(BNames.hasFinalChecked, false);
await box.put(BNames.isServerStarted, false); await box.put(BNames.isServerStarted, false);
@ -739,7 +739,9 @@ class ServerInstallationRepository {
await box.put(BNames.isLoading, false); await box.put(BNames.isLoading, false);
await box.put(BNames.serverDetails, null); await box.put(BNames.serverDetails, null);
await dnsProviderApi.removeSimilarRecords(domain: serverDomain); await ApiController.currentDnsProviderApiFactory!
.getDnsProvider()
.removeSimilarRecords(domain: serverDomain);
} }
Future<void> deleteServerRelatedRecords() async { Future<void> deleteServerRelatedRecords() async {

View File

@ -206,9 +206,8 @@ class InitializingPage extends StatelessWidget {
), ),
const Spacer(), const Spacer(),
BrandButton.rised( BrandButton.rised(
onPressed: formCubitState.isSubmitting onPressed: () =>
? null context.read<DnsProviderFormCubit>().trySubmit(),
: () => context.read<DnsProviderFormCubit>().trySubmit(),
text: 'basis.connect'.tr(), text: 'basis.connect'.tr(),
), ),
const SizedBox(height: 10), const SizedBox(height: 10),