rufen method

Future<Map<String, dynamic>> rufen(
  1. String name, {
  2. Map<String, dynamic> params = const {},
  3. Duration? frist,
})

Einen Endpunkt rufen. params kommt zur Kasse dazu; null-Werte fallen weg, damit das Backend „nicht gesetzt" nicht als ausdrückliche Angabe missversteht.

frist überschreibt die Vorgabe für diesen einen Aufruf — der Abschluss eines Belegs darf länger warten als eine Belegliste.

Implementation

Future<Map<String, dynamic>> rufen(
  String name, {
  Map<String, dynamic> params = const {},
  Duration? frist,
}) async {
  // Beides frisch — siehe Klassenkommentar.
  final token = await idToken();
  final sitzung = await sessionId();
  if (token == null || token.isEmpty) {
    throw KasseneckValidationError(name, 'idToken lieferte kein Token', 'request');
  }
  if (sitzung == null || sitzung.isEmpty) {
    throw KasseneckValidationError(name, 'sessionId lieferte keine Sitzung', 'request');
  }

  final nutzlast = <String, dynamic>{'cashregisterId': cashregisterId};
  params.forEach((schluessel, wert) {
    if (wert != null) nutzlast[schluessel] = wert;
  });

  final http.Response antwort;
  try {
    antwort = await _http
        .post(
          Uri.parse('$baseUrl/$name'),
          headers: {
            'Content-Type': 'application/json',
            'Authorization': 'Bearer $token',
            'register-session': sitzung,
          },
          body: jsonEncode({'params': nutzlast}),
        )
        .timeout(frist ?? _timeout);
  } on Object {
    throw KasseneckHttpError(name, 0, 'network');
  }

  Object? roh;
  try {
    roh = jsonDecode(antwort.body);
  } on FormatException {
    throw KasseneckHttpError(name, antwort.statusCode, 'not-json');
  }
  if (roh is! Map) throw KasseneckHttpError(name, antwort.statusCode, 'missing-status');
  final huelle = Map<String, dynamic>.from(roh);
  if (huelle['status'] == 'success') {
    final daten = huelle['data'];
    return daten is Map ? Map<String, dynamic>.from(daten) : <String, dynamic>{};
  }
  final meldung = huelle['message'];
  throw KasseneckApiError(name, meldung is String && meldung.isNotEmpty ? meldung : 'Der Aufruf ist fehlgeschlagen.');
}