Last changes on storage pages and job backend logic

remotes/1708434123650076052/graphql
NaiJi ✨ 2022-08-24 08:35:49 +03:00
parent d2c3d28b0f
commit 7bbdaf2ebe
50 changed files with 16907 additions and 2158 deletions

View File

@ -256,6 +256,15 @@
"bottom_sheet": { "bottom_sheet": {
"1": "Openconnect VPN Server. Engine for secure and scalable VPN infrastructure" "1": "Openconnect VPN Server. Engine for secure and scalable VPN infrastructure"
} }
},
"page": {
"up_and_running": "Up and running",
"resource_usage": "Resource usage",
"disk_used": "{} of disk space used",
"users": "Users",
"controlled_by": "Controlled by {}",
"apps": "Apps",
"settings": "Settings and maintenance"
} }
}, },
"users": { "users": {
@ -395,8 +404,10 @@
}, },
"modals": { "modals": {
"_comment": "messages in modals", "_comment": "messages in modals",
"1": "Server with such name, already exist", "1": "Server with such name, already exist.",
"1_1": "Unexpected error during placement from the provider side.",
"2": "Destroy server and create a new one?", "2": "Destroy server and create a new one?",
"2_2": "Try again?",
"3": "Are you sure?", "3": "Are you sure?",
"4": "Purge all authentication keys?", "4": "Purge all authentication keys?",
"5": "Yes, purge all my tokens", "5": "Yes, purge all my tokens",

View File

@ -375,8 +375,10 @@
}, },
"modals": { "modals": {
"_comment": "messages in modals", "_comment": "messages in modals",
"1": "Сервер с таким именем уже существует", "1": "Сервер с таким именем уже существует.",
"1.1": "Непредвиденная ошибка при создании со стороны провайдера.",
"2": "Уничтожить сервер и создать новый?", "2": "Уничтожить сервер и создать новый?",
"2.2": "Попробовать ещё раз?",
"3": "Подтвердите", "3": "Подтвердите",
"4": "Сбросить все ключи?", "4": "Сбросить все ключи?",
"5": "Да, сбросить", "5": "Да, сбросить",

View File

@ -10,6 +10,7 @@ import 'package:selfprivacy/logic/cubit/jobs/jobs_cubit.dart';
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart';
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
import 'package:selfprivacy/logic/cubit/volumes/volumes_cubit.dart';
class BlocAndProviderConfig extends StatelessWidget { class BlocAndProviderConfig extends StatelessWidget {
const BlocAndProviderConfig({final super.key, this.child}); const BlocAndProviderConfig({final super.key, this.child});
@ -26,6 +27,7 @@ class BlocAndProviderConfig extends StatelessWidget {
final dnsRecordsCubit = DnsRecordsCubit(serverInstallationCubit); final dnsRecordsCubit = DnsRecordsCubit(serverInstallationCubit);
final recoveryKeyCubit = RecoveryKeyCubit(serverInstallationCubit); final recoveryKeyCubit = RecoveryKeyCubit(serverInstallationCubit);
final apiDevicesCubit = ApiDevicesCubit(serverInstallationCubit); final apiDevicesCubit = ApiDevicesCubit(serverInstallationCubit);
final apiVolumesCubit = ApiVolumesCubit(serverInstallationCubit);
return MultiProvider( return MultiProvider(
providers: [ providers: [
BlocProvider( BlocProvider(
@ -60,6 +62,9 @@ class BlocAndProviderConfig extends StatelessWidget {
BlocProvider( BlocProvider(
create: (final _) => apiDevicesCubit..load(), create: (final _) => apiDevicesCubit..load(),
), ),
BlocProvider(
create: (final _) => apiVolumesCubit..load(),
),
BlocProvider( BlocProvider(
create: (final _) => create: (final _) =>
JobsCubit(usersCubit: usersCubit, servicesCubit: servicesCubit), JobsCubit(usersCubit: usersCubit, servicesCubit: servicesCubit),

View File

@ -7,11 +7,12 @@ abstract class ApiMap {
'https://api.$rootAddress/graphql', 'https://api.$rootAddress/graphql',
); );
final String token = _getApiToken();
final Link graphQLLink = isWithToken final Link graphQLLink = isWithToken
? AuthLink( ? AuthLink(
getToken: () async => customToken == '' getToken: () async =>
? getIt<ApiConfigModel>().serverDetails!.apiToken customToken == '' ? 'Bearer $token' : customToken,
: customToken,
).concat(httpLink) ).concat(httpLink)
: httpLink; : httpLink;
@ -21,6 +22,32 @@ abstract class ApiMap {
); );
} }
Future<GraphQLClient> getSubscriptionClient() async {
final String token = _getApiToken();
final WebSocketLink webSocketLink = WebSocketLink(
'ws://api.$rootAddress/graphql',
config: SocketClientConfig(
autoReconnect: true,
headers: token.isEmpty ? null : {'Authorization': 'Bearer $token'},
),
);
return GraphQLClient(
cache: GraphQLCache(),
link: webSocketLink,
);
}
String _getApiToken() {
String token = '';
final serverDetails = getIt<ApiConfigModel>().serverDetails;
if (serverDetails != null) {
token = getIt<ApiConfigModel>().serverDetails!.apiToken;
}
return token;
}
abstract final String? rootAddress; abstract final String? rootAddress;
abstract final bool hasLogger; abstract final bool hasLogger;
abstract final bool isWithToken; abstract final bool isWithToken;

View File

@ -1,4 +1,10 @@
query GetServerDiskVolumesQuery { fragment basicMutationReturnFields on MutationReturnInterface{
code
message
success
}
query GetServerDiskVolumes {
storage { storage {
volumes { volumes {
freeSpace freeSpace
@ -8,31 +14,56 @@ query GetServerDiskVolumesQuery {
serial serial
totalSpace totalSpace
type type
usages {
title
usedSpace
__typename
... on ServiceStorageUsage {
service {
id
isMovable
displayName
}
}
}
usedSpace usedSpace
} }
} }
} }
mutation MountVolumeMutation($name: String!) { mutation MountVolume($name: String!) {
mountVolume(name: $name) { mountVolume(name: $name) {
code ...basicMutationReturnFields
message
success
} }
} }
mutation ResizeVolumeMutation($name: String!) { mutation ResizeVolume($name: String!) {
resizeVolume(name: $name) { resizeVolume(name: $name) {
code ...basicMutationReturnFields
message
success
} }
} }
mutation UnmountVolumeMutation($name: String!) { mutation UnmountVolume($name: String!) {
unmountVolume(name: $name) { unmountVolume(name: $name) {
code ...basicMutationReturnFields
message
success
} }
} }
mutation MigrateToBinds($input: MigrateToBindsInput!) {
migrateToBinds(input: $input) {
...basicMutationReturnFields
job {
createdAt
description
error
finishedAt
name
progress
result
status
statusText
uid
updatedAt
}
}
}

View File

@ -6,57 +6,78 @@ part of 'disk_volumes.graphql.dart';
// JsonSerializableGenerator // JsonSerializableGenerator
// ************************************************************************** // **************************************************************************
Query$GetServerDiskVolumesQuery _$Query$GetServerDiskVolumesQueryFromJson( Fragment$basicMutationReturnFields _$Fragment$basicMutationReturnFieldsFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetServerDiskVolumesQuery( Fragment$basicMutationReturnFields(
storage: Query$GetServerDiskVolumesQuery$storage.fromJson( code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Fragment$basicMutationReturnFieldsToJson(
Fragment$basicMutationReturnFields instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Query$GetServerDiskVolumes _$Query$GetServerDiskVolumesFromJson(
Map<String, dynamic> json) =>
Query$GetServerDiskVolumes(
storage: Query$GetServerDiskVolumes$storage.fromJson(
json['storage'] as Map<String, dynamic>), json['storage'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetServerDiskVolumesQueryToJson( Map<String, dynamic> _$Query$GetServerDiskVolumesToJson(
Query$GetServerDiskVolumesQuery instance) => Query$GetServerDiskVolumes instance) =>
<String, dynamic>{ <String, dynamic>{
'storage': instance.storage.toJson(), 'storage': instance.storage.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetServerDiskVolumesQuery$storage Query$GetServerDiskVolumes$storage _$Query$GetServerDiskVolumes$storageFromJson(
_$Query$GetServerDiskVolumesQuery$storageFromJson( Map<String, dynamic> json) =>
Map<String, dynamic> json) => Query$GetServerDiskVolumes$storage(
Query$GetServerDiskVolumesQuery$storage( volumes: (json['volumes'] as List<dynamic>)
volumes: (json['volumes'] as List<dynamic>) .map((e) => Query$GetServerDiskVolumes$storage$volumes.fromJson(
.map((e) => e as Map<String, dynamic>))
Query$GetServerDiskVolumesQuery$storage$volumes.fromJson( .toList(),
e as Map<String, dynamic>)) $__typename: json['__typename'] as String,
.toList(), );
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetServerDiskVolumesQuery$storageToJson( Map<String, dynamic> _$Query$GetServerDiskVolumes$storageToJson(
Query$GetServerDiskVolumesQuery$storage instance) => Query$GetServerDiskVolumes$storage instance) =>
<String, dynamic>{ <String, dynamic>{
'volumes': instance.volumes.map((e) => e.toJson()).toList(), 'volumes': instance.volumes.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetServerDiskVolumesQuery$storage$volumes Query$GetServerDiskVolumes$storage$volumes
_$Query$GetServerDiskVolumesQuery$storage$volumesFromJson( _$Query$GetServerDiskVolumes$storage$volumesFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetServerDiskVolumesQuery$storage$volumes( Query$GetServerDiskVolumes$storage$volumes(
freeSpace: json['freeSpace'] as String, freeSpace: json['freeSpace'] as String,
model: json['model'] as String, model: json['model'] as String?,
name: json['name'] as String, name: json['name'] as String,
root: json['root'] as bool, root: json['root'] as bool,
serial: json['serial'] as String, serial: json['serial'] as String?,
totalSpace: json['totalSpace'] as String, totalSpace: json['totalSpace'] as String,
type: json['type'] as String, type: json['type'] as String,
usages: (json['usages'] as List<dynamic>)
.map((e) =>
Query$GetServerDiskVolumes$storage$volumes$usages.fromJson(
e as Map<String, dynamic>))
.toList(),
usedSpace: json['usedSpace'] as String, usedSpace: json['usedSpace'] as String,
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetServerDiskVolumesQuery$storage$volumesToJson( Map<String, dynamic> _$Query$GetServerDiskVolumes$storage$volumesToJson(
Query$GetServerDiskVolumesQuery$storage$volumes instance) => Query$GetServerDiskVolumes$storage$volumes instance) =>
<String, dynamic>{ <String, dynamic>{
'freeSpace': instance.freeSpace, 'freeSpace': instance.freeSpace,
'model': instance.model, 'model': instance.model,
@ -65,50 +86,111 @@ Map<String, dynamic> _$Query$GetServerDiskVolumesQuery$storage$volumesToJson(
'serial': instance.serial, 'serial': instance.serial,
'totalSpace': instance.totalSpace, 'totalSpace': instance.totalSpace,
'type': instance.type, 'type': instance.type,
'usages': instance.usages.map((e) => e.toJson()).toList(),
'usedSpace': instance.usedSpace, 'usedSpace': instance.usedSpace,
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Variables$Mutation$MountVolumeMutation Query$GetServerDiskVolumes$storage$volumes$usages
_$Variables$Mutation$MountVolumeMutationFromJson( _$Query$GetServerDiskVolumes$storage$volumes$usagesFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Variables$Mutation$MountVolumeMutation( Query$GetServerDiskVolumes$storage$volumes$usages(
name: json['name'] as String, title: json['title'] as String,
usedSpace: json['usedSpace'] as String,
$__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Variables$Mutation$MountVolumeMutationToJson( Map<String, dynamic> _$Query$GetServerDiskVolumes$storage$volumes$usagesToJson(
Variables$Mutation$MountVolumeMutation instance) => Query$GetServerDiskVolumes$storage$volumes$usages instance) =>
<String, dynamic>{
'title': instance.title,
'usedSpace': instance.usedSpace,
'__typename': instance.$__typename,
};
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage
_$Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsageFromJson(
Map<String, dynamic> json) =>
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage(
title: json['title'] as String,
usedSpace: json['usedSpace'] as String,
$__typename: json['__typename'] as String,
service: json['service'] == null
? null
: Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$service
.fromJson(json['service'] as Map<String, dynamic>),
);
Map<String, dynamic>
_$Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsageToJson(
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage
instance) =>
<String, dynamic>{
'title': instance.title,
'usedSpace': instance.usedSpace,
'__typename': instance.$__typename,
'service': instance.service?.toJson(),
};
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$service
_$Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$serviceFromJson(
Map<String, dynamic> json) =>
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$service(
id: json['id'] as String,
isMovable: json['isMovable'] as bool,
displayName: json['displayName'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic>
_$Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$serviceToJson(
Query$GetServerDiskVolumes$storage$volumes$usages$$ServiceStorageUsage$service
instance) =>
<String, dynamic>{
'id': instance.id,
'isMovable': instance.isMovable,
'displayName': instance.displayName,
'__typename': instance.$__typename,
};
Variables$Mutation$MountVolume _$Variables$Mutation$MountVolumeFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$MountVolume(
name: json['name'] as String,
);
Map<String, dynamic> _$Variables$Mutation$MountVolumeToJson(
Variables$Mutation$MountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'name': instance.name, 'name': instance.name,
}; };
Mutation$MountVolumeMutation _$Mutation$MountVolumeMutationFromJson( Mutation$MountVolume _$Mutation$MountVolumeFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Mutation$MountVolumeMutation( Mutation$MountVolume(
mountVolume: Mutation$MountVolumeMutation$mountVolume.fromJson( mountVolume: Mutation$MountVolume$mountVolume.fromJson(
json['mountVolume'] as Map<String, dynamic>), json['mountVolume'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Mutation$MountVolumeMutationToJson( Map<String, dynamic> _$Mutation$MountVolumeToJson(
Mutation$MountVolumeMutation instance) => Mutation$MountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'mountVolume': instance.mountVolume.toJson(), 'mountVolume': instance.mountVolume.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Mutation$MountVolumeMutation$mountVolume Mutation$MountVolume$mountVolume _$Mutation$MountVolume$mountVolumeFromJson(
_$Mutation$MountVolumeMutation$mountVolumeFromJson( Map<String, dynamic> json) =>
Map<String, dynamic> json) => Mutation$MountVolume$mountVolume(
Mutation$MountVolumeMutation$mountVolume( code: json['code'] as int,
code: json['code'] as int, message: json['message'] as String,
message: json['message'] as String, success: json['success'] as bool,
success: json['success'] as bool, $__typename: json['__typename'] as String,
$__typename: json['__typename'] as String, );
);
Map<String, dynamic> _$Mutation$MountVolumeMutation$mountVolumeToJson( Map<String, dynamic> _$Mutation$MountVolume$mountVolumeToJson(
Mutation$MountVolumeMutation$mountVolume instance) => Mutation$MountVolume$mountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'code': instance.code, 'code': instance.code,
'message': instance.message, 'message': instance.message,
@ -116,46 +198,44 @@ Map<String, dynamic> _$Mutation$MountVolumeMutation$mountVolumeToJson(
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Variables$Mutation$ResizeVolumeMutation Variables$Mutation$ResizeVolume _$Variables$Mutation$ResizeVolumeFromJson(
_$Variables$Mutation$ResizeVolumeMutationFromJson( Map<String, dynamic> json) =>
Map<String, dynamic> json) => Variables$Mutation$ResizeVolume(
Variables$Mutation$ResizeVolumeMutation( name: json['name'] as String,
name: json['name'] as String, );
);
Map<String, dynamic> _$Variables$Mutation$ResizeVolumeMutationToJson( Map<String, dynamic> _$Variables$Mutation$ResizeVolumeToJson(
Variables$Mutation$ResizeVolumeMutation instance) => Variables$Mutation$ResizeVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'name': instance.name, 'name': instance.name,
}; };
Mutation$ResizeVolumeMutation _$Mutation$ResizeVolumeMutationFromJson( Mutation$ResizeVolume _$Mutation$ResizeVolumeFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Mutation$ResizeVolumeMutation( Mutation$ResizeVolume(
resizeVolume: Mutation$ResizeVolumeMutation$resizeVolume.fromJson( resizeVolume: Mutation$ResizeVolume$resizeVolume.fromJson(
json['resizeVolume'] as Map<String, dynamic>), json['resizeVolume'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Mutation$ResizeVolumeMutationToJson( Map<String, dynamic> _$Mutation$ResizeVolumeToJson(
Mutation$ResizeVolumeMutation instance) => Mutation$ResizeVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'resizeVolume': instance.resizeVolume.toJson(), 'resizeVolume': instance.resizeVolume.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Mutation$ResizeVolumeMutation$resizeVolume Mutation$ResizeVolume$resizeVolume _$Mutation$ResizeVolume$resizeVolumeFromJson(
_$Mutation$ResizeVolumeMutation$resizeVolumeFromJson( Map<String, dynamic> json) =>
Map<String, dynamic> json) => Mutation$ResizeVolume$resizeVolume(
Mutation$ResizeVolumeMutation$resizeVolume( code: json['code'] as int,
code: json['code'] as int, message: json['message'] as String,
message: json['message'] as String, success: json['success'] as bool,
success: json['success'] as bool, $__typename: json['__typename'] as String,
$__typename: json['__typename'] as String, );
);
Map<String, dynamic> _$Mutation$ResizeVolumeMutation$resizeVolumeToJson( Map<String, dynamic> _$Mutation$ResizeVolume$resizeVolumeToJson(
Mutation$ResizeVolumeMutation$resizeVolume instance) => Mutation$ResizeVolume$resizeVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'code': instance.code, 'code': instance.code,
'message': instance.message, 'message': instance.message,
@ -163,49 +243,134 @@ Map<String, dynamic> _$Mutation$ResizeVolumeMutation$resizeVolumeToJson(
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Variables$Mutation$UnmountVolumeMutation Variables$Mutation$UnmountVolume _$Variables$Mutation$UnmountVolumeFromJson(
_$Variables$Mutation$UnmountVolumeMutationFromJson( Map<String, dynamic> json) =>
Map<String, dynamic> json) => Variables$Mutation$UnmountVolume(
Variables$Mutation$UnmountVolumeMutation( name: json['name'] as String,
name: json['name'] as String, );
);
Map<String, dynamic> _$Variables$Mutation$UnmountVolumeMutationToJson( Map<String, dynamic> _$Variables$Mutation$UnmountVolumeToJson(
Variables$Mutation$UnmountVolumeMutation instance) => Variables$Mutation$UnmountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'name': instance.name, 'name': instance.name,
}; };
Mutation$UnmountVolumeMutation _$Mutation$UnmountVolumeMutationFromJson( Mutation$UnmountVolume _$Mutation$UnmountVolumeFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Mutation$UnmountVolumeMutation( Mutation$UnmountVolume(
unmountVolume: Mutation$UnmountVolumeMutation$unmountVolume.fromJson( unmountVolume: Mutation$UnmountVolume$unmountVolume.fromJson(
json['unmountVolume'] as Map<String, dynamic>), json['unmountVolume'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Mutation$UnmountVolumeMutationToJson( Map<String, dynamic> _$Mutation$UnmountVolumeToJson(
Mutation$UnmountVolumeMutation instance) => Mutation$UnmountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'unmountVolume': instance.unmountVolume.toJson(), 'unmountVolume': instance.unmountVolume.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Mutation$UnmountVolumeMutation$unmountVolume Mutation$UnmountVolume$unmountVolume
_$Mutation$UnmountVolumeMutation$unmountVolumeFromJson( _$Mutation$UnmountVolume$unmountVolumeFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> json) => Mutation$UnmountVolume$unmountVolume(
Mutation$UnmountVolumeMutation$unmountVolume(
code: json['code'] as int, code: json['code'] as int,
message: json['message'] as String, message: json['message'] as String,
success: json['success'] as bool, success: json['success'] as bool,
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Mutation$UnmountVolumeMutation$unmountVolumeToJson( Map<String, dynamic> _$Mutation$UnmountVolume$unmountVolumeToJson(
Mutation$UnmountVolumeMutation$unmountVolume instance) => Mutation$UnmountVolume$unmountVolume instance) =>
<String, dynamic>{ <String, dynamic>{
'code': instance.code, 'code': instance.code,
'message': instance.message, 'message': instance.message,
'success': instance.success, 'success': instance.success,
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Variables$Mutation$MigrateToBinds _$Variables$Mutation$MigrateToBindsFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$MigrateToBinds(
input: Input$MigrateToBindsInput.fromJson(
json['input'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$MigrateToBindsToJson(
Variables$Mutation$MigrateToBinds instance) =>
<String, dynamic>{
'input': instance.input.toJson(),
};
Mutation$MigrateToBinds _$Mutation$MigrateToBindsFromJson(
Map<String, dynamic> json) =>
Mutation$MigrateToBinds(
migrateToBinds: Mutation$MigrateToBinds$migrateToBinds.fromJson(
json['migrateToBinds'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$MigrateToBindsToJson(
Mutation$MigrateToBinds instance) =>
<String, dynamic>{
'migrateToBinds': instance.migrateToBinds.toJson(),
'__typename': instance.$__typename,
};
Mutation$MigrateToBinds$migrateToBinds
_$Mutation$MigrateToBinds$migrateToBindsFromJson(
Map<String, dynamic> json) =>
Mutation$MigrateToBinds$migrateToBinds(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
job: json['job'] == null
? null
: Mutation$MigrateToBinds$migrateToBinds$job.fromJson(
json['job'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$MigrateToBinds$migrateToBindsToJson(
Mutation$MigrateToBinds$migrateToBinds instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'job': instance.job?.toJson(),
};
Mutation$MigrateToBinds$migrateToBinds$job
_$Mutation$MigrateToBinds$migrateToBinds$jobFromJson(
Map<String, dynamic> json) =>
Mutation$MigrateToBinds$migrateToBinds$job(
createdAt: dateTimeFromJson(json['createdAt']),
description: json['description'] as String,
error: json['error'] as String?,
finishedAt: _nullable$dateTimeFromJson(json['finishedAt']),
name: json['name'] as String,
progress: json['progress'] as int?,
result: json['result'] as String?,
status: json['status'] as String,
statusText: json['statusText'] as String?,
uid: json['uid'] as String,
updatedAt: dateTimeFromJson(json['updatedAt']),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$MigrateToBinds$migrateToBinds$jobToJson(
Mutation$MigrateToBinds$migrateToBinds$job instance) =>
<String, dynamic>{
'createdAt': dateTimeToJson(instance.createdAt),
'description': instance.description,
'error': instance.error,
'finishedAt': _nullable$dateTimeToJson(instance.finishedAt),
'name': instance.name,
'progress': instance.progress,
'result': instance.result,
'status': instance.status,
'statusText': instance.statusText,
'uid': instance.uid,
'updatedAt': dateTimeToJson(instance.updatedAt),
'__typename': instance.$__typename,
};

View File

@ -1,63 +1,76 @@
scalar DateTime
type Alert { type Alert {
severity: Severity!
title: String!
message: String! message: String!
severity: Severity!
timestamp: DateTime timestamp: DateTime
} title: String!
type StorageVolume {
freeSpace: String!
model: String!
name: String!
root: Boolean!
serial: String!
totalSpace: String!
type: String!
usedSpace: String!
}
type Storage {
volumes: [StorageVolume!]!
} }
type Api { type Api {
version: String!
devices: [ApiDevice!]! devices: [ApiDevice!]!
recoveryKey: ApiRecoveryKeyStatus! recoveryKey: ApiRecoveryKeyStatus!
version: String!
} }
type ApiDevice { type ApiDevice {
name: String!
creationDate: DateTime! creationDate: DateTime!
isCaller: Boolean! isCaller: Boolean!
name: String!
}
type ApiJob {
createdAt: DateTime!
description: String!
error: String
finishedAt: DateTime
name: String!
progress: Int
result: String
status: String!
statusText: String
uid: String!
updatedAt: DateTime!
} }
type ApiKeyMutationReturn implements MutationReturnInterface { type ApiKeyMutationReturn implements MutationReturnInterface {
success: Boolean!
message: String!
code: Int! code: Int!
key: String key: String
message: String!
success: Boolean!
} }
type ApiRecoveryKeyStatus { type ApiRecoveryKeyStatus {
exists: Boolean!
valid: Boolean!
creationDate: DateTime creationDate: DateTime
exists: Boolean!
expirationDate: DateTime expirationDate: DateTime
usesLeft: Int usesLeft: Int
valid: Boolean!
} }
type AutoUpgradeOptions { type AutoUpgradeOptions {
enable: Boolean!
allowReboot: Boolean! allowReboot: Boolean!
enable: Boolean!
} }
type DeviceApiTokenMutationReturn implements MutationReturnInterface { input AutoUpgradeSettingsInput {
success: Boolean! enableAutoUpgrade: Boolean = null
message: String! allowReboot: Boolean = null
}
type AutoUpgradeSettingsMutationReturn implements MutationReturnInterface {
allowReboot: Boolean!
code: Int! code: Int!
enableAutoUpgrade: Boolean!
message: String!
success: Boolean!
}
"""Date with time (isoformat)"""
scalar DateTime
type DeviceApiTokenMutationReturn implements MutationReturnInterface {
code: Int!
message: String!
success: Boolean!
token: String token: String
} }
@ -66,59 +79,163 @@ enum DnsProvider {
} }
type DnsRecord { type DnsRecord {
recordType: String!
name: String!
content: String! content: String!
ttl: Int! name: String!
priority: Int priority: Int
recordType: String!
ttl: Int!
}
type GenericJobButationReturn implements MutationReturnInterface {
code: Int!
job: ApiJob
message: String!
success: Boolean!
} }
type GenericMutationReturn implements MutationReturnInterface { type GenericMutationReturn implements MutationReturnInterface {
success: Boolean!
message: String!
code: Int! code: Int!
message: String!
success: Boolean!
}
type Job {
getJob(jobId: String!): ApiJob
getJobs: [ApiJob!]!
}
input MigrateToBindsInput {
emailBlockDevice: String!
bitwardenBlockDevice: String!
giteaBlockDevice: String!
nextcloudBlockDevice: String!
pleromaBlockDevice: String!
}
input MoveServiceInput {
serviceId: String!
location: String!
} }
type Mutation { type Mutation {
getNewRecoveryApiKey(limits: RecoveryKeyLimitsInput!): ApiKeyMutationReturn! addSshKey(sshInput: SshMutationInput!): UserMutationReturn!
useRecoveryApiKey(input: UseRecoveryKeyInput!): DeviceApiTokenMutationReturn!
refreshDeviceApiToken: DeviceApiTokenMutationReturn!
deleteDeviceApiToken(device: String!): GenericMutationReturn!
getNewDeviceApiKey: ApiKeyMutationReturn!
invalidateNewDeviceApiKey: GenericMutationReturn!
authorizeWithNewDeviceApiKey(input: UseNewDeviceKeyInput!): DeviceApiTokenMutationReturn! authorizeWithNewDeviceApiKey(input: UseNewDeviceKeyInput!): DeviceApiTokenMutationReturn!
resizeVolume(name: String!): GenericMutationReturn! changeAutoUpgradeSettings(settings: AutoUpgradeSettingsInput!): AutoUpgradeSettingsMutationReturn!
unmountVolume(name: String!): GenericMutationReturn! changeTimezone(timezone: String!): TimezoneMutationReturn!
createUser(user: UserMutationInput!): UserMutationReturn!
deleteDeviceApiToken(device: String!): GenericMutationReturn!
deleteUser(username: String!): GenericMutationReturn!
disableService(serviceId: String!): ServiceMutationReturn!
enableService(serviceId: String!): ServiceMutationReturn!
getNewDeviceApiKey: ApiKeyMutationReturn!
getNewRecoveryApiKey(limits: RecoveryKeyLimitsInput = null): ApiKeyMutationReturn!
invalidateNewDeviceApiKey: GenericMutationReturn!
migrateToBinds(input: MigrateToBindsInput!): GenericJobButationReturn!
mountVolume(name: String!): GenericMutationReturn! mountVolume(name: String!): GenericMutationReturn!
moveService(input: MoveServiceInput!): ServiceJobMutationReturn!
pullRepositoryChanges: GenericMutationReturn!
rebootSystem: GenericMutationReturn!
refreshDeviceApiToken: DeviceApiTokenMutationReturn!
removeJob(jobId: String!): GenericMutationReturn!
removeSshKey(sshInput: SshMutationInput!): UserMutationReturn!
resizeVolume(name: String!): GenericMutationReturn!
restartService(serviceId: String!): ServiceMutationReturn!
runSystemRebuild: GenericMutationReturn!
runSystemRollback: GenericMutationReturn!
runSystemUpgrade: GenericMutationReturn!
startService(serviceId: String!): ServiceMutationReturn!
stopService(serviceId: String!): ServiceMutationReturn!
testMutation: GenericMutationReturn!
unmountVolume(name: String!): GenericMutationReturn!
updateUser(user: UserMutationInput!): UserMutationReturn!
useRecoveryApiKey(input: UseRecoveryKeyInput!): DeviceApiTokenMutationReturn!
} }
interface MutationReturnInterface { interface MutationReturnInterface {
success: Boolean!
message: String!
code: Int! code: Int!
message: String!
success: Boolean!
} }
type Query { type Query {
system: System!
storage: Storage!
api: Api! api: Api!
jobs: Job!
services: Services!
storage: Storage!
system: System!
users: Users!
} }
input RecoveryKeyLimitsInput { input RecoveryKeyLimitsInput {
expirationDate: DateTime expirationDate: DateTime = null
uses: Int uses: Int = null
} }
enum ServerProvider { enum ServerProvider {
HETZNER HETZNER
} }
type Service {
description: String!
displayName: String!
dnsRecords: [DnsRecord!]
id: String!
isEnabled: Boolean!
isMovable: Boolean!
isRequired: Boolean!
status: ServiceStatusEnum!
storageUsage: ServiceStorageUsage!
svgIcon: String!
url: String
}
type ServiceJobMutationReturn implements MutationReturnInterface {
code: Int!
job: ApiJob
message: String!
service: Service
success: Boolean!
}
type ServiceMutationReturn implements MutationReturnInterface {
code: Int!
message: String!
service: Service
success: Boolean!
}
enum ServiceStatusEnum {
ACTIVATING
ACTIVE
DEACTIVATING
FAILED
INACTIVE
OFF
RELOADING
}
type ServiceStorageUsage implements StorageUsageInterface {
service: Service
title: String!
usedSpace: String!
volume: StorageVolume
}
type Services {
allServices: [Service!]!
}
enum Severity { enum Severity {
INFO
WARNING
ERROR
CRITICAL CRITICAL
ERROR
INFO
SUCCESS SUCCESS
WARNING
}
input SshMutationInput {
username: String!
sshKey: String!
} }
type SshSettings { type SshSettings {
@ -127,13 +244,40 @@ type SshSettings {
rootSshKeys: [String!]! rootSshKeys: [String!]!
} }
type Storage {
volumes: [StorageVolume!]!
}
interface StorageUsageInterface {
title: String!
usedSpace: String!
volume: StorageVolume
}
type StorageVolume {
freeSpace: String!
model: String
name: String!
root: Boolean!
serial: String
totalSpace: String!
type: String!
usages: [StorageUsageInterface!]!
usedSpace: String!
}
type Subscription {
count(target: Int! = 100): Int!
}
type System { type System {
status: Alert! busy: Boolean!
domain: SystemDomainInfo! domainInfo: SystemDomainInfo!
settings: SystemSettings!
info: SystemInfo! info: SystemInfo!
provider: SystemProviderInfo! provider: SystemProviderInfo!
busy: Boolean! settings: SystemSettings!
status: Alert!
workingDirectory: String!
} }
type SystemDomainInfo { type SystemDomainInfo {
@ -144,13 +288,14 @@ type SystemDomainInfo {
} }
type SystemInfo { type SystemInfo {
systemVersion: String!
pythonVersion: String! pythonVersion: String!
systemVersion: String!
usingBinds: Boolean!
} }
type SystemProviderInfo { type SystemProviderInfo {
provider: ServerProvider!
id: String! id: String!
provider: ServerProvider!
} }
type SystemSettings { type SystemSettings {
@ -159,6 +304,13 @@ type SystemSettings {
timezone: String! timezone: String!
} }
type TimezoneMutationReturn implements MutationReturnInterface {
code: Int!
message: String!
success: Boolean!
timezone: String
}
input UseNewDeviceKeyInput { input UseNewDeviceKeyInput {
key: String! key: String!
deviceName: String! deviceName: String!
@ -167,4 +319,33 @@ input UseNewDeviceKeyInput {
input UseRecoveryKeyInput { input UseRecoveryKeyInput {
key: String! key: String!
deviceName: String! deviceName: String!
}
type User {
sshKeys: [String!]!
userType: UserType!
username: String!
}
input UserMutationInput {
username: String!
password: String!
}
type UserMutationReturn implements MutationReturnInterface {
code: Int!
message: String!
success: Boolean!
user: User
}
enum UserType {
NORMAL
PRIMARY
ROOT
}
type Users {
allUsers: [User!]!
getUser(username: String!): User
} }

View File

@ -2,6 +2,174 @@ import 'package:json_annotation/json_annotation.dart';
import 'package:selfprivacy/utils/scalars.dart'; import 'package:selfprivacy/utils/scalars.dart';
part 'schema.graphql.g.dart'; part 'schema.graphql.g.dart';
@JsonSerializable(explicitToJson: true)
class Input$AutoUpgradeSettingsInput {
Input$AutoUpgradeSettingsInput({this.enableAutoUpgrade, this.allowReboot});
@override
factory Input$AutoUpgradeSettingsInput.fromJson(Map<String, dynamic> json) =>
_$Input$AutoUpgradeSettingsInputFromJson(json);
final bool? enableAutoUpgrade;
final bool? allowReboot;
Map<String, dynamic> toJson() => _$Input$AutoUpgradeSettingsInputToJson(this);
int get hashCode {
final l$enableAutoUpgrade = enableAutoUpgrade;
final l$allowReboot = allowReboot;
return Object.hashAll([l$enableAutoUpgrade, l$allowReboot]);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (!(other is Input$AutoUpgradeSettingsInput) ||
runtimeType != other.runtimeType) return false;
final l$enableAutoUpgrade = enableAutoUpgrade;
final lOther$enableAutoUpgrade = other.enableAutoUpgrade;
if (l$enableAutoUpgrade != lOther$enableAutoUpgrade) return false;
final l$allowReboot = allowReboot;
final lOther$allowReboot = other.allowReboot;
if (l$allowReboot != lOther$allowReboot) return false;
return true;
}
Input$AutoUpgradeSettingsInput copyWith(
{bool? Function()? enableAutoUpgrade,
bool? Function()? allowReboot}) =>
Input$AutoUpgradeSettingsInput(
enableAutoUpgrade: enableAutoUpgrade == null
? this.enableAutoUpgrade
: enableAutoUpgrade(),
allowReboot: allowReboot == null ? this.allowReboot : allowReboot());
}
@JsonSerializable(explicitToJson: true)
class Input$MigrateToBindsInput {
Input$MigrateToBindsInput(
{required this.emailBlockDevice,
required this.bitwardenBlockDevice,
required this.giteaBlockDevice,
required this.nextcloudBlockDevice,
required this.pleromaBlockDevice});
@override
factory Input$MigrateToBindsInput.fromJson(Map<String, dynamic> json) =>
_$Input$MigrateToBindsInputFromJson(json);
final String emailBlockDevice;
final String bitwardenBlockDevice;
final String giteaBlockDevice;
final String nextcloudBlockDevice;
final String pleromaBlockDevice;
Map<String, dynamic> toJson() => _$Input$MigrateToBindsInputToJson(this);
int get hashCode {
final l$emailBlockDevice = emailBlockDevice;
final l$bitwardenBlockDevice = bitwardenBlockDevice;
final l$giteaBlockDevice = giteaBlockDevice;
final l$nextcloudBlockDevice = nextcloudBlockDevice;
final l$pleromaBlockDevice = pleromaBlockDevice;
return Object.hashAll([
l$emailBlockDevice,
l$bitwardenBlockDevice,
l$giteaBlockDevice,
l$nextcloudBlockDevice,
l$pleromaBlockDevice
]);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (!(other is Input$MigrateToBindsInput) ||
runtimeType != other.runtimeType) return false;
final l$emailBlockDevice = emailBlockDevice;
final lOther$emailBlockDevice = other.emailBlockDevice;
if (l$emailBlockDevice != lOther$emailBlockDevice) return false;
final l$bitwardenBlockDevice = bitwardenBlockDevice;
final lOther$bitwardenBlockDevice = other.bitwardenBlockDevice;
if (l$bitwardenBlockDevice != lOther$bitwardenBlockDevice) return false;
final l$giteaBlockDevice = giteaBlockDevice;
final lOther$giteaBlockDevice = other.giteaBlockDevice;
if (l$giteaBlockDevice != lOther$giteaBlockDevice) return false;
final l$nextcloudBlockDevice = nextcloudBlockDevice;
final lOther$nextcloudBlockDevice = other.nextcloudBlockDevice;
if (l$nextcloudBlockDevice != lOther$nextcloudBlockDevice) return false;
final l$pleromaBlockDevice = pleromaBlockDevice;
final lOther$pleromaBlockDevice = other.pleromaBlockDevice;
if (l$pleromaBlockDevice != lOther$pleromaBlockDevice) return false;
return true;
}
Input$MigrateToBindsInput copyWith(
{String? emailBlockDevice,
String? bitwardenBlockDevice,
String? giteaBlockDevice,
String? nextcloudBlockDevice,
String? pleromaBlockDevice}) =>
Input$MigrateToBindsInput(
emailBlockDevice: emailBlockDevice == null
? this.emailBlockDevice
: emailBlockDevice,
bitwardenBlockDevice: bitwardenBlockDevice == null
? this.bitwardenBlockDevice
: bitwardenBlockDevice,
giteaBlockDevice: giteaBlockDevice == null
? this.giteaBlockDevice
: giteaBlockDevice,
nextcloudBlockDevice: nextcloudBlockDevice == null
? this.nextcloudBlockDevice
: nextcloudBlockDevice,
pleromaBlockDevice: pleromaBlockDevice == null
? this.pleromaBlockDevice
: pleromaBlockDevice);
}
@JsonSerializable(explicitToJson: true)
class Input$MoveServiceInput {
Input$MoveServiceInput({required this.serviceId, required this.location});
@override
factory Input$MoveServiceInput.fromJson(Map<String, dynamic> json) =>
_$Input$MoveServiceInputFromJson(json);
final String serviceId;
final String location;
Map<String, dynamic> toJson() => _$Input$MoveServiceInputToJson(this);
int get hashCode {
final l$serviceId = serviceId;
final l$location = location;
return Object.hashAll([l$serviceId, l$location]);
}
@override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (!(other is Input$MoveServiceInput) || runtimeType != other.runtimeType)
return false;
final l$serviceId = serviceId;
final lOther$serviceId = other.serviceId;
if (l$serviceId != lOther$serviceId) return false;
final l$location = location;
final lOther$location = other.location;
if (l$location != lOther$location) return false;
return true;
}
Input$MoveServiceInput copyWith({String? serviceId, String? location}) =>
Input$MoveServiceInput(
serviceId: serviceId == null ? this.serviceId : serviceId,
location: location == null ? this.location : location);
}
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
class Input$RecoveryKeyLimitsInput { class Input$RecoveryKeyLimitsInput {
Input$RecoveryKeyLimitsInput({this.expirationDate, this.uses}); Input$RecoveryKeyLimitsInput({this.expirationDate, this.uses});
@ -37,47 +205,51 @@ class Input$RecoveryKeyLimitsInput {
return true; return true;
} }
CopyWith$Input$RecoveryKeyLimitsInput<Input$RecoveryKeyLimitsInput> Input$RecoveryKeyLimitsInput copyWith(
get copyWith => CopyWith$Input$RecoveryKeyLimitsInput(this, (i) => i); {DateTime? Function()? expirationDate, int? Function()? uses}) =>
Input$RecoveryKeyLimitsInput(
expirationDate:
expirationDate == null ? this.expirationDate : expirationDate(),
uses: uses == null ? this.uses : uses());
} }
abstract class CopyWith$Input$RecoveryKeyLimitsInput<TRes> { @JsonSerializable(explicitToJson: true)
factory CopyWith$Input$RecoveryKeyLimitsInput( class Input$SshMutationInput {
Input$RecoveryKeyLimitsInput instance, Input$SshMutationInput({required this.username, required this.sshKey});
TRes Function(Input$RecoveryKeyLimitsInput) then) =
_CopyWithImpl$Input$RecoveryKeyLimitsInput;
factory CopyWith$Input$RecoveryKeyLimitsInput.stub(TRes res) = @override
_CopyWithStubImpl$Input$RecoveryKeyLimitsInput; factory Input$SshMutationInput.fromJson(Map<String, dynamic> json) =>
_$Input$SshMutationInputFromJson(json);
TRes call({DateTime? expirationDate, int? uses}); final String username;
}
class _CopyWithImpl$Input$RecoveryKeyLimitsInput<TRes> final String sshKey;
implements CopyWith$Input$RecoveryKeyLimitsInput<TRes> {
_CopyWithImpl$Input$RecoveryKeyLimitsInput(this._instance, this._then);
final Input$RecoveryKeyLimitsInput _instance; Map<String, dynamic> toJson() => _$Input$SshMutationInputToJson(this);
int get hashCode {
final l$username = username;
final l$sshKey = sshKey;
return Object.hashAll([l$username, l$sshKey]);
}
final TRes Function(Input$RecoveryKeyLimitsInput) _then; @override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (!(other is Input$SshMutationInput) || runtimeType != other.runtimeType)
return false;
final l$username = username;
final lOther$username = other.username;
if (l$username != lOther$username) return false;
final l$sshKey = sshKey;
final lOther$sshKey = other.sshKey;
if (l$sshKey != lOther$sshKey) return false;
return true;
}
static const _undefined = {}; Input$SshMutationInput copyWith({String? username, String? sshKey}) =>
Input$SshMutationInput(
TRes call({Object? expirationDate = _undefined, Object? uses = _undefined}) => username: username == null ? this.username : username,
_then(Input$RecoveryKeyLimitsInput( sshKey: sshKey == null ? this.sshKey : sshKey);
expirationDate: expirationDate == _undefined
? _instance.expirationDate
: (expirationDate as DateTime?),
uses: uses == _undefined ? _instance.uses : (uses as int?)));
}
class _CopyWithStubImpl$Input$RecoveryKeyLimitsInput<TRes>
implements CopyWith$Input$RecoveryKeyLimitsInput<TRes> {
_CopyWithStubImpl$Input$RecoveryKeyLimitsInput(this._res);
TRes _res;
call({DateTime? expirationDate, int? uses}) => _res;
} }
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
@ -113,49 +285,10 @@ class Input$UseNewDeviceKeyInput {
return true; return true;
} }
CopyWith$Input$UseNewDeviceKeyInput<Input$UseNewDeviceKeyInput> Input$UseNewDeviceKeyInput copyWith({String? key, String? deviceName}) =>
get copyWith => CopyWith$Input$UseNewDeviceKeyInput(this, (i) => i); Input$UseNewDeviceKeyInput(
} key: key == null ? this.key : key,
deviceName: deviceName == null ? this.deviceName : deviceName);
abstract class CopyWith$Input$UseNewDeviceKeyInput<TRes> {
factory CopyWith$Input$UseNewDeviceKeyInput(
Input$UseNewDeviceKeyInput instance,
TRes Function(Input$UseNewDeviceKeyInput) then) =
_CopyWithImpl$Input$UseNewDeviceKeyInput;
factory CopyWith$Input$UseNewDeviceKeyInput.stub(TRes res) =
_CopyWithStubImpl$Input$UseNewDeviceKeyInput;
TRes call({String? key, String? deviceName});
}
class _CopyWithImpl$Input$UseNewDeviceKeyInput<TRes>
implements CopyWith$Input$UseNewDeviceKeyInput<TRes> {
_CopyWithImpl$Input$UseNewDeviceKeyInput(this._instance, this._then);
final Input$UseNewDeviceKeyInput _instance;
final TRes Function(Input$UseNewDeviceKeyInput) _then;
static const _undefined = {};
TRes call({Object? key = _undefined, Object? deviceName = _undefined}) =>
_then(Input$UseNewDeviceKeyInput(
key: key == _undefined || key == null
? _instance.key
: (key as String),
deviceName: deviceName == _undefined || deviceName == null
? _instance.deviceName
: (deviceName as String)));
}
class _CopyWithStubImpl$Input$UseNewDeviceKeyInput<TRes>
implements CopyWith$Input$UseNewDeviceKeyInput<TRes> {
_CopyWithStubImpl$Input$UseNewDeviceKeyInput(this._res);
TRes _res;
call({String? key, String? deviceName}) => _res;
} }
@JsonSerializable(explicitToJson: true) @JsonSerializable(explicitToJson: true)
@ -191,48 +324,49 @@ class Input$UseRecoveryKeyInput {
return true; return true;
} }
CopyWith$Input$UseRecoveryKeyInput<Input$UseRecoveryKeyInput> get copyWith => Input$UseRecoveryKeyInput copyWith({String? key, String? deviceName}) =>
CopyWith$Input$UseRecoveryKeyInput(this, (i) => i); Input$UseRecoveryKeyInput(
key: key == null ? this.key : key,
deviceName: deviceName == null ? this.deviceName : deviceName);
} }
abstract class CopyWith$Input$UseRecoveryKeyInput<TRes> { @JsonSerializable(explicitToJson: true)
factory CopyWith$Input$UseRecoveryKeyInput(Input$UseRecoveryKeyInput instance, class Input$UserMutationInput {
TRes Function(Input$UseRecoveryKeyInput) then) = Input$UserMutationInput({required this.username, required this.password});
_CopyWithImpl$Input$UseRecoveryKeyInput;
factory CopyWith$Input$UseRecoveryKeyInput.stub(TRes res) = @override
_CopyWithStubImpl$Input$UseRecoveryKeyInput; factory Input$UserMutationInput.fromJson(Map<String, dynamic> json) =>
_$Input$UserMutationInputFromJson(json);
TRes call({String? key, String? deviceName}); final String username;
}
class _CopyWithImpl$Input$UseRecoveryKeyInput<TRes> final String password;
implements CopyWith$Input$UseRecoveryKeyInput<TRes> {
_CopyWithImpl$Input$UseRecoveryKeyInput(this._instance, this._then);
final Input$UseRecoveryKeyInput _instance; Map<String, dynamic> toJson() => _$Input$UserMutationInputToJson(this);
int get hashCode {
final l$username = username;
final l$password = password;
return Object.hashAll([l$username, l$password]);
}
final TRes Function(Input$UseRecoveryKeyInput) _then; @override
bool operator ==(Object other) {
if (identical(this, other)) return true;
if (!(other is Input$UserMutationInput) || runtimeType != other.runtimeType)
return false;
final l$username = username;
final lOther$username = other.username;
if (l$username != lOther$username) return false;
final l$password = password;
final lOther$password = other.password;
if (l$password != lOther$password) return false;
return true;
}
static const _undefined = {}; Input$UserMutationInput copyWith({String? username, String? password}) =>
Input$UserMutationInput(
TRes call({Object? key = _undefined, Object? deviceName = _undefined}) => username: username == null ? this.username : username,
_then(Input$UseRecoveryKeyInput( password: password == null ? this.password : password);
key: key == _undefined || key == null
? _instance.key
: (key as String),
deviceName: deviceName == _undefined || deviceName == null
? _instance.deviceName
: (deviceName as String)));
}
class _CopyWithStubImpl$Input$UseRecoveryKeyInput<TRes>
implements CopyWith$Input$UseRecoveryKeyInput<TRes> {
_CopyWithStubImpl$Input$UseRecoveryKeyInput(this._res);
TRes _res;
call({String? key, String? deviceName}) => _res;
} }
enum Enum$DnsProvider { enum Enum$DnsProvider {
@ -247,26 +381,61 @@ enum Enum$ServerProvider {
$unknown $unknown
} }
enum Enum$ServiceStatusEnum {
@JsonValue('ACTIVATING')
ACTIVATING,
@JsonValue('ACTIVE')
ACTIVE,
@JsonValue('DEACTIVATING')
DEACTIVATING,
@JsonValue('FAILED')
FAILED,
@JsonValue('INACTIVE')
INACTIVE,
@JsonValue('OFF')
OFF,
@JsonValue('RELOADING')
RELOADING,
$unknown
}
enum Enum$Severity { enum Enum$Severity {
@JsonValue('INFO')
INFO,
@JsonValue('WARNING')
WARNING,
@JsonValue('ERROR')
ERROR,
@JsonValue('CRITICAL') @JsonValue('CRITICAL')
CRITICAL, CRITICAL,
@JsonValue('ERROR')
ERROR,
@JsonValue('INFO')
INFO,
@JsonValue('SUCCESS') @JsonValue('SUCCESS')
SUCCESS, SUCCESS,
@JsonValue('WARNING')
WARNING,
$unknown
}
enum Enum$UserType {
@JsonValue('NORMAL')
NORMAL,
@JsonValue('PRIMARY')
PRIMARY,
@JsonValue('ROOT')
ROOT,
$unknown $unknown
} }
const possibleTypesMap = { const possibleTypesMap = {
'MutationReturnInterface': { 'MutationReturnInterface': {
'ApiKeyMutationReturn', 'ApiKeyMutationReturn',
'AutoUpgradeSettingsMutationReturn',
'DeviceApiTokenMutationReturn', 'DeviceApiTokenMutationReturn',
'GenericMutationReturn' 'GenericJobButationReturn',
} 'GenericMutationReturn',
'ServiceJobMutationReturn',
'ServiceMutationReturn',
'TimezoneMutationReturn',
'UserMutationReturn'
},
'StorageUsageInterface': {'ServiceStorageUsage'}
}; };
DateTime? _nullable$dateTimeFromJson(dynamic data) => DateTime? _nullable$dateTimeFromJson(dynamic data) =>
data == null ? null : dateTimeFromJson(data); data == null ? null : dateTimeFromJson(data);

View File

@ -6,6 +6,54 @@ part of 'schema.graphql.dart';
// JsonSerializableGenerator // JsonSerializableGenerator
// ************************************************************************** // **************************************************************************
Input$AutoUpgradeSettingsInput _$Input$AutoUpgradeSettingsInputFromJson(
Map<String, dynamic> json) =>
Input$AutoUpgradeSettingsInput(
enableAutoUpgrade: json['enableAutoUpgrade'] as bool?,
allowReboot: json['allowReboot'] as bool?,
);
Map<String, dynamic> _$Input$AutoUpgradeSettingsInputToJson(
Input$AutoUpgradeSettingsInput instance) =>
<String, dynamic>{
'enableAutoUpgrade': instance.enableAutoUpgrade,
'allowReboot': instance.allowReboot,
};
Input$MigrateToBindsInput _$Input$MigrateToBindsInputFromJson(
Map<String, dynamic> json) =>
Input$MigrateToBindsInput(
emailBlockDevice: json['emailBlockDevice'] as String,
bitwardenBlockDevice: json['bitwardenBlockDevice'] as String,
giteaBlockDevice: json['giteaBlockDevice'] as String,
nextcloudBlockDevice: json['nextcloudBlockDevice'] as String,
pleromaBlockDevice: json['pleromaBlockDevice'] as String,
);
Map<String, dynamic> _$Input$MigrateToBindsInputToJson(
Input$MigrateToBindsInput instance) =>
<String, dynamic>{
'emailBlockDevice': instance.emailBlockDevice,
'bitwardenBlockDevice': instance.bitwardenBlockDevice,
'giteaBlockDevice': instance.giteaBlockDevice,
'nextcloudBlockDevice': instance.nextcloudBlockDevice,
'pleromaBlockDevice': instance.pleromaBlockDevice,
};
Input$MoveServiceInput _$Input$MoveServiceInputFromJson(
Map<String, dynamic> json) =>
Input$MoveServiceInput(
serviceId: json['serviceId'] as String,
location: json['location'] as String,
);
Map<String, dynamic> _$Input$MoveServiceInputToJson(
Input$MoveServiceInput instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
'location': instance.location,
};
Input$RecoveryKeyLimitsInput _$Input$RecoveryKeyLimitsInputFromJson( Input$RecoveryKeyLimitsInput _$Input$RecoveryKeyLimitsInputFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Input$RecoveryKeyLimitsInput( Input$RecoveryKeyLimitsInput(
@ -20,6 +68,20 @@ Map<String, dynamic> _$Input$RecoveryKeyLimitsInputToJson(
'uses': instance.uses, 'uses': instance.uses,
}; };
Input$SshMutationInput _$Input$SshMutationInputFromJson(
Map<String, dynamic> json) =>
Input$SshMutationInput(
username: json['username'] as String,
sshKey: json['sshKey'] as String,
);
Map<String, dynamic> _$Input$SshMutationInputToJson(
Input$SshMutationInput instance) =>
<String, dynamic>{
'username': instance.username,
'sshKey': instance.sshKey,
};
Input$UseNewDeviceKeyInput _$Input$UseNewDeviceKeyInputFromJson( Input$UseNewDeviceKeyInput _$Input$UseNewDeviceKeyInputFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Input$UseNewDeviceKeyInput( Input$UseNewDeviceKeyInput(
@ -47,3 +109,17 @@ Map<String, dynamic> _$Input$UseRecoveryKeyInputToJson(
'key': instance.key, 'key': instance.key,
'deviceName': instance.deviceName, 'deviceName': instance.deviceName,
}; };
Input$UserMutationInput _$Input$UserMutationInputFromJson(
Map<String, dynamic> json) =>
Input$UserMutationInput(
username: json['username'] as String,
password: json['password'] as String,
);
Map<String, dynamic> _$Input$UserMutationInputToJson(
Input$UserMutationInput instance) =>
<String, dynamic>{
'username': instance.username,
'password': instance.password,
};

View File

@ -3,9 +3,11 @@ 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/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/models/hive/server_domain.dart'; 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';
class ServerApi extends ApiMap { class ServerApi extends ApiMap {
ServerApi({ ServerApi({
@ -25,13 +27,35 @@ class ServerApi extends ApiMap {
@override @override
String? rootAddress; String? rootAddress;
Future<bool> _commonBoolRequest(final Function graphQLMethod) async {
QueryResult response;
bool result = false;
try {
response = await graphQLMethod();
if (response.hasException) {
print(response.exception.toString());
result = false;
} else {
result = true;
}
} catch (e) {
print(e);
}
return result;
}
Future<String?> getApiVersion() async { Future<String?> getApiVersion() async {
QueryResult response; QueryResult response;
String? apiVersion; String? apiVersion;
final GraphQLClient client = await getClient();
try { try {
response = await client.query$GetApiVersionQuery(); final GraphQLClient client = await getClient();
response = await client.query$GetApiVersion();
if (response.hasException) {
print(response.exception.toString());
}
apiVersion = response.data!['api']['version']; apiVersion = response.data!['api']['version'];
} catch (e) { } catch (e) {
print(e); print(e);
@ -45,7 +69,10 @@ class ServerApi extends ApiMap {
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
response = await client.query$GetApiTokensQuery(); response = await client.query$GetApiTokens();
if (response.hasException) {
print(response.exception.toString());
}
tokens = response.data!['api']['devices'] tokens = response.data!['api']['devices']
.map<ApiToken>((final e) => ApiToken.fromJson(e)) .map<ApiToken>((final e) => ApiToken.fromJson(e))
.toList(); .toList();
@ -62,7 +89,10 @@ class ServerApi extends ApiMap {
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
response = await client.query$GetServerDiskVolumesQuery(); response = await client.query$GetServerDiskVolumes();
if (response.hasException) {
print(response.exception.toString());
}
volumes = response.data!['storage']['volumes'] volumes = response.data!['storage']['volumes']
.map<ServerDiskVolume>((final e) => ServerDiskVolume.fromJson(e)) .map<ServerDiskVolume>((final e) => ServerDiskVolume.fromJson(e))
.toList(); .toList();
@ -76,11 +106,10 @@ class ServerApi extends ApiMap {
Future<void> mountVolume(final String volumeName) async { Future<void> mountVolume(final String volumeName) async {
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
final variables = final variables = Variables$Mutation$MountVolume(name: volumeName);
Variables$Mutation$MountVolumeMutation(name: volumeName);
final mountVolumeMutation = final mountVolumeMutation =
Options$Mutation$MountVolumeMutation(variables: variables); Options$Mutation$MountVolume(variables: variables);
await client.mutate$MountVolumeMutation(mountVolumeMutation); await client.mutate$MountVolume(mountVolumeMutation);
} catch (e) { } catch (e) {
print(e); print(e);
} }
@ -89,11 +118,10 @@ class ServerApi extends ApiMap {
Future<void> unmountVolume(final String volumeName) async { Future<void> unmountVolume(final String volumeName) async {
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
final variables = final variables = Variables$Mutation$UnmountVolume(name: volumeName);
Variables$Mutation$UnmountVolumeMutation(name: volumeName);
final unmountVolumeMutation = final unmountVolumeMutation =
Options$Mutation$UnmountVolumeMutation(variables: variables); Options$Mutation$UnmountVolume(variables: variables);
await client.mutate$UnmountVolumeMutation(unmountVolumeMutation); await client.mutate$UnmountVolume(unmountVolumeMutation);
} catch (e) { } catch (e) {
print(e); print(e);
} }
@ -102,11 +130,104 @@ class ServerApi extends ApiMap {
Future<void> resizeVolume(final String volumeName) async { Future<void> resizeVolume(final String volumeName) async {
try { try {
final GraphQLClient client = await getClient(); final GraphQLClient client = await getClient();
final variables = final variables = Variables$Mutation$ResizeVolume(name: volumeName);
Variables$Mutation$ResizeVolumeMutation(name: volumeName);
final resizeVolumeMutation = final resizeVolumeMutation =
Options$Mutation$ResizeVolumeMutation(variables: variables); Options$Mutation$ResizeVolume(variables: variables);
await client.mutate$ResizeVolumeMutation(resizeVolumeMutation); await client.mutate$ResizeVolume(resizeVolumeMutation);
} catch (e) {
print(e);
}
}
Future<List<ServerJob>> getServerJobs() async {
QueryResult response;
List<ServerJob> jobs = [];
try {
final GraphQLClient client = await getClient();
response = await client.query$GetApiJobs();
if (response.hasException) {
print(response.exception.toString());
}
jobs = response.data!['jobs']
.map<ServerJob>((final e) => ServerJob.fromJson(e))
.toList();
} catch (e) {
print(e);
}
return jobs;
}
Future<void> removeApiJob(final String uid) async {
try {
final GraphQLClient client = await getClient();
//await client.query$GetApiJobsQuery();
} catch (e) {
print(e);
}
}
Future<bool> reboot() async {
try {
final GraphQLClient client = await getClient();
return await _commonBoolRequest(
() async {
await client.mutate$RebootSystem();
},
);
} catch (e) {
return false;
}
}
Future<bool> pullConfigurationUpdate() async {
try {
final GraphQLClient client = await getClient();
return await _commonBoolRequest(
() async {
await client.mutate$PullRepositoryChanges();
},
);
} catch (e) {
return false;
}
}
Future<bool> upgrade() async {
try {
final GraphQLClient client = await getClient();
return await _commonBoolRequest(
() async {
await client.mutate$RunSystemUpgrade();
},
);
} catch (e) {
return false;
}
}
Future<void> switchService(final String uid, final bool needTurnOn) async {
try {
final GraphQLClient client = await getClient();
if (needTurnOn) {
final variables = Variables$Mutation$EnableService(serviceId: uid);
final mutation = Options$Mutation$EnableService(variables: variables);
await client.mutate$EnableService(mutation);
} else {
final variables = Variables$Mutation$DisableService(serviceId: uid);
final mutation = Options$Mutation$DisableService(variables: variables);
await client.mutate$DisableService(mutation);
}
} catch (e) {
print(e);
}
}
Future<void> apply() async {
try {
final GraphQLClient client = await getClient();
await client.mutate$RunSystemRebuild();
} catch (e) { } catch (e) {
print(e); print(e);
} }

View File

@ -1,4 +1,70 @@
query GetApiTokensQuery { fragment basicMutationReturnFields on MutationReturnInterface{
code
message
success
}
query GetApiVersion {
api {
version
}
}
query GetApiJobs {
jobs {
getJobs {
createdAt
description
error
finishedAt
name
progress
result
status
statusText
uid
updatedAt
}
}
}
mutation RemoveJob($jobId: String!) {
removeJob(jobId: $jobId) {
...basicMutationReturnFields
}
}
mutation RunSystemRebuild {
runSystemRebuild {
...basicMutationReturnFields
}
}
mutation RunSystemRollback {
runSystemRollback {
...basicMutationReturnFields
}
}
mutation RunSystemUpgrade {
runSystemUpgrade {
...basicMutationReturnFields
}
}
mutation PullRepositoryChanges {
pullRepositoryChanges {
...basicMutationReturnFields
}
}
mutation RebootSystem {
rebootSystem {
...basicMutationReturnFields
}
}
query GetApiTokens {
api { api {
devices { devices {
creationDate creationDate
@ -8,8 +74,61 @@ query GetApiTokensQuery {
} }
} }
query GetApiVersionQuery { query RecoveryKey {
api { api {
version recoveryKey {
creationDate
exists
expirationDate
usesLeft
valid
}
} }
} }
mutation GetNewRecoveryApiKey($limits: RecoveryKeyLimitsInput) {
getNewRecoveryApiKey(limits: $limits) {
...basicMutationReturnFields
key
}
}
mutation UseRecoveryApiKey($input: UseRecoveryKeyInput!) {
useRecoveryApiKey(input: $input) {
...basicMutationReturnFields
token
}
}
mutation RefreshDeviceApiToken {
refreshDeviceApiToken {
...basicMutationReturnFields
token
}
}
mutation DeleteDeviceApiToken($device: String!) {
deleteDeviceApiToken(device: $device) {
...basicMutationReturnFields
}
}
mutation GetNewDeviceApiKey {
getNewDeviceApiKey {
...basicMutationReturnFields
key
}
}
mutation InvalidateNewDeviceApiKey {
invalidateNewDeviceApiKey {
...basicMutationReturnFields
}
}
mutation AuthorizeWithNewDeviceApiKey($input: UseNewDeviceKeyInput!) {
authorizeWithNewDeviceApiKey(input: $input) {
...basicMutationReturnFields
token
}
}

File diff suppressed because it is too large Load Diff

View File

@ -6,49 +6,370 @@ part of 'server_api.graphql.dart';
// JsonSerializableGenerator // JsonSerializableGenerator
// ************************************************************************** // **************************************************************************
Query$GetApiTokensQuery _$Query$GetApiTokensQueryFromJson( Fragment$basicMutationReturnFields _$Fragment$basicMutationReturnFieldsFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetApiTokensQuery( Fragment$basicMutationReturnFields(
api: Query$GetApiTokensQuery$api.fromJson( code: json['code'] as int,
json['api'] as Map<String, dynamic>), message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetApiTokensQueryToJson( Map<String, dynamic> _$Fragment$basicMutationReturnFieldsToJson(
Query$GetApiTokensQuery instance) => Fragment$basicMutationReturnFields instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Query$GetApiVersion _$Query$GetApiVersionFromJson(Map<String, dynamic> json) =>
Query$GetApiVersion(
api:
Query$GetApiVersion$api.fromJson(json['api'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiVersionToJson(
Query$GetApiVersion instance) =>
<String, dynamic>{ <String, dynamic>{
'api': instance.api.toJson(), 'api': instance.api.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetApiTokensQuery$api _$Query$GetApiTokensQuery$apiFromJson( Query$GetApiVersion$api _$Query$GetApiVersion$apiFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetApiTokensQuery$api( Query$GetApiVersion$api(
version: json['version'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiVersion$apiToJson(
Query$GetApiVersion$api instance) =>
<String, dynamic>{
'version': instance.version,
'__typename': instance.$__typename,
};
Query$GetApiJobs _$Query$GetApiJobsFromJson(Map<String, dynamic> json) =>
Query$GetApiJobs(
jobs:
Query$GetApiJobs$jobs.fromJson(json['jobs'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiJobsToJson(Query$GetApiJobs instance) =>
<String, dynamic>{
'jobs': instance.jobs.toJson(),
'__typename': instance.$__typename,
};
Query$GetApiJobs$jobs _$Query$GetApiJobs$jobsFromJson(
Map<String, dynamic> json) =>
Query$GetApiJobs$jobs(
getJobs: (json['getJobs'] as List<dynamic>)
.map((e) =>
Query$GetApiJobs$jobs$getJobs.fromJson(e as Map<String, dynamic>))
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiJobs$jobsToJson(
Query$GetApiJobs$jobs instance) =>
<String, dynamic>{
'getJobs': instance.getJobs.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename,
};
Query$GetApiJobs$jobs$getJobs _$Query$GetApiJobs$jobs$getJobsFromJson(
Map<String, dynamic> json) =>
Query$GetApiJobs$jobs$getJobs(
createdAt: dateTimeFromJson(json['createdAt']),
description: json['description'] as String,
error: json['error'] as String?,
finishedAt: _nullable$dateTimeFromJson(json['finishedAt']),
name: json['name'] as String,
progress: json['progress'] as int?,
result: json['result'] as String?,
status: json['status'] as String,
statusText: json['statusText'] as String?,
uid: json['uid'] as String,
updatedAt: dateTimeFromJson(json['updatedAt']),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiJobs$jobs$getJobsToJson(
Query$GetApiJobs$jobs$getJobs instance) =>
<String, dynamic>{
'createdAt': dateTimeToJson(instance.createdAt),
'description': instance.description,
'error': instance.error,
'finishedAt': _nullable$dateTimeToJson(instance.finishedAt),
'name': instance.name,
'progress': instance.progress,
'result': instance.result,
'status': instance.status,
'statusText': instance.statusText,
'uid': instance.uid,
'updatedAt': dateTimeToJson(instance.updatedAt),
'__typename': instance.$__typename,
};
Variables$Mutation$RemoveJob _$Variables$Mutation$RemoveJobFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$RemoveJob(
jobId: json['jobId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$RemoveJobToJson(
Variables$Mutation$RemoveJob instance) =>
<String, dynamic>{
'jobId': instance.jobId,
};
Mutation$RemoveJob _$Mutation$RemoveJobFromJson(Map<String, dynamic> json) =>
Mutation$RemoveJob(
removeJob: Mutation$RemoveJob$removeJob.fromJson(
json['removeJob'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RemoveJobToJson(Mutation$RemoveJob instance) =>
<String, dynamic>{
'removeJob': instance.removeJob.toJson(),
'__typename': instance.$__typename,
};
Mutation$RemoveJob$removeJob _$Mutation$RemoveJob$removeJobFromJson(
Map<String, dynamic> json) =>
Mutation$RemoveJob$removeJob(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RemoveJob$removeJobToJson(
Mutation$RemoveJob$removeJob instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$RunSystemRebuild _$Mutation$RunSystemRebuildFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemRebuild(
runSystemRebuild: Mutation$RunSystemRebuild$runSystemRebuild.fromJson(
json['runSystemRebuild'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemRebuildToJson(
Mutation$RunSystemRebuild instance) =>
<String, dynamic>{
'runSystemRebuild': instance.runSystemRebuild.toJson(),
'__typename': instance.$__typename,
};
Mutation$RunSystemRebuild$runSystemRebuild
_$Mutation$RunSystemRebuild$runSystemRebuildFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemRebuild$runSystemRebuild(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemRebuild$runSystemRebuildToJson(
Mutation$RunSystemRebuild$runSystemRebuild instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$RunSystemRollback _$Mutation$RunSystemRollbackFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemRollback(
runSystemRollback: Mutation$RunSystemRollback$runSystemRollback.fromJson(
json['runSystemRollback'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemRollbackToJson(
Mutation$RunSystemRollback instance) =>
<String, dynamic>{
'runSystemRollback': instance.runSystemRollback.toJson(),
'__typename': instance.$__typename,
};
Mutation$RunSystemRollback$runSystemRollback
_$Mutation$RunSystemRollback$runSystemRollbackFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemRollback$runSystemRollback(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemRollback$runSystemRollbackToJson(
Mutation$RunSystemRollback$runSystemRollback instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$RunSystemUpgrade _$Mutation$RunSystemUpgradeFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemUpgrade(
runSystemUpgrade: Mutation$RunSystemUpgrade$runSystemUpgrade.fromJson(
json['runSystemUpgrade'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemUpgradeToJson(
Mutation$RunSystemUpgrade instance) =>
<String, dynamic>{
'runSystemUpgrade': instance.runSystemUpgrade.toJson(),
'__typename': instance.$__typename,
};
Mutation$RunSystemUpgrade$runSystemUpgrade
_$Mutation$RunSystemUpgrade$runSystemUpgradeFromJson(
Map<String, dynamic> json) =>
Mutation$RunSystemUpgrade$runSystemUpgrade(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RunSystemUpgrade$runSystemUpgradeToJson(
Mutation$RunSystemUpgrade$runSystemUpgrade instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$PullRepositoryChanges _$Mutation$PullRepositoryChangesFromJson(
Map<String, dynamic> json) =>
Mutation$PullRepositoryChanges(
pullRepositoryChanges:
Mutation$PullRepositoryChanges$pullRepositoryChanges.fromJson(
json['pullRepositoryChanges'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$PullRepositoryChangesToJson(
Mutation$PullRepositoryChanges instance) =>
<String, dynamic>{
'pullRepositoryChanges': instance.pullRepositoryChanges.toJson(),
'__typename': instance.$__typename,
};
Mutation$PullRepositoryChanges$pullRepositoryChanges
_$Mutation$PullRepositoryChanges$pullRepositoryChangesFromJson(
Map<String, dynamic> json) =>
Mutation$PullRepositoryChanges$pullRepositoryChanges(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic>
_$Mutation$PullRepositoryChanges$pullRepositoryChangesToJson(
Mutation$PullRepositoryChanges$pullRepositoryChanges instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$RebootSystem _$Mutation$RebootSystemFromJson(
Map<String, dynamic> json) =>
Mutation$RebootSystem(
rebootSystem: Mutation$RebootSystem$rebootSystem.fromJson(
json['rebootSystem'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RebootSystemToJson(
Mutation$RebootSystem instance) =>
<String, dynamic>{
'rebootSystem': instance.rebootSystem.toJson(),
'__typename': instance.$__typename,
};
Mutation$RebootSystem$rebootSystem _$Mutation$RebootSystem$rebootSystemFromJson(
Map<String, dynamic> json) =>
Mutation$RebootSystem$rebootSystem(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RebootSystem$rebootSystemToJson(
Mutation$RebootSystem$rebootSystem instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Query$GetApiTokens _$Query$GetApiTokensFromJson(Map<String, dynamic> json) =>
Query$GetApiTokens(
api: Query$GetApiTokens$api.fromJson(json['api'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetApiTokensToJson(Query$GetApiTokens instance) =>
<String, dynamic>{
'api': instance.api.toJson(),
'__typename': instance.$__typename,
};
Query$GetApiTokens$api _$Query$GetApiTokens$apiFromJson(
Map<String, dynamic> json) =>
Query$GetApiTokens$api(
devices: (json['devices'] as List<dynamic>) devices: (json['devices'] as List<dynamic>)
.map((e) => Query$GetApiTokensQuery$api$devices.fromJson( .map((e) => Query$GetApiTokens$api$devices.fromJson(
e as Map<String, dynamic>)) e as Map<String, dynamic>))
.toList(), .toList(),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetApiTokensQuery$apiToJson( Map<String, dynamic> _$Query$GetApiTokens$apiToJson(
Query$GetApiTokensQuery$api instance) => Query$GetApiTokens$api instance) =>
<String, dynamic>{ <String, dynamic>{
'devices': instance.devices.map((e) => e.toJson()).toList(), 'devices': instance.devices.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetApiTokensQuery$api$devices Query$GetApiTokens$api$devices _$Query$GetApiTokens$api$devicesFromJson(
_$Query$GetApiTokensQuery$api$devicesFromJson(Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetApiTokensQuery$api$devices( Query$GetApiTokens$api$devices(
creationDate: dateTimeFromJson(json['creationDate']), creationDate: dateTimeFromJson(json['creationDate']),
isCaller: json['isCaller'] as bool, isCaller: json['isCaller'] as bool,
name: json['name'] as String, name: json['name'] as String,
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetApiTokensQuery$api$devicesToJson( Map<String, dynamic> _$Query$GetApiTokens$api$devicesToJson(
Query$GetApiTokensQuery$api$devices instance) => Query$GetApiTokens$api$devices instance) =>
<String, dynamic>{ <String, dynamic>{
'creationDate': dateTimeToJson(instance.creationDate), 'creationDate': dateTimeToJson(instance.creationDate),
'isCaller': instance.isCaller, 'isCaller': instance.isCaller,
@ -56,31 +377,369 @@ Map<String, dynamic> _$Query$GetApiTokensQuery$api$devicesToJson(
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetApiVersionQuery _$Query$GetApiVersionQueryFromJson( Query$RecoveryKey _$Query$RecoveryKeyFromJson(Map<String, dynamic> json) =>
Map<String, dynamic> json) => Query$RecoveryKey(
Query$GetApiVersionQuery( api: Query$RecoveryKey$api.fromJson(json['api'] as Map<String, dynamic>),
api: Query$GetApiVersionQuery$api.fromJson(
json['api'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetApiVersionQueryToJson( Map<String, dynamic> _$Query$RecoveryKeyToJson(Query$RecoveryKey instance) =>
Query$GetApiVersionQuery instance) =>
<String, dynamic>{ <String, dynamic>{
'api': instance.api.toJson(), 'api': instance.api.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$GetApiVersionQuery$api _$Query$GetApiVersionQuery$apiFromJson( Query$RecoveryKey$api _$Query$RecoveryKey$apiFromJson(
Map<String, dynamic> json) => Map<String, dynamic> json) =>
Query$GetApiVersionQuery$api( Query$RecoveryKey$api(
version: json['version'] as String, recoveryKey: Query$RecoveryKey$api$recoveryKey.fromJson(
json['recoveryKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String, $__typename: json['__typename'] as String,
); );
Map<String, dynamic> _$Query$GetApiVersionQuery$apiToJson( Map<String, dynamic> _$Query$RecoveryKey$apiToJson(
Query$GetApiVersionQuery$api instance) => Query$RecoveryKey$api instance) =>
<String, dynamic>{ <String, dynamic>{
'version': instance.version, 'recoveryKey': instance.recoveryKey.toJson(),
'__typename': instance.$__typename, '__typename': instance.$__typename,
}; };
Query$RecoveryKey$api$recoveryKey _$Query$RecoveryKey$api$recoveryKeyFromJson(
Map<String, dynamic> json) =>
Query$RecoveryKey$api$recoveryKey(
creationDate: _nullable$dateTimeFromJson(json['creationDate']),
exists: json['exists'] as bool,
expirationDate: _nullable$dateTimeFromJson(json['expirationDate']),
usesLeft: json['usesLeft'] as int?,
valid: json['valid'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$RecoveryKey$api$recoveryKeyToJson(
Query$RecoveryKey$api$recoveryKey instance) =>
<String, dynamic>{
'creationDate': _nullable$dateTimeToJson(instance.creationDate),
'exists': instance.exists,
'expirationDate': _nullable$dateTimeToJson(instance.expirationDate),
'usesLeft': instance.usesLeft,
'valid': instance.valid,
'__typename': instance.$__typename,
};
Variables$Mutation$GetNewRecoveryApiKey
_$Variables$Mutation$GetNewRecoveryApiKeyFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$GetNewRecoveryApiKey(
limits: json['limits'] == null
? null
: Input$RecoveryKeyLimitsInput.fromJson(
json['limits'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$GetNewRecoveryApiKeyToJson(
Variables$Mutation$GetNewRecoveryApiKey instance) =>
<String, dynamic>{
'limits': instance.limits?.toJson(),
};
Mutation$GetNewRecoveryApiKey _$Mutation$GetNewRecoveryApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$GetNewRecoveryApiKey(
getNewRecoveryApiKey:
Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKey.fromJson(
json['getNewRecoveryApiKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$GetNewRecoveryApiKeyToJson(
Mutation$GetNewRecoveryApiKey instance) =>
<String, dynamic>{
'getNewRecoveryApiKey': instance.getNewRecoveryApiKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKey
_$Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
key: json['key'] as String?,
);
Map<String, dynamic> _$Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKeyToJson(
Mutation$GetNewRecoveryApiKey$getNewRecoveryApiKey instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'key': instance.key,
};
Variables$Mutation$UseRecoveryApiKey
_$Variables$Mutation$UseRecoveryApiKeyFromJson(Map<String, dynamic> json) =>
Variables$Mutation$UseRecoveryApiKey(
input: Input$UseRecoveryKeyInput.fromJson(
json['input'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$UseRecoveryApiKeyToJson(
Variables$Mutation$UseRecoveryApiKey instance) =>
<String, dynamic>{
'input': instance.input.toJson(),
};
Mutation$UseRecoveryApiKey _$Mutation$UseRecoveryApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$UseRecoveryApiKey(
useRecoveryApiKey: Mutation$UseRecoveryApiKey$useRecoveryApiKey.fromJson(
json['useRecoveryApiKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$UseRecoveryApiKeyToJson(
Mutation$UseRecoveryApiKey instance) =>
<String, dynamic>{
'useRecoveryApiKey': instance.useRecoveryApiKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$UseRecoveryApiKey$useRecoveryApiKey
_$Mutation$UseRecoveryApiKey$useRecoveryApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$UseRecoveryApiKey$useRecoveryApiKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
token: json['token'] as String?,
);
Map<String, dynamic> _$Mutation$UseRecoveryApiKey$useRecoveryApiKeyToJson(
Mutation$UseRecoveryApiKey$useRecoveryApiKey instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'token': instance.token,
};
Mutation$RefreshDeviceApiToken _$Mutation$RefreshDeviceApiTokenFromJson(
Map<String, dynamic> json) =>
Mutation$RefreshDeviceApiToken(
refreshDeviceApiToken:
Mutation$RefreshDeviceApiToken$refreshDeviceApiToken.fromJson(
json['refreshDeviceApiToken'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RefreshDeviceApiTokenToJson(
Mutation$RefreshDeviceApiToken instance) =>
<String, dynamic>{
'refreshDeviceApiToken': instance.refreshDeviceApiToken.toJson(),
'__typename': instance.$__typename,
};
Mutation$RefreshDeviceApiToken$refreshDeviceApiToken
_$Mutation$RefreshDeviceApiToken$refreshDeviceApiTokenFromJson(
Map<String, dynamic> json) =>
Mutation$RefreshDeviceApiToken$refreshDeviceApiToken(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
token: json['token'] as String?,
);
Map<String, dynamic>
_$Mutation$RefreshDeviceApiToken$refreshDeviceApiTokenToJson(
Mutation$RefreshDeviceApiToken$refreshDeviceApiToken instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'token': instance.token,
};
Variables$Mutation$DeleteDeviceApiToken
_$Variables$Mutation$DeleteDeviceApiTokenFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$DeleteDeviceApiToken(
device: json['device'] as String,
);
Map<String, dynamic> _$Variables$Mutation$DeleteDeviceApiTokenToJson(
Variables$Mutation$DeleteDeviceApiToken instance) =>
<String, dynamic>{
'device': instance.device,
};
Mutation$DeleteDeviceApiToken _$Mutation$DeleteDeviceApiTokenFromJson(
Map<String, dynamic> json) =>
Mutation$DeleteDeviceApiToken(
deleteDeviceApiToken:
Mutation$DeleteDeviceApiToken$deleteDeviceApiToken.fromJson(
json['deleteDeviceApiToken'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DeleteDeviceApiTokenToJson(
Mutation$DeleteDeviceApiToken instance) =>
<String, dynamic>{
'deleteDeviceApiToken': instance.deleteDeviceApiToken.toJson(),
'__typename': instance.$__typename,
};
Mutation$DeleteDeviceApiToken$deleteDeviceApiToken
_$Mutation$DeleteDeviceApiToken$deleteDeviceApiTokenFromJson(
Map<String, dynamic> json) =>
Mutation$DeleteDeviceApiToken$deleteDeviceApiToken(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DeleteDeviceApiToken$deleteDeviceApiTokenToJson(
Mutation$DeleteDeviceApiToken$deleteDeviceApiToken instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Mutation$GetNewDeviceApiKey _$Mutation$GetNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$GetNewDeviceApiKey(
getNewDeviceApiKey:
Mutation$GetNewDeviceApiKey$getNewDeviceApiKey.fromJson(
json['getNewDeviceApiKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$GetNewDeviceApiKeyToJson(
Mutation$GetNewDeviceApiKey instance) =>
<String, dynamic>{
'getNewDeviceApiKey': instance.getNewDeviceApiKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$GetNewDeviceApiKey$getNewDeviceApiKey
_$Mutation$GetNewDeviceApiKey$getNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$GetNewDeviceApiKey$getNewDeviceApiKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
key: json['key'] as String?,
);
Map<String, dynamic> _$Mutation$GetNewDeviceApiKey$getNewDeviceApiKeyToJson(
Mutation$GetNewDeviceApiKey$getNewDeviceApiKey instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'key': instance.key,
};
Mutation$InvalidateNewDeviceApiKey _$Mutation$InvalidateNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$InvalidateNewDeviceApiKey(
invalidateNewDeviceApiKey:
Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKey.fromJson(
json['invalidateNewDeviceApiKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$InvalidateNewDeviceApiKeyToJson(
Mutation$InvalidateNewDeviceApiKey instance) =>
<String, dynamic>{
'invalidateNewDeviceApiKey': instance.invalidateNewDeviceApiKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKey
_$Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic>
_$Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKeyToJson(
Mutation$InvalidateNewDeviceApiKey$invalidateNewDeviceApiKey
instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$AuthorizeWithNewDeviceApiKey
_$Variables$Mutation$AuthorizeWithNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$AuthorizeWithNewDeviceApiKey(
input: Input$UseNewDeviceKeyInput.fromJson(
json['input'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$AuthorizeWithNewDeviceApiKeyToJson(
Variables$Mutation$AuthorizeWithNewDeviceApiKey instance) =>
<String, dynamic>{
'input': instance.input.toJson(),
};
Mutation$AuthorizeWithNewDeviceApiKey
_$Mutation$AuthorizeWithNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$AuthorizeWithNewDeviceApiKey(
authorizeWithNewDeviceApiKey:
Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKey
.fromJson(json['authorizeWithNewDeviceApiKey']
as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$AuthorizeWithNewDeviceApiKeyToJson(
Mutation$AuthorizeWithNewDeviceApiKey instance) =>
<String, dynamic>{
'authorizeWithNewDeviceApiKey':
instance.authorizeWithNewDeviceApiKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKey
_$Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKeyFromJson(
Map<String, dynamic> json) =>
Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
token: json['token'] as String?,
);
Map<String, dynamic>
_$Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKeyToJson(
Mutation$AuthorizeWithNewDeviceApiKey$authorizeWithNewDeviceApiKey
instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'token': instance.token,
};

View File

@ -0,0 +1,54 @@
fragment basicMutationReturnFields on MutationReturnInterface{
code
message
success
}
query SystemSettings {
system {
settings {
autoUpgrade {
allowReboot
enable
}
ssh {
enable
passwordAuthentication
rootSshKeys
}
timezone
}
}
}
query DomainInfo {
system {
domainInfo {
domain
hostname
provider
requiredDnsRecords {
content
name
priority
recordType
ttl
}
}
}
}
mutation ChangeTimezone($timezone: String!) {
changeTimezone(timezone: $timezone) {
...basicMutationReturnFields
timezone
}
}
mutation ChangeAutoUpgradeSettings($settings: AutoUpgradeSettingsInput!) {
changeAutoUpgradeSettings(settings: $settings) {
...basicMutationReturnFields
allowReboot
enableAutoUpgrade
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,300 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'server_settings.graphql.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Fragment$basicMutationReturnFields _$Fragment$basicMutationReturnFieldsFromJson(
Map<String, dynamic> json) =>
Fragment$basicMutationReturnFields(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Fragment$basicMutationReturnFieldsToJson(
Fragment$basicMutationReturnFields instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Query$SystemSettings _$Query$SystemSettingsFromJson(
Map<String, dynamic> json) =>
Query$SystemSettings(
system: Query$SystemSettings$system.fromJson(
json['system'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$SystemSettingsToJson(
Query$SystemSettings instance) =>
<String, dynamic>{
'system': instance.system.toJson(),
'__typename': instance.$__typename,
};
Query$SystemSettings$system _$Query$SystemSettings$systemFromJson(
Map<String, dynamic> json) =>
Query$SystemSettings$system(
settings: Query$SystemSettings$system$settings.fromJson(
json['settings'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$SystemSettings$systemToJson(
Query$SystemSettings$system instance) =>
<String, dynamic>{
'settings': instance.settings.toJson(),
'__typename': instance.$__typename,
};
Query$SystemSettings$system$settings
_$Query$SystemSettings$system$settingsFromJson(Map<String, dynamic> json) =>
Query$SystemSettings$system$settings(
autoUpgrade:
Query$SystemSettings$system$settings$autoUpgrade.fromJson(
json['autoUpgrade'] as Map<String, dynamic>),
ssh: Query$SystemSettings$system$settings$ssh.fromJson(
json['ssh'] as Map<String, dynamic>),
timezone: json['timezone'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$SystemSettings$system$settingsToJson(
Query$SystemSettings$system$settings instance) =>
<String, dynamic>{
'autoUpgrade': instance.autoUpgrade.toJson(),
'ssh': instance.ssh.toJson(),
'timezone': instance.timezone,
'__typename': instance.$__typename,
};
Query$SystemSettings$system$settings$autoUpgrade
_$Query$SystemSettings$system$settings$autoUpgradeFromJson(
Map<String, dynamic> json) =>
Query$SystemSettings$system$settings$autoUpgrade(
allowReboot: json['allowReboot'] as bool,
enable: json['enable'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$SystemSettings$system$settings$autoUpgradeToJson(
Query$SystemSettings$system$settings$autoUpgrade instance) =>
<String, dynamic>{
'allowReboot': instance.allowReboot,
'enable': instance.enable,
'__typename': instance.$__typename,
};
Query$SystemSettings$system$settings$ssh
_$Query$SystemSettings$system$settings$sshFromJson(
Map<String, dynamic> json) =>
Query$SystemSettings$system$settings$ssh(
enable: json['enable'] as bool,
passwordAuthentication: json['passwordAuthentication'] as bool,
rootSshKeys: (json['rootSshKeys'] as List<dynamic>)
.map((e) => e as String)
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$SystemSettings$system$settings$sshToJson(
Query$SystemSettings$system$settings$ssh instance) =>
<String, dynamic>{
'enable': instance.enable,
'passwordAuthentication': instance.passwordAuthentication,
'rootSshKeys': instance.rootSshKeys,
'__typename': instance.$__typename,
};
Query$DomainInfo _$Query$DomainInfoFromJson(Map<String, dynamic> json) =>
Query$DomainInfo(
system: Query$DomainInfo$system.fromJson(
json['system'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$DomainInfoToJson(Query$DomainInfo instance) =>
<String, dynamic>{
'system': instance.system.toJson(),
'__typename': instance.$__typename,
};
Query$DomainInfo$system _$Query$DomainInfo$systemFromJson(
Map<String, dynamic> json) =>
Query$DomainInfo$system(
domainInfo: Query$DomainInfo$system$domainInfo.fromJson(
json['domainInfo'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$DomainInfo$systemToJson(
Query$DomainInfo$system instance) =>
<String, dynamic>{
'domainInfo': instance.domainInfo.toJson(),
'__typename': instance.$__typename,
};
Query$DomainInfo$system$domainInfo _$Query$DomainInfo$system$domainInfoFromJson(
Map<String, dynamic> json) =>
Query$DomainInfo$system$domainInfo(
domain: json['domain'] as String,
hostname: json['hostname'] as String,
provider: $enumDecode(_$Enum$DnsProviderEnumMap, json['provider'],
unknownValue: Enum$DnsProvider.$unknown),
requiredDnsRecords: (json['requiredDnsRecords'] as List<dynamic>)
.map((e) =>
Query$DomainInfo$system$domainInfo$requiredDnsRecords.fromJson(
e as Map<String, dynamic>))
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$DomainInfo$system$domainInfoToJson(
Query$DomainInfo$system$domainInfo instance) =>
<String, dynamic>{
'domain': instance.domain,
'hostname': instance.hostname,
'provider': _$Enum$DnsProviderEnumMap[instance.provider],
'requiredDnsRecords':
instance.requiredDnsRecords.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename,
};
const _$Enum$DnsProviderEnumMap = {
Enum$DnsProvider.CLOUDFLARE: 'CLOUDFLARE',
Enum$DnsProvider.$unknown: r'$unknown',
};
Query$DomainInfo$system$domainInfo$requiredDnsRecords
_$Query$DomainInfo$system$domainInfo$requiredDnsRecordsFromJson(
Map<String, dynamic> json) =>
Query$DomainInfo$system$domainInfo$requiredDnsRecords(
content: json['content'] as String,
name: json['name'] as String,
priority: json['priority'] as int?,
recordType: json['recordType'] as String,
ttl: json['ttl'] as int,
$__typename: json['__typename'] as String,
);
Map<String, dynamic>
_$Query$DomainInfo$system$domainInfo$requiredDnsRecordsToJson(
Query$DomainInfo$system$domainInfo$requiredDnsRecords instance) =>
<String, dynamic>{
'content': instance.content,
'name': instance.name,
'priority': instance.priority,
'recordType': instance.recordType,
'ttl': instance.ttl,
'__typename': instance.$__typename,
};
Variables$Mutation$ChangeTimezone _$Variables$Mutation$ChangeTimezoneFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$ChangeTimezone(
timezone: json['timezone'] as String,
);
Map<String, dynamic> _$Variables$Mutation$ChangeTimezoneToJson(
Variables$Mutation$ChangeTimezone instance) =>
<String, dynamic>{
'timezone': instance.timezone,
};
Mutation$ChangeTimezone _$Mutation$ChangeTimezoneFromJson(
Map<String, dynamic> json) =>
Mutation$ChangeTimezone(
changeTimezone: Mutation$ChangeTimezone$changeTimezone.fromJson(
json['changeTimezone'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$ChangeTimezoneToJson(
Mutation$ChangeTimezone instance) =>
<String, dynamic>{
'changeTimezone': instance.changeTimezone.toJson(),
'__typename': instance.$__typename,
};
Mutation$ChangeTimezone$changeTimezone
_$Mutation$ChangeTimezone$changeTimezoneFromJson(
Map<String, dynamic> json) =>
Mutation$ChangeTimezone$changeTimezone(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
timezone: json['timezone'] as String?,
);
Map<String, dynamic> _$Mutation$ChangeTimezone$changeTimezoneToJson(
Mutation$ChangeTimezone$changeTimezone instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'timezone': instance.timezone,
};
Variables$Mutation$ChangeAutoUpgradeSettings
_$Variables$Mutation$ChangeAutoUpgradeSettingsFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$ChangeAutoUpgradeSettings(
settings: Input$AutoUpgradeSettingsInput.fromJson(
json['settings'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$ChangeAutoUpgradeSettingsToJson(
Variables$Mutation$ChangeAutoUpgradeSettings instance) =>
<String, dynamic>{
'settings': instance.settings.toJson(),
};
Mutation$ChangeAutoUpgradeSettings _$Mutation$ChangeAutoUpgradeSettingsFromJson(
Map<String, dynamic> json) =>
Mutation$ChangeAutoUpgradeSettings(
changeAutoUpgradeSettings:
Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettings.fromJson(
json['changeAutoUpgradeSettings'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$ChangeAutoUpgradeSettingsToJson(
Mutation$ChangeAutoUpgradeSettings instance) =>
<String, dynamic>{
'changeAutoUpgradeSettings': instance.changeAutoUpgradeSettings.toJson(),
'__typename': instance.$__typename,
};
Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettings
_$Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettingsFromJson(
Map<String, dynamic> json) =>
Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettings(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
allowReboot: json['allowReboot'] as bool,
enableAutoUpgrade: json['enableAutoUpgrade'] as bool,
);
Map<String, dynamic>
_$Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettingsToJson(
Mutation$ChangeAutoUpgradeSettings$changeAutoUpgradeSettings
instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'allowReboot': instance.allowReboot,
'enableAutoUpgrade': instance.enableAutoUpgrade,
};

View File

@ -0,0 +1,84 @@
fragment basicMutationReturnFields on MutationReturnInterface{
code
message
success
}
query AllServices {
services {
allServices {
description
displayName
dnsRecords {
content
name
priority
recordType
ttl
}
id
isEnabled
isMovable
isRequired
status
storageUsage {
title
usedSpace
volume {
name
}
}
svgIcon
url
}
}
}
mutation EnableService($serviceId: String!) {
enableService(serviceId: $serviceId) {
...basicMutationReturnFields
}
}
mutation DisableService($serviceId: String!) {
disableService(serviceId: $serviceId) {
...basicMutationReturnFields
}
}
mutation StopService($serviceId: String!) {
stopService(serviceId: $serviceId) {
...basicMutationReturnFields
}
}
mutation StartService($serviceId: String!) {
startService(serviceId: $serviceId) {
...basicMutationReturnFields
}
}
mutation RestartService($serviceId: String!) {
restartService(serviceId: $serviceId) {
...basicMutationReturnFields
}
}
mutation MoveService($input: MoveServiceInput!) {
moveService(input: $input) {
...basicMutationReturnFields
job {
createdAt
description
error
finishedAt
name
progress
result
status
statusText
uid
updatedAt
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,482 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'services.graphql.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Fragment$basicMutationReturnFields _$Fragment$basicMutationReturnFieldsFromJson(
Map<String, dynamic> json) =>
Fragment$basicMutationReturnFields(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Fragment$basicMutationReturnFieldsToJson(
Fragment$basicMutationReturnFields instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Query$AllServices _$Query$AllServicesFromJson(Map<String, dynamic> json) =>
Query$AllServices(
services: Query$AllServices$services.fromJson(
json['services'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllServicesToJson(Query$AllServices instance) =>
<String, dynamic>{
'services': instance.services.toJson(),
'__typename': instance.$__typename,
};
Query$AllServices$services _$Query$AllServices$servicesFromJson(
Map<String, dynamic> json) =>
Query$AllServices$services(
allServices: (json['allServices'] as List<dynamic>)
.map((e) => Query$AllServices$services$allServices.fromJson(
e as Map<String, dynamic>))
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllServices$servicesToJson(
Query$AllServices$services instance) =>
<String, dynamic>{
'allServices': instance.allServices.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename,
};
Query$AllServices$services$allServices
_$Query$AllServices$services$allServicesFromJson(
Map<String, dynamic> json) =>
Query$AllServices$services$allServices(
description: json['description'] as String,
displayName: json['displayName'] as String,
dnsRecords: (json['dnsRecords'] as List<dynamic>?)
?.map((e) =>
Query$AllServices$services$allServices$dnsRecords.fromJson(
e as Map<String, dynamic>))
.toList(),
id: json['id'] as String,
isEnabled: json['isEnabled'] as bool,
isMovable: json['isMovable'] as bool,
isRequired: json['isRequired'] as bool,
status: $enumDecode(_$Enum$ServiceStatusEnumEnumMap, json['status'],
unknownValue: Enum$ServiceStatusEnum.$unknown),
storageUsage:
Query$AllServices$services$allServices$storageUsage.fromJson(
json['storageUsage'] as Map<String, dynamic>),
svgIcon: json['svgIcon'] as String,
url: json['url'] as String?,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllServices$services$allServicesToJson(
Query$AllServices$services$allServices instance) =>
<String, dynamic>{
'description': instance.description,
'displayName': instance.displayName,
'dnsRecords': instance.dnsRecords?.map((e) => e.toJson()).toList(),
'id': instance.id,
'isEnabled': instance.isEnabled,
'isMovable': instance.isMovable,
'isRequired': instance.isRequired,
'status': _$Enum$ServiceStatusEnumEnumMap[instance.status],
'storageUsage': instance.storageUsage.toJson(),
'svgIcon': instance.svgIcon,
'url': instance.url,
'__typename': instance.$__typename,
};
const _$Enum$ServiceStatusEnumEnumMap = {
Enum$ServiceStatusEnum.ACTIVATING: 'ACTIVATING',
Enum$ServiceStatusEnum.ACTIVE: 'ACTIVE',
Enum$ServiceStatusEnum.DEACTIVATING: 'DEACTIVATING',
Enum$ServiceStatusEnum.FAILED: 'FAILED',
Enum$ServiceStatusEnum.INACTIVE: 'INACTIVE',
Enum$ServiceStatusEnum.OFF: 'OFF',
Enum$ServiceStatusEnum.RELOADING: 'RELOADING',
Enum$ServiceStatusEnum.$unknown: r'$unknown',
};
Query$AllServices$services$allServices$dnsRecords
_$Query$AllServices$services$allServices$dnsRecordsFromJson(
Map<String, dynamic> json) =>
Query$AllServices$services$allServices$dnsRecords(
content: json['content'] as String,
name: json['name'] as String,
priority: json['priority'] as int?,
recordType: json['recordType'] as String,
ttl: json['ttl'] as int,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllServices$services$allServices$dnsRecordsToJson(
Query$AllServices$services$allServices$dnsRecords instance) =>
<String, dynamic>{
'content': instance.content,
'name': instance.name,
'priority': instance.priority,
'recordType': instance.recordType,
'ttl': instance.ttl,
'__typename': instance.$__typename,
};
Query$AllServices$services$allServices$storageUsage
_$Query$AllServices$services$allServices$storageUsageFromJson(
Map<String, dynamic> json) =>
Query$AllServices$services$allServices$storageUsage(
title: json['title'] as String,
usedSpace: json['usedSpace'] as String,
volume: json['volume'] == null
? null
: Query$AllServices$services$allServices$storageUsage$volume
.fromJson(json['volume'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic>
_$Query$AllServices$services$allServices$storageUsageToJson(
Query$AllServices$services$allServices$storageUsage instance) =>
<String, dynamic>{
'title': instance.title,
'usedSpace': instance.usedSpace,
'volume': instance.volume?.toJson(),
'__typename': instance.$__typename,
};
Query$AllServices$services$allServices$storageUsage$volume
_$Query$AllServices$services$allServices$storageUsage$volumeFromJson(
Map<String, dynamic> json) =>
Query$AllServices$services$allServices$storageUsage$volume(
name: json['name'] as String,
$__typename: json['__typename'] as String,
);
Map<String,
dynamic> _$Query$AllServices$services$allServices$storageUsage$volumeToJson(
Query$AllServices$services$allServices$storageUsage$volume instance) =>
<String, dynamic>{
'name': instance.name,
'__typename': instance.$__typename,
};
Variables$Mutation$EnableService _$Variables$Mutation$EnableServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$EnableService(
serviceId: json['serviceId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$EnableServiceToJson(
Variables$Mutation$EnableService instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
};
Mutation$EnableService _$Mutation$EnableServiceFromJson(
Map<String, dynamic> json) =>
Mutation$EnableService(
enableService: Mutation$EnableService$enableService.fromJson(
json['enableService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$EnableServiceToJson(
Mutation$EnableService instance) =>
<String, dynamic>{
'enableService': instance.enableService.toJson(),
'__typename': instance.$__typename,
};
Mutation$EnableService$enableService
_$Mutation$EnableService$enableServiceFromJson(Map<String, dynamic> json) =>
Mutation$EnableService$enableService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$EnableService$enableServiceToJson(
Mutation$EnableService$enableService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$DisableService _$Variables$Mutation$DisableServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$DisableService(
serviceId: json['serviceId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$DisableServiceToJson(
Variables$Mutation$DisableService instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
};
Mutation$DisableService _$Mutation$DisableServiceFromJson(
Map<String, dynamic> json) =>
Mutation$DisableService(
disableService: Mutation$DisableService$disableService.fromJson(
json['disableService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DisableServiceToJson(
Mutation$DisableService instance) =>
<String, dynamic>{
'disableService': instance.disableService.toJson(),
'__typename': instance.$__typename,
};
Mutation$DisableService$disableService
_$Mutation$DisableService$disableServiceFromJson(
Map<String, dynamic> json) =>
Mutation$DisableService$disableService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DisableService$disableServiceToJson(
Mutation$DisableService$disableService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$StopService _$Variables$Mutation$StopServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$StopService(
serviceId: json['serviceId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$StopServiceToJson(
Variables$Mutation$StopService instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
};
Mutation$StopService _$Mutation$StopServiceFromJson(
Map<String, dynamic> json) =>
Mutation$StopService(
stopService: Mutation$StopService$stopService.fromJson(
json['stopService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$StopServiceToJson(
Mutation$StopService instance) =>
<String, dynamic>{
'stopService': instance.stopService.toJson(),
'__typename': instance.$__typename,
};
Mutation$StopService$stopService _$Mutation$StopService$stopServiceFromJson(
Map<String, dynamic> json) =>
Mutation$StopService$stopService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$StopService$stopServiceToJson(
Mutation$StopService$stopService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$StartService _$Variables$Mutation$StartServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$StartService(
serviceId: json['serviceId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$StartServiceToJson(
Variables$Mutation$StartService instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
};
Mutation$StartService _$Mutation$StartServiceFromJson(
Map<String, dynamic> json) =>
Mutation$StartService(
startService: Mutation$StartService$startService.fromJson(
json['startService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$StartServiceToJson(
Mutation$StartService instance) =>
<String, dynamic>{
'startService': instance.startService.toJson(),
'__typename': instance.$__typename,
};
Mutation$StartService$startService _$Mutation$StartService$startServiceFromJson(
Map<String, dynamic> json) =>
Mutation$StartService$startService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$StartService$startServiceToJson(
Mutation$StartService$startService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$RestartService _$Variables$Mutation$RestartServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$RestartService(
serviceId: json['serviceId'] as String,
);
Map<String, dynamic> _$Variables$Mutation$RestartServiceToJson(
Variables$Mutation$RestartService instance) =>
<String, dynamic>{
'serviceId': instance.serviceId,
};
Mutation$RestartService _$Mutation$RestartServiceFromJson(
Map<String, dynamic> json) =>
Mutation$RestartService(
restartService: Mutation$RestartService$restartService.fromJson(
json['restartService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RestartServiceToJson(
Mutation$RestartService instance) =>
<String, dynamic>{
'restartService': instance.restartService.toJson(),
'__typename': instance.$__typename,
};
Mutation$RestartService$restartService
_$Mutation$RestartService$restartServiceFromJson(
Map<String, dynamic> json) =>
Mutation$RestartService$restartService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RestartService$restartServiceToJson(
Mutation$RestartService$restartService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$MoveService _$Variables$Mutation$MoveServiceFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$MoveService(
input: Input$MoveServiceInput.fromJson(
json['input'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$MoveServiceToJson(
Variables$Mutation$MoveService instance) =>
<String, dynamic>{
'input': instance.input.toJson(),
};
Mutation$MoveService _$Mutation$MoveServiceFromJson(
Map<String, dynamic> json) =>
Mutation$MoveService(
moveService: Mutation$MoveService$moveService.fromJson(
json['moveService'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$MoveServiceToJson(
Mutation$MoveService instance) =>
<String, dynamic>{
'moveService': instance.moveService.toJson(),
'__typename': instance.$__typename,
};
Mutation$MoveService$moveService _$Mutation$MoveService$moveServiceFromJson(
Map<String, dynamic> json) =>
Mutation$MoveService$moveService(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
job: json['job'] == null
? null
: Mutation$MoveService$moveService$job.fromJson(
json['job'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$MoveService$moveServiceToJson(
Mutation$MoveService$moveService instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'job': instance.job?.toJson(),
};
Mutation$MoveService$moveService$job
_$Mutation$MoveService$moveService$jobFromJson(Map<String, dynamic> json) =>
Mutation$MoveService$moveService$job(
createdAt: dateTimeFromJson(json['createdAt']),
description: json['description'] as String,
error: json['error'] as String?,
finishedAt: _nullable$dateTimeFromJson(json['finishedAt']),
name: json['name'] as String,
progress: json['progress'] as int?,
result: json['result'] as String?,
status: json['status'] as String,
statusText: json['statusText'] as String?,
uid: json['uid'] as String,
updatedAt: dateTimeFromJson(json['updatedAt']),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$MoveService$moveService$jobToJson(
Mutation$MoveService$moveService$job instance) =>
<String, dynamic>{
'createdAt': dateTimeToJson(instance.createdAt),
'description': instance.description,
'error': instance.error,
'finishedAt': _nullable$dateTimeToJson(instance.finishedAt),
'name': instance.name,
'progress': instance.progress,
'result': instance.result,
'status': instance.status,
'statusText': instance.statusText,
'uid': instance.uid,
'updatedAt': dateTimeToJson(instance.updatedAt),
'__typename': instance.$__typename,
};

View File

@ -0,0 +1,76 @@
fragment basicMutationReturnFields on MutationReturnInterface{
code
message
success
}
mutation CreateUser($user: UserMutationInput!) {
createUser(user: $user) {
...basicMutationReturnFields
user {
username
userType
sshKeys
}
}
}
query AllUsers {
users {
allUsers {
userType
username
sshKeys
}
}
}
mutation AddSshKey($sshInput: SshMutationInput!) {
addSshKey(sshInput: $sshInput) {
...basicMutationReturnFields
user {
sshKeys
userType
username
}
}
}
query GetUser($username: String!) {
users {
getUser(username: $username) {
sshKeys
userType
username
}
}
}
mutation RemoveSshKey($sshInput: SshMutationInput!) {
removeSshKey(sshInput: $sshInput) {
...basicMutationReturnFields
user {
sshKeys
userType
username
}
}
}
mutation DeleteUser($username: String!) {
deleteUser(username: $username) {
...basicMutationReturnFields
}
}
mutation UpdateUser($user: UserMutationInput!) {
updateUser(user: $user) {
...basicMutationReturnFields
user {
sshKeys
userType
username
}
}
}

File diff suppressed because it is too large Load Diff

View File

@ -0,0 +1,471 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'users.graphql.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
Fragment$basicMutationReturnFields _$Fragment$basicMutationReturnFieldsFromJson(
Map<String, dynamic> json) =>
Fragment$basicMutationReturnFields(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Fragment$basicMutationReturnFieldsToJson(
Fragment$basicMutationReturnFields instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$CreateUser _$Variables$Mutation$CreateUserFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$CreateUser(
user: Input$UserMutationInput.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$CreateUserToJson(
Variables$Mutation$CreateUser instance) =>
<String, dynamic>{
'user': instance.user.toJson(),
};
Mutation$CreateUser _$Mutation$CreateUserFromJson(Map<String, dynamic> json) =>
Mutation$CreateUser(
createUser: Mutation$CreateUser$createUser.fromJson(
json['createUser'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$CreateUserToJson(
Mutation$CreateUser instance) =>
<String, dynamic>{
'createUser': instance.createUser.toJson(),
'__typename': instance.$__typename,
};
Mutation$CreateUser$createUser _$Mutation$CreateUser$createUserFromJson(
Map<String, dynamic> json) =>
Mutation$CreateUser$createUser(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
user: json['user'] == null
? null
: Mutation$CreateUser$createUser$user.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$CreateUser$createUserToJson(
Mutation$CreateUser$createUser instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'user': instance.user?.toJson(),
};
Mutation$CreateUser$createUser$user
_$Mutation$CreateUser$createUser$userFromJson(Map<String, dynamic> json) =>
Mutation$CreateUser$createUser$user(
username: json['username'] as String,
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
sshKeys: (json['sshKeys'] as List<dynamic>)
.map((e) => e as String)
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$CreateUser$createUser$userToJson(
Mutation$CreateUser$createUser$user instance) =>
<String, dynamic>{
'username': instance.username,
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'sshKeys': instance.sshKeys,
'__typename': instance.$__typename,
};
const _$Enum$UserTypeEnumMap = {
Enum$UserType.NORMAL: 'NORMAL',
Enum$UserType.PRIMARY: 'PRIMARY',
Enum$UserType.ROOT: 'ROOT',
Enum$UserType.$unknown: r'$unknown',
};
Query$AllUsers _$Query$AllUsersFromJson(Map<String, dynamic> json) =>
Query$AllUsers(
users:
Query$AllUsers$users.fromJson(json['users'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllUsersToJson(Query$AllUsers instance) =>
<String, dynamic>{
'users': instance.users.toJson(),
'__typename': instance.$__typename,
};
Query$AllUsers$users _$Query$AllUsers$usersFromJson(
Map<String, dynamic> json) =>
Query$AllUsers$users(
allUsers: (json['allUsers'] as List<dynamic>)
.map((e) =>
Query$AllUsers$users$allUsers.fromJson(e as Map<String, dynamic>))
.toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllUsers$usersToJson(
Query$AllUsers$users instance) =>
<String, dynamic>{
'allUsers': instance.allUsers.map((e) => e.toJson()).toList(),
'__typename': instance.$__typename,
};
Query$AllUsers$users$allUsers _$Query$AllUsers$users$allUsersFromJson(
Map<String, dynamic> json) =>
Query$AllUsers$users$allUsers(
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
username: json['username'] as String,
sshKeys:
(json['sshKeys'] as List<dynamic>).map((e) => e as String).toList(),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$AllUsers$users$allUsersToJson(
Query$AllUsers$users$allUsers instance) =>
<String, dynamic>{
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'username': instance.username,
'sshKeys': instance.sshKeys,
'__typename': instance.$__typename,
};
Variables$Mutation$AddSshKey _$Variables$Mutation$AddSshKeyFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$AddSshKey(
sshInput: Input$SshMutationInput.fromJson(
json['sshInput'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$AddSshKeyToJson(
Variables$Mutation$AddSshKey instance) =>
<String, dynamic>{
'sshInput': instance.sshInput.toJson(),
};
Mutation$AddSshKey _$Mutation$AddSshKeyFromJson(Map<String, dynamic> json) =>
Mutation$AddSshKey(
addSshKey: Mutation$AddSshKey$addSshKey.fromJson(
json['addSshKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$AddSshKeyToJson(Mutation$AddSshKey instance) =>
<String, dynamic>{
'addSshKey': instance.addSshKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$AddSshKey$addSshKey _$Mutation$AddSshKey$addSshKeyFromJson(
Map<String, dynamic> json) =>
Mutation$AddSshKey$addSshKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
user: json['user'] == null
? null
: Mutation$AddSshKey$addSshKey$user.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$AddSshKey$addSshKeyToJson(
Mutation$AddSshKey$addSshKey instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'user': instance.user?.toJson(),
};
Mutation$AddSshKey$addSshKey$user _$Mutation$AddSshKey$addSshKey$userFromJson(
Map<String, dynamic> json) =>
Mutation$AddSshKey$addSshKey$user(
sshKeys:
(json['sshKeys'] as List<dynamic>).map((e) => e as String).toList(),
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
username: json['username'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$AddSshKey$addSshKey$userToJson(
Mutation$AddSshKey$addSshKey$user instance) =>
<String, dynamic>{
'sshKeys': instance.sshKeys,
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'username': instance.username,
'__typename': instance.$__typename,
};
Variables$Query$GetUser _$Variables$Query$GetUserFromJson(
Map<String, dynamic> json) =>
Variables$Query$GetUser(
username: json['username'] as String,
);
Map<String, dynamic> _$Variables$Query$GetUserToJson(
Variables$Query$GetUser instance) =>
<String, dynamic>{
'username': instance.username,
};
Query$GetUser _$Query$GetUserFromJson(Map<String, dynamic> json) =>
Query$GetUser(
users:
Query$GetUser$users.fromJson(json['users'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetUserToJson(Query$GetUser instance) =>
<String, dynamic>{
'users': instance.users.toJson(),
'__typename': instance.$__typename,
};
Query$GetUser$users _$Query$GetUser$usersFromJson(Map<String, dynamic> json) =>
Query$GetUser$users(
getUser: json['getUser'] == null
? null
: Query$GetUser$users$getUser.fromJson(
json['getUser'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetUser$usersToJson(
Query$GetUser$users instance) =>
<String, dynamic>{
'getUser': instance.getUser?.toJson(),
'__typename': instance.$__typename,
};
Query$GetUser$users$getUser _$Query$GetUser$users$getUserFromJson(
Map<String, dynamic> json) =>
Query$GetUser$users$getUser(
sshKeys:
(json['sshKeys'] as List<dynamic>).map((e) => e as String).toList(),
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
username: json['username'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Query$GetUser$users$getUserToJson(
Query$GetUser$users$getUser instance) =>
<String, dynamic>{
'sshKeys': instance.sshKeys,
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'username': instance.username,
'__typename': instance.$__typename,
};
Variables$Mutation$RemoveSshKey _$Variables$Mutation$RemoveSshKeyFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$RemoveSshKey(
sshInput: Input$SshMutationInput.fromJson(
json['sshInput'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$RemoveSshKeyToJson(
Variables$Mutation$RemoveSshKey instance) =>
<String, dynamic>{
'sshInput': instance.sshInput.toJson(),
};
Mutation$RemoveSshKey _$Mutation$RemoveSshKeyFromJson(
Map<String, dynamic> json) =>
Mutation$RemoveSshKey(
removeSshKey: Mutation$RemoveSshKey$removeSshKey.fromJson(
json['removeSshKey'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RemoveSshKeyToJson(
Mutation$RemoveSshKey instance) =>
<String, dynamic>{
'removeSshKey': instance.removeSshKey.toJson(),
'__typename': instance.$__typename,
};
Mutation$RemoveSshKey$removeSshKey _$Mutation$RemoveSshKey$removeSshKeyFromJson(
Map<String, dynamic> json) =>
Mutation$RemoveSshKey$removeSshKey(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
user: json['user'] == null
? null
: Mutation$RemoveSshKey$removeSshKey$user.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$RemoveSshKey$removeSshKeyToJson(
Mutation$RemoveSshKey$removeSshKey instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'user': instance.user?.toJson(),
};
Mutation$RemoveSshKey$removeSshKey$user
_$Mutation$RemoveSshKey$removeSshKey$userFromJson(
Map<String, dynamic> json) =>
Mutation$RemoveSshKey$removeSshKey$user(
sshKeys: (json['sshKeys'] as List<dynamic>)
.map((e) => e as String)
.toList(),
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
username: json['username'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$RemoveSshKey$removeSshKey$userToJson(
Mutation$RemoveSshKey$removeSshKey$user instance) =>
<String, dynamic>{
'sshKeys': instance.sshKeys,
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'username': instance.username,
'__typename': instance.$__typename,
};
Variables$Mutation$DeleteUser _$Variables$Mutation$DeleteUserFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$DeleteUser(
username: json['username'] as String,
);
Map<String, dynamic> _$Variables$Mutation$DeleteUserToJson(
Variables$Mutation$DeleteUser instance) =>
<String, dynamic>{
'username': instance.username,
};
Mutation$DeleteUser _$Mutation$DeleteUserFromJson(Map<String, dynamic> json) =>
Mutation$DeleteUser(
deleteUser: Mutation$DeleteUser$deleteUser.fromJson(
json['deleteUser'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DeleteUserToJson(
Mutation$DeleteUser instance) =>
<String, dynamic>{
'deleteUser': instance.deleteUser.toJson(),
'__typename': instance.$__typename,
};
Mutation$DeleteUser$deleteUser _$Mutation$DeleteUser$deleteUserFromJson(
Map<String, dynamic> json) =>
Mutation$DeleteUser$deleteUser(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$DeleteUser$deleteUserToJson(
Mutation$DeleteUser$deleteUser instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
};
Variables$Mutation$UpdateUser _$Variables$Mutation$UpdateUserFromJson(
Map<String, dynamic> json) =>
Variables$Mutation$UpdateUser(
user: Input$UserMutationInput.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Variables$Mutation$UpdateUserToJson(
Variables$Mutation$UpdateUser instance) =>
<String, dynamic>{
'user': instance.user.toJson(),
};
Mutation$UpdateUser _$Mutation$UpdateUserFromJson(Map<String, dynamic> json) =>
Mutation$UpdateUser(
updateUser: Mutation$UpdateUser$updateUser.fromJson(
json['updateUser'] as Map<String, dynamic>),
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$UpdateUserToJson(
Mutation$UpdateUser instance) =>
<String, dynamic>{
'updateUser': instance.updateUser.toJson(),
'__typename': instance.$__typename,
};
Mutation$UpdateUser$updateUser _$Mutation$UpdateUser$updateUserFromJson(
Map<String, dynamic> json) =>
Mutation$UpdateUser$updateUser(
code: json['code'] as int,
message: json['message'] as String,
success: json['success'] as bool,
$__typename: json['__typename'] as String,
user: json['user'] == null
? null
: Mutation$UpdateUser$updateUser$user.fromJson(
json['user'] as Map<String, dynamic>),
);
Map<String, dynamic> _$Mutation$UpdateUser$updateUserToJson(
Mutation$UpdateUser$updateUser instance) =>
<String, dynamic>{
'code': instance.code,
'message': instance.message,
'success': instance.success,
'__typename': instance.$__typename,
'user': instance.user?.toJson(),
};
Mutation$UpdateUser$updateUser$user
_$Mutation$UpdateUser$updateUser$userFromJson(Map<String, dynamic> json) =>
Mutation$UpdateUser$updateUser$user(
sshKeys: (json['sshKeys'] as List<dynamic>)
.map((e) => e as String)
.toList(),
userType: $enumDecode(_$Enum$UserTypeEnumMap, json['userType'],
unknownValue: Enum$UserType.$unknown),
username: json['username'] as String,
$__typename: json['__typename'] as String,
);
Map<String, dynamic> _$Mutation$UpdateUser$updateUser$userToJson(
Mutation$UpdateUser$updateUser$user instance) =>
<String, dynamic>{
'sshKeys': instance.sshKeys,
'userType': _$Enum$UserTypeEnumMap[instance.userType],
'username': instance.username,
'__typename': instance.$__typename,
};

View File

@ -105,8 +105,8 @@ class ServerApi extends ApiMap {
try { try {
response = await client.get('/services/status'); response = await client.get('/services/status');
res = response.statusCode == HttpStatus.ok; res = response.statusCode == HttpStatus.ok;
} on DioError catch (e) { } catch (e) {
print(e.message); print(e);
} finally { } finally {
close(client); close(client);
} }

View File

@ -81,11 +81,11 @@ class HetznerApi extends ServerProviderApi with VolumeProviderApi {
final Response dbGetResponse; final Response dbGetResponse;
final Dio client = await getClient(); final Dio client = await getClient();
try { try {
dbGetResponse = await client.post('/pricing'); dbGetResponse = await client.get('/pricing');
final volume = dbGetResponse.data['pricing']['volume']; final volume = dbGetResponse.data['pricing']['volume'];
final volumePrice = volume['price_per_gb_month']['gross']; final volumePrice = volume['price_per_gb_month']['gross'];
price = volumePrice as double; price = double.parse(volumePrice);
} catch (e) { } catch (e) {
print(e); print(e);
} finally { } finally {

View File

@ -1,11 +1,14 @@
import 'dart:async';
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:equatable/equatable.dart'; import 'package:equatable/equatable.dart';
import 'package:flutter_bloc/flutter_bloc.dart'; import 'package:flutter_bloc/flutter_bloc.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.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/schema/server.dart';
import 'package:selfprivacy/logic/cubit/services/services_cubit.dart'; import 'package:selfprivacy/logic/cubit/services/services_cubit.dart';
import 'package:selfprivacy/logic/cubit/users/users_cubit.dart'; import 'package:selfprivacy/logic/cubit/users/users_cubit.dart';
import 'package:selfprivacy/logic/models/job.dart'; import 'package:selfprivacy/logic/models/job.dart';
import 'package:selfprivacy/logic/models/json/server_job.dart';
export 'package:provider/provider.dart'; export 'package:provider/provider.dart';
@ -15,20 +18,21 @@ class JobsCubit extends Cubit<JobsState> {
JobsCubit({ JobsCubit({
required this.usersCubit, required this.usersCubit,
required this.servicesCubit, required this.servicesCubit,
}) : super(JobsStateEmpty()); }) : super(const JobsStateEmpty([]));
final ServerApi api = ServerApi(); final ServerApi api = ServerApi();
final UsersCubit usersCubit; final UsersCubit usersCubit;
final ServicesCubit servicesCubit; final ServicesCubit servicesCubit;
void addJob(final Job job) { void addJob(final ClientJob job) {
final List<Job> newJobsList = <Job>[]; final List<ClientJob> newJobsList = [];
if (state is JobsStateWithJobs) { if (state is JobsStateWithJobs) {
newJobsList.addAll((state as JobsStateWithJobs).jobList); final JobsStateWithJobs jobsState = state as JobsStateWithJobs;
newJobsList.addAll(jobsState.clientJobList);
} }
newJobsList.add(job); newJobsList.add(job);
getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr()); getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr());
emit(JobsStateWithJobs(newJobsList)); emit(JobsStateWithJobs(newJobsList, state.serverJobList));
} }
void removeJob(final String id) { void removeJob(final String id) {
@ -37,51 +41,51 @@ class JobsCubit extends Cubit<JobsState> {
} }
void createOrRemoveServiceToggleJob(final ToggleJob job) { void createOrRemoveServiceToggleJob(final ToggleJob job) {
final List<Job> newJobsList = <Job>[]; final List<ClientJob> newJobsList = <ClientJob>[];
if (state is JobsStateWithJobs) { if (state is JobsStateWithJobs) {
newJobsList.addAll((state as JobsStateWithJobs).jobList); newJobsList.addAll((state as JobsStateWithJobs).clientJobList);
} }
final bool needToRemoveJob = newJobsList final bool needToRemoveJob = newJobsList
.any((final el) => el is ServiceToggleJob && el.type == job.type); .any((final el) => el is ServiceToggleJob && el.type == job.type);
if (needToRemoveJob) { if (needToRemoveJob) {
final Job removingJob = newJobsList.firstWhere( final ClientJob removingJob = newJobsList.firstWhere(
(final el) => el is ServiceToggleJob && el.type == job.type, (final el) => el is ServiceToggleJob && el.type == job.type,
); );
removeJob(removingJob.id); removeJob(removingJob.id);
} else { } else {
newJobsList.add(job); newJobsList.add(job);
getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr()); getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr());
emit(JobsStateWithJobs(newJobsList)); emit(JobsStateWithJobs(newJobsList, state.serverJobList));
} }
} }
void createShhJobIfNotExist(final CreateSSHKeyJob job) { void createShhJobIfNotExist(final CreateSSHKeyJob job) {
final List<Job> newJobsList = <Job>[]; final List<ClientJob> newJobsList = <ClientJob>[];
if (state is JobsStateWithJobs) { if (state is JobsStateWithJobs) {
newJobsList.addAll((state as JobsStateWithJobs).jobList); newJobsList.addAll((state as JobsStateWithJobs).clientJobList);
} }
final bool isExistInJobList = final bool isExistInJobList =
newJobsList.any((final el) => el is CreateSSHKeyJob); newJobsList.any((final el) => el is CreateSSHKeyJob);
if (!isExistInJobList) { if (!isExistInJobList) {
newJobsList.add(job); newJobsList.add(job);
getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr()); getIt<NavigationService>().showSnackBar('jobs.jobAdded'.tr());
emit(JobsStateWithJobs(newJobsList)); emit(JobsStateWithJobs(newJobsList, state.serverJobList));
} }
} }
Future<void> rebootServer() async { Future<void> rebootServer() async {
emit(JobsStateLoading()); emit(JobsStateLoading(state.serverJobList));
final bool isSuccessful = await api.reboot(); final bool isSuccessful = await api.reboot();
if (isSuccessful) { if (isSuccessful) {
getIt<NavigationService>().showSnackBar('jobs.rebootSuccess'.tr()); getIt<NavigationService>().showSnackBar('jobs.rebootSuccess'.tr());
} else { } else {
getIt<NavigationService>().showSnackBar('jobs.rebootFailed'.tr()); getIt<NavigationService>().showSnackBar('jobs.rebootFailed'.tr());
} }
emit(JobsStateEmpty()); emit(JobsStateEmpty(state.serverJobList));
} }
Future<void> upgradeServer() async { Future<void> upgradeServer() async {
emit(JobsStateLoading()); emit(JobsStateLoading(state.serverJobList));
final bool isPullSuccessful = await api.pullConfigurationUpdate(); final bool isPullSuccessful = await api.pullConfigurationUpdate();
final bool isSuccessful = await api.upgrade(); final bool isSuccessful = await api.upgrade();
if (isSuccessful) { if (isSuccessful) {
@ -93,15 +97,15 @@ class JobsCubit extends Cubit<JobsState> {
} else { } else {
getIt<NavigationService>().showSnackBar('jobs.upgradeFailed'.tr()); getIt<NavigationService>().showSnackBar('jobs.upgradeFailed'.tr());
} }
emit(JobsStateEmpty()); emit(JobsStateEmpty(state.serverJobList));
} }
Future<void> applyAll() async { Future<void> applyAll() async {
if (state is JobsStateWithJobs) { if (state is JobsStateWithJobs) {
final List<Job> jobs = (state as JobsStateWithJobs).jobList; final List<ClientJob> jobs = (state as JobsStateWithJobs).clientJobList;
emit(JobsStateLoading()); emit(JobsStateLoading(state.serverJobList));
bool hasServiceJobs = false; bool hasServiceJobs = false;
for (final Job job in jobs) { for (final ClientJob job in jobs) {
if (job is CreateUserJob) { if (job is CreateUserJob) {
await usersCubit.createUser(job.user); await usersCubit.createUser(job.user);
} }
@ -122,11 +126,45 @@ class JobsCubit extends Cubit<JobsState> {
await api.pullConfigurationUpdate(); await api.pullConfigurationUpdate();
await api.apply(); await api.apply();
if (hasServiceJobs) { if (hasServiceJobs) {
await servicesCubit.load(); await servicesCubit.load();
} }
emit(JobsStateEmpty()); emit(JobsStateEmpty(state.serverJobList));
} }
} }
Future<void> resetRequestsTimer() async {
const duration = Duration(seconds: 1);
Timer.periodic(
duration,
(final timer) async {
if (timer.tick >= 10) {
final List<ServerJob> serverJobs = await api.getServerJobs();
final List<ServerJob> newServerJobs = [];
for (final ServerJob job in serverJobs) {
if (job.status == 'FINISHED') {
await api.removeApiJob(job.uid);
} else {
newServerJobs.add(job);
}
}
if (state is JobsStateWithJobs) {
emit(
JobsStateWithJobs(
(state as JobsStateWithJobs).clientJobList,
newServerJobs,
),
);
} else {
emit(
JobsStateEmpty(newServerJobs),
);
}
}
},
);
}
} }

View File

@ -1,28 +1,34 @@
part of 'jobs_cubit.dart'; part of 'jobs_cubit.dart';
abstract class JobsState extends Equatable { abstract class JobsState extends Equatable {
const JobsState(this.serverJobList);
final List<ServerJob> serverJobList;
@override @override
List<Object?> get props => []; List<Object?> get props => [serverJobList];
} }
class JobsStateLoading extends JobsState {} class JobsStateLoading extends JobsState {
const JobsStateLoading(super.serverJobList);
}
class JobsStateEmpty extends JobsState {} class JobsStateEmpty extends JobsState {
const JobsStateEmpty(super.serverJobList);
}
class JobsStateWithJobs extends JobsState { class JobsStateWithJobs extends JobsState {
JobsStateWithJobs(this.jobList); const JobsStateWithJobs(this.clientJobList, super.serverJobList);
final List<Job> jobList; final List<ClientJob> clientJobList;
JobsState removeById(final String id) { JobsState removeById(final String id) {
final List<Job> newJobsList = final List<ClientJob> newJobsList =
jobList.where((final element) => element.id != id).toList(); clientJobList.where((final element) => element.id != id).toList();
if (newJobsList.isEmpty) { if (newJobsList.isEmpty) {
return JobsStateEmpty(); return JobsStateEmpty(serverJobList);
} }
return JobsStateWithJobs(newJobsList); return JobsStateWithJobs(newJobsList, serverJobList);
} }
@override @override
List<Object?> get props => jobList; List<Object?> get props => [...super.props, clientJobList];
} }

View File

@ -292,6 +292,43 @@ class ServerInstallationRepository {
], ],
), ),
); );
} else if (e.response!.data['error']['code'] == 'resource_unavailable') {
final NavigationService nav = getIt.get<NavigationService>();
nav.showPopUpDialog(
BrandAlert(
title: 'modals.1_1'.tr(),
contentText: 'modals.2_2'.tr(),
actions: [
ActionButton(
text: 'modals.7'.tr(),
isRed: true,
onPressed: () async {
ServerHostingDetails? serverDetails;
try {
serverDetails = await api.createServer(
dnsApiToken: cloudFlareKey,
rootUser: rootUser,
domainName: domainName,
);
} catch (e) {
print(e);
}
if (serverDetails == null) {
print('Server is not initialized!');
return;
}
await saveServerDetails(serverDetails);
onSuccess(serverDetails);
},
),
ActionButton(
text: 'basis.cancel'.tr(),
onPressed: onCancel,
),
],
),
);
} }
} }
} }

View File

@ -12,12 +12,16 @@ part 'volumes_state.dart';
class ApiVolumesCubit class ApiVolumesCubit
extends ServerInstallationDependendCubit<ApiVolumesState> { extends ServerInstallationDependendCubit<ApiVolumesState> {
ApiVolumesCubit(final ServerInstallationCubit serverInstallationCubit) ApiVolumesCubit(final ServerInstallationCubit serverInstallationCubit)
: super(serverInstallationCubit, const ApiVolumesState.initial()); : super(serverInstallationCubit, const ApiVolumesState.initial()) {
final serverDetails = getIt<ApiConfigModel>().serverDetails;
providerApi = serverDetails == null
? null
: VolumeApiFactoryCreator.createVolumeProviderApiFactory(
getIt<ApiConfigModel>().serverDetails!.provider,
);
}
final VolumeProviderApiFactory providerApi = VolumeProviderApiFactory? providerApi;
VolumeApiFactoryCreator.createVolumeProviderApiFactory(
getIt<ApiConfigModel>().serverDetails!.provider,
);
@override @override
Future<void> load() async { Future<void> load() async {
@ -26,8 +30,16 @@ class ApiVolumesCubit
} }
} }
Future<List<ServerVolume>> getVolumes() async {
if (providerApi == null) {
return [];
}
return providerApi!.getVolumeProvider().getVolumes();
}
Future<double?> getPricePerGb() async => Future<double?> getPricePerGb() async =>
providerApi.getVolumeProvider().getPricePerGb(); providerApi!.getVolumeProvider().getPricePerGb();
Future<void> refresh() async { Future<void> refresh() async {
emit(const ApiVolumesState([], LoadingStatus.refreshing)); emit(const ApiVolumesState([], LoadingStatus.refreshing));
@ -35,8 +47,7 @@ class ApiVolumesCubit
} }
Future<void> _refetch() async { Future<void> _refetch() async {
final List<ServerVolume> volumes = final List<ServerVolume> volumes = await getVolumes();
await providerApi.getVolumeProvider().getVolumes();
if (volumes.isNotEmpty) { if (volumes.isNotEmpty) {
emit(ApiVolumesState(volumes, LoadingStatus.success)); emit(ApiVolumesState(volumes, LoadingStatus.success));
} else { } else {
@ -46,12 +57,12 @@ class ApiVolumesCubit
Future<void> attachVolume(final ServerVolume volume) async { Future<void> attachVolume(final ServerVolume volume) async {
final ServerHostingDetails server = getIt<ApiConfigModel>().serverDetails!; final ServerHostingDetails server = getIt<ApiConfigModel>().serverDetails!;
await providerApi.getVolumeProvider().attachVolume(volume.id, server.id); await providerApi!.getVolumeProvider().attachVolume(volume.id, server.id);
refresh(); refresh();
} }
Future<void> detachVolume(final ServerVolume volume) async { Future<void> detachVolume(final ServerVolume volume) async {
await providerApi.getVolumeProvider().detachVolume(volume.id); await providerApi!.getVolumeProvider().detachVolume(volume.id);
refresh(); refresh();
} }
@ -60,7 +71,7 @@ class ApiVolumesCubit
final int newSizeGb, final int newSizeGb,
) async { ) async {
final ServerVolume? providerVolume = await fetchProdiverVolume(volume); final ServerVolume? providerVolume = await fetchProdiverVolume(volume);
final bool resized = await providerApi.getVolumeProvider().resizeVolume( final bool resized = await providerApi!.getVolumeProvider().resizeVolume(
providerVolume!.id, providerVolume!.id,
newSizeGb, newSizeGb,
); );
@ -76,7 +87,7 @@ class ApiVolumesCubit
Future<void> createVolume() async { Future<void> createVolume() async {
final ServerVolume? volume = final ServerVolume? volume =
await providerApi.getVolumeProvider().createVolume(); await providerApi!.getVolumeProvider().createVolume();
await attachVolume(volume!); await attachVolume(volume!);
await Future.delayed(const Duration(seconds: 10)); await Future.delayed(const Duration(seconds: 10));
@ -88,7 +99,7 @@ class ApiVolumesCubit
Future<void> deleteVolume(final ServerDiskVolume volume) async { Future<void> deleteVolume(final ServerDiskVolume volume) async {
final ServerVolume? providerVolume = await fetchProdiverVolume(volume); final ServerVolume? providerVolume = await fetchProdiverVolume(volume);
await providerApi.getVolumeProvider().deleteVolume(providerVolume!.id); await providerApi!.getVolumeProvider().deleteVolume(providerVolume!.id);
refresh(); refresh();
} }
@ -102,7 +113,7 @@ class ApiVolumesCubit
) async { ) async {
ServerVolume? fetchedVolume; ServerVolume? fetchedVolume;
final List<ServerVolume> volumes = final List<ServerVolume> volumes =
await providerApi.getVolumeProvider().getVolumes(); await providerApi!.getVolumeProvider().getVolumes();
for (final ServerVolume providerVolume in volumes) { for (final ServerVolume providerVolume in volumes) {
if (providerVolume.linuxDevice == null) { if (providerVolume.linuxDevice == null) {

View File

@ -0,0 +1,9 @@
class DiskSize {
DiskSize({final this.byte = 0});
double asKb() => byte / 1000.0;
double asMb() => byte / 1000000.0;
double asGb() => byte / 1000000000.0;
int byte;
}

View File

@ -7,8 +7,8 @@ import 'package:selfprivacy/utils/password_generator.dart';
import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/hive/user.dart';
@immutable @immutable
class Job extends Equatable { class ClientJob extends Equatable {
Job({ ClientJob({
required this.title, required this.title,
final String? id, final String? id,
}) : id = id ?? StringGenerators.simpleId(); }) : id = id ?? StringGenerators.simpleId();
@ -20,7 +20,7 @@ class Job extends Equatable {
List<Object> get props => [id, title]; List<Object> get props => [id, title];
} }
class CreateUserJob extends Job { class CreateUserJob extends ClientJob {
CreateUserJob({ CreateUserJob({
required this.user, required this.user,
}) : super(title: '${"jobs.createUser".tr()} ${user.login}'); }) : super(title: '${"jobs.createUser".tr()} ${user.login}');
@ -31,7 +31,7 @@ class CreateUserJob extends Job {
List<Object> get props => [id, title, user]; List<Object> get props => [id, title, user];
} }
class DeleteUserJob extends Job { class DeleteUserJob extends ClientJob {
DeleteUserJob({ DeleteUserJob({
required this.user, required this.user,
}) : super(title: '${"jobs.deleteUser".tr()} ${user.login}'); }) : super(title: '${"jobs.deleteUser".tr()} ${user.login}');
@ -42,7 +42,7 @@ class DeleteUserJob extends Job {
List<Object> get props => [id, title, user]; List<Object> get props => [id, title, user];
} }
class ToggleJob extends Job { class ToggleJob extends ClientJob {
ToggleJob({ ToggleJob({
required this.type, required this.type,
required final super.title, required final super.title,
@ -66,7 +66,7 @@ class ServiceToggleJob extends ToggleJob {
final bool needToTurnOn; final bool needToTurnOn;
} }
class CreateSSHKeyJob extends Job { class CreateSSHKeyJob extends ClientJob {
CreateSSHKeyJob({ CreateSSHKeyJob({
required this.user, required this.user,
required this.publicKey, required this.publicKey,
@ -79,7 +79,7 @@ class CreateSSHKeyJob extends Job {
List<Object> get props => [id, title, user, publicKey]; List<Object> get props => [id, title, user, publicKey];
} }
class DeleteSSHKeyJob extends Job { class DeleteSSHKeyJob extends ClientJob {
DeleteSSHKeyJob({ DeleteSSHKeyJob({
required this.user, required this.user,
required this.publicKey, required this.publicKey,

View File

@ -24,7 +24,7 @@ BackupStatus _$BackupStatusFromJson(Map<String, dynamic> json) => BackupStatus(
Map<String, dynamic> _$BackupStatusToJson(BackupStatus instance) => Map<String, dynamic> _$BackupStatusToJson(BackupStatus instance) =>
<String, dynamic>{ <String, dynamic>{
'status': _$BackupStatusEnumEnumMap[instance.status]!, 'status': _$BackupStatusEnumEnumMap[instance.status],
'progress': instance.progress, 'progress': instance.progress,
'error_message': instance.errorMessage, 'error_message': instance.errorMessage,
}; };

View File

@ -23,7 +23,7 @@ Map<String, dynamic> _$HetznerServerInfoToJson(HetznerServerInfo instance) =>
<String, dynamic>{ <String, dynamic>{
'id': instance.id, 'id': instance.id,
'name': instance.name, 'name': instance.name,
'status': _$ServerStatusEnumMap[instance.status]!, 'status': _$ServerStatusEnumMap[instance.status],
'created': instance.created.toIso8601String(), 'created': instance.created.toIso8601String(),
'volumes': instance.volumes, 'volumes': instance.volumes,
'server_type': instance.serverType, 'server_type': instance.serverType,

View File

@ -0,0 +1,39 @@
import 'package:json_annotation/json_annotation.dart';
part 'server_job.g.dart';
@JsonSerializable()
class ServerJob {
factory ServerJob.fromJson(final Map<String, dynamic> json) =>
_$ServerJobFromJson(json);
ServerJob({
required this.name,
required this.description,
required this.status,
required this.uid,
required this.updatedAt,
required this.createdAt,
final this.error,
final this.progress,
final this.result,
final this.statusText,
final this.finishedAt,
});
final String name;
final String description;
final String status;
final String uid;
@JsonKey(name: 'updated_at')
final String updatedAt;
@JsonKey(name: 'created_at')
final DateTime createdAt;
final String? error;
final int? progress;
final String? result;
@JsonKey(name: 'status_text')
final String? statusText;
@JsonKey(name: 'finished_at')
final String? finishedAt;
}

View File

@ -0,0 +1,35 @@
// GENERATED CODE - DO NOT MODIFY BY HAND
part of 'server_job.dart';
// **************************************************************************
// JsonSerializableGenerator
// **************************************************************************
ServerJob _$ServerJobFromJson(Map<String, dynamic> json) => ServerJob(
name: json['name'] as String,
description: json['description'] as String,
status: json['status'] as String,
uid: json['uid'] as String,
updatedAt: json['updated_at'] as String,
createdAt: DateTime.parse(json['created_at'] as String),
error: json['error'] as String?,
progress: json['progress'] as int?,
result: json['result'] as String?,
statusText: json['status_text'] as String?,
finishedAt: json['finished_at'] as String?,
);
Map<String, dynamic> _$ServerJobToJson(ServerJob instance) => <String, dynamic>{
'name': instance.name,
'description': instance.description,
'status': instance.status,
'uid': instance.uid,
'updated_at': instance.updatedAt,
'created_at': instance.createdAt.toIso8601String(),
'error': instance.error,
'progress': instance.progress,
'result': instance.result,
'status_text': instance.statusText,
'finished_at': instance.finishedAt,
};

View File

@ -0,0 +1,34 @@
import 'package:flutter/material.dart';
class BrandOutlinedButton extends StatelessWidget {
const BrandOutlinedButton({
final super.key,
this.onPressed,
this.title,
this.child,
this.disabled = false,
});
final VoidCallback? onPressed;
final String? title;
final Widget? child;
final bool disabled;
@override
Widget build(final BuildContext context) => ConstrainedBox(
constraints: const BoxConstraints(
minHeight: 40,
minWidth: double.infinity,
),
child: OutlinedButton(
onPressed: onPressed,
child: child ??
Text(
title ?? '',
style: Theme.of(context).textTheme.button?.copyWith(
color: Theme.of(context).colorScheme.primary,
),
),
),
);
}

View File

@ -67,7 +67,7 @@ class JobsContent extends StatelessWidget {
]; ];
} else if (state is JobsStateWithJobs) { } else if (state is JobsStateWithJobs) {
widgets = [ widgets = [
...state.jobList ...state.clientJobList
.map( .map(
(final j) => Row( (final j) => Row(
children: [ children: [

View File

@ -83,10 +83,14 @@ class _ProgressBarState extends State<ProgressBar> {
height: 5, height: 5,
decoration: BoxDecoration( decoration: BoxDecoration(
borderRadius: BorderRadius.circular(5), borderRadius: BorderRadius.circular(5),
gradient: const LinearGradient( color: Theme.of(context).colorScheme.surfaceVariant,
gradient: LinearGradient(
begin: Alignment.topLeft, begin: Alignment.topLeft,
end: Alignment.bottomRight, end: Alignment.bottomRight,
colors: BrandColors.stableGradientColors, colors: [
Theme.of(context).colorScheme.primary,
Theme.of(context).colorScheme.secondary
],
), ),
), ),
duration: const Duration( duration: const Duration(
@ -122,15 +126,7 @@ class _ProgressBarState extends State<ProgressBar> {
text: TextSpan( text: TextSpan(
style: progressTextStyleLight, style: progressTextStyleLight,
children: [ children: [
if (checked) TextSpan(text: '${index + 1}.', style: style),
const WidgetSpan(
child: Padding(
padding: EdgeInsets.only(bottom: 2, right: 2),
child: Icon(BrandIcons.check, size: 11),
),
)
else
TextSpan(text: '${index + 1}.', style: style),
TextSpan(text: step, style: style) TextSpan(text: step, style: style)
], ],
), ),

View File

@ -5,6 +5,9 @@ import 'package:selfprivacy/logic/cubit/backups/backups_cubit.dart';
import 'package:selfprivacy/logic/cubit/dns_records/dns_records_cubit.dart'; import 'package:selfprivacy/logic/cubit/dns_records/dns_records_cubit.dart';
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.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/cubit/volumes/volumes_cubit.dart';
import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/logic/models/hive/server_details.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/provider.dart'; import 'package:selfprivacy/logic/models/provider.dart';
import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart'; import 'package:selfprivacy/ui/components/brand_bottom_sheet/brand_bottom_sheet.dart';
@ -18,6 +21,7 @@ import 'package:selfprivacy/ui/pages/backup_details/backup_details.dart';
import 'package:selfprivacy/ui/pages/dns_details/dns_details.dart'; import 'package:selfprivacy/ui/pages/dns_details/dns_details.dart';
import 'package:selfprivacy/ui/pages/providers/storage_card.dart'; import 'package:selfprivacy/ui/pages/providers/storage_card.dart';
import 'package:selfprivacy/ui/pages/server_details/server_details_screen.dart'; import 'package:selfprivacy/ui/pages/server_details/server_details_screen.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart';
GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>(); GlobalKey<NavigatorState> navigatorKey = GlobalKey<NavigatorState>();
@ -73,15 +77,21 @@ class _ProvidersPageState extends State<ProvidersPage> {
Padding( Padding(
padding: const EdgeInsets.only(bottom: 30), padding: const EdgeInsets.only(bottom: 30),
child: FutureBuilder( child: FutureBuilder(
future: future: Future.wait([
context.read<ServerInstallationCubit>().getServerDiskVolumes(), context.read<ServerInstallationCubit>().getServerDiskVolumes(),
context.read<ApiVolumesCubit>().getVolumes(),
]),
builder: ( builder: (
final BuildContext context, final BuildContext context,
final AsyncSnapshot<Object?> snapshot, final AsyncSnapshot<List<dynamic>> snapshot,
) => ) =>
StorageCard( StorageCard(
volumes: diskStatus: snapshot.hasData
snapshot.hasData ? snapshot.data as List<ServerDiskVolume> : [], ? toDiskStatus(
snapshot.data![0] as List<ServerDiskVolume>,
snapshot.data![1] as List<ServerVolume>,
)
: DiskStatus(),
), ),
), ),
), ),
@ -105,6 +115,60 @@ class _ProvidersPageState extends State<ProvidersPage> {
), ),
); );
} }
DiskStatus toDiskStatus(
final List<ServerDiskVolume> serverVolumes,
final List<ServerVolume> providerVolumes,
) {
final DiskStatus diskStatus = DiskStatus();
diskStatus.isDiskOkay = true;
if (providerVolumes.isEmpty || serverVolumes.isEmpty) {
diskStatus.isDiskOkay = false;
}
diskStatus.diskVolumes = serverVolumes.map((
final ServerDiskVolume volume,
) {
final DiskVolume diskVolume = DiskVolume();
diskVolume.sizeUsed = DiskSize(
byte: volume.usedSpace == 'None' ? 0 : int.parse(volume.usedSpace),
);
diskVolume.sizeTotal = DiskSize(
byte: volume.totalSpace == 'None' ? 0 : int.parse(volume.totalSpace),
);
diskVolume.serverDiskVolume = volume;
for (final ServerVolume providerVolume in providerVolumes) {
if (providerVolume.linuxDevice == null ||
volume.model == null ||
volume.serial == null) {
continue;
}
final String deviceId = providerVolume.linuxDevice!.split('/').last;
if (deviceId.contains(volume.model!) &&
deviceId.contains(volume.serial!)) {
diskVolume.providerVolume = providerVolume;
break;
}
}
diskVolume.name = volume.name;
diskVolume.root = volume.root;
diskVolume.percentage =
volume.usedSpace != 'None' && volume.totalSpace != 'None'
? 1.0 / diskVolume.sizeTotal.byte * diskVolume.sizeUsed.byte
: 0.0;
if (diskVolume.percentage >= 0.8 ||
diskVolume.sizeTotal.asGb() - diskVolume.sizeUsed.asGb() <= 2.0) {
diskStatus.isDiskOkay = false;
}
return diskVolume;
}).toList();
return diskStatus;
}
} }
class _Card extends StatelessWidget { class _Card extends StatelessWidget {
@ -137,8 +201,9 @@ class _Card extends StatelessWidget {
break; break;
case ProviderType.domain: case ProviderType.domain:
title = 'providers.domain.screen_title'.tr(); title = 'providers.domain.screen_title'.tr();
message = message = appConfig.isDomainSelected
appConfig.isDomainFilled ? appConfig.serverDomain!.domainName : ''; ? appConfig.serverDomain!.domainName
: '';
stableText = 'providers.domain.status'.tr(); stableText = 'providers.domain.status'.tr();
onTap = () => Navigator.of(context).push( onTap = () => Navigator.of(context).push(
@ -168,12 +233,17 @@ class _Card extends StatelessWidget {
status: provider.state, status: provider.state,
child: Icon(provider.icon, size: 30, color: Colors.white), child: Icon(provider.icon, size: 30, color: Colors.white),
), ),
const SizedBox(height: 10), const SizedBox(height: 16),
BrandText.h2(title), Text(
const SizedBox(height: 10), title,
style: Theme.of(context).textTheme.titleLarge,
),
if (message != null) ...[ if (message != null) ...[
BrandText.body2(message), Text(
const SizedBox(height: 10), message,
style: Theme.of(context).textTheme.titleLarge,
),
const SizedBox(height: 16),
], ],
if (provider.state == StateType.stable) BrandText.body2(stableText), if (provider.state == StateType.stable) BrandText.body2(stableText),
], ],

View File

@ -1,67 +1,47 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:selfprivacy/logic/cubit/app_config_dependent/authentication_dependend_cubit.dart';
import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart'; import 'package:selfprivacy/logic/cubit/providers/providers_cubit.dart';
import 'package:selfprivacy/logic/models/json/server_disk_volume.dart';
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart'; import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
import 'package:selfprivacy/ui/components/brand_linear_indicator/brand_linear_indicator.dart';
import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart'; import 'package:selfprivacy/ui/components/icon_status_mask/icon_status_mask.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
import 'package:selfprivacy/ui/pages/server_storage/server_storage.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage.dart';
import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart';
class StorageCard extends StatelessWidget { class StorageCard extends StatelessWidget {
const StorageCard({required this.volumes, final super.key}); const StorageCard({
required final this.diskStatus,
final super.key,
});
final List<ServerDiskVolume> volumes; final DiskStatus diskStatus;
@override @override
Widget build(final BuildContext context) { Widget build(final BuildContext context) {
final DiskStatus diskStatus = toDiskStatus(volumes);
final List<Widget> sections = []; final List<Widget> sections = [];
for (final DiskVolume volume in diskStatus.diskVolumes) { for (final DiskVolume volume in diskStatus.diskVolumes) {
sections.add( sections.add(
const SizedBox(height: 16), const SizedBox(height: 16),
); );
sections.add( sections.add(
Text( ServerStorageListItem(
'providers.storage.disk_usage'.tr( volume: volume,
args: [ dense: true,
volume.gbUsed.toString(), showIcon: false,
],
),
style: Theme.of(context).textTheme.titleMedium,
),
);
sections.add(
const SizedBox(height: 4),
);
sections.add(
BrandLinearIndicator(
value: volume.percentage,
color: volume.root
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.secondary,
backgroundColor: Theme.of(context).colorScheme.surfaceVariant,
height: 14.0,
),
);
sections.add(
const SizedBox(height: 4),
);
sections.add(
Text(
'providers.storage.disk_total'.tr(
args: [
volume.gbTotal.toString(),
volume.name,
],
),
style: Theme.of(context).textTheme.bodySmall,
), ),
); );
} }
StateType state = context.watch<ServerInstallationCubit>().state
is ServerInstallationFinished
? StateType.stable
: StateType.uninitialized;
if (state == StateType.stable && !diskStatus.isDiskOkay) {
state = StateType.error;
}
return GestureDetector( return GestureDetector(
onTap: () => Navigator.of(context).push( onTap: () => Navigator.of(context).push(
materialRoute( materialRoute(
@ -77,24 +57,25 @@ class StorageCard extends StatelessWidget {
Row( Row(
mainAxisAlignment: MainAxisAlignment.spaceBetween, mainAxisAlignment: MainAxisAlignment.spaceBetween,
children: [ children: [
const IconStatusMask( IconStatusMask(
status: StateType.stable, status: state,
child: Icon( child: const Icon(
Icons.storage_outlined, Icons.storage_outlined,
size: 30, size: 30,
color: Colors.white, color: Colors.white,
), ),
), ),
IconStatusMask( if (state != StateType.uninitialized)
status: StateType.stable, IconStatusMask(
child: Icon( status: state,
diskStatus.isDiskOkay child: Icon(
? Icons.check_circle_outline diskStatus.isDiskOkay
: Icons.error_outline, ? Icons.check_circle_outline
size: 24, : Icons.error_outline,
color: Colors.white, size: 24,
color: Colors.white,
),
), ),
),
], ],
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
@ -102,12 +83,13 @@ class StorageCard extends StatelessWidget {
'providers.storage.card_title'.tr(), 'providers.storage.card_title'.tr(),
style: Theme.of(context).textTheme.titleLarge, style: Theme.of(context).textTheme.titleLarge,
), ),
Text( if (state != StateType.uninitialized)
diskStatus.isDiskOkay Text(
? 'providers.storage.status_ok'.tr() diskStatus.isDiskOkay
: 'providers.storage.status_error'.tr(), ? 'providers.storage.status_ok'.tr()
style: Theme.of(context).textTheme.bodyLarge, : 'providers.storage.status_error'.tr(),
), style: Theme.of(context).textTheme.bodyLarge,
),
...sections, ...sections,
const SizedBox(height: 8), const SizedBox(height: 8),
], ],
@ -115,34 +97,4 @@ class StorageCard extends StatelessWidget {
), ),
); );
} }
DiskStatus toDiskStatus(final List<ServerDiskVolume> status) {
final DiskStatus diskStatus = DiskStatus();
diskStatus.isDiskOkay = true;
diskStatus.diskVolumes = status.map((
final ServerDiskVolume volume,
) {
final DiskVolume diskVolume = DiskVolume();
diskVolume.gbUsed = volume.usedSpace == 'None'
? 0
: int.parse(volume.usedSpace) ~/ 1000000000;
diskVolume.gbTotal = volume.totalSpace == 'None'
? 0
: int.parse(volume.totalSpace) ~/ 1000000000;
diskVolume.name = volume.name;
diskVolume.root = volume.root;
diskVolume.percentage =
volume.usedSpace != 'None' && volume.totalSpace != 'None'
? 1.0 / int.parse(volume.totalSpace) * int.parse(volume.usedSpace)
: 0.0;
if (diskVolume.percentage >= 0.8 ||
diskVolume.gbTotal - diskVolume.gbUsed <= 2) {
diskStatus.isDiskOkay = false;
}
return diskVolume;
}).toList();
return diskStatus;
}
} }

View File

@ -1,134 +1,46 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:selfprivacy/logic/cubit/server_installation/server_installation_cubit.dart'; import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/ui/components/brand_button/filled_button.dart';
import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart';
import 'package:selfprivacy/ui/components/brand_linear_indicator/brand_linear_indicator.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
import 'package:selfprivacy/ui/pages/server_storage/extending_volume.dart'; import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart';
class ServerStoragePage extends StatefulWidget { class DataMigrationPage extends StatefulWidget {
const ServerStoragePage({required this.diskStatus, final super.key}); const DataMigrationPage({
required this.diskVolumeToResize,
required this.diskStatus,
required this.resizeTarget,
final super.key,
});
final DiskVolume diskVolumeToResize;
final DiskStatus diskStatus; final DiskStatus diskStatus;
final DiskSize resizeTarget;
@override @override
State<ServerStoragePage> createState() => _ServerStoragePageState(); State<DataMigrationPage> createState() => _DataMigrationPageState();
} }
class _ServerStoragePageState extends State<ServerStoragePage> { class _DataMigrationPageState extends State<DataMigrationPage> {
List<bool> _expandedSections = [];
@override @override
Widget build(final BuildContext context) { Widget build(final BuildContext context) {
final bool isReady = context.watch<ServerInstallationCubit>().state int a = 0;
is ServerInstallationFinished;
if (!isReady) {
return BrandHeroScreen(
hasBackButton: true,
heroTitle: 'providers.storage.card_title'.tr(),
children: const [],
);
}
/// The first section is expanded, the rest are hidden by default.
/// ( true, false, false, etc... )
_expandedSections = [
true,
...List<bool>.filled(
widget.diskStatus.diskVolumes.length - 1,
false,
),
];
int sectionId = 0;
final List<Widget> sections = [];
for (final DiskVolume volume in widget.diskStatus.diskVolumes) {
sections.add(
const SizedBox(height: 16),
);
sections.add(
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Icon(
Icons.storage_outlined,
size: 24,
color: Colors.white,
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'providers.storage.disk_usage'.tr(
args: [
volume.gbUsed.toString(),
],
),
style: Theme.of(context).textTheme.titleMedium,
),
Expanded(
child: BrandLinearIndicator(
value: volume.percentage,
color: volume.root
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.secondary,
backgroundColor:
Theme.of(context).colorScheme.surfaceVariant,
height: 14.0,
),
),
Text(
'providers.storage.disk_total'.tr(
args: [
volume.gbTotal.toString(),
volume.name,
],
),
style: Theme.of(context).textTheme.bodySmall,
),
],
),
),
],
),
),
);
sections.add(
AnimatedCrossFade(
duration: const Duration(milliseconds: 200),
crossFadeState: _expandedSections[sectionId]
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: FilledButton(
title: 'providers.extend_volume_button.title'.tr(),
onPressed: () => Navigator.of(context).push(
materialRoute(
ExtendingVolumePage(
diskVolume: volume,
),
),
),
),
secondChild: Container(),
),
);
++sectionId;
}
return BrandHeroScreen( return BrandHeroScreen(
hasBackButton: true, hasBackButton: true,
heroTitle: 'providers.storage.card_title'.tr(), heroTitle: 'providers.storage.data_migration_title'.tr(),
children: [ children: [
...sections, ...widget.diskStatus.diskVolumes
const SizedBox(height: 8), .map(
(final volume) => Column(
children: [
ServerStorageListItem(
volume: volume,
),
const SizedBox(height: 16),
],
),
)
.toList(),
], ],
); );
} }

View File

@ -1,8 +1,15 @@
import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/logic/models/hive/server_details.dart';
import 'package:selfprivacy/logic/models/json/server_disk_volume.dart';
class DiskVolume { class DiskVolume {
int gbUsed = 0; DiskSize sizeUsed = DiskSize();
int gbTotal = 0; DiskSize sizeTotal = DiskSize();
String name = ''; String name = '';
bool root = false; bool root = false;
bool isResizable = true;
ServerDiskVolume? serverDiskVolume;
ServerVolume? providerVolume;
/// from 0.0 to 1.0 /// from 0.0 to 1.0
double percentage = 0.0; double percentage = 0.0;

View File

@ -1,55 +1,40 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.dart';
import 'package:flutter/services.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/cubit/volumes/volumes_cubit.dart'; import 'package:selfprivacy/logic/cubit/volumes/volumes_cubit.dart';
import 'package:selfprivacy/logic/models/disk_size.dart';
import 'package:selfprivacy/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_button/filled_button.dart';
import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
class ExtendingVolumePage extends StatefulWidget { class ExtendingVolumePage extends StatefulWidget {
const ExtendingVolumePage({required this.diskVolume, final super.key}); const ExtendingVolumePage({
required this.diskVolumeToResize,
required this.diskStatus,
final super.key,
});
final DiskVolume diskVolume; final DiskVolume diskVolumeToResize;
final DiskStatus diskStatus;
@override @override
State<ExtendingVolumePage> createState() => _ExtendingVolumePageState(); State<ExtendingVolumePage> createState() => _ExtendingVolumePageState();
} }
class _ExtendingVolumePageState extends State<ExtendingVolumePage> { class _ExtendingVolumePageState extends State<ExtendingVolumePage> {
bool _isSizeError = false; bool _isError = false;
bool _isPriceError = false;
double _currentSliderGbValue = 20.0; double _currentSliderGbValue = -1;
double _euroPerGb = 1.0; double _euroPerGb = 1.0;
final double maxGb = 500.0; final DiskSize maxSize = DiskSize(byte: 500000000000);
double minGb = 0.0; DiskSize minSize = DiskSize();
final TextEditingController _sizeController = TextEditingController(); final TextEditingController _sizeController = TextEditingController();
late final TextEditingController _priceController; final TextEditingController _priceController = TextEditingController();
void _updateByPrice() {
final double price = double.parse(_priceController.text);
_currentSliderGbValue = price / _euroPerGb;
_sizeController.text = _currentSliderGbValue.round.toString();
/// Now we need to convert size back to price to round
/// it properly and display it in text field as well,
/// because size in GB can ONLY(!) be discrete.
_updateBySize();
}
void _updateBySize() {
final double size = double.parse(_sizeController.text);
_priceController.text = (size * _euroPerGb).toString();
_updateErrorStatuses();
}
void _updateErrorStatuses() { void _updateErrorStatuses() {
final bool error = minGb > _currentSliderGbValue; _isError = minSize.asGb() > _currentSliderGbValue;
_isSizeError = error;
_isPriceError = error;
} }
@override @override
@ -59,15 +44,26 @@ class _ExtendingVolumePageState extends State<ExtendingVolumePage> {
final BuildContext context, final BuildContext context,
final AsyncSnapshot<void> snapshot, final AsyncSnapshot<void> snapshot,
) { ) {
if (!snapshot.hasData) {
return BrandHeroScreen(
hasBackButton: true,
heroTitle: 'providers.storage.extending_volume_title'.tr(),
heroSubtitle:
'providers.storage.extending_volume_description'.tr(),
children: const [
SizedBox(height: 16),
],
);
}
_euroPerGb = snapshot.data as double; _euroPerGb = snapshot.data as double;
_sizeController.text = _currentSliderGbValue.toString(); _sizeController.text = _currentSliderGbValue.truncate().toString();
_priceController.text = _priceController.text =
(_euroPerGb * double.parse(_sizeController.text)).toString(); (_euroPerGb * double.parse(_sizeController.text))
_sizeController.addListener(_updateBySize); .toStringAsPrecision(2);
_priceController.addListener(_updateByPrice); minSize = widget.diskVolumeToResize.sizeTotal;
minGb = widget.diskVolume.gbTotal + 1 < maxGb if (_currentSliderGbValue < 0) {
? widget.diskVolume.gbTotal + 1 _currentSliderGbValue = minSize.asGb();
: maxGb; }
return BrandHeroScreen( return BrandHeroScreen(
hasBackButton: true, hasBackButton: true,
@ -76,47 +72,48 @@ class _ExtendingVolumePageState extends State<ExtendingVolumePage> {
children: [ children: [
const SizedBox(height: 16), const SizedBox(height: 16),
Row( Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [ children: [
TextField( ConstrainedBox(
textInputAction: TextInputAction.next, constraints: const BoxConstraints(maxWidth: 130),
enabled: true, child: TextField(
controller: _sizeController, readOnly: true,
decoration: InputDecoration( textAlign: TextAlign.start,
border: const OutlineInputBorder(), textInputAction: TextInputAction.next,
errorText: _isSizeError ? ' ' : null, enabled: true,
labelText: 'providers.storage.size'.tr(), controller: _sizeController,
decoration: InputDecoration(
border: const OutlineInputBorder(),
errorText: _isError ? ' ' : null,
labelText: 'providers.storage.size'.tr(),
),
), ),
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly,
], // Only numbers can be entered
), ),
const SizedBox(height: 16), const SizedBox(width: 16),
TextField( ConstrainedBox(
textInputAction: TextInputAction.next, constraints: const BoxConstraints(maxWidth: 130),
enabled: true, child: TextField(
controller: _priceController, readOnly: true,
decoration: InputDecoration( textAlign: TextAlign.start,
border: const OutlineInputBorder(), textInputAction: TextInputAction.next,
errorText: _isPriceError ? ' ' : null, enabled: true,
labelText: 'providers.storage.euro'.tr(), controller: _priceController,
decoration: InputDecoration(
border: const OutlineInputBorder(),
errorText: _isError ? ' ' : null,
labelText: 'providers.storage.euro'.tr(),
),
), ),
keyboardType: TextInputType.number,
inputFormatters: <TextInputFormatter>[
FilteringTextInputFormatter.digitsOnly,
], // Only numbers can be entered
), ),
], ],
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
Slider( Slider(
min: minGb, min: minSize.asGb(),
value: widget.diskVolume.gbTotal + 5 < maxGb value: _currentSliderGbValue,
? widget.diskVolume.gbTotal + 5 max: maxSize.asGb(),
: maxGb,
max: maxGb,
divisions: 1,
label: _currentSliderGbValue.round().toString(),
onChanged: (final double value) { onChanged: (final double value) {
setState(() { setState(() {
_currentSliderGbValue = value; _currentSliderGbValue = value;
@ -126,15 +123,22 @@ class _ExtendingVolumePageState extends State<ExtendingVolumePage> {
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
FilledButton( FilledButton(
title: 'providers.extend_volume_button.title'.tr(), title: 'providers.storage.extend_volume_button.title'.tr(),
onPressed: null, onPressed: null,
disabled: _isError,
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
const Divider( const Divider(
height: 1.0, height: 1.0,
), ),
const SizedBox(height: 16), const SizedBox(height: 16),
const Icon(Icons.info_outlined, size: 24), const Align(
alignment: Alignment.centerLeft,
child: Icon(
Icons.info_outlined,
size: 24,
),
),
const SizedBox(height: 16), const SizedBox(height: 16),
Text('providers.storage.extending_volume_price_info'.tr()), Text('providers.storage.extending_volume_price_info'.tr()),
const SizedBox(height: 16), const SizedBox(height: 16),

View File

@ -1,11 +1,11 @@
import 'package:easy_localization/easy_localization.dart'; import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart'; import 'package:flutter/material.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/ui/components/brand_button/filled_button.dart'; import 'package:selfprivacy/ui/components/brand_button/outlined_button.dart';
import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart'; import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart';
import 'package:selfprivacy/ui/components/brand_linear_indicator/brand_linear_indicator.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart'; import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
import 'package:selfprivacy/ui/pages/server_storage/extending_volume.dart'; import 'package:selfprivacy/ui/pages/server_storage/extending_volume.dart';
import 'package:selfprivacy/ui/pages/server_storage/server_storage_list_item.dart';
import 'package:selfprivacy/utils/route_transitions/basic.dart'; import 'package:selfprivacy/utils/route_transitions/basic.dart';
class ServerStoragePage extends StatefulWidget { class ServerStoragePage extends StatefulWidget {
@ -18,8 +18,6 @@ class ServerStoragePage extends StatefulWidget {
} }
class _ServerStoragePageState extends State<ServerStoragePage> { class _ServerStoragePageState extends State<ServerStoragePage> {
List<bool> _expandedSections = [];
@override @override
Widget build(final BuildContext context) { Widget build(final BuildContext context) {
final bool isReady = context.watch<ServerInstallationCubit>().state final bool isReady = context.watch<ServerInstallationCubit>().state
@ -33,103 +31,62 @@ class _ServerStoragePageState extends State<ServerStoragePage> {
); );
} }
/// The first section is expanded, the rest are hidden by default.
/// ( true, false, false, etc... )
_expandedSections = [
true,
...List<bool>.filled(
widget.diskStatus.diskVolumes.length - 1,
false,
),
];
int sectionId = 0;
final List<Widget> sections = [];
for (final DiskVolume volume in widget.diskStatus.diskVolumes) {
sections.add(
const SizedBox(height: 16),
);
sections.add(
Expanded(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
const Icon(
Icons.storage_outlined,
size: 24,
color: Colors.white,
),
Expanded(
child: Column(
mainAxisAlignment: MainAxisAlignment.center,
crossAxisAlignment: CrossAxisAlignment.stretch,
children: [
Text(
'providers.storage.disk_usage'.tr(
args: [
volume.gbUsed.toString(),
],
),
style: Theme.of(context).textTheme.titleMedium,
),
Expanded(
child: BrandLinearIndicator(
value: volume.percentage,
color: volume.root
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.secondary,
backgroundColor:
Theme.of(context).colorScheme.surfaceVariant,
height: 14.0,
),
),
Text(
'providers.storage.disk_total'.tr(
args: [
volume.gbTotal.toString(),
volume.name,
],
),
style: Theme.of(context).textTheme.bodySmall,
),
],
),
),
],
),
),
);
sections.add(
AnimatedCrossFade(
duration: const Duration(milliseconds: 200),
crossFadeState: _expandedSections[sectionId]
? CrossFadeState.showFirst
: CrossFadeState.showSecond,
firstChild: FilledButton(
title: 'providers.extend_volume_button.title'.tr(),
onPressed: () => Navigator.of(context).push(
materialRoute(
ExtendingVolumePage(
diskVolume: volume,
),
),
),
),
secondChild: Container(),
),
);
++sectionId;
}
return BrandHeroScreen( return BrandHeroScreen(
hasBackButton: true, hasBackButton: true,
heroTitle: 'providers.storage.card_title'.tr(), heroTitle: 'providers.storage.card_title'.tr(),
children: [ children: [
...sections, // ...sections,
...widget.diskStatus.diskVolumes
.map(
(final volume) => Column(
children: [
ServerStorageSection(
volume: volume,
diskStatus: widget.diskStatus,
),
const SizedBox(height: 16),
const Divider(),
const SizedBox(height: 16),
],
),
)
.toList(),
const SizedBox(height: 8), const SizedBox(height: 8),
], ],
); );
} }
} }
class ServerStorageSection extends StatelessWidget {
const ServerStorageSection({
required this.volume,
required this.diskStatus,
final super.key,
});
final DiskVolume volume;
final DiskStatus diskStatus;
@override
Widget build(final BuildContext context) => Column(
children: [
ServerStorageListItem(
volume: volume,
),
if (volume.isResizable) ...[
const SizedBox(height: 16),
BrandOutlinedButton(
title: 'providers.storage.extend_volume_button.title'.tr(),
onPressed: () => Navigator.of(context).push(
materialRoute(
ExtendingVolumePage(
diskVolumeToResize: volume,
diskStatus: diskStatus,
),
),
),
),
],
],
);
}

View File

@ -0,0 +1,74 @@
import 'package:easy_localization/easy_localization.dart';
import 'package:flutter/material.dart';
import 'package:selfprivacy/ui/components/brand_linear_indicator/brand_linear_indicator.dart';
import 'package:selfprivacy/ui/pages/server_storage/disk_status.dart';
class ServerStorageListItem extends StatelessWidget {
const ServerStorageListItem({
required this.volume,
final this.showIcon = true,
final this.dense = false,
final super.key,
});
final DiskVolume volume;
final bool showIcon;
final bool dense;
@override
Widget build(final BuildContext context) {
final TextStyle? titleStyle = dense
? Theme.of(context).textTheme.titleMedium
: Theme.of(context).textTheme.titleLarge;
final TextStyle? subtitleStyle = dense
? Theme.of(context).textTheme.bodySmall
: Theme.of(context).textTheme.bodyMedium;
return Row(
children: [
if (showIcon)
const Icon(
Icons.storage_outlined,
size: 24,
color: Colors.white,
),
if (showIcon) const SizedBox(width: 16),
Expanded(
child: Column(
crossAxisAlignment: CrossAxisAlignment.start,
children: [
Text(
'providers.storage.disk_usage'.tr(
args: [
volume.sizeUsed.asGb().toStringAsPrecision(3),
],
),
style: titleStyle,
),
const SizedBox(height: 4),
BrandLinearIndicator(
value: volume.percentage,
color: volume.root
? Theme.of(context).colorScheme.primary
: Theme.of(context).colorScheme.secondary,
backgroundColor: Theme.of(context).colorScheme.surfaceVariant,
height: 14.0,
),
const SizedBox(height: 4),
Text(
'providers.storage.disk_total'.tr(
args: [
volume.sizeTotal.asGb().toStringAsPrecision(3),
volume.name,
],
),
style: subtitleStyle,
),
],
),
),
],
);
}
}

View File

@ -0,0 +1,87 @@
import 'package:flutter/material.dart';
import 'package:selfprivacy/ui/components/brand_button/filled_button.dart';
import 'package:selfprivacy/ui/components/brand_cards/brand_cards.dart';
import 'package:selfprivacy/ui/components/brand_hero_screen/brand_hero_screen.dart';
class ServicePage extends StatefulWidget {
const ServicePage({final super.key});
@override
State<ServicePage> createState() => _ServicePageState();
}
class _ServicePageState extends State<ServicePage> {
@override
Widget build(final BuildContext context) {
int a;
return BrandHeroScreen(
hasBackButton: true,
children: [
const SizedBox(height: 16),
Container(
alignment: Alignment.center,
child: const Icon(
Icons.question_mark_outlined,
size: 48,
),
),
const SizedBox(height: 16),
Text(
'My Incredible Service',
textAlign: TextAlign.center,
style: Theme.of(context).textTheme.headlineMedium!.copyWith(
color: Theme.of(context).colorScheme.onBackground,
),
),
const SizedBox(height: 16),
BrandCards.outlined(
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 24),
child: const Icon(
Icons.check_box_outlined,
size: 24,
),
),
const SizedBox(width: 16),
ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 130),
child: const Text(''),
),
],
),
),
const SizedBox(height: 16),
const Divider(),
const SizedBox(height: 16),
ElevatedButton(
onPressed: null,
child: Row(
mainAxisAlignment: MainAxisAlignment.center,
mainAxisSize: MainAxisSize.max,
crossAxisAlignment: CrossAxisAlignment.center,
children: [
ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 24),
child: const Icon(
Icons.language_outlined,
size: 24,
),
),
const SizedBox(width: 16),
ConstrainedBox(
constraints: const BoxConstraints(maxWidth: 130),
child: const Text('Your Cool Domain'),
),
],
),
),
const SizedBox(height: 16),
],
);
}
}

View File

@ -106,7 +106,7 @@ class _Card extends StatelessWidget {
final switchableService = switchableServices.contains(serviceType); final switchableService = switchableServices.contains(serviceType);
final hasSwitchJob = switchableService && final hasSwitchJob = switchableService &&
jobState is JobsStateWithJobs && jobState is JobsStateWithJobs &&
jobState.jobList.any( jobState.clientJobList.any(
(final el) => el is ServiceToggleJob && el.type == serviceType, (final el) => el is ServiceToggleJob && el.type == serviceType,
); );
@ -150,7 +150,7 @@ class _Card extends StatelessWidget {
builder: (final context) { builder: (final context) {
late bool isActive; late bool isActive;
if (hasSwitchJob) { if (hasSwitchJob) {
isActive = (jobState.jobList.firstWhere( isActive = (jobState.clientJobList.firstWhere(
(final el) => (final el) =>
el is ServiceToggleJob && el.type == serviceType, el is ServiceToggleJob && el.type == serviceType,
) as ServiceToggleJob) ) as ServiceToggleJob)

View File

@ -72,7 +72,7 @@ class InitializingPage extends StatelessWidget {
'Domain', 'Domain',
'User', 'User',
'Server', 'Server',
'Check', 'Check',
], ],
activeIndex: cubit.state.porgressBar, activeIndex: cubit.state.porgressBar,
), ),

View File

@ -11,7 +11,7 @@ class _NewSshKey extends StatelessWidget {
final jobCubit = context.read<JobsCubit>(); final jobCubit = context.read<JobsCubit>();
final jobState = jobCubit.state; final jobState = jobCubit.state;
if (jobState is JobsStateWithJobs) { if (jobState is JobsStateWithJobs) {
final jobs = jobState.jobList; final jobs = jobState.clientJobList;
for (final job in jobs) { for (final job in jobs) {
if (job is CreateSSHKeyJob && job.user.login == user.login) { if (job is CreateSSHKeyJob && job.user.login == user.login) {
user.sshKeys.add(job.publicKey); user.sshKeys.add(job.publicKey);

View File

@ -18,7 +18,7 @@ class NewUser extends StatelessWidget {
final users = <User>[]; final users = <User>[];
users.addAll(context.read<UsersCubit>().state.users); users.addAll(context.read<UsersCubit>().state.users);
if (jobState is JobsStateWithJobs) { if (jobState is JobsStateWithJobs) {
final jobs = jobState.jobList; final jobs = jobState.clientJobList;
for (final job in jobs) { for (final job in jobs) {
if (job is CreateUserJob) { if (job is CreateUserJob) {
users.add(job.user); users.add(job.user);