migrated the breaker system to MarianumConnect and refactored the API response to a rule-based model with support for version-specific blocks using maxBuild.

This commit is contained in:
2026-07-06 21:15:39 +02:00
parent 38a271929c
commit 2be5051d12
13 changed files with 213 additions and 118 deletions
@@ -1,7 +1,7 @@
import 'package:flutter/foundation.dart';
import 'package:package_info_plus/package_info_plus.dart';
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
import '../../../infrastructure/utility_widgets/loadable_hydrated_bloc/loadable_hydrated_bloc.dart';
import '../../../infrastructure/utility_widgets/loadable_hydrated_bloc/loadable_hydrated_bloc_event.dart';
import '../repository/breaker_repository.dart';
@@ -40,13 +40,11 @@ class BreakerBloc
final response = innerState?.response;
if (response == null || _packageInfo == null) return null;
if (response.global.areas.contains(type)) return response.global.message;
final selfBuild = int.parse(_packageInfo!.buildNumber);
for (final entry in response.regional.entries) {
final affectedBuild = int.parse(entry.key.split('b')[1]);
if (affectedBuild >= selfBuild && entry.value.areas.contains(type)) {
return entry.value.message;
final selfBuild = int.tryParse(_packageInfo!.buildNumber) ?? 0;
for (final rule in response.rules) {
if (!rule.areas.contains(type)) continue;
if (rule.maxBuild == null || selfBuild <= rule.maxBuild!) {
return rule.message;
}
}
return null;
@@ -1,6 +1,6 @@
import 'package:freezed_annotation/freezed_annotation.dart';
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
part 'breaker_state.freezed.dart';
part 'breaker_state.g.dart';
@@ -1,16 +1,20 @@
import 'dart:async';
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_cache.dart';
import '../../../../../api/mhsl/breaker/get_breakers/get_breakers_response.dart';
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_cache.dart';
import '../../../../../api/marianumconnect/queries/get_breakers/get_breakers_response.dart';
import '../../../../../api/request_cache.dart';
class BreakerDataProvider {
Future<GetBreakersResponse> getBreakers() {
final completer = Completer<GetBreakersResponse>();
GetBreakersCache(
onUpdate: (data) {
if (!completer.isCompleted) completer.complete(data);
},
);
return completer.future;
}
/// Resolves via [resolveFromCache] (not first-emit-wins): the cache emits its
/// stored value first for an instant display, then the network value — and we
/// return the latter once [RequestCache.ready] settles. `renew: true` forces a
/// fresh network check on every call so a just-changed breaker takes effect on
/// the next `refresh()` (app resume) instead of only after a restart.
Future<GetBreakersResponse> getBreakers({
bool renew = true,
void Function(Object)? onError,
}) => resolveFromCache<GetBreakersResponse>(
(onUpdate, onError) =>
GetBreakersCache(renew: renew, onUpdate: onUpdate, onError: onError),
onError: onError,
operationName: 'getBreakers',
);
}