mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2025-02-02 14:16:58 +00:00
chore: Move volume api to abstract server provider interface
This commit is contained in:
parent
f6591cbfc6
commit
3b49805c9c
|
@ -1,22 +1,10 @@
|
|||
import 'package:selfprivacy/logic/api_maps/rest_maps/api_factory_creator.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/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 ServerProviderSettings settings,
|
||||
) {
|
||||
_volumeProviderApiFactory =
|
||||
VolumeApiFactoryCreator.createVolumeProviderApiFactory(settings);
|
||||
}
|
||||
|
||||
static void initDnsProviderApiFactory(
|
||||
final DnsProviderFactorySettings settings,
|
||||
|
@ -25,20 +13,9 @@ class ApiController {
|
|||
ApiFactoryCreator.createDnsProviderApiFactory(settings);
|
||||
}
|
||||
|
||||
static void initServerProviderApiFactory(
|
||||
final ServerProviderSettings settings,
|
||||
) {
|
||||
_serverProviderApiFactory =
|
||||
ApiFactoryCreator.createServerProviderApiFactory(settings);
|
||||
}
|
||||
|
||||
static void clearProviderApiFactories() {
|
||||
_volumeProviderApiFactory = null;
|
||||
_dnsProviderApiFactory = null;
|
||||
_serverProviderApiFactory = null;
|
||||
}
|
||||
|
||||
static VolumeProviderApiFactory? _volumeProviderApiFactory;
|
||||
static DnsProviderApiFactory? _dnsProviderApiFactory;
|
||||
static ServerProviderApiFactory? _serverProviderApiFactory;
|
||||
}
|
||||
|
|
|
@ -95,13 +95,6 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
|||
);
|
||||
}
|
||||
|
||||
/// Hardcoded on their documentation and there is no pricing API at all
|
||||
/// Probably we should scrap the doc page manually
|
||||
Future<Price?> getPricePerGb() async => Price(
|
||||
value: 0.10,
|
||||
currency: 'USD',
|
||||
);
|
||||
|
||||
Future<GenericResult> createVolume() async {
|
||||
Response? createVolumeResponse;
|
||||
final Dio client = await getClient();
|
||||
|
|
|
@ -305,7 +305,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
|||
);
|
||||
}
|
||||
|
||||
Future<bool> resizeVolume(
|
||||
Future<GenericResult<bool>> resizeVolume(
|
||||
final ServerVolume volume,
|
||||
final DiskSize size,
|
||||
) async {
|
||||
|
@ -324,11 +324,19 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
|||
resizeVolumeResponse.data['action']['status'].toString() != 'error';
|
||||
} catch (e) {
|
||||
print(e);
|
||||
return GenericResult(
|
||||
data: false,
|
||||
success: false,
|
||||
message: e.toString(),
|
||||
);
|
||||
} finally {
|
||||
client.close();
|
||||
}
|
||||
|
||||
return success;
|
||||
return GenericResult(
|
||||
data: success,
|
||||
success: true,
|
||||
);
|
||||
}
|
||||
|
||||
Future<GenericResult> createServer({
|
||||
|
|
|
@ -10,6 +10,7 @@ import 'package:selfprivacy/logic/models/disk_size.dart';
|
|||
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
||||
import 'package:selfprivacy/logic/models/disk_status.dart';
|
||||
import 'package:selfprivacy/logic/models/price.dart';
|
||||
import 'package:selfprivacy/logic/providers/providers_controller.dart';
|
||||
|
||||
part 'provider_volume_state.dart';
|
||||
|
||||
|
@ -27,9 +28,7 @@ class ApiProviderVolumeCubit
|
|||
}
|
||||
|
||||
Future<Price?> getPricePerGb() async =>
|
||||
ApiController.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
.getPricePerGb();
|
||||
ProvidersController.currentServerProvider!.getPricePerGb();
|
||||
|
||||
Future<void> refresh() async {
|
||||
emit(const ApiProviderVolumeState([], LoadingStatus.refreshing, false));
|
||||
|
@ -41,29 +40,31 @@ class ApiProviderVolumeCubit
|
|||
return emit(const ApiProviderVolumeState([], LoadingStatus.error, false));
|
||||
}
|
||||
|
||||
final List<ServerVolume> volumes = await ApiController
|
||||
.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
.getVolumes();
|
||||
final volumesResult =
|
||||
await ProvidersController.currentServerProvider!.getVolumes();
|
||||
|
||||
if (volumes.isEmpty) {
|
||||
if (!volumesResult.success || volumesResult.data.isEmpty) {
|
||||
return emit(const ApiProviderVolumeState([], LoadingStatus.error, false));
|
||||
}
|
||||
|
||||
emit(ApiProviderVolumeState(volumes, LoadingStatus.success, false));
|
||||
emit(
|
||||
ApiProviderVolumeState(
|
||||
volumesResult.data,
|
||||
LoadingStatus.success,
|
||||
false,
|
||||
),
|
||||
);
|
||||
}
|
||||
|
||||
Future<void> attachVolume(final DiskVolume volume) async {
|
||||
final ServerHostingDetails server = getIt<ApiConfigModel>().serverDetails!;
|
||||
await ApiController.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
await ProvidersController.currentServerProvider!
|
||||
.attachVolume(volume.providerVolume!, server.id);
|
||||
unawaited(refresh());
|
||||
}
|
||||
|
||||
Future<void> detachVolume(final DiskVolume volume) async {
|
||||
await ApiController.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
await ProvidersController.currentServerProvider!
|
||||
.detachVolume(volume.providerVolume!);
|
||||
unawaited(refresh());
|
||||
}
|
||||
|
@ -77,14 +78,13 @@ class ApiProviderVolumeCubit
|
|||
'Starting resize',
|
||||
);
|
||||
emit(state.copyWith(isResizing: true));
|
||||
final bool resized = await ApiController.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
.resizeVolume(
|
||||
volume.providerVolume!,
|
||||
newSize,
|
||||
);
|
||||
final resizedResult =
|
||||
await ProvidersController.currentServerProvider!.resizeVolume(
|
||||
volume.providerVolume!,
|
||||
newSize,
|
||||
);
|
||||
|
||||
if (!resized) {
|
||||
if (!resizedResult.success || !resizedResult.data) {
|
||||
getIt<NavigationService>().showSnackBar(
|
||||
'storage.extending_volume_error'.tr(),
|
||||
);
|
||||
|
@ -115,11 +115,8 @@ class ApiProviderVolumeCubit
|
|||
}
|
||||
|
||||
Future<void> createVolume() async {
|
||||
final ServerVolume? volume = (await ApiController
|
||||
.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
.createVolume())
|
||||
.data;
|
||||
final ServerVolume? volume =
|
||||
(await ProvidersController.currentServerProvider!.createVolume()).data;
|
||||
|
||||
final diskVolume = DiskVolume(providerVolume: volume);
|
||||
await attachVolume(diskVolume);
|
||||
|
@ -131,8 +128,7 @@ class ApiProviderVolumeCubit
|
|||
}
|
||||
|
||||
Future<void> deleteVolume(final DiskVolume volume) async {
|
||||
await ApiController.currentVolumeProviderApiFactory!
|
||||
.getVolumeProvider()
|
||||
await ProvidersController.currentServerProvider!
|
||||
.deleteVolume(volume.providerVolume!);
|
||||
unawaited(refresh());
|
||||
}
|
||||
|
|
|
@ -1,7 +1,10 @@
|
|||
import 'package:selfprivacy/logic/api_maps/generic_result.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';
|
||||
import 'package:selfprivacy/logic/models/launch_installation_data.dart';
|
||||
import 'package:selfprivacy/logic/models/metrics.dart';
|
||||
import 'package:selfprivacy/logic/models/price.dart';
|
||||
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
||||
import 'package:selfprivacy/logic/models/server_type.dart';
|
||||
|
||||
|
@ -26,5 +29,18 @@ abstract class ServerProvider {
|
|||
final DateTime end,
|
||||
);
|
||||
|
||||
Future<Price?> getPricePerGb();
|
||||
Future<GenericResult<List<ServerVolume>>> getVolumes({final String? status});
|
||||
Future<GenericResult<ServerVolume?>> createVolume();
|
||||
Future<GenericResult<void>> deleteVolume(final ServerVolume volume);
|
||||
Future<GenericResult<bool>> resizeVolume(
|
||||
final ServerVolume volume,
|
||||
final DiskSize size,
|
||||
);
|
||||
Future<GenericResult<bool>> attachVolume(
|
||||
final ServerVolume volume,
|
||||
final int serverId,
|
||||
);
|
||||
Future<GenericResult<bool>> detachVolume(final ServerVolume volume);
|
||||
GenericResult<bool> get success => GenericResult(success: true, data: true);
|
||||
}
|
||||
|
|
|
@ -610,6 +610,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericResult<List<ServerVolume>>> getVolumes({
|
||||
final String? status,
|
||||
}) async {
|
||||
|
@ -658,6 +659,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericResult<ServerVolume?>> createVolume() async {
|
||||
ServerVolume? volume;
|
||||
|
||||
|
@ -729,6 +731,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericResult<void>> deleteVolume(
|
||||
final ServerVolume volume,
|
||||
) async =>
|
||||
|
@ -736,6 +739,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
volume.uuid!,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<GenericResult<bool>> attachVolume(
|
||||
final ServerVolume volume,
|
||||
final int serverId,
|
||||
|
@ -745,6 +749,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
serverId,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<GenericResult<bool>> detachVolume(
|
||||
final ServerVolume volume,
|
||||
) async =>
|
||||
|
@ -753,6 +758,7 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
volume.serverId!,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<GenericResult<bool>> resizeVolume(
|
||||
final ServerVolume volume,
|
||||
final DiskSize size,
|
||||
|
@ -761,4 +767,33 @@ class DigitalOceanServerProvider extends ServerProvider {
|
|||
volume.name,
|
||||
size,
|
||||
);
|
||||
|
||||
/// Hardcoded on their documentation and there is no pricing API at all
|
||||
/// Probably we should scrap the doc page manually
|
||||
@override
|
||||
Future<Price?> getPricePerGb() async => Price(
|
||||
value: 0.10,
|
||||
currency: 'USD',
|
||||
);
|
||||
|
||||
@override
|
||||
Future<GenericResult<DateTime?>> powerOn(final int serverId) async {
|
||||
DateTime? timestamp;
|
||||
final result = await _adapter.api().powerOn(serverId);
|
||||
if (!result.success) {
|
||||
return GenericResult(
|
||||
success: false,
|
||||
data: timestamp,
|
||||
code: result.code,
|
||||
message: result.message,
|
||||
);
|
||||
}
|
||||
|
||||
timestamp = DateTime.now();
|
||||
|
||||
return GenericResult(
|
||||
success: true,
|
||||
data: timestamp,
|
||||
);
|
||||
}
|
||||
}
|
||||
|
|
|
@ -7,7 +7,6 @@ import 'package:selfprivacy/logic/models/disk_size.dart';
|
|||
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
||||
import 'package:selfprivacy/logic/models/hive/server_domain.dart';
|
||||
import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart';
|
||||
import 'package:selfprivacy/logic/models/launch_installation_data.dart';
|
||||
import 'package:selfprivacy/logic/models/metrics.dart';
|
||||
import 'package:selfprivacy/logic/models/price.dart';
|
||||
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
||||
|
@ -434,7 +433,7 @@ class HetznerServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
final volume = volumeResult.data!;
|
||||
final volume = volumeResult.data;
|
||||
final serverApiToken = StringGenerators.apiToken();
|
||||
final hostname = getHostnameFromDomain(installationData.domainName);
|
||||
|
||||
|
@ -632,6 +631,7 @@ class HetznerServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericResult<ServerVolume?>> createVolume() async {
|
||||
ServerVolume? volume;
|
||||
|
||||
|
@ -676,6 +676,7 @@ class HetznerServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
@override
|
||||
Future<GenericResult<List<ServerVolume>>> getVolumes({
|
||||
final String? status,
|
||||
}) async {
|
||||
|
@ -724,9 +725,11 @@ class HetznerServerProvider extends ServerProvider {
|
|||
);
|
||||
}
|
||||
|
||||
Future<GenericResult<void>> deleteVolume(final int volumeId) async =>
|
||||
_adapter.api().deleteVolume(volumeId);
|
||||
@override
|
||||
Future<GenericResult<void>> deleteVolume(final ServerVolume volume) async =>
|
||||
_adapter.api().deleteVolume(volume.id);
|
||||
|
||||
@override
|
||||
Future<GenericResult<bool>> attachVolume(
|
||||
final ServerVolume volume,
|
||||
final int serverId,
|
||||
|
@ -736,14 +739,16 @@ class HetznerServerProvider extends ServerProvider {
|
|||
serverId,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<GenericResult<bool>> detachVolume(
|
||||
final int volumeId,
|
||||
final ServerVolume volume,
|
||||
) async =>
|
||||
_adapter.api().detachVolume(
|
||||
volumeId,
|
||||
volume.id,
|
||||
);
|
||||
|
||||
Future<bool> resizeVolume(
|
||||
@override
|
||||
Future<GenericResult<bool>> resizeVolume(
|
||||
final ServerVolume volume,
|
||||
final DiskSize size,
|
||||
) async =>
|
||||
|
@ -751,4 +756,7 @@ class HetznerServerProvider extends ServerProvider {
|
|||
volume,
|
||||
size,
|
||||
);
|
||||
|
||||
@override
|
||||
Future<Price?> getPricePerGb() async => _adapter.api().getPricePerGb();
|
||||
}
|
||||
|
|
|
@ -10,7 +10,8 @@
|
|||
part of 'router.dart';
|
||||
|
||||
abstract class _$RootRouter extends RootStackRouter {
|
||||
_$RootRouter([GlobalKey<NavigatorState>? navigatorKey]) : super(navigatorKey);
|
||||
_$RootRouter([GlobalKey<NavigatorState>? navigatorKey])
|
||||
: super(navigatorKey: navigatorKey);
|
||||
|
||||
@override
|
||||
final Map<String, PageFactory> pagesMap = {
|
||||
|
|
Loading…
Reference in a new issue