From af32c32a70d603cb99efb365264e30d56b224fd5 Mon Sep 17 00:00:00 2001 From: Bossanyi Tibor Date: Sun, 2 Aug 2020 16:03:51 +0200 Subject: [PATCH] ExerciseTree getActiveMenu items --- data/db/install.sql | 2 +- data/db/update_1_0_5.sql | 1 + .../api/controller/ExerciseTreeController.kt | 21 ++++++++++++++ .../com/aitrainer/api/model/ExerciseTree.kt | 23 +++++++++++++++ .../api/model/ExerciseTreeTranslation.kt | 19 ++++++++++++ .../api/repository/ExerciseTreeRepository.kt | 16 ++++++++++ .../resources/application-prod.properties | 13 +++++++-- .../aitrainer/api/test/ExerciseTreeTest.kt | 29 +++++++++++++++++++ 8 files changed, 121 insertions(+), 3 deletions(-) create mode 100644 src/main/kotlin/com/aitrainer/api/controller/ExerciseTreeController.kt create mode 100644 src/main/kotlin/com/aitrainer/api/model/ExerciseTree.kt create mode 100644 src/main/kotlin/com/aitrainer/api/model/ExerciseTreeTranslation.kt create mode 100644 src/main/kotlin/com/aitrainer/api/repository/ExerciseTreeRepository.kt create mode 100644 src/test/kotlin/com/aitrainer/api/test/ExerciseTreeTest.kt diff --git a/data/db/install.sql b/data/db/install.sql index 9f8bb23..e65981e 100644 --- a/data/db/install.sql +++ b/data/db/install.sql @@ -198,7 +198,7 @@ ENGINE=InnoDB ; CREATE TABLE `exercise_tree` ( - `item_id` INT(11) NOT NULL AUTO_INCREMENT, + `tree_id` INT(11) NOT NULL AUTO_INCREMENT, `parent_id` INT(11) NOT NULL DEFAULT '0', `name` CHAR(50) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', `image_url` CHAR(200) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', diff --git a/data/db/update_1_0_5.sql b/data/db/update_1_0_5.sql index 442bb85..c3cf434 100644 --- a/data/db/update_1_0_5.sql +++ b/data/db/update_1_0_5.sql @@ -1,5 +1,6 @@ ALTER TABLE `exercise_type` ADD COLUMN `tree_id` INT(12) DEFAULT 0 AFTER `exercise_type_id`; +ALTER TABLE `exercise_type` ADD COLUMN `active` TINYINT(1) NULL DEFAULT NULL AFTER `unit_quantity_unit`; ALTER TABLE `exercise_type` DROP COLUMN `video`; diff --git a/src/main/kotlin/com/aitrainer/api/controller/ExerciseTreeController.kt b/src/main/kotlin/com/aitrainer/api/controller/ExerciseTreeController.kt new file mode 100644 index 0000000..377beaf --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/controller/ExerciseTreeController.kt @@ -0,0 +1,21 @@ +package com.aitrainer.api.controller + +import com.aitrainer.api.model.ExerciseTree +import com.aitrainer.api.repository.ExerciseTreeRepository +import org.slf4j.LoggerFactory +import org.springframework.web.bind.annotation.GetMapping +import org.springframework.web.bind.annotation.RequestMapping +import org.springframework.web.bind.annotation.RestController + +@RestController +@RequestMapping("/api") +class ExerciseTreeController (private val exerciseTreeRepository: ExerciseTreeRepository) { + private val logger = LoggerFactory.getLogger(javaClass) + + @GetMapping("/exercise_tree") + fun getAllActiveMenu(): List { + val list: List = exerciseTreeRepository.getActiveMenu() + logger.info(" -- Get All active Exercise Tree menu..") + return list + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/model/ExerciseTree.kt b/src/main/kotlin/com/aitrainer/api/model/ExerciseTree.kt new file mode 100644 index 0000000..d9fc3b5 --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/model/ExerciseTree.kt @@ -0,0 +1,23 @@ +package com.aitrainer.api.model + +import org.hibernate.annotations.Fetch +import org.hibernate.annotations.FetchMode +import org.springframework.lang.NonNull +import javax.persistence.* +import javax.validation.constraints.NotBlank + +@Entity +data class ExerciseTree ( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + val treeId: Long = 0, + + @get: NonNull var parentId: Int, + @get: NotBlank var name: String = "", + @get: NotBlank var imageUrl: String = "", + @get: NonNull var active: Boolean?, + + @OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER, mappedBy = "exerciseTree") + @Fetch(value = FetchMode.SUBSELECT) + val translations: List = mutableListOf().toList() +) \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/model/ExerciseTreeTranslation.kt b/src/main/kotlin/com/aitrainer/api/model/ExerciseTreeTranslation.kt new file mode 100644 index 0000000..7ba720a --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/model/ExerciseTreeTranslation.kt @@ -0,0 +1,19 @@ +package com.aitrainer.api.model + +import javax.persistence.* +import javax.validation.constraints.NotBlank + +@Entity +data class ExerciseTreeTranslation ( + @Id + @GeneratedValue(strategy = GenerationType.IDENTITY) + val translationId: Long = 0, + + @get: NotBlank var languageCode: String?, + @get: NotBlank var name: String = "", + + @ManyToOne(fetch = FetchType.EAGER, optional = false) + @JoinColumn(name = "treeId", nullable = false) + val exerciseTree: ExerciseTree? = null + +) diff --git a/src/main/kotlin/com/aitrainer/api/repository/ExerciseTreeRepository.kt b/src/main/kotlin/com/aitrainer/api/repository/ExerciseTreeRepository.kt new file mode 100644 index 0000000..a4d2b9b --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/repository/ExerciseTreeRepository.kt @@ -0,0 +1,16 @@ +package com.aitrainer.api.repository + +import com.aitrainer.api.model.ExerciseTree +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query +import org.springframework.stereotype.Repository + +@Repository +interface ExerciseTreeRepository : JpaRepository { + + @Query("FROM ExerciseTree as e " + + "LEFT JOIN ExerciseTreeTranslation as t ON e.treeId = t.exerciseTree AND t.languageCode = 'hu' " + + "WHERE e.active = 1 " + + "ORDER BY e.treeId ") + fun getActiveMenu(): List +} \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index a52ad08..c328b10 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -1,6 +1,6 @@ spring.profiles.active=prod ## Spring DATASOURCE (DataSourceAutoConfiguration & DataSourceProperties) -spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer2?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true +spring.datasource.url = jdbc:mysql://localhost:3306/aitrainer?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowPublicKeyRetrieval=true&allowMultiQueries=true spring.datasource.username = aitrainer spring.datasource.password = andio2009 @@ -9,4 +9,13 @@ spring.datasource.password = andio2009 # The SQL dialect makes Hibernate generate better SQL for the chosen database -spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect \ No newline at end of file +spring.jpa.properties.hibernate.dialect = org.hibernate.dialect.MySQL5InnoDBDialect + + +logging.config=classpath:logback-spring.xml +logging.file=logs + +# if the database structure has been changed, increment this version number +application.version=1.0.5 + +jwt.secret=aitrainer \ No newline at end of file diff --git a/src/test/kotlin/com/aitrainer/api/test/ExerciseTreeTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExerciseTreeTest.kt new file mode 100644 index 0000000..3d690fd --- /dev/null +++ b/src/test/kotlin/com/aitrainer/api/test/ExerciseTreeTest.kt @@ -0,0 +1,29 @@ +package com.aitrainer.api.test + + +import com.aitrainer.api.controller.ExerciseTreeController +import com.aitrainer.api.repository.ExerciseTreeRepository +import org.junit.jupiter.api.Test +import org.slf4j.LoggerFactory +import org.springframework.beans.factory.annotation.Autowired +import org.springframework.boot.test.context.SpringBootTest +import kotlin.test.assertEquals + +@SpringBootTest +class ExerciseTreeTest { + private val logger = LoggerFactory.getLogger(javaClass) + + @Autowired + private lateinit var exerciseTreeRepository: ExerciseTreeRepository + + @Test + fun testActiveExercises() { + val exerciseTreeController = ExerciseTreeController(exerciseTreeRepository) + val exerciseTree = exerciseTreeController.getAllActiveMenu() + + val exerciseTreeItem = exerciseTree[0] + assertEquals(exerciseTreeItem.name, "Cardio") + assertEquals(exerciseTree[1].translations[0].name, "Erő") + + } +} \ No newline at end of file