From 83383bd6392e5394fb97ab9e0016f30eeab0f81a Mon Sep 17 00:00:00 2001
From: Tamas Bunth <tamas.bunth@collabora.co.uk>
Date: Sat, 17 Mar 2018 02:30:58 +0100
Subject: [PATCH] REST: implement posting mobile data

---
 api.iml                                       |  7 ++-
 .../kotlin/mobildata/model/LocationData.kt    | 12 +++++
 src/main/kotlin/mobildata/model/MobilData.kt  | 20 +++++++++
 .../mobildata/model/inout/MobilDataIn.kt      | 45 +++++++++++++++++++
 .../kotlin/mobildata/model/inout/Register.kt  |  3 +-
 .../repository/MobilDataRepository.kt         | 10 +++++
 .../kotlin/mobildata/web/MobilDataHandler.kt  | 34 ++++++++++++++
 src/main/resources/schema.sql                 | 30 +++++++++----
 8 files changed, 150 insertions(+), 11 deletions(-)
 create mode 100644 src/main/kotlin/mobildata/model/LocationData.kt
 create mode 100644 src/main/kotlin/mobildata/model/MobilData.kt
 create mode 100644 src/main/kotlin/mobildata/model/inout/MobilDataIn.kt
 create mode 100644 src/main/kotlin/mobildata/repository/MobilDataRepository.kt
 create mode 100644 src/main/kotlin/mobildata/web/MobilDataHandler.kt

diff --git a/api.iml b/api.iml
index 5644b7c..8f41ed4 100644
--- a/api.iml
+++ b/api.iml
@@ -2,7 +2,12 @@
 <module org.jetbrains.idea.maven.project.MavenProjectsManager.isMavenModule="true" type="JAVA_MODULE" version="4">
   <component name="FacetManager">
     <facet type="Spring" name="Spring">
-      <configuration />
+      <configuration>
+        <fileset id="fileset" name="Spring Application Context" removed="false">
+          <file>file://$MODULE_DIR$/src/main/kotlin/mobildata/web/SwaggerConfig.kt</file>
+          <file>file://$MODULE_DIR$/src/main/kotlin/mobildata/ApiApplication.kt</file>
+        </fileset>
+      </configuration>
     </facet>
     <facet type="web" name="Web">
       <configuration>
diff --git a/src/main/kotlin/mobildata/model/LocationData.kt b/src/main/kotlin/mobildata/model/LocationData.kt
new file mode 100644
index 0000000..07d1189
--- /dev/null
+++ b/src/main/kotlin/mobildata/model/LocationData.kt
@@ -0,0 +1,12 @@
+package mobildata.model
+
+import io.swagger.annotations.ApiModelProperty
+import javax.validation.constraints.Pattern
+
+data class LocationData(
+        @ApiModelProperty(example = "49.090638", required = true)
+        val latitude: Double,
+
+        @ApiModelProperty(example = "-126.947656", required = true)
+        val longitude: Double
+){}
\ No newline at end of file
diff --git a/src/main/kotlin/mobildata/model/MobilData.kt b/src/main/kotlin/mobildata/model/MobilData.kt
new file mode 100644
index 0000000..c11ceed
--- /dev/null
+++ b/src/main/kotlin/mobildata/model/MobilData.kt
@@ -0,0 +1,20 @@
+package mobildata.model
+
+import javax.persistence.*
+
+@Entity
+@Table(name = "mobil_data")
+data class MobilData(
+        val user_id: Long,
+        val location_lat: Double?,
+        val location_long: Double?,
+        var battery: Int?,
+        var brightness: Int?,
+        var isWifiOn: Boolean?,
+        var isBluetoothOn: Boolean?,
+        var isNfcOn: Boolean?,
+        var isMobilDataOn: Boolean?,
+        var sleepTime: Int?,
+        @Id @GeneratedValue(strategy = GenerationType.AUTO)
+        var id: Long = 0) {
+}
\ No newline at end of file
diff --git a/src/main/kotlin/mobildata/model/inout/MobilDataIn.kt b/src/main/kotlin/mobildata/model/inout/MobilDataIn.kt
new file mode 100644
index 0000000..14f944f
--- /dev/null
+++ b/src/main/kotlin/mobildata/model/inout/MobilDataIn.kt
@@ -0,0 +1,45 @@
+package mobildata.model.inout
+
+import io.swagger.annotations.ApiModelProperty
+import mobildata.model.LocationData
+import javax.validation.constraints.*
+
+
+//@JsonRootName("mobil_data")
+class MobilDataIn {
+    @ApiModelProperty(required = false)
+    var location: LocationData?
+
+
+    @Min(value = 0L, message = "The value must be positive")
+    @Max(value = 100, message = "The value must be between 0 and 100")
+    @ApiModelProperty(example = "97", required = false)
+    var battery: Int?
+
+    // TODO MAX value
+    @Min(value = 0L, message = "The value must be positive")
+    @ApiModelProperty(example = "20", required = false)
+    var brightness: Int?
+
+    var isWifiOn: Boolean?
+    var isBluetoothOn: Boolean?
+    var isNfcOn: Boolean?
+    var isMobilDataOn: Boolean?
+
+    @Min(value = 0L, message = "The value must be positive")
+    @ApiModelProperty(example = "15", required = false)
+    var sleepTime: Int?
+
+    constructor(location: LocationData? = null, battery: Int?, brightness: Int?, isWifiOn: Boolean?,
+                isBluetoothOn: Boolean?, isNfcOn: Boolean?, isMobilDataOn: Boolean?,
+                sleepTime: Int?) {
+        this.location = location
+        this.battery = battery
+        this.brightness = brightness
+        this.isWifiOn = isWifiOn
+        this.isBluetoothOn = isBluetoothOn
+        this.isNfcOn = isNfcOn
+        this.isMobilDataOn = isMobilDataOn
+        this.sleepTime = sleepTime
+    }
+}
diff --git a/src/main/kotlin/mobildata/model/inout/Register.kt b/src/main/kotlin/mobildata/model/inout/Register.kt
index caa54d4..adad31d 100644
--- a/src/main/kotlin/mobildata/model/inout/Register.kt
+++ b/src/main/kotlin/mobildata/model/inout/Register.kt
@@ -1,6 +1,7 @@
 package mobildata.model.inout
 
 import io.swagger.annotations.ApiModelProperty
+import javax.validation.constraints.Min
 import javax.validation.constraints.NotNull
 import javax.validation.constraints.Pattern
 import javax.validation.constraints.Size
@@ -25,8 +26,8 @@ class Register {
     @ApiModelProperty(example = "16/01/1996", required = false)
     var birthDate: String? = ""
 
-    // TODO integer validation
     @ApiModelProperty(example = "28", required = false)
+    @Min(value = 0L, message = "The value must be positive")
     var androidVersion: Int? = null
 
     @Size(min = 1, max = 500, message = "invalid field size")
diff --git a/src/main/kotlin/mobildata/repository/MobilDataRepository.kt b/src/main/kotlin/mobildata/repository/MobilDataRepository.kt
new file mode 100644
index 0000000..fb5c21c
--- /dev/null
+++ b/src/main/kotlin/mobildata/repository/MobilDataRepository.kt
@@ -0,0 +1,10 @@
+package mobildata.repository
+
+import mobildata.model.MobilData
+import mobildata.model.User
+import org.springframework.data.repository.CrudRepository
+import org.springframework.stereotype.Repository
+
+@Repository
+interface MobilDataRepository : CrudRepository<MobilData, Long> {
+}
\ No newline at end of file
diff --git a/src/main/kotlin/mobildata/web/MobilDataHandler.kt b/src/main/kotlin/mobildata/web/MobilDataHandler.kt
new file mode 100644
index 0000000..004a8ec
--- /dev/null
+++ b/src/main/kotlin/mobildata/web/MobilDataHandler.kt
@@ -0,0 +1,34 @@
+package mobildata.web
+
+import mobildata.jwt.ApiKeySecured
+import mobildata.model.MobilData
+import mobildata.model.User
+import mobildata.model.inout.MobilDataIn
+import mobildata.repository.MobilDataRepository
+import mobildata.repository.UserRepository
+import org.springframework.validation.Errors
+import org.springframework.web.bind.annotation.PostMapping
+import org.springframework.web.bind.annotation.RequestBody
+import org.springframework.web.bind.annotation.RestController
+import javax.servlet.http.HttpServletRequest
+import javax.validation.Valid
+
+@RestController
+class MobilDataHandler (val mobilRepository: MobilDataRepository,
+                        val userRepo: UserRepository) {
+
+    private fun inputToMobilData(input : MobilDataIn, user:User? ): MobilData {
+        return MobilData(user_id = user!!.id, location_lat = input.location?.latitude,
+                location_long = input.location?.longitude, battery = input.battery,
+                brightness = input.brightness, isWifiOn = input.isWifiOn, isBluetoothOn = input.isBluetoothOn,
+                isMobilDataOn = input.isMobilDataOn, isNfcOn = input.isNfcOn, sleepTime = input.sleepTime)
+    }
+
+    @ApiKeySecured
+    @PostMapping("/api/data")
+    fun dataInput(@Valid @RequestBody mobilData: MobilDataIn, errors: Errors, request: HttpServletRequest) {
+        val apiKey = request.getHeader("Authorization")?.replace("Token ", "")
+        val dataToSave = inputToMobilData(mobilData, userRepo.findByToken(apiKey!!))
+        mobilRepository.save(dataToSave)
+    }
+};
\ No newline at end of file
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index 41bd635..6907354 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -1,12 +1,5 @@
-alter table if exists "user_user"
-  drop constraint FKl0s7rdd5k82i0xbgm2igjaetj;
-
-alter table if exists "user_user"
-  drop constraint FK8w8vorfaxyv2c87ga05luvkls;
-
 drop table if exists "user" cascade;
-
-drop table if exists "user_user" cascade;
+drop table if exists mobil_data cascade;
 
 drop sequence if exists hibernate_sequence;
 create sequence hibernate_sequence start 1 increment 1;
@@ -20,4 +13,23 @@ create table "user" (
   birth_date TIMESTAMP,
   device_type VARCHAR(255),
   primary key (id)
-);
\ No newline at end of file
+);
+
+create table mobil_data (
+  id int8 not null,
+  user_id int8 not null,
+  location_lat DOUBLE PRECISION,
+  location_long DOUBLE PRECISION,
+  battery INTEGER,
+  brightness INTEGER,
+  is_wifi_on BOOLEAN,
+  is_mobil_data_on BOOLEAN,
+  is_bluetooth_on BOOLEAN,
+  is_nfc_on BOOLEAN,
+  sleep_time INTEGER
+);
+
+alter table mobil_data
+    add CONSTRAINT user_id_foreign_key
+    FOREIGN KEY ("user_id")
+    REFERENCES "user"
\ No newline at end of file
-- 
GitLab