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