diff --git a/lib/configuration.dart b/lib/configuration.dart index d8a5458aa087022fa137c3dc84997041c81c3a86..8c95d9094b96536b24446f4cb22c2f8dfa36e8b9 100644 --- a/lib/configuration.dart +++ b/lib/configuration.dart @@ -55,12 +55,11 @@ class _MyHomePageState extends State<Configuration> { Future<void> updateConfiguration() async { final EventStoreInstance event = EventStoreInstance(); String token = ''; - List<Device> devices = []; try{ - token = await connector.getAuthToken(configuration.loginInformation.mail, configuration.loginInformation.password); - devices = await connector.fetchCollectionDevices(configuration.currentCollection.id); + configuration.devices = await futureDevices; //already fetched just use the data. + configuration.eventTypes = await futureEventTypes; //already fetched just use the data. event.currentEvent.id = 0; event.currentEvent.urnId = configuration.devices[0].id; //TODO: fix if devices are an empty list. @@ -69,6 +68,7 @@ class _MyHomePageState extends State<Configuration> { event.currentEvent.label = ''; event.currentEvent.type = configuration.eventTypes[0].name; + var date = DateTime.now().toUtc(); var isoDate = date.toIso8601String(); event.currentEvent.startDate = isoDate; @@ -86,10 +86,6 @@ class _MyHomePageState extends State<Configuration> { _status = 'Login success & configuration stored'; setState(() {}); - } on SocketException catch (e) { - debugPrint('Exception: $e'); - _status = 'No connection'; - setState(() {}); } catch (e) { debugPrint('Exception: $e'); _status = '$e'; @@ -151,8 +147,8 @@ class _MyHomePageState extends State<Configuration> { initialValue: configuration.loginInformation.mail, decoration: const InputDecoration( border: OutlineInputBorder(), - labelText: 'Sensor E-Mail', - hintText: 'User for writing events', + labelText: 'E-Mail', + hintText: '', ), onChanged: (value) { configuration.loginInformation.mail = value; @@ -163,12 +159,13 @@ class _MyHomePageState extends State<Configuration> { ), const SizedBox(height: 15.0), TextFormField( + obscureText: true, autofocus: false, initialValue: configuration.loginInformation.password, decoration: const InputDecoration( border: OutlineInputBorder(), - labelText: 'Sensor Password', - hintText: 'Password for writing events', + labelText: 'Password', + hintText: '', ), onChanged: (value){ configuration.loginInformation.password = value; @@ -193,6 +190,7 @@ class _MyHomePageState extends State<Configuration> { if(configuration.currentCollection.id == -1){ configuration.currentCollection = configuration.collections[0]; futureDevices = connector.fetchCollectionDevices(configuration.currentCollection.id); + //TODO: shall this be removed here and just done at confirmation.? } return DropdownButtonFormField( @@ -276,5 +274,5 @@ class _MyHomePageState extends State<Configuration> { //TODO: write configuration on app dispose! //TODO: display mission internet connection properly. - +//TODO: add label prefix with appended upcounting number. //TODO: grey out update button if nothing has changed. ? \ No newline at end of file diff --git a/lib/sensorconnector.dart b/lib/sensorconnector.dart index df1c699999e51422e17f33bd767b0b70b7549256..fd798b117963566da37437c1f978c6a5bbb09248 100644 --- a/lib/sensorconnector.dart +++ b/lib/sensorconnector.dart @@ -1,4 +1,5 @@ import 'dart:convert'; +import 'dart:io'; import 'package:flutter/cupertino.dart'; import 'package:http/http.dart' as http; import 'datamodel.dart'; @@ -21,116 +22,143 @@ class SensorConnector { }; String encodedBody = body.keys.map((key) => "$key=${body[key]}").join("&"); - final response = await http.post(Uri.parse(url), - body: encodedBody, - headers: { - 'Accept': 'application/json', - 'Content-Type': 'application/x-www-form-urlencoded' - }, - encoding: Encoding.getByName("utf-8") - ); - if (response.statusCode == 200) { - token = response.headers['set-cookie']?.split(';')[0]; - debugPrint('Login success. Token: ' + token!.toString()); - - } else { - debugPrint('Failed to login' - 'Header: ' + response.headers.toString() + - ' StatusCode: ' +response.statusCode.toString() + - ' Body: ' +response.body.toString()); - - throw Exception('Failed to login'); + try { + final response = await http.post(Uri.parse(url), + body: encodedBody, + headers: { + 'Accept': 'application/json', + 'Content-Type': 'application/x-www-form-urlencoded' + }, + encoding: Encoding.getByName("utf-8") + ); + if (response.statusCode == 200) { + token = response.headers['set-cookie']?.split(';')[0]; + debugPrint('Login success. Token: ' + token!.toString()); + return token; + } + else { + debugPrint('Failed to login' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' + response.statusCode.toString() + + ' Body: ' + response.body.toString()); + throw Exception('Failed to login'); + } + } on SocketException catch (e){ + throw Exception('No connection'); + }catch (e){ + rethrow; } - return token; } - Future<List<Collection>> fetchCollections() async { String url = baseUrl + collectionsUrl; List<Collection> collectionList = []; - final response = await http.get(Uri.parse(url)); - if (response.statusCode == 200) { - collectionList = (json.decode(response.body) as List) - .map((i) => Collection.fromJson(i)) - .toList(); - debugPrint("Fetching Collections Success: " + collectionList.toString()); - } else { - throw Exception('Failed to fetch Collections. ' - 'Header: ' + response.headers.toString() + - ' StatusCode: ' +response.statusCode.toString() + - ' Body: ' +response.body.toString()); + try{ + final response = await http.get(Uri.parse(url)); + if (response.statusCode == 200) { + collectionList = (json.decode(response.body) as List) + .map((i) => Collection.fromJson(i)) + .toList(); + debugPrint("Fetching Collections Success: " + collectionList.toString()); + return collectionList; + } else { + throw Exception('Failed to fetch Collections. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); + } + } on SocketException catch (e){ + throw Exception('No connection'); + }catch (e){ + rethrow; } - return collectionList; } Future<List<EventType>> fetchEventTypes() async { String url = baseUrl + eventTypesUrl; List<EventType> eventTypeList = []; - final response = await http.get(Uri.parse(url)); - if (response.statusCode == 200) { - //eventTypeList = (json.decode(response.body) as List) - // .map((i) => EventType.fromSensorJson(i)) - // .toList(); - - List<dynamic> data = json.decode(response.body); - for (var entry in data) { - eventTypeList.add(EventType.fromSensorJson(entry)); + try{ + final response = await http.get(Uri.parse(url)); + if (response.statusCode == 200) { + List<dynamic> data = json.decode(response.body); + for (var entry in data) { + eventTypeList.add(EventType.fromSensorJson(entry)); + } + debugPrint("Fetching Event Types Success: " + eventTypeList.toString()); + return eventTypeList; + } else{ + throw Exception('Failed to fetch event types. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); } - debugPrint("Fetching Event Types Success: " + eventTypeList.toString()); - } else{ - throw Exception('Failed to fetch event types. ' - 'Header: ' + response.headers.toString() + - ' StatusCode: ' +response.statusCode.toString() + - ' Body: ' +response.body.toString()); + + } on SocketException catch (e){ + throw Exception('No connection'); + }catch (e){ + rethrow; } - return eventTypeList; } Future<List<Device>> fetchCollectionDevices(int collectionId) async { String url = baseUrl + collectionItemsUrl + collectionId.toString(); List<Device> collectionDevices = []; - final response = await http.get(Uri.parse(url)); - if (response.statusCode == 200) { - List<dynamic> data = json.decode(response.body); - for (var entry in data) { - collectionDevices.add(Device.fromJson(entry)); + try{ + final response = await http.get(Uri.parse(url)); + if (response.statusCode == 200) { + List<dynamic> data = json.decode(response.body); + for (var entry in data) { + collectionDevices.add(Device.fromJson(entry)); + } + debugPrint("Fetching Collection Devices Success: " + collectionDevices.toString()); + return collectionDevices; + } else { + throw Exception('Failed to load Collection Devices. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); } - debugPrint("Fetching Collection Devices Success: " + collectionDevices.toString()); - - } else { - throw Exception('Failed to load Collection Devices. ' - 'Header: ' + response.headers.toString() + - ' StatusCode: ' +response.statusCode.toString() + - ' Body: ' +response.body.toString()); + } on SocketException catch (e){ + throw Exception('No connection'); + }catch (e){ + rethrow; } - return collectionDevices; } Future<bool> putEvent(Event event, String authToken) async { // Create url with corresponding device id: String url = baseUrl + putEventUrl + event.urnId.toString() + '?createVersion=false'; - final response = await http.put(Uri.parse(url), - headers: { - "Content-Type": "application/json", - "Cookie": authToken - }, - body: event.toSensorJson().toString(), - encoding: Encoding.getByName("utf-8"), - ); - if (response.statusCode == 201) { - return true; - } else { - throw Exception('Failed to put event. ' - 'Header: ' + response.headers.toString() + - ' StatusCode: ' +response.statusCode.toString() + - ' Body: ' +response.body.toString()); - return false; + + try{ + final response = await http.put(Uri.parse(url), + headers: { + "Content-Type": "application/json", + "Cookie": authToken + }, + body: event.toSensorJson().toString(), + encoding: Encoding.getByName("utf-8"), + ); + if (response.statusCode == 201) { + return true; + } else if (response.statusCode == 401) { + throw Exception('No editor for UrnId ' + event.urnId.toString()); + } + else { + debugPrint(response.statusCode.toString()); + throw Exception('Failed to put event. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); + } + } on SocketException catch (e){ + throw Exception('No connection'); + }catch (e){ + rethrow; } } - } diff --git a/lib/viewevents.dart b/lib/viewevents.dart index 19dcc8e8d5c2b715e169b548f1fe805798cef7bd..63dcc4b863a7518b3f805491e0922bf00df103a3 100644 --- a/lib/viewevents.dart +++ b/lib/viewevents.dart @@ -69,10 +69,6 @@ class _ViewEvents extends State<ViewEvents> { } } _syncStatus = 'export success'; - } on SocketException catch (e) { - debugPrint('Exception: $e'); - _syncStatus = 'No connection'; - setState(() {}); } catch (e) { debugPrint('Exception: $e'); _syncStatus = '$e';