From efe7dea584e61bdf04fab552cfd47a1a8bdfc985 Mon Sep 17 00:00:00 2001 From: Bossanyi Tibor Date: Thu, 10 Sep 2020 07:15:42 +0200 Subject: [PATCH] ExercisePlan, ExercisePlanDetail - no OneToMany connection, Delete operation --- build.gradle.kts | 2 +- data/db/install.sql | 9 +++--- .../api/controller/ExercisePlanController.kt | 20 ++++++++++++- .../ExercisePlanDetailController.kt | 17 +++++++---- .../com/aitrainer/api/model/ExercisePlan.kt | 6 ++-- .../aitrainer/api/model/ExercisePlanDetail.kt | 9 ++++-- .../ExercisePlanDetailRepository.kt | 8 ++++-- .../api/repository/ExercisePlanRepository.kt | 2 +- .../api/test/ExercisePlanDetailTest.kt | 27 ++++++++++++------ .../aitrainer/api/test/ExercisePlanTest.kt | 28 +++++++++++++++++-- 10 files changed, 99 insertions(+), 29 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index ee50167..d7efa14 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "com.aitrainer" -version = "1.0.7" +version = "1.0.8" java.sourceCompatibility = JavaVersion.VERSION_1_8 repositories { diff --git a/data/db/install.sql b/data/db/install.sql index 6363f39..3740ed7 100644 --- a/data/db/install.sql +++ b/data/db/install.sql @@ -236,16 +236,17 @@ CREATE TABLE `exercise_plan` ( `description` TEXT(65535) NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', `private` TINYINT(4) NULL DEFAULT '0', `date_add` DATETIME NOT NULL, + `date_upd` DATETIME NOT NULL, PRIMARY KEY (`exercise_plan_id`) USING BTREE ) COLLATE='utf8mb4_general_ci' ENGINE=InnoDB ; -INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`) VALUES (3, 90, 'Common', 'Common training plan', 0, '0000-00-00 00:00:00'); -INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`) VALUES (4, 90, 'Chuck Norris Plan', '', 0, '0000-00-00 00:00:00'); -INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`) VALUES (6, 90, 'Boss private', NULL, 1, '2020-09-05 18:00:00'); -INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`) VALUES (7, 90, 'Boss private', NULL, 1, '2020-09-06 08:00:00'); +INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`, `date_upd`) VALUES (3, 90, 'Common', 'Common training plan', 0, NULL, NULL); +INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`, `date_upd`) VALUES (4, 90, 'Chuck Norris Plan', '', 0, NULL, NULL); +INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`, `date_upd`) VALUES (6, 90, 'Boss private', '', 1, '2020-09-08 00:06:26', NULL); +INSERT INTO `exercise_plan` (`exercise_plan_id`, `customer_id`, `name`, `description`, `private`, `date_add`, `date_upd`) VALUES (20, 90, 'Boss private 2', NULL, 1, '2020-09-09 00:06:19', NULL); CREATE TABLE `exercise_plan_detail` ( diff --git a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt index e83bcf0..2f34944 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt @@ -1,8 +1,10 @@ package com.aitrainer.api.controller import com.aitrainer.api.model.ExercisePlan +import com.aitrainer.api.model.ExercisePlanDetail import com.aitrainer.api.repository.ExercisePlanRepository import org.slf4j.LoggerFactory +import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.security.access.annotation.Secured import org.springframework.web.bind.annotation.* @@ -33,7 +35,7 @@ class ExercisePlanController( private val exercisePlanRepository: ExercisePlanRe @Secured @PostMapping("/exercise_plan/{exercisePlanId}") - fun updateExercisePlanById(@PathVariable(value = "exercisePlanId") exercisePlanId: Long, + fun updateExercisePlanById(@PathVariable(value = "exercisePlanId") exercisePlanId: Int, @Valid @RequestBody exercisePlan: ExercisePlan, @RequestHeader requestHeader: RequestHeader? ): ResponseEntity { @@ -49,4 +51,20 @@ class ExercisePlanController( private val exercisePlanRepository: ExercisePlanRe logger.info("-- updateExercisePlanById id: $updatedPlan ") return ResponseEntity.ok().body(exercisePlanRepository.save(updatedPlan)) } + + @Secured + @PostMapping("/exercise_plan/delete/{exercisePlanId}") + fun deleteExercisePlanById(@PathVariable(value = "exercisePlanId") exercisePlanId: Int, + @Valid @RequestBody exercisePlan: ExercisePlan) + :ResponseEntity { + val returnPlan = exercisePlanRepository.findById(exercisePlanId).orElse(null) + ?: return ResponseEntity.ok().body(HttpStatus.NOT_FOUND) + try { + exercisePlanRepository.delete(returnPlan) + } catch (e: IllegalArgumentException ) { + return ResponseEntity.ok().body(HttpStatus.BAD_REQUEST) + } + + return ResponseEntity.ok().body(HttpStatus.OK) + } } \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt index d15ebe4..a4cb044 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt @@ -22,12 +22,21 @@ class ExercisePlanDetailController( private val exercisePlanDetailRepository: Ex return ResponseEntity.ok().body(exercisePlanDetailRepository.save(exercisePlanDetail)) } - @GetMapping("/exercise_plan_detail/last/{customerId}") + /* @GetMapping("/exercise_plan_detail/last/{customerId}") fun getExercisePlanByCustomerId(@PathVariable(value = "customerId") customerId: Long): ResponseEntity> { val list: List = exercisePlanDetailRepository.getLastExercisePlanDetail(customerId) logger.info("-- getExercisePlanByCustomerId id: $customerId -- $list") return ResponseEntity.ok().body(list) } + */ + + + @GetMapping("/exercise_plan_detail/{exercisePlanId}") + fun getExercisePlanByExercisePlanId(@PathVariable(value = "exercisePlanId") exercisePlanId: Int): ResponseEntity> { + val list: List = exercisePlanDetailRepository.findByExercisePlanId(exercisePlanId) + logger.info("-- getExercisePlanByExercisePlanId id: $exercisePlanId -- $list") + return ResponseEntity.ok().body(list) + } @Secured @PostMapping("/exercise_plan_detail/{exercisePlanDetailId}") @@ -39,7 +48,7 @@ class ExercisePlanDetailController( private val exercisePlanDetailRepository: Ex ?: return ResponseEntity.notFound().build() val updatedPlanDetail = returnPlanDetail.copy( - exercisePlan = exercisePlanDetail.exercisePlan, + exercisePlanId = exercisePlanDetail.exercisePlanId, exerciseTypeId = exercisePlanDetail.exerciseTypeId, serie = exercisePlanDetail.serie, repeats = exercisePlanDetail.repeats, @@ -56,9 +65,7 @@ class ExercisePlanDetailController( private val exercisePlanDetailRepository: Ex @Valid @RequestBody exercisePlanDetail: ExercisePlanDetail) :ResponseEntity { val returnPlanDetail = exercisePlanDetailRepository.findById(exercisePlanDetailId).orElse(null) - if (returnPlanDetail == null) { - return ResponseEntity.ok().body(HttpStatus.NOT_FOUND) - } + ?: return ResponseEntity.ok().body(HttpStatus.NOT_FOUND) try { exercisePlanDetailRepository.delete(returnPlanDetail) } catch (e: IllegalArgumentException ) { diff --git a/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt b/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt index 6e3bc74..7bdad44 100644 --- a/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt +++ b/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt @@ -17,11 +17,13 @@ data class ExercisePlan( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - var exercisePlanId: Long = 0 + var exercisePlanId: Int = 0 - @OneToMany(fetch = FetchType.EAGER, mappedBy = "exercisePlan") + /* @OneToMany(fetch = FetchType.LAZY, mappedBy = "exercisePlan") @Fetch(value = FetchMode.SUBSELECT) val planDetailList: List = mutableListOf() + + */ } \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt b/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt index f9b176e..047d0d8 100644 --- a/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt +++ b/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt @@ -6,15 +6,18 @@ import javax.persistence.* @Entity data class ExercisePlanDetail ( - @get: NonNull var exerciseTypeId: Long = 0, + @get: NonNull var exercisePlanId: Int = 0, + @get: NonNull var exerciseTypeId: Int = 0, @get: NonNull var serie: Int = 0, @get: NonNull var repeats: Int = 0, - @get: NonNull var weightEquation: String? = "", + @get: NonNull var weightEquation: String? = "" - @ManyToOne(fetch = FetchType.EAGER, optional = false) + /* @ManyToOne(fetch = FetchType.LAZY, optional = false) @JoinColumn(name = "exercisePlanId", nullable = false) @JsonIgnore val exercisePlan: ExercisePlan? = null + + */ ) { @Id diff --git a/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanDetailRepository.kt b/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanDetailRepository.kt index fa43fc9..c2efa7b 100644 --- a/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanDetailRepository.kt +++ b/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanDetailRepository.kt @@ -1,17 +1,21 @@ package com.aitrainer.api.repository +import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.model.ExercisePlanDetail import org.springframework.data.jpa.repository.JpaRepository -import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository @Repository interface ExercisePlanDetailRepository: JpaRepository { - @Query("FROM ExercisePlanDetail as d " + + /* @Query("FROM ExercisePlanDetail as d " + "INNER JOIN ExercisePlan as p ON p.exercisePlanId = d.exercisePlan " + "WHERE p.private = 1 " + "AND p.customerId = :customerId " + "ORDER BY p.dateAdd DESC ") fun getLastExercisePlanDetail(customerId: Long): List + + */ + + fun findByExercisePlanId(exercisePlanId: Int): List } \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanRepository.kt b/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanRepository.kt index a3d0158..1dc1168 100644 --- a/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanRepository.kt +++ b/src/main/kotlin/com/aitrainer/api/repository/ExercisePlanRepository.kt @@ -6,7 +6,7 @@ import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository @Repository -interface ExercisePlanRepository: JpaRepository { +interface ExercisePlanRepository: JpaRepository { @Query(" FROM ExercisePlan" + " WHERE customerId = :customerId AND private = 1" + " AND dateAdd in (select Max(dateAdd) from ExercisePlan where customerId = :customerId and private = 1) "+ diff --git a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt index 60288db..6a34363 100644 --- a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt @@ -5,6 +5,7 @@ import com.aitrainer.api.controller.ExercisePlanDetailController import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.model.ExercisePlanDetail import com.aitrainer.api.repository.ExercisePlanDetailRepository +import com.aitrainer.api.repository.ExercisePlanRepository import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.slf4j.LoggerFactory @@ -12,7 +13,6 @@ import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity -import java.util.* import kotlin.test.assertEquals import kotlin.test.assertNotNull @@ -29,14 +29,14 @@ class ExercisePlanDetailTest { val plan = ExercisePlan( ) - plan.exercisePlanId = 6; + plan.exercisePlanId = 6 val planDetail = ExercisePlanDetail( exerciseTypeId = 41, serie = 3, repeats = 12, weightEquation = "50", - exercisePlan = plan + exercisePlanId = 6 ) val savedDetail: ExercisePlanDetail = exercisePlanDetailRepository.save(planDetail) assertEquals(savedDetail.repeats, 12) @@ -44,7 +44,7 @@ class ExercisePlanDetailTest { exercisePlanDetailRepository.delete(savedDetail) } - @Test + /* @Test fun testGetLastExercisePlanDetail() { val exercisePlanDetailList: List = exercisePlanDetailRepository.getLastExercisePlanDetail(90) logger.info(" ****** list: $exercisePlanDetailList") @@ -52,7 +52,7 @@ class ExercisePlanDetailTest { val exercisePlanDetail: ExercisePlanDetail = exercisePlanDetailList[0] assertEquals(exercisePlanDetail.weightEquation, "40") - } + } */ @Test fun testUpdatePlanDetail() { @@ -68,7 +68,7 @@ class ExercisePlanDetailTest { val updatedPlanDetail = response.body as ExercisePlanDetail assertEquals(planDetail.weightEquation, "50%") assertEquals(planDetail.repeats, 30) - assertEquals(planDetail.exercisePlan?.exercisePlanId, 6) + //assertEquals(planDetail.exercisePlan, ) assertEquals(planDetail.exercisePlanDetailId, 4) updatedPlanDetail.weightEquation = "40" @@ -81,14 +81,14 @@ class ExercisePlanDetailTest { val plan = ExercisePlan( ) - plan.exercisePlanId = 6; + plan.exercisePlanId = 6 val planDetail = ExercisePlanDetail( exerciseTypeId = 63, serie = 3, repeats = 120, weightEquation = "90", - exercisePlan = plan + exercisePlanId = 6 ) val savedDetail: ExercisePlanDetail = exercisePlanDetailRepository.save(planDetail) assertEquals(savedDetail.weightEquation, "90") @@ -105,6 +105,17 @@ class ExercisePlanDetailTest { val response2: ResponseEntity<*> = planDetailController.deleteExercisePlanDetailById(9999, planDetailToDelete) assertEquals(response2.body, HttpStatus.NOT_FOUND) + + } + + @Test + fun testGetExercisePlanDetailByPlanId() { + val exercisePlanDetailList: List = exercisePlanDetailRepository.findByExercisePlanId(6) + logger.info(" ****** list: $exercisePlanDetailList") + assertEquals(exercisePlanDetailList.size, 2) + + val exercisePlanDetail: ExercisePlanDetail = exercisePlanDetailList[0] + assertEquals(exercisePlanDetail.repeats, 1) } } diff --git a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt index 76adc39..eadeb14 100644 --- a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt @@ -7,10 +7,12 @@ import org.junit.jupiter.api.Test import org.junit.jupiter.api.TestInstance import org.springframework.beans.factory.annotation.Autowired import org.springframework.boot.test.context.SpringBootTest +import org.springframework.http.HttpStatus import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.RequestHeader import java.util.* import kotlin.test.assertEquals +import kotlin.test.assertNull @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -40,8 +42,8 @@ class ExercisePlanTest { @Test fun testGetLastPlan() { val exercisePlan: ExercisePlan? = exercisePlanRepository.getLastExercisePlan(90) - assertEquals(exercisePlan?.name, "Boss private") - assertEquals(exercisePlan?.dateAdd, "2020-09-06 08:00:00") + assertEquals(exercisePlan?.name, "Boss private 2") + assertEquals(exercisePlan?.dateAdd, "2020-09-09 00:06:19") val exercisePlan2: ExercisePlan? = exercisePlanRepository.getLastExercisePlan(91) assertEquals(exercisePlan2, null) @@ -66,4 +68,26 @@ class ExercisePlanTest { updatedPlan.description = "" planController.updateExercisePlanById(6, updatedPlan, null) } + + @Test + fun testDeletePlan() { + val exercisePlan = ExercisePlan ( + name = "Bossanyi private 3", + description = "", + customerId = 92, + private = true, + dateAdd = "2020-09-10 17:00" + ) + + + val savedPlan: ExercisePlan = exercisePlanRepository.save(exercisePlan) + assertEquals(savedPlan.customerId, 92) + + val planController = ExercisePlanController(exercisePlanRepository) + val response3: ResponseEntity<*> = planController.deleteExercisePlanById(exercisePlan.exercisePlanId, exercisePlan) + assertEquals(response3.body, HttpStatus.OK) + + val searchPlan = exercisePlanRepository.findById(exercisePlan.exercisePlanId) + assertEquals(searchPlan, Optional.empty()) + } } \ No newline at end of file