From 311e467bc839c1f417097f64ea44c487b30980e9 Mon Sep 17 00:00:00 2001
From: Luke <lomah001@gold.ac.uk>
Date: Mon, 13 May 2019 12:43:09 +0100
Subject: [PATCH] upd: added missing sensor data controller and service, moved
 repository classes into own package

---
 .../controller/SensorDataController.java      | 42 ++++++++++++++
 .../SensorDataRepository.java                 |  4 +-
 .../data/SensorDataRepositoryCustom.java      | 10 ++++
 .../data/SensorDataRepositoryImpl.java        | 57 +++++++++++++++++++
 .../glowhouse/service/SensorDataService.java  | 11 +++-
 5 files changed, 121 insertions(+), 3 deletions(-)
 create mode 100644 src/main/java/com/backend/glowhouse/controller/SensorDataController.java
 rename src/main/java/com/backend/glowhouse/repository/{device => data}/SensorDataRepository.java (68%)
 create mode 100644 src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryCustom.java
 create mode 100644 src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryImpl.java

diff --git a/src/main/java/com/backend/glowhouse/controller/SensorDataController.java b/src/main/java/com/backend/glowhouse/controller/SensorDataController.java
new file mode 100644
index 0000000..175c78f
--- /dev/null
+++ b/src/main/java/com/backend/glowhouse/controller/SensorDataController.java
@@ -0,0 +1,42 @@
+package com.backend.glowhouse.controller;
+
+import com.backend.glowhouse.model.DataTableItem;
+import com.backend.glowhouse.model.SensorData;
+import com.backend.glowhouse.service.SensorDataService;
+import com.fasterxml.jackson.core.JsonProcessingException;
+import com.fasterxml.jackson.databind.ObjectMapper;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.security.access.prepost.PreAuthorize;
+import org.springframework.web.bind.annotation.GetMapping;
+import org.springframework.web.bind.annotation.PathVariable;
+import org.springframework.web.bind.annotation.RequestMapping;
+import org.springframework.web.bind.annotation.RestController;
+
+import java.util.Date;
+import java.util.List;
+
+@RestController
+@RequestMapping("/api/sensorData")
+public class SensorDataController {
+    private ObjectMapper mapper = new ObjectMapper();
+    private SensorDataService sensorDataService;
+
+    @Autowired
+    public SensorDataController(SensorDataService sensorDataService) {
+        this.sensorDataService = sensorDataService;
+    }
+
+    @GetMapping("/aggregateData")
+    @PreAuthorize("hasRole('USER')")
+    public String aggregateSensorDataBetweenDates(
+            @PathVariable(value = "deviceId") String deviceId,
+            @PathVariable(value = "startTime") long startTime,
+            @PathVariable(value = "endTime") long endTime,
+            @PathVariable(value = "dataType") String dataType) throws JsonProcessingException {
+
+
+        List<DataTableItem> sensorDataList = this.sensorDataService.retrieveSensorDataBetweenDates(deviceId, startTime, endTime, dataType);
+
+        return mapper.writeValueAsString(sensorDataList);
+    }
+}
diff --git a/src/main/java/com/backend/glowhouse/repository/device/SensorDataRepository.java b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepository.java
similarity index 68%
rename from src/main/java/com/backend/glowhouse/repository/device/SensorDataRepository.java
rename to src/main/java/com/backend/glowhouse/repository/data/SensorDataRepository.java
index cb8455e..2668f9a 100644
--- a/src/main/java/com/backend/glowhouse/repository/device/SensorDataRepository.java
+++ b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepository.java
@@ -1,10 +1,10 @@
-package com.backend.glowhouse.repository.device;
+package com.backend.glowhouse.repository.data;
 
 import com.backend.glowhouse.model.SensorData;
 import org.springframework.data.mongodb.repository.MongoRepository;
 
 import java.util.List;
 
-public interface SensorDataRepository extends MongoRepository<SensorData, String> {
+public interface SensorDataRepository extends MongoRepository<SensorData, String>, SensorDataRepositoryCustom {
 
 }
diff --git a/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryCustom.java b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryCustom.java
new file mode 100644
index 0000000..48ce4ac
--- /dev/null
+++ b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryCustom.java
@@ -0,0 +1,10 @@
+package com.backend.glowhouse.repository.data;
+
+import com.backend.glowhouse.model.DataTableItem;
+
+import java.util.Date;
+import java.util.List;
+
+public interface SensorDataRepositoryCustom {
+    List<DataTableItem> findDataByDeviceIdBetweenDates(String deviceId, Date startDate, Date endDate, String dataType);
+}
diff --git a/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryImpl.java b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryImpl.java
new file mode 100644
index 0000000..76be6fa
--- /dev/null
+++ b/src/main/java/com/backend/glowhouse/repository/data/SensorDataRepositoryImpl.java
@@ -0,0 +1,57 @@
+package com.backend.glowhouse.repository.data;
+
+import com.backend.glowhouse.model.DataTableItem;
+import com.backend.glowhouse.model.SensorData;
+import org.springframework.beans.factory.annotation.Autowired;
+import org.springframework.data.mongodb.core.MongoTemplate;
+import org.springframework.data.mongodb.core.query.Criteria;
+import org.springframework.data.mongodb.core.query.Query;
+
+import java.util.ArrayList;
+import java.util.Date;
+import java.util.List;
+
+public class SensorDataRepositoryImpl implements SensorDataRepositoryCustom {
+    private final MongoTemplate mongoTemplate;
+
+    @Autowired
+    public  SensorDataRepositoryImpl(MongoTemplate mongoTemplate) {
+        this.mongoTemplate = mongoTemplate;
+    }
+
+    @Override
+    public List<DataTableItem> findDataByDeviceIdBetweenDates(String deviceId, Date startDate, Date endDate, String dataType) {
+        //Query for existing device
+        Query query = new Query();
+        query.addCriteria(Criteria.where("dId").is(deviceId));
+        query.addCriteria(Criteria.where("date").gte(startDate));
+        query.addCriteria(Criteria.where("date").lte(endDate));
+
+        List<SensorData> sensorDataList = mongoTemplate.find(query, SensorData.class);
+
+        List<DataTableItem> dataTable = new ArrayList<>();
+        for (SensorData data : sensorDataList) {
+            if (data.getDate() != null) {
+                float value = 0f;
+
+                switch (dataType) {
+                    case "t":
+                        value = data.getT();
+                        break;
+                    case "h":
+                        value = data.getH();
+                        break;
+                    case "ph":
+                        value = data.getPh();
+                        break;
+                }
+
+                if (value != 0f) {
+                    dataTable.add(new DataTableItem(data.getDate().getTime(), value));
+                }
+            }
+        }
+
+        return dataTable;
+    }
+}
diff --git a/src/main/java/com/backend/glowhouse/service/SensorDataService.java b/src/main/java/com/backend/glowhouse/service/SensorDataService.java
index 08332da..79b47ce 100644
--- a/src/main/java/com/backend/glowhouse/service/SensorDataService.java
+++ b/src/main/java/com/backend/glowhouse/service/SensorDataService.java
@@ -1,10 +1,12 @@
 package com.backend.glowhouse.service;
 
+import com.backend.glowhouse.model.DataTableItem;
 import com.backend.glowhouse.model.SensorData;
-import com.backend.glowhouse.repository.device.SensorDataRepository;
+import com.backend.glowhouse.repository.data.SensorDataRepository;
 import org.springframework.beans.factory.annotation.Autowired;
 import org.springframework.stereotype.Service;
 
+import java.util.Date;
 import java.util.List;
 
 @Service
@@ -23,4 +25,11 @@ public class SensorDataService {
     public void processMultipleSensorData(List<SensorData> sensorData) {
         this.sensorDataRepository.saveAll(sensorData);
     }
+
+    public List<DataTableItem> retrieveSensorDataBetweenDates(String deviceId, long startTime, long endTime, String dataType) {
+        Date startDate = new Date(startTime);
+        Date endDate = new Date(endTime);
+
+        return this.sensorDataRepository.findDataByDeviceIdBetweenDates(deviceId, startDate, endDate, dataType);
+    }
 }
-- 
GitLab