diff --git a/lib/logic/common_enum/common_enum.dart b/lib/logic/common_enum/common_enum.dart index 93334069..77c2fa82 100644 --- a/lib/logic/common_enum/common_enum.dart +++ b/lib/logic/common_enum/common_enum.dart @@ -20,7 +20,22 @@ enum InitializingSteps { checkSystemDnsAndDkimSet, } -enum Period { hour, day, month } +enum Period { + hour, + day, + month; + + int get stepPeriodInSeconds { + switch (this) { + case Period.hour: + return 18; + case Period.day: + return 432; + case Period.month: + return 6480; + } + } +} enum ServiceTypes { mailserver, diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart index cb398dcd..1cfdc23a 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart @@ -39,16 +39,20 @@ class HetznerMetricsCubit extends Cubit { } void load(final Period period) async { - final HetznerMetricsLoaded newState = await repository.getMetrics(period); - timer = Timer( - Duration(seconds: newState.stepInSeconds.toInt()), - () => load(newState.period), - ); - try { + final HetznerMetricsLoaded newState = await repository.getMetrics(period); + timer = Timer( + Duration(seconds: newState.stepInSeconds.toInt()), + () => load(newState.period), + ); emit(newState); } on StateError { print('Tried to emit Hetzner metrics when cubit is closed'); + } on MetricsLoadException { + timer = Timer( + Duration(seconds: state.period.stepPeriodInSeconds), + () => load(state.period), + ); } } } diff --git a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart index dc0805c7..134c955e 100644 --- a/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart +++ b/lib/logic/cubit/hetzner_metrics/hetzner_metrics_repository.dart @@ -4,6 +4,11 @@ import 'package:selfprivacy/logic/models/hetzner_metrics.dart'; import 'package:selfprivacy/logic/cubit/hetzner_metrics/hetzner_metrics_cubit.dart'; +class MetricsLoadException implements Exception { + MetricsLoadException(this.message); + final String message; +} + class HetznerMetricsRepository { Future getMetrics(final Period period) async { final DateTime end = DateTime.now(); @@ -31,6 +36,10 @@ class HetznerMetricsRepository { final cpuMetricsData = results[0]['metrics']; final networkMetricsData = results[1]['metrics']; + if (cpuMetricsData == null || networkMetricsData == null) { + throw MetricsLoadException('Metrics data is null'); + } + return HetznerMetricsLoaded( period: period, start: start,