Add Services type and GraphQL endpoints with parsers.

This commit is contained in:
inexcode 2022-08-29 04:40:35 +04:00
parent d934a6a9cb
commit c0ce019360
4 changed files with 285 additions and 1 deletions

View file

@ -1,6 +1,7 @@
import 'package:graphql/client.dart'; import 'package:graphql/client.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/api_map.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/api_map.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/schema.graphql.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/server_api.graphql.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/server_api.graphql.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/disk_volumes.graphql.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/disk_volumes.graphql.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/services.graphql.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/services.graphql.dart';
@ -8,12 +9,34 @@ import 'package:selfprivacy/logic/models/hive/server_domain.dart';
import 'package:selfprivacy/logic/models/json/api_token.dart'; import 'package:selfprivacy/logic/models/json/api_token.dart';
import 'package:selfprivacy/logic/models/json/server_disk_volume.dart'; import 'package:selfprivacy/logic/models/json/server_disk_volume.dart';
import 'package:selfprivacy/logic/models/json/server_job.dart'; import 'package:selfprivacy/logic/models/json/server_job.dart';
import 'package:selfprivacy/logic/models/service.dart';
part 'volume_api.dart'; part 'volume_api.dart';
part 'jobs_api.dart'; part 'jobs_api.dart';
part 'server_actions_api.dart'; part 'server_actions_api.dart';
part 'services_api.dart'; part 'services_api.dart';
class GenericMutationResult {
GenericMutationResult({
required this.success,
required this.code,
this.message,
});
final bool success;
final int code;
final String? message;
}
class GenericJobMutationReturn extends GenericMutationResult {
GenericJobMutationReturn({
required final super.success,
required final super.code,
final super.message,
this.job,
});
final ServerJob? job;
}
class ServerApi extends ApiMap with VolumeApi, JobsApi, ServerActionsApi { class ServerApi extends ApiMap with VolumeApi, JobsApi, ServerActionsApi {
ServerApi({ ServerApi({
this.hasLogger = false, this.hasLogger = false,

View file

@ -1,3 +1,159 @@
part of 'server.dart'; part of 'server.dart';
mixin ServicesApi on ApiMap {} mixin ServicesApi on ApiMap {
Future<List<Service>> getAllServices() async {
QueryResult<Query$AllServices> response;
List<Service> services = [];
try {
final GraphQLClient client = await getClient();
response = await client.query$AllServices();
if (response.hasException) {
print(response.exception.toString());
}
services = response.parsedData?.services.allServices
.map<Service>((final service) => Service.fromGraphQL(service))
.toList() ??
[];
} catch (e) {
print(e);
}
return services;
}
Future<GenericMutationResult> enableService(final String serviceId) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$EnableService(serviceId: serviceId);
final mutation = Options$Mutation$EnableService(variables: variables);
final response = await client.mutate$EnableService(mutation);
return GenericMutationResult(
success: response.parsedData?.enableService.success ?? false,
code: response.parsedData?.enableService.code ?? 0,
message: response.parsedData?.enableService.message,
);
} catch (e) {
print(e);
return GenericMutationResult(
success: false,
code: 0,
message: e.toString(),
);
}
}
Future<GenericMutationResult> disableService(final String serviceId) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$DisableService(serviceId: serviceId);
final mutation = Options$Mutation$DisableService(variables: variables);
final response = await client.mutate$DisableService(mutation);
return GenericMutationResult(
success: response.parsedData?.disableService.success ?? false,
code: response.parsedData?.disableService.code ?? 0,
message: response.parsedData?.disableService.message,
);
} catch (e) {
print(e);
return GenericMutationResult(
success: false,
code: 0,
message: e.toString(),
);
}
}
Future<GenericMutationResult> stopService(final String serviceId) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$StopService(serviceId: serviceId);
final mutation = Options$Mutation$StopService(variables: variables);
final response = await client.mutate$StopService(mutation);
return GenericMutationResult(
success: response.parsedData?.stopService.success ?? false,
code: response.parsedData?.stopService.code ?? 0,
message: response.parsedData?.stopService.message,
);
} catch (e) {
print(e);
return GenericMutationResult(
success: false,
code: 0,
message: e.toString(),
);
}
}
Future<GenericMutationResult> startService(final String serviceId) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$StartService(serviceId: serviceId);
final mutation = Options$Mutation$StartService(variables: variables);
final response = await client.mutate$StartService(mutation);
return GenericMutationResult(
success: response.parsedData?.startService.success ?? false,
code: response.parsedData?.startService.code ?? 0,
message: response.parsedData?.startService.message,
);
} catch (e) {
print(e);
return GenericMutationResult(
success: false,
code: 0,
message: e.toString(),
);
}
}
Future<GenericMutationResult> restartService(final String serviceId) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$RestartService(serviceId: serviceId);
final mutation = Options$Mutation$RestartService(variables: variables);
final response = await client.mutate$RestartService(mutation);
return GenericMutationResult(
success: response.parsedData?.restartService.success ?? false,
code: response.parsedData?.restartService.code ?? 0,
message: response.parsedData?.restartService.message,
);
} catch (e) {
print(e);
return GenericMutationResult(
success: false,
code: 0,
message: e.toString(),
);
}
}
Future<GenericJobMutationReturn> moveService(
final String serviceId,
final String destination,
) async {
try {
final GraphQLClient client = await getClient();
final variables = Variables$Mutation$MoveService(
input: Input$MoveServiceInput(
serviceId: serviceId,
location: destination,
),
);
final mutation = Options$Mutation$MoveService(variables: variables);
final response = await client.mutate$MoveService(mutation);
final jobJson = response.parsedData?.moveService.job?.toJson();
return GenericJobMutationReturn(
success: response.parsedData?.moveService.success ?? false,
code: response.parsedData?.moveService.code ?? 0,
message: response.parsedData?.moveService.message,
job: jobJson != null ? ServerJob.fromJson(jobJson) : null,
);
} catch (e) {
print(e);
return GenericJobMutationReturn(
success: false,
code: 0,
message: e.toString(),
job: null,
);
}
}
}

View file

@ -1,4 +1,5 @@
import 'package:json_annotation/json_annotation.dart'; import 'package:json_annotation/json_annotation.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/services.graphql.dart';
part 'dns_records.g.dart'; part 'dns_records.g.dart';
@ -13,6 +14,16 @@ class DnsRecord {
this.proxied = false, this.proxied = false,
}); });
DnsRecord.fromGraphQL(
final Query$AllServices$services$allServices$dnsRecords record,
) : this(
type: record.recordType,
name: record.name,
content: record.content,
ttl: record.ttl,
priority: record.priority ?? 10,
);
final String type; final String type;
final String? name; final String? name;
final String? content; final String? content;

View file

@ -0,0 +1,94 @@
import 'dart:convert';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/schema.graphql.dart';
import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/services.graphql.dart';
import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/logic/models/json/dns_records.dart';
class Service {
Service({
required this.id,
required this.displayName,
required this.description,
required this.isEnabled,
required this.isRequired,
required this.status,
required this.storageUsage,
required this.svgIcon,
required this.dnsRecords,
this.url,
});
Service.fromGraphQL(final Query$AllServices$services$allServices service)
: this(
id: service.id,
displayName: service.displayName,
description: service.description,
isEnabled: service.isEnabled,
isRequired: service.isRequired,
status: ServiceStatus.fromGraphQL(service.status),
storageUsage: ServiceStorageUsage(
used: DiskSize(byte: int.parse(service.storageUsage.usedSpace)),
volume: service.storageUsage.volume?.name,
),
// Decode the base64 encoded svg icon to text.
svgIcon: utf8.decode(base64.decode(service.svgIcon)),
dnsRecords: service.dnsRecords
?.map((final record) => DnsRecord.fromGraphQL(record))
.toList() ??
[],
url: service.url,
);
final String id;
final String displayName;
final String description;
final bool isEnabled;
final bool isRequired;
final ServiceStatus status;
final ServiceStorageUsage storageUsage;
final String svgIcon;
final String? url;
final List<DnsRecord> dnsRecords;
}
class ServiceStorageUsage {
ServiceStorageUsage({
required this.used,
required this.volume,
});
final DiskSize used;
final String? volume;
}
enum ServiceStatus {
activating,
active,
deactivating,
failed,
inactive,
off,
reloading;
factory ServiceStatus.fromGraphQL(final Enum$ServiceStatusEnum graphQL) {
switch (graphQL) {
case Enum$ServiceStatusEnum.ACTIVATING:
return activating;
case Enum$ServiceStatusEnum.ACTIVE:
return active;
case Enum$ServiceStatusEnum.DEACTIVATING:
return deactivating;
case Enum$ServiceStatusEnum.FAILED:
return failed;
case Enum$ServiceStatusEnum.INACTIVE:
return inactive;
case Enum$ServiceStatusEnum.OFF:
return off;
case Enum$ServiceStatusEnum.RELOADING:
return reloading;
case Enum$ServiceStatusEnum.$unknown:
return inactive;
}
}
}