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