ExerciseType extension with Images and Translations
DB 1.0.5
This commit is contained in:
@@ -39,10 +39,17 @@ class ExerciseTypeController ( private val exerciseTypeRepository: ExerciseTypeR
|
||||
/*
|
||||
@GetMapping("/exercise_type/name/{name}")
|
||||
fun getExerciseTypeByName(@PathVariable(value = "name") name: String): ResponseEntity<ExerciseType> {
|
||||
return exerciseTypeRepository.findByName(name).map { exerciseType ->
|
||||
return exerciseTypeRepository.findByName(name).map { exerciseType ->
|
||||
ResponseEntity.ok(exerciseType)
|
||||
}.orElse(ResponseEntity.notFound().build())
|
||||
}*/
|
||||
}*/
|
||||
|
||||
@GetMapping("exercise_type/active")
|
||||
fun getActiveExerciseType(): List<ExerciseType> {
|
||||
val list: List<ExerciseType> = exerciseTypeRepository.getActiveExerciseTypes()
|
||||
logger.info("-- Get Active Exercise Types with Images and Translation -- ")
|
||||
return list
|
||||
}
|
||||
|
||||
@PostMapping("/exercise_type/{id}")
|
||||
fun updateExerciseTypesById(@PathVariable(value = "id") exerciseTypeId: Long,
|
||||
@@ -52,7 +59,7 @@ class ExerciseTypeController ( private val exerciseTypeRepository: ExerciseTypeR
|
||||
val updatedExerciseType: ExerciseType = existingExerciseType
|
||||
.copy(name = newExerciseType.name,
|
||||
description = newExerciseType.description,
|
||||
video = newExerciseType.video)
|
||||
treeId = newExerciseType.treeId)
|
||||
ResponseEntity.ok().body(exerciseTypeRepository.save(updatedExerciseType))
|
||||
}.orElse(ResponseEntity.notFound().build())
|
||||
|
||||
|
||||
@@ -1,24 +1,32 @@
|
||||
package com.aitrainer.api.model
|
||||
|
||||
import org.hibernate.type.BinaryType
|
||||
import javax.persistence.Entity
|
||||
import javax.persistence.GeneratedValue
|
||||
import javax.persistence.GenerationType
|
||||
import javax.persistence.Id
|
||||
import org.hibernate.annotations.FetchMode
|
||||
import org.hibernate.annotations.Fetch
|
||||
import org.springframework.lang.NonNull
|
||||
import javax.persistence.*
|
||||
import javax.validation.constraints.NotBlank
|
||||
import javax.validation.constraints.Null
|
||||
|
||||
@Entity
|
||||
data class ExerciseType (
|
||||
|
||||
@get: NotBlank var name: String = "",
|
||||
data class ExerciseType(
|
||||
@get: NonNull var treeId: Int,
|
||||
@get: NotBlank var name: String = "",
|
||||
@get: NotBlank var description: String = "",
|
||||
@get: Null var video: BinaryType?,
|
||||
@get: Null var unit: String?,
|
||||
@get: Null var unitQuantity: String?,
|
||||
@get: Null var unitQuantityUnit: String?,
|
||||
@get: NonNull var active: Boolean?,
|
||||
|
||||
|
||||
@Id @GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
val exerciseTypeId: Long = 0
|
||||
val exerciseTypeId: Long = 0,
|
||||
|
||||
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER, mappedBy = "exerciseType")
|
||||
@Fetch(value = FetchMode.SUBSELECT)
|
||||
val images: List<ExerciseTypeImage> = mutableListOf<ExerciseTypeImage>().toList(),
|
||||
|
||||
@OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER, mappedBy = "exerciseType")
|
||||
@Fetch(value = FetchMode.SUBSELECT)
|
||||
val translations: List<ExerciseTypeTranslation> = mutableListOf<ExerciseTypeTranslation>().toList()
|
||||
|
||||
)
|
||||
|
||||
@@ -0,0 +1,24 @@
|
||||
package com.aitrainer.api.model
|
||||
|
||||
import org.springframework.lang.NonNull
|
||||
import javax.persistence.*
|
||||
import javax.validation.constraints.NotBlank
|
||||
|
||||
@Entity
|
||||
data class ExerciseTypeImage (
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
val imageId: Long = 0,
|
||||
|
||||
//@get: NonNull var exerciseTypeId: Integer?,
|
||||
@get: NotBlank var name: String = "",
|
||||
@get: NotBlank var type: String = "",
|
||||
@get: NotBlank var url: String = ""
|
||||
|
||||
) {
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER, optional = false)
|
||||
@JoinColumn(name="exerciseTypeId", nullable=false)
|
||||
val exerciseType: ExerciseType? = null
|
||||
}
|
||||
|
||||
@@ -0,0 +1,22 @@
|
||||
package com.aitrainer.api.model
|
||||
|
||||
import org.springframework.lang.NonNull
|
||||
import javax.persistence.*
|
||||
import javax.validation.constraints.NotBlank
|
||||
|
||||
@Entity
|
||||
data class ExerciseTypeTranslation (
|
||||
@Id
|
||||
@GeneratedValue(strategy = GenerationType.IDENTITY)
|
||||
val translationId: Long = 0,
|
||||
|
||||
//@get: NonNull var exerciseTypeId: Integer?,
|
||||
@get: NotBlank var languageCode: String?,
|
||||
@get: NotBlank var name: String = "",
|
||||
@get: NotBlank var description: String = ""
|
||||
) {
|
||||
|
||||
@ManyToOne(fetch = FetchType.EAGER, optional = false)
|
||||
@JoinColumn(name = "exerciseTypeId", nullable = false)
|
||||
val exerciseType: ExerciseType? = null
|
||||
}
|
||||
@@ -1,12 +1,25 @@
|
||||
package com.aitrainer.api.repository
|
||||
|
||||
import com.aitrainer.api.model.ExerciseType
|
||||
import com.aitrainer.api.model.Exercises
|
||||
import org.springframework.data.jpa.repository.JpaRepository
|
||||
import org.springframework.data.jpa.repository.Query
|
||||
import org.springframework.data.repository.query.Param
|
||||
import org.springframework.stereotype.Repository
|
||||
import javax.persistence.NamedQuery
|
||||
|
||||
@Repository
|
||||
interface ExerciseTypeRepository : JpaRepository<ExerciseType, Long>{
|
||||
|
||||
fun findByName(name: String): ExerciseType
|
||||
|
||||
@Query("FROM ExerciseType as e " +
|
||||
"LEFT JOIN ExerciseTypeImage as i ON e.exerciseTypeId = i.exerciseType " +
|
||||
"LEFT JOIN ExerciseTypeTranslation as t ON e.exerciseTypeId = t.exerciseType " +
|
||||
"WHERE e.active = 1 " +
|
||||
"AND t.languageCode = 'hu' " +
|
||||
"AND i.type = 'menu' " +
|
||||
"ORDER BY e.exerciseTypeId ")
|
||||
fun getActiveExerciseTypes(): List<ExerciseType>
|
||||
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
spring.profiles.active=dev
|
||||
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
|
||||
#spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer2?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true
|
||||
spring.datasource.username = aitrainer
|
||||
spring.datasource.password = andio2009
|
||||
|
||||
|
||||
@@ -1,7 +1,6 @@
|
||||
spring.profiles.active=prod
|
||||
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
|
||||
#spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer2?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true
|
||||
spring.datasource.username = aitrainer
|
||||
spring.datasource.password = andio2009
|
||||
|
||||
|
||||
@@ -1,7 +1,7 @@
|
||||
spring.profiles.active=dev,test,prod
|
||||
## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties)
|
||||
#spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?autoReconnect=true&useUnicode=true&characterEncoding=UTF-8&allowMultiQueries=true&useSSL=false
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true
|
||||
spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer2?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true
|
||||
spring.datasource.username = aitrainer
|
||||
spring.datasource.password = andio2009
|
||||
|
||||
@@ -16,6 +16,6 @@ logging.config=classpath:logback-spring.xml
|
||||
logging.file=logs
|
||||
|
||||
# if the database structure has been changed, increment this version number
|
||||
application.version=1.0.4
|
||||
application.version=1.0.5
|
||||
|
||||
jwt.secret=aitrainer
|
||||
@@ -24,7 +24,7 @@ class ApplicationStartTest {
|
||||
var foundTable = false
|
||||
val rs: ResultSet = Singleton.execQuery("Show tables;")
|
||||
while ( rs.next() ) {
|
||||
if ( rs.getString("tables_in_aitrainer") == "customer_information" ) {
|
||||
if ( rs.getString("tables_in_aitrainer2") == "customer_information" ) {
|
||||
foundTable = true
|
||||
}
|
||||
}
|
||||
|
||||
@@ -115,6 +115,7 @@ class CustomerTests {
|
||||
assertEquals(response.statusCode, HttpStatus.OK)
|
||||
assertEquals(newCustomer?.weight, 79)
|
||||
assertEquals(newCustomer?.password, "123456789")
|
||||
assertEquals(newCustomer?.firstname, "Tib")
|
||||
|
||||
// test not found
|
||||
id = 1000
|
||||
@@ -125,10 +126,14 @@ class CustomerTests {
|
||||
// update Password
|
||||
id = 103
|
||||
customer.password = "blabal"
|
||||
customer.firstname = "Kakadu"
|
||||
customer.name = "Bos"
|
||||
response = customerController.updateCustomerById(id, customer, HttpHeaders.readOnlyHttpHeaders(HttpHeaders.EMPTY) )
|
||||
assertEquals(response.statusCode, HttpStatus.OK)
|
||||
newCustomer = response.body as Customer
|
||||
assertEquals(newCustomer.password, "blabal")
|
||||
assertEquals(newCustomer.firstname, "Kakadu")
|
||||
assertEquals(newCustomer.name, "Bos")
|
||||
|
||||
}
|
||||
|
||||
|
||||
@@ -1,5 +1,7 @@
|
||||
package com.aitrainer.api.test
|
||||
|
||||
import com.aitrainer.api.controller.CustomerController
|
||||
import com.aitrainer.api.controller.ExerciseTypeController
|
||||
import com.aitrainer.api.model.ExerciseType
|
||||
import com.aitrainer.api.repository.ExerciseTypeRepository
|
||||
import org.junit.jupiter.api.Test
|
||||
@@ -48,7 +50,7 @@ class ExerciseTypeTest {
|
||||
@Test
|
||||
fun testInsert(){
|
||||
logger.info("Add 'Húzodszkodás 2")
|
||||
val newEx = ExerciseType( "Húzodszkodás 2", " A legtöbb húzodszkodást 24 óra alatt John Ort érte el 7600-al 2016-ban. ", null, null, null , null)
|
||||
val newEx = ExerciseType( 0,"Húzodszkodás 2", " A legtöbb húzodszkodást 24 óra alatt John Ort érte el 7600-al 2016-ban. ", null, null, null ,true)
|
||||
val savedEx: ExerciseType = exerciseTypeRepository.save(newEx)
|
||||
assertEquals(savedEx.name, "Húzodszkodás 2")
|
||||
|
||||
@@ -61,4 +63,16 @@ class ExerciseTypeTest {
|
||||
logger.info("Delete 'Húzodszkodás 2")
|
||||
exerciseTypeRepository.delete(extype)
|
||||
}
|
||||
|
||||
@Test
|
||||
fun testActiveExercises() {
|
||||
val exerciseTypeController = ExerciseTypeController(exerciseTypeRepository)
|
||||
val exerciseTypes = exerciseTypeController.getActiveExerciseType()
|
||||
|
||||
val exerciseType = exerciseTypes[0]
|
||||
assertEquals(exerciseType.name, "Chest Press")
|
||||
assertEquals(exerciseType.images[0].url, "images/2.2.1.1.chestpress.png")
|
||||
assertEquals(exerciseTypes[2].translations[0].name, "Tricepsz")
|
||||
|
||||
}
|
||||
}
|
||||
@@ -15,7 +15,7 @@ class PropertiesTest {
|
||||
@Test
|
||||
fun testDatasourceUrl() {
|
||||
val url: String = properties.getDatasourceUrl()
|
||||
assertEquals(url, "jdbc:mysql://localhost:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true")
|
||||
assertEquals(url, "jdbc:mysql://localhost:3306/aitrainer2?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true")
|
||||
}
|
||||
|
||||
}
|
||||
Reference in New Issue
Block a user