From cbb1b7a2a340d8d0b77a65d59242a510837c2043 Mon Sep 17 00:00:00 2001 From: Maximilian Betz <Maximilian.Betz@awi.de> Date: Wed, 16 Mar 2022 14:12:13 +0100 Subject: [PATCH] started moving the sensor communication to separate dart file --- lib/configuration.dart | 6 +- lib/sensorconnector.dart | 132 +++++++++++++++++++++++++++++++++++++++ 2 files changed, 137 insertions(+), 1 deletion(-) create mode 100644 lib/sensorconnector.dart diff --git a/lib/configuration.dart b/lib/configuration.dart index d7495e0..fce5a1b 100644 --- a/lib/configuration.dart +++ b/lib/configuration.dart @@ -4,6 +4,7 @@ import 'package:flutter/services.dart'; import 'package:http/http.dart' as http; import 'dart:convert'; import 'datamodel.dart'; +import 'sensorconnector.dart'; Future<int> login() async { // Get Access to local configuration store. Token must be stored there! @@ -151,11 +152,14 @@ class _MyHomePageState extends State<Configuration> { late Future<Collection> futureCollection; late Future<List<Collection>> futureCollections; + late Future<List<EventType>> futureEventTypes; + SensorConnector connector = SensorConnector(); @override void initState() { super.initState(); - futureCollections = fetchCollections(); + futureCollections = connector.fetchCollections(); + futureEventTypes = connector.fetchEventTypes(); fetchEventTypes(); } late Future<String> eventTypes; diff --git a/lib/sensorconnector.dart b/lib/sensorconnector.dart new file mode 100644 index 0000000..aad6ae3 --- /dev/null +++ b/lib/sensorconnector.dart @@ -0,0 +1,132 @@ +import 'dart:convert'; +import 'package:flutter/cupertino.dart'; +import 'package:http/http.dart' as http; +import 'datamodel.dart'; + +class SensorConnector { + final String baseUrl = 'https://sandbox.sensor.awi.de/rest/'; + final String loginUrl = 'sensors/contacts/login'; + final String collectionsUrl = 'sensors/collections/getAllCollections?pointInTime=2018-07-03T12%3A30%3A55.389Z'; + final String eventTypesUrl = 'sensors/events/getAllEventTypes'; + final String collectionItemsUrl = 'sensors/collections/getItemsOfCollection/'; // + collectionId + final String putEventUrl = 'sensors/events/putEvent/'; // + eventId; + + Future<String> getAuthToken(String username, String password) async { + String url = baseUrl + loginUrl; + String? token; + + Map<String, dynamic> body = { + 'username': username, + 'authPassword': password + }; + 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 { + throw Exception('Failed to login. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); + } + 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()); + } + 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.fromJson(i)) + .toList(); + 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()); + } + return eventTypeList; + } + + Future<List<Device>> updateDevices(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)); + } + 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()); + } + return collectionDevices; + } + + + Future<bool> putEvent(Event event, String authToken) async { + // Create url with corresponding device id: + String url = baseUrl + putEventUrl + event.id.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) { + event.status = 'EXPORTED'; //Update the event status so that it is only exported once. + return true; + } else { + throw Exception('Failed to put event. ' + 'Header: ' + response.headers.toString() + + ' StatusCode: ' +response.statusCode.toString() + + ' Body: ' +response.body.toString()); + return false; + } + } + +} + + + + -- GitLab