diff --git a/data/db/update_1_0_7.sql b/data/db/update_1_0_7.sql index a48ee4a..a702d99 100644 --- a/data/db/update_1_0_7.sql +++ b/data/db/update_1_0_7.sql @@ -1,9 +1,9 @@ ALTER TABLE `exercise_plan` ADD COLUMN `customer_id` INT(11) NOT NULL DEFAULT '0' AFTER `exercise_plan_id`, ADD COLUMN `private` TINYINT(4) NULL DEFAULT '0' AFTER `description`, - ADD COLUMN `date_add` DATETIME NOT NULL AFTER `private`; + ADD COLUMN `date_add` DATETIME NULL AFTER `private`; ALTER TABLE `exercise_plan_detail` CHANGE COLUMN `repeat` `repeats` INT(11) NULL DEFAULT NULL AFTER `serie`; -UPDATE configuration set config_value = "1.0.7" WHERE config_key = "db_version"; \ No newline at end of file +UPDATE configuration set config_value = "1.0.7", date_change=CURRENT_DATE WHERE config_key = "db_version"; \ No newline at end of file diff --git a/data/db/update_1_0_8.sql b/data/db/update_1_0_8.sql new file mode 100644 index 0000000..59b2b6f --- /dev/null +++ b/data/db/update_1_0_8.sql @@ -0,0 +1,4 @@ +ALTER TABLE `exercise_plan` + ADD COLUMN `date_upd` DATETIME NULL AFTER `date_add`; + +UPDATE configuration set config_value = "1.0.8", date_change=CURRENT_DATE WHERE config_key = "db_version"; \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt index 4d1921a..e83bcf0 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanController.kt @@ -4,6 +4,7 @@ import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.repository.ExercisePlanRepository import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity +import org.springframework.security.access.annotation.Secured import org.springframework.web.bind.annotation.* import javax.validation.Valid @@ -29,4 +30,23 @@ class ExercisePlanController( private val exercisePlanRepository: ExercisePlanRe ResponseEntity.ok().body(exercisePlan) else ResponseEntity.notFound().build() } + + @Secured + @PostMapping("/exercise_plan/{exercisePlanId}") + fun updateExercisePlanById(@PathVariable(value = "exercisePlanId") exercisePlanId: Long, + @Valid @RequestBody exercisePlan: ExercisePlan, + @RequestHeader requestHeader: RequestHeader? + ): ResponseEntity { + val returnPlan = exercisePlanRepository.findById(exercisePlanId).orElse(null) + ?: return ResponseEntity.notFound().build() + val updatedPlan = returnPlan.copy( + customerId = exercisePlan.customerId, + name = exercisePlan.name, + dateAdd = exercisePlan.dateAdd, + description = exercisePlan.description + ) + updatedPlan.exercisePlanId = exercisePlan.exercisePlanId + logger.info("-- updateExercisePlanById id: $updatedPlan ") + return ResponseEntity.ok().body(exercisePlanRepository.save(updatedPlan)) + } } \ 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 aea7b82..d15ebe4 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/ExercisePlanDetailController.kt @@ -1,10 +1,13 @@ package com.aitrainer.api.controller +import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.model.ExercisePlanDetail import com.aitrainer.api.model.ExerciseType import com.aitrainer.api.repository.ExercisePlanDetailRepository 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.* import javax.validation.Valid @@ -25,4 +28,43 @@ class ExercisePlanDetailController( private val exercisePlanDetailRepository: Ex logger.info("-- getExercisePlanByCustomerId id: $customerId -- $list") return ResponseEntity.ok().body(list) } + + @Secured + @PostMapping("/exercise_plan_detail/{exercisePlanDetailId}") + fun updateExercisePlanDetailById(@PathVariable(value = "exercisePlanDetailId") exercisePlanDetailId: Long, + @Valid @RequestBody exercisePlanDetail: ExercisePlanDetail, + @RequestHeader requestHeader: RequestHeader? + ): ResponseEntity { + val returnPlanDetail = exercisePlanDetailRepository.findById(exercisePlanDetailId).orElse(null) + ?: return ResponseEntity.notFound().build() + + val updatedPlanDetail = returnPlanDetail.copy( + exercisePlan = exercisePlanDetail.exercisePlan, + exerciseTypeId = exercisePlanDetail.exerciseTypeId, + serie = exercisePlanDetail.serie, + repeats = exercisePlanDetail.repeats, + weightEquation = exercisePlanDetail.weightEquation + ) + updatedPlanDetail.exercisePlanDetailId = exercisePlanDetail.exercisePlanDetailId + logger.info("-- updateExercisePlanDetailById id: $updatedPlanDetail ") + return ResponseEntity.ok().body(exercisePlanDetailRepository.save(updatedPlanDetail)) + } + + @Secured + @PostMapping("/exercise_plan_detail/delete/{exercisePlanDetailId}") + fun deleteExercisePlanDetailById(@PathVariable(value = "exercisePlanDetailId") exercisePlanDetailId: Long, + @Valid @RequestBody exercisePlanDetail: ExercisePlanDetail) + :ResponseEntity { + val returnPlanDetail = exercisePlanDetailRepository.findById(exercisePlanDetailId).orElse(null) + if (returnPlanDetail == null) { + return ResponseEntity.ok().body(HttpStatus.NOT_FOUND) + } + try { + exercisePlanDetailRepository.delete(returnPlanDetail) + } 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/model/ExercisePlan.kt b/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt index bf1ff8d..6e3bc74 100644 --- a/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt +++ b/src/main/kotlin/com/aitrainer/api/model/ExercisePlan.kt @@ -11,7 +11,8 @@ data class ExercisePlan( @get: NonNull var name: String? = null, @get: NonNull var description: String? = null, @get: NonNull var private: Boolean = false, - @get: NonNull var dateAdd: String? = null + @get: NonNull var dateAdd: String? = null, + @get: NonNull var dateUpd: String? = null ) { @Id diff --git a/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt b/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt index d2238c0..f9b176e 100644 --- a/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt +++ b/src/main/kotlin/com/aitrainer/api/model/ExercisePlanDetail.kt @@ -19,5 +19,5 @@ data class ExercisePlanDetail ( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) - val exercisePlanDetailId: Long = 0 + var exercisePlanDetailId: Long = 0 } \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index cc45e71..e9c6455 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -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.6 +application.version=1.0.8 jwt.secret=aitrainer \ No newline at end of file diff --git a/src/main/resources/application-prodtest.properties b/src/main/resources/application-prodtest.properties index ed184c4..8e4b57e 100644 --- a/src/main/resources/application-prodtest.properties +++ b/src/main/resources/application-prodtest.properties @@ -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.6 +application.version=1.0.8 jwt.secret=aitrainer \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index dfa31e4..6408a67 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -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.7 +application.version=1.0.8 jwt.secret=aitrainer \ No newline at end of file diff --git a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt index c37ffe6..60288db 100644 --- a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanDetailTest.kt @@ -1,5 +1,7 @@ package com.aitrainer.api.test +import com.aitrainer.api.controller.ExercisePlanController +import com.aitrainer.api.controller.ExercisePlanDetailController import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.model.ExercisePlanDetail import com.aitrainer.api.repository.ExercisePlanDetailRepository @@ -8,7 +10,11 @@ import org.junit.jupiter.api.TestInstance import org.slf4j.LoggerFactory 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 @SpringBootTest @TestInstance(TestInstance.Lifecycle.PER_CLASS) @@ -47,5 +53,58 @@ class ExercisePlanDetailTest { val exercisePlanDetail: ExercisePlanDetail = exercisePlanDetailList[0] assertEquals(exercisePlanDetail.weightEquation, "40") } + + @Test + fun testUpdatePlanDetail() { + val planDetail: ExercisePlanDetail = exercisePlanDetailRepository.findById(4).orElse(null) + assertEquals(planDetail.exerciseTypeId, 39) + assertEquals(planDetail.serie, 3) + planDetail.weightEquation = "50%" + planDetail.repeats = 30 + + + val planDetailController = ExercisePlanDetailController(exercisePlanDetailRepository) + val response: ResponseEntity<*> = planDetailController.updateExercisePlanDetailById(4, planDetail, null) + val updatedPlanDetail = response.body as ExercisePlanDetail + assertEquals(planDetail.weightEquation, "50%") + assertEquals(planDetail.repeats, 30) + assertEquals(planDetail.exercisePlan?.exercisePlanId, 6) + assertEquals(planDetail.exercisePlanDetailId, 4) + + updatedPlanDetail.weightEquation = "40" + updatedPlanDetail.repeats = 1 + planDetailController.updateExercisePlanDetailById(4, updatedPlanDetail, null) + } + + @Test + fun testDeletePlanDetail() { + val plan = ExercisePlan( + + ) + plan.exercisePlanId = 6; + + val planDetail = ExercisePlanDetail( + exerciseTypeId = 63, + serie = 3, + repeats = 120, + weightEquation = "90", + exercisePlan = plan + ) + val savedDetail: ExercisePlanDetail = exercisePlanDetailRepository.save(planDetail) + assertEquals(savedDetail.weightEquation, "90") + val newPlanDetailId = savedDetail.exercisePlanDetailId + print(" --- new plan for delete $newPlanDetailId") + + val planDetailController = ExercisePlanDetailController(exercisePlanDetailRepository) + + val planDetailToDelete: ExercisePlanDetail = exercisePlanDetailRepository.findById(newPlanDetailId).orElse(null) + assertNotNull(planDetailToDelete) + + val response: ResponseEntity<*> = planDetailController.deleteExercisePlanDetailById(newPlanDetailId, planDetailToDelete) + assertEquals(response.body, HttpStatus.OK) + + val response2: ResponseEntity<*> = planDetailController.deleteExercisePlanDetailById(9999, planDetailToDelete) + assertEquals(response2.body, HttpStatus.NOT_FOUND) + } } diff --git a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt index a3a4ba3..76adc39 100644 --- a/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/ExercisePlanTest.kt @@ -1,11 +1,15 @@ package com.aitrainer.api.test +import com.aitrainer.api.controller.ExercisePlanController import com.aitrainer.api.model.ExercisePlan import com.aitrainer.api.repository.ExercisePlanRepository 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.ResponseEntity +import org.springframework.web.bind.annotation.RequestHeader +import java.util.* import kotlin.test.assertEquals @SpringBootTest @@ -42,4 +46,24 @@ class ExercisePlanTest { val exercisePlan2: ExercisePlan? = exercisePlanRepository.getLastExercisePlan(91) assertEquals(exercisePlan2, null) } + + @Test + fun testUpdatePlan() { + val plan: ExercisePlan = exercisePlanRepository.findById(6).orElse(null) + assertEquals(plan.name, "Boss private") + assertEquals(plan.customerId, 90) + plan.dateUpd = Date().toString() + plan.description = "Bossanyi updated" + + val planController = ExercisePlanController(exercisePlanRepository) + val response: ResponseEntity<*> = planController.updateExercisePlanById(6, plan, null) + val updatedPlan = response.body as ExercisePlan + assertEquals(plan.name, "Boss private") + assertEquals(plan.customerId, 90) + assertEquals(plan.description, "Bossanyi updated") + assertEquals(plan.exercisePlanId, 6) + + updatedPlan.description = "" + planController.updateExercisePlanById(6, updatedPlan, null) + } } \ No newline at end of file