From aeaeddc25b56f7f2de75c65fe99bfe72da1daa02 Mon Sep 17 00:00:00 2001
From: Tamas Bunth <tamas.bunth@collabora.co.uk>
Date: Wed, 14 Mar 2018 21:17:51 +0100
Subject: [PATCH] REST: Fix upcoming issues of new fields

---
 src/main/kotlin/mobildata/model/User.kt       |  9 +++++----
 .../kotlin/mobildata/model/inout/Register.kt  | 16 +++++++++++++---
 .../mobildata/model/inout/UpdateUser.kt       | 19 +++++++++++++++++++
 src/main/kotlin/mobildata/web/UserHandler.kt  |  8 ++++----
 src/main/resources/schema.sql                 |  6 +++---
 5 files changed, 44 insertions(+), 14 deletions(-)

diff --git a/src/main/kotlin/mobildata/model/User.kt b/src/main/kotlin/mobildata/model/User.kt
index b988048..f1368f8 100644
--- a/src/main/kotlin/mobildata/model/User.kt
+++ b/src/main/kotlin/mobildata/model/User.kt
@@ -8,6 +8,8 @@ import javax.persistence.*
 // user should be quoted, because this keyword might be resolved in
 // various DBMS's (e.g. postgresql)
 
+//@ManyToMany: use for list fields
+
 @Entity
 //@JsonRootName("user")
 @Table(name = "\"user\"")
@@ -15,11 +17,10 @@ data class User(var email: String = "",
                 @JsonIgnore
                 var password: String = "",
                 var token: String = "",
-                @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/mm/yyyy") var birthDate: Date = Date(),
+                @JsonFormat(shape = JsonFormat.Shape.STRING, pattern = "dd/mm/yyyy")
+                var birthDate: Date = Date(),
                 var deviceType: String = "", // TODO type
-                var androidVersion: String = "",
-                //@ManyToMany
-                //@JsonIgnore
+                var androidVersion: Int? = null,
                 @Id @GeneratedValue(strategy = GenerationType.AUTO)
                 var id: Long = 0) {
     override fun toString(): String = "User($email)"
diff --git a/src/main/kotlin/mobildata/model/inout/Register.kt b/src/main/kotlin/mobildata/model/inout/Register.kt
index 8c176ad..caa54d4 100644
--- a/src/main/kotlin/mobildata/model/inout/Register.kt
+++ b/src/main/kotlin/mobildata/model/inout/Register.kt
@@ -1,8 +1,6 @@
 package mobildata.model.inout
 
-import com.fasterxml.jackson.annotation.JsonRootName
 import io.swagger.annotations.ApiModelProperty
-import io.swagger.annotations.Example
 import javax.validation.constraints.NotNull
 import javax.validation.constraints.Pattern
 import javax.validation.constraints.Size
@@ -27,8 +25,20 @@ class Register {
     @ApiModelProperty(example = "16/01/1996", required = false)
     var birthDate: String? = ""
 
-    constructor(email: String?, password: String?) {
+    // TODO integer validation
+    @ApiModelProperty(example = "28", required = false)
+    var androidVersion: Int? = null
+
+    @Size(min = 1, max = 500, message = "invalid field size")
+    @ApiModelProperty(example = "Samsung Galaxy blabla bla", required = false)
+    var deviceType: String? = ""
+
+    constructor(email: String?, password: String?, birthDate: String? = null, androidVersion: Int? = null,
+                deviceType: String? = null) {
         this.email = email
         this.password = password
+        this.birthDate = birthDate
+        this.androidVersion = androidVersion
+        this.deviceType = deviceType
     }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/mobildata/model/inout/UpdateUser.kt b/src/main/kotlin/mobildata/model/inout/UpdateUser.kt
index ea06930..af7883a 100644
--- a/src/main/kotlin/mobildata/model/inout/UpdateUser.kt
+++ b/src/main/kotlin/mobildata/model/inout/UpdateUser.kt
@@ -17,5 +17,24 @@ class UpdateUser {
     @ApiModelProperty(example = "16/01/1996", required = false)
     var birthDate: String? = ""
 
+    @Size(min = 1, message = "can't be empty")
+    @Pattern(regexp = "([1-9]\\d)", message = "must be a valid andoid API level")
+    @ApiModelProperty(example = "28", required = false)
+    var androidVersion: Int? = null
+
+    @Size(min = 1, max = 500, message = "invalid field size")
+    @ApiModelProperty(example = "Samsung Galaxy blabla bla", required = false)
+    var deviceType: String? = ""
+
+
     var password: String? = null
+
+    constructor(email: String?, password: String?, birthDate: String? = null, androidVersion: Int? = null,
+                deviceType: String? = null) {
+        this.email = email
+        this.password = password
+        this.birthDate = birthDate
+        this.androidVersion = androidVersion
+        this.deviceType = deviceType
+    }
 }
\ No newline at end of file
diff --git a/src/main/kotlin/mobildata/web/UserHandler.kt b/src/main/kotlin/mobildata/web/UserHandler.kt
index d907c2b..635280b 100644
--- a/src/main/kotlin/mobildata/web/UserHandler.kt
+++ b/src/main/kotlin/mobildata/web/UserHandler.kt
@@ -52,7 +52,7 @@ class UserHandler(val repository: UserRepository,
         val date = service.createDate(register.birthDate) ?: Date();
 
         val user = User(email = register.email!!, password = BCrypt.hashpw(register.password, BCrypt.gensalt()),
-                birthDate = date)
+                birthDate = date, deviceType = register.deviceType ?: "", androidVersion = register.androidVersion)
         user.token = service.newToken(user)
 
         val saved = repository.save(user)
@@ -62,7 +62,7 @@ class UserHandler(val repository: UserRepository,
 
     @ApiKeySecured
     @GetMapping("/api/user")
-    fun currentUser() = view(service.currentUser())
+    fun currentUser() = service.currentUser()
 
     @ApiKeySecured
     @PutMapping("/api/user")
@@ -87,7 +87,8 @@ class UserHandler(val repository: UserRepository,
 
         // update the user
         val u = currentUser.copy(email = user.email ?: currentUser.email,
-                password = BCrypt.hashpw(user.password, BCrypt.gensalt()), birthDate = date)
+                password = BCrypt.hashpw(user.password, BCrypt.gensalt()), birthDate = date,
+                deviceType = user.deviceType ?: "", androidVersion = user.androidVersion)
         // update token only if email changed
         if (currentUser.email != u.email) {
             u.token = service.newToken(u)
@@ -104,5 +105,4 @@ class UserHandler(val repository: UserRepository,
         }
     }
 
-    fun view(user: User) = mapOf("user" to user)
 }
\ No newline at end of file
diff --git a/src/main/resources/schema.sql b/src/main/resources/schema.sql
index 9fde62b..15c0570 100644
--- a/src/main/resources/schema.sql
+++ b/src/main/resources/schema.sql
@@ -13,12 +13,12 @@ create sequence hibernate_sequence start 1 increment 1;
 
 create table "user" (
   id int8 not null,
-  bio varchar(255),
   email varchar(255),
-  image varchar(255),
   password varchar(255),
   token varchar(255),
-  username varchar(255),
+  android_version INTEGER,
+  birth_date TIMESTAMP,
+  device_type VARCHAR(255),
   primary key (id)
 );
 
-- 
GitLab