mirror of
https://git.selfprivacy.org/kherel/selfprivacy.org.app.git
synced 2025-03-11 17:24:09 +00:00
feat(region): Implement endpoints for listing available types by region
This commit is contained in:
parent
e032bd8a78
commit
b30e372322
5 changed files with 113 additions and 2 deletions
lib/logic
api_maps/rest_maps/server_providers
models
|
@ -5,6 +5,7 @@ import 'package:dio/dio.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart';
|
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_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.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/disk_size.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/hetzner_server_info.dart';
|
import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
||||||
|
@ -12,6 +13,7 @@ import 'package:selfprivacy/logic/models/hive/user.dart';
|
||||||
import 'package:selfprivacy/logic/models/price.dart';
|
import 'package:selfprivacy/logic/models/price.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/server_type.dart';
|
||||||
import 'package:selfprivacy/utils/password_generator.dart';
|
import 'package:selfprivacy/utils/password_generator.dart';
|
||||||
|
|
||||||
class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
|
@ -582,7 +584,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
|
|
||||||
final Dio client = await getClient();
|
final Dio client = await getClient();
|
||||||
try {
|
try {
|
||||||
final Response response = await client.post(
|
final Response response = await client.get(
|
||||||
'/locations',
|
'/locations',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -591,6 +593,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
title: location['slug'],
|
title: location['slug'],
|
||||||
description: location['name'],
|
description: location['name'],
|
||||||
flag: getEmojiFlag(location['slug']),
|
flag: getEmojiFlag(location['slug']),
|
||||||
|
identifier: location['slug'],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -602,6 +605,46 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
return locations;
|
return locations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<ServerType>> getServerTypesByLocation({
|
||||||
|
required final ServerProviderLocation location,
|
||||||
|
}) async {
|
||||||
|
final List<ServerType> 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']) {
|
||||||
|
if (rawRegion.toString() == location.identifier) {
|
||||||
|
types.add(
|
||||||
|
ServerType(
|
||||||
|
title: rawSize['description'],
|
||||||
|
identifier: rawSize['slug'],
|
||||||
|
ram: rawSize['memory'],
|
||||||
|
cores: rawSize['vcpus'],
|
||||||
|
disk: DiskSize(byte: rawSize['disk'] * 1024 * 1024 * 1024),
|
||||||
|
price: Price(
|
||||||
|
value: rawSize['price_monthly'],
|
||||||
|
currency: 'USD',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
} finally {
|
||||||
|
close(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> createReverseDns({
|
Future<void> createReverseDns({
|
||||||
required final ServerHostingDetails serverDetails,
|
required final ServerHostingDetails serverDetails,
|
||||||
|
|
|
@ -5,6 +5,7 @@ import 'package:dio/dio.dart';
|
||||||
import 'package:selfprivacy/config/get_it_config.dart';
|
import 'package:selfprivacy/config/get_it_config.dart';
|
||||||
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_provider.dart';
|
import 'package:selfprivacy/logic/api_maps/rest_maps/server_providers/volume_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.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/disk_size.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/hetzner_server_info.dart';
|
import 'package:selfprivacy/logic/models/json/hetzner_server_info.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
import 'package:selfprivacy/logic/models/hive/server_details.dart';
|
||||||
|
@ -12,6 +13,7 @@ import 'package:selfprivacy/logic/models/hive/user.dart';
|
||||||
import 'package:selfprivacy/logic/models/price.dart';
|
import 'package:selfprivacy/logic/models/price.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/server_type.dart';
|
||||||
import 'package:selfprivacy/utils/password_generator.dart';
|
import 'package:selfprivacy/utils/password_generator.dart';
|
||||||
|
|
||||||
class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
|
@ -567,7 +569,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
|
|
||||||
final Dio client = await getClient();
|
final Dio client = await getClient();
|
||||||
try {
|
try {
|
||||||
final Response response = await client.post(
|
final Response response = await client.get(
|
||||||
'/locations',
|
'/locations',
|
||||||
);
|
);
|
||||||
|
|
||||||
|
@ -576,6 +578,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
title: location['city'],
|
title: location['city'],
|
||||||
description: location['description'],
|
description: location['description'],
|
||||||
flag: getEmojiFlag(location['country']),
|
flag: getEmojiFlag(location['country']),
|
||||||
|
identifier: location['name'],
|
||||||
),
|
),
|
||||||
);
|
);
|
||||||
} catch (e) {
|
} catch (e) {
|
||||||
|
@ -587,6 +590,46 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
|
||||||
return locations;
|
return locations;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@override
|
||||||
|
Future<List<ServerType>> getServerTypesByLocation({
|
||||||
|
required final ServerProviderLocation location,
|
||||||
|
}) async {
|
||||||
|
final List<ServerType> types = [];
|
||||||
|
|
||||||
|
final Dio client = await getClient();
|
||||||
|
try {
|
||||||
|
final Response response = await client.get(
|
||||||
|
'/server_types',
|
||||||
|
);
|
||||||
|
final rawTypes = response.data!['server_types'];
|
||||||
|
for (final rawType in rawTypes) {
|
||||||
|
for (final rawPrice in rawType['prices']) {
|
||||||
|
if (rawPrice['location'].toString() == location.identifier) {
|
||||||
|
types.add(
|
||||||
|
ServerType(
|
||||||
|
title: rawType['description'],
|
||||||
|
identifier: rawType['name'],
|
||||||
|
ram: rawType['memory'],
|
||||||
|
cores: rawType['cores'],
|
||||||
|
disk: DiskSize(byte: rawType['disk'] * 1024 * 1024 * 1024),
|
||||||
|
price: Price(
|
||||||
|
value: rawPrice['price_monthly']['gross'],
|
||||||
|
currency: 'EUR',
|
||||||
|
),
|
||||||
|
),
|
||||||
|
);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
} catch (e) {
|
||||||
|
print(e);
|
||||||
|
} finally {
|
||||||
|
close(client);
|
||||||
|
}
|
||||||
|
|
||||||
|
return types;
|
||||||
|
}
|
||||||
|
|
||||||
@override
|
@override
|
||||||
Future<void> createReverseDns({
|
Future<void> createReverseDns({
|
||||||
required final ServerHostingDetails serverDetails,
|
required final ServerHostingDetails serverDetails,
|
||||||
|
|
|
@ -4,10 +4,14 @@ import 'package:selfprivacy/logic/models/hive/server_domain.dart';
|
||||||
import 'package:selfprivacy/logic/models/hive/user.dart';
|
import 'package:selfprivacy/logic/models/hive/user.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
import 'package:selfprivacy/logic/models/server_basic_info.dart';
|
||||||
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
import 'package:selfprivacy/logic/models/server_provider_location.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/server_type.dart';
|
||||||
|
|
||||||
abstract class ServerProviderApi extends ApiMap {
|
abstract class ServerProviderApi extends ApiMap {
|
||||||
Future<List<ServerBasicInfo>> getServers();
|
Future<List<ServerBasicInfo>> getServers();
|
||||||
Future<List<ServerProviderLocation>> getAvailableLocations();
|
Future<List<ServerProviderLocation>> getAvailableLocations();
|
||||||
|
Future<List<ServerType>> getServerTypesByLocation({
|
||||||
|
required final ServerProviderLocation location,
|
||||||
|
});
|
||||||
|
|
||||||
Future<ServerHostingDetails> restart();
|
Future<ServerHostingDetails> restart();
|
||||||
Future<ServerHostingDetails> powerOn();
|
Future<ServerHostingDetails> powerOn();
|
||||||
|
|
|
@ -1,11 +1,13 @@
|
||||||
class ServerProviderLocation {
|
class ServerProviderLocation {
|
||||||
ServerProviderLocation({
|
ServerProviderLocation({
|
||||||
required this.title,
|
required this.title,
|
||||||
|
required this.identifier,
|
||||||
this.description,
|
this.description,
|
||||||
this.flag,
|
this.flag,
|
||||||
});
|
});
|
||||||
|
|
||||||
final String title;
|
final String title;
|
||||||
|
final String identifier;
|
||||||
final String? description;
|
final String? description;
|
||||||
|
|
||||||
/// as emoji
|
/// as emoji
|
||||||
|
|
19
lib/logic/models/server_type.dart
Normal file
19
lib/logic/models/server_type.dart
Normal file
|
@ -0,0 +1,19 @@
|
||||||
|
import 'package:selfprivacy/logic/models/disk_size.dart';
|
||||||
|
import 'package:selfprivacy/logic/models/price.dart';
|
||||||
|
|
||||||
|
class ServerType {
|
||||||
|
ServerType({
|
||||||
|
required this.title,
|
||||||
|
required this.identifier,
|
||||||
|
required this.ram,
|
||||||
|
required this.cores,
|
||||||
|
required this.disk,
|
||||||
|
required this.price,
|
||||||
|
});
|
||||||
|
final String title;
|
||||||
|
final String identifier;
|
||||||
|
final double ram;
|
||||||
|
final DiskSize disk;
|
||||||
|
final int cores;
|
||||||
|
final Price price;
|
||||||
|
}
|
Loading…
Add table
Reference in a new issue