From caa2fd3b8e3cb616f621be313579dea5315b2cc5 Mon Sep 17 00:00:00 2001 From: Inex Code Date: Tue, 20 Feb 2024 23:17:36 +0300 Subject: [PATCH] refactor: Handle situation when the job has to be removed Closes #166 --- assets/translations/en.json | 1 + .../graphql_maps/server_api/server_api.dart | 50 +++++++++++++++++-- .../cubit/client_jobs/client_jobs_state.dart | 31 +++++++++--- .../get_it/api_connection_repository.dart | 32 ++++++++++++ lib/logic/models/job.dart | 37 +++++++------- 5 files changed, 123 insertions(+), 28 deletions(-) diff --git a/assets/translations/en.json b/assets/translations/en.json index 14861d32..b89dbc58 100644 --- a/assets/translations/en.json +++ b/assets/translations/en.json @@ -597,6 +597,7 @@ "service_turn_on": "Turn on", "job_added": "Job added", "job_postponed": "Job added, but you will be able to launch it after current jobs are finished", + "job_removed": "Job removed", "run_jobs": "Run jobs", "reboot_success": "Server is rebooting", "reboot_failed": "Couldn't reboot the server. Check the app logs.", diff --git a/lib/logic/api_maps/graphql_maps/server_api/server_api.dart b/lib/logic/api_maps/graphql_maps/server_api/server_api.dart index b511b6a9..d94d7cf6 100644 --- a/lib/logic/api_maps/graphql_maps/server_api/server_api.dart +++ b/lib/logic/api_maps/graphql_maps/server_api/server_api.dart @@ -149,7 +149,7 @@ class ServerApi extends GraphQLApiMap } } - Future setAutoUpgradeSettings( + Future> setAutoUpgradeSettings( final AutoUpgradeSettings settings, ) async { try { @@ -164,13 +164,38 @@ class ServerApi extends GraphQLApiMap final mutation = Options$Mutation$ChangeAutoUpgradeSettings( variables: variables, ); - await client.mutate$ChangeAutoUpgradeSettings(mutation); + final result = await client.mutate$ChangeAutoUpgradeSettings(mutation); + if (result.hasException) { + return GenericResult( + success: false, + message: result.exception.toString(), + data: null, + ); + } + return GenericResult( + success: result.parsedData?.system.changeAutoUpgradeSettings.success ?? + false, + message: result.parsedData?.system.changeAutoUpgradeSettings.message, + data: result.parsedData == null + ? null + : AutoUpgradeSettings( + allowReboot: result + .parsedData!.system.changeAutoUpgradeSettings.allowReboot, + enable: result.parsedData!.system.changeAutoUpgradeSettings + .enableAutoUpgrade, + ), + ); } catch (e) { print(e); + return GenericResult( + success: false, + message: e.toString(), + data: null, + ); } } - Future setTimezone(final String timezone) async { + Future> setTimezone(final String timezone) async { try { final GraphQLClient client = await getClient(); final variables = Variables$Mutation$ChangeTimezone( @@ -179,9 +204,26 @@ class ServerApi extends GraphQLApiMap final mutation = Options$Mutation$ChangeTimezone( variables: variables, ); - await client.mutate$ChangeTimezone(mutation); + final result = await client.mutate$ChangeTimezone(mutation); + if (result.hasException) { + return GenericResult( + success: false, + message: result.exception.toString(), + data: '', + ); + } + return GenericResult( + success: result.parsedData?.system.changeTimezone.success ?? false, + message: result.parsedData?.system.changeTimezone.message, + data: result.parsedData?.system.changeTimezone.timezone, + ); } catch (e) { print(e); + return GenericResult( + success: false, + message: e.toString(), + data: '', + ); } } diff --git a/lib/logic/cubit/client_jobs/client_jobs_state.dart b/lib/logic/cubit/client_jobs/client_jobs_state.dart index 4f7244f5..c7ab2c0c 100644 --- a/lib/logic/cubit/client_jobs/client_jobs_state.dart +++ b/lib/logic/cubit/client_jobs/client_jobs_state.dart @@ -45,8 +45,15 @@ class JobsStateWithJobs extends JobsState { final List newJobsList = clientJobList .where((final element) => element.runtimeType != job.runtimeType) .toList(); - newJobsList.add(job); - getIt().showSnackBar('jobs.job_added'.tr()); + if (job.shouldRemoveInsteadOfAdd(clientJobList)) { + getIt().showSnackBar('jobs.job_removed'.tr()); + } else { + newJobsList.add(job); + getIt().showSnackBar('jobs.job_added'.tr()); + } + if (newJobsList.isEmpty) { + return JobsStateEmpty(); + } return JobsStateWithJobs(newJobsList); } if (job.canAddTo(clientJobList)) { @@ -102,13 +109,16 @@ class JobsStateLoading extends JobsState { @override JobsState addJob(final ClientJob job) { - // Do the same, but add jobs to the postponed list if (job is ReplaceableJob) { final List newPostponedJobs = postponedJobs .where((final element) => element.runtimeType != job.runtimeType) .toList(); - newPostponedJobs.add(job); - getIt().showSnackBar('jobs.job_postponed'.tr()); + if (job.shouldRemoveInsteadOfAdd(postponedJobs)) { + getIt().showSnackBar('jobs.job_removed'.tr()); + } else { + newPostponedJobs.add(job); + getIt().showSnackBar('jobs.job_postponed'.tr()); + } return JobsStateLoading(clientJobList, rebuildJobUid, newPostponedJobs); } if (job.canAddTo(postponedJobs)) { @@ -140,8 +150,15 @@ class JobsStateFinished extends JobsState { final List newPostponedJobs = postponedJobs .where((final element) => element.runtimeType != job.runtimeType) .toList(); - newPostponedJobs.add(job); - getIt().showSnackBar('jobs.job_added'.tr()); + if (job.shouldRemoveInsteadOfAdd(postponedJobs)) { + getIt().showSnackBar('jobs.job_removed'.tr()); + } else { + newPostponedJobs.add(job); + getIt().showSnackBar('jobs.job_added'.tr()); + } + if (newPostponedJobs.isEmpty) { + return JobsStateEmpty(); + } return JobsStateWithJobs(newPostponedJobs); } if (job.canAddTo(postponedJobs)) { diff --git a/lib/logic/get_it/api_connection_repository.dart b/lib/logic/get_it/api_connection_repository.dart index 3096874c..10c7fc0e 100644 --- a/lib/logic/get_it/api_connection_repository.dart +++ b/lib/logic/get_it/api_connection_repository.dart @@ -6,6 +6,7 @@ import 'package:pub_semver/pub_semver.dart'; import 'package:selfprivacy/config/get_it_config.dart'; import 'package:selfprivacy/config/hive_config.dart'; import 'package:selfprivacy/logic/api_maps/graphql_maps/server_api/server_api.dart'; +import 'package:selfprivacy/logic/models/auto_upgrade_settings.dart'; import 'package:selfprivacy/logic/models/backup.dart'; import 'package:selfprivacy/logic/models/hive/server_details.dart'; import 'package:selfprivacy/logic/models/hive/server_domain.dart'; @@ -188,6 +189,37 @@ class ApiConnectionRepository { return (true, result.message ?? 'basis.done'.tr()); } + Future<(bool, String)> setAutoUpgradeSettings( + final bool enable, + final bool allowReboot, + ) async { + final GenericResult result = + await api.setAutoUpgradeSettings( + AutoUpgradeSettings( + enable: enable, + allowReboot: allowReboot, + ), + ); + _apiData.settings.invalidate(); + if (result.data != null) { + return (true, result.message ?? 'basis.done'.tr()); + } else { + return (false, result.message ?? 'jobs.generic_error'.tr()); + } + } + + Future<(bool, String)> setServerTimezone( + final String timezone, + ) async { + final GenericResult result = await api.setTimezone(timezone); + _apiData.settings.invalidate(); + if (result.success) { + return (true, result.message ?? 'basis.done'.tr()); + } else { + return (false, result.message ?? 'jobs.generic_error'.tr()); + } + } + void dispose() { _dataStream.close(); _connectionStatusStream.close(); diff --git a/lib/logic/models/job.dart b/lib/logic/models/job.dart index 81248975..fea658f9 100644 --- a/lib/logic/models/job.dart +++ b/lib/logic/models/job.dart @@ -2,7 +2,6 @@ import 'package:easy_localization/easy_localization.dart'; import 'package:equatable/equatable.dart'; import 'package:flutter/material.dart'; import 'package:selfprivacy/config/get_it_config.dart'; -import 'package:selfprivacy/logic/models/auto_upgrade_settings.dart'; import 'package:selfprivacy/logic/models/hive/user.dart'; import 'package:selfprivacy/logic/models/json/server_job.dart'; import 'package:selfprivacy/logic/models/service.dart'; @@ -350,18 +349,21 @@ class ChangeAutoUpgradeSettingsJob extends ReplaceableJob { final bool allowReboot; @override - Future<(bool, String)> execute() async { - await getIt().api.setAutoUpgradeSettings( - AutoUpgradeSettings(enable: enable, allowReboot: allowReboot), - ); - getIt().apiData.settings.invalidate(); - return (true, 'Check not implemented'); - } + Future<(bool, String)> execute() async => getIt() + .setAutoUpgradeSettings(enable, allowReboot); @override bool shouldRemoveInsteadOfAdd(final List jobs) { - // TODO: Finish this - throw UnimplementedError(); + final currentSettings = getIt() + .apiData + .settings + .data + ?.autoUpgradeSettings; + if (currentSettings == null) { + return false; + } + return currentSettings.enable == enable && + currentSettings.allowReboot == allowReboot; } @override @@ -392,16 +394,17 @@ class ChangeServerTimezoneJob extends ReplaceableJob { final String timezone; @override - Future<(bool, String)> execute() async { - await getIt().api.setTimezone(timezone); - getIt().apiData.settings.invalidate(); - return (true, 'Check not implemented'); - } + Future<(bool, String)> execute() async => + getIt().setServerTimezone(timezone); @override bool shouldRemoveInsteadOfAdd(final List jobs) { - // TODO: Finish this - throw UnimplementedError(); + final currentSettings = + getIt().apiData.settings.data?.timezone; + if (currentSettings == null) { + return false; + } + return currentSettings == timezone; } @override