diff --git a/lib/barcode.dart b/lib/barcode.dart index ab5c313a..99891a99 100644 --- a/lib/barcode.dart +++ b/lib/barcode.dart @@ -1,4 +1,5 @@ import 'package:inventree/app_settings.dart'; +import 'package:inventree/inventree/sentry.dart'; import 'package:inventree/widget/dialogs.dart'; import 'package:inventree/widget/snacks.dart'; import 'package:audioplayers/audioplayers.dart'; @@ -98,18 +99,28 @@ class BarcodeHandler { expectedStatusCode: 200 ); - if (!response.isValid()) { - return; - } + _controller?.resumeCamera(); - if (response.data.containsKey('error')) { - _controller?.resumeCamera(); + // Handle strange response from the server + if (!response.isValid() || response.data == null || !(response.data is Map)) { + onBarcodeUnknown(context, {}); + + // We want to know about this one! + await sentryReportMessage( + "BarcodeHandler.processBarcode returned strange value", + context: { + "data": response.data?.toString() ?? "null", + "barcode": barcode, + "url": url, + "statusCode": response.statusCode.toString(), + "valid": response.isValid().toString(), + } + ); + } else if (response.data.containsKey('error')) { onBarcodeUnknown(context, response.data); } else if (response.data.containsKey('success')) { - _controller?.resumeCamera(); onBarcodeMatched(context, response.data); } else { - _controller?.resumeCamera(); onBarcodeUnhandled(context, response.data); } } diff --git a/lib/inventree/model.dart b/lib/inventree/model.dart index 581402d9..97f11571 100644 --- a/lib/inventree/model.dart +++ b/lib/inventree/model.dart @@ -2,6 +2,7 @@ import 'dart:async'; import 'package:inventree/api.dart'; import 'package:flutter/cupertino.dart'; +import 'package:inventree/inventree/sentry.dart'; import 'package:url_launcher/url_launcher.dart'; import 'package:path/path.dart' as path; @@ -147,9 +148,22 @@ class InvenTreeModel { Future reload() async { var response = await api.get(url, params: defaultGetFilters(), expectedStatusCode: 200); - - if (!response.isValid()) { + + if (!response.isValid() || response.data == null || !(response.data is Map)) { + + // Report error + await sentryReportMessage( + "InvenTreeModel.reload() returned invalid response", + context: { + "url": url, + "statusCode": response.statusCode.toString(), + "data": response.data?.toString() ?? "null", + "valid": response.isValid().toString(), + } + ); + return false; + } jsondata = response.data; @@ -200,8 +214,20 @@ class InvenTreeModel { var response = await api.get(url, params: params); - if (!response.isValid()) { + if (!response.isValid() || response.data == null || !(response.data is Map)) { + + await sentryReportMessage( + "InvenTreeModel.get() returned invalid response", + context: { + "url": url, + "statusCode": response.statusCode.toString(), + "data": response.data?.toString() ?? "null", + "valid": response.isValid().toString() + } + ); + return null; + } return createFromJson(response.data); @@ -222,7 +248,18 @@ class InvenTreeModel { var response = await api.post(URL, body: data); // Invalid response returned from server - if (!response.isValid()) { + if (!response.isValid() || response.data == null || !(response.data is Map)) { + + await sentryReportMessage( + "InvenTreeModel.create() returned invalid response", + context: { + "url": url, + "statusCode": response.statusCode.toString(), + "data": response.data?.toString() ?? "null", + "valid": response.isValid().toString(), + } + ); + return null; }