feat(region): Implement endpoints for listing available types by region

routes-refactor
NaiJi ✨ 2022-10-14 19:00:44 +00:00
parent e032bd8a78
commit b30e372322
5 changed files with 113 additions and 2 deletions

View File

@ -5,6 +5,7 @@ import 'package:dio/dio.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/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/json/hetzner_server_info.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/server_basic_info.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';
class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
@ -582,7 +584,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
final Dio client = await getClient();
try {
final Response response = await client.post(
final Response response = await client.get(
'/locations',
);
@ -591,6 +593,7 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
title: location['slug'],
description: location['name'],
flag: getEmojiFlag(location['slug']),
identifier: location['slug'],
),
);
} catch (e) {
@ -602,6 +605,46 @@ class DigitalOceanApi extends ServerProviderApi with VolumeProviderApi {
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
Future<void> createReverseDns({
required final ServerHostingDetails serverDetails,

View File

@ -5,6 +5,7 @@ import 'package:dio/dio.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/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/json/hetzner_server_info.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/server_basic_info.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';
class HetznerApi extends ServerProviderApi with VolumeProviderApi {
@ -567,7 +569,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
final Dio client = await getClient();
try {
final Response response = await client.post(
final Response response = await client.get(
'/locations',
);
@ -576,6 +578,7 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
title: location['city'],
description: location['description'],
flag: getEmojiFlag(location['country']),
identifier: location['name'],
),
);
} catch (e) {
@ -587,6 +590,46 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
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
Future<void> createReverseDns({
required final ServerHostingDetails serverDetails,

View File

@ -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/server_basic_info.dart';
import 'package:selfprivacy/logic/models/server_provider_location.dart';
import 'package:selfprivacy/logic/models/server_type.dart';
abstract class ServerProviderApi extends ApiMap {
Future<List<ServerBasicInfo>> getServers();
Future<List<ServerProviderLocation>> getAvailableLocations();
Future<List<ServerType>> getServerTypesByLocation({
required final ServerProviderLocation location,
});
Future<ServerHostingDetails> restart();
Future<ServerHostingDetails> powerOn();

View File

@ -1,11 +1,13 @@
class ServerProviderLocation {
ServerProviderLocation({
required this.title,
required this.identifier,
this.description,
this.flag,
});
final String title;
final String identifier;
final String? description;
/// as emoji

View 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;
}