From 1e9a6018bd8c6055fb2b3f5e0d707542cd45fa66 Mon Sep 17 00:00:00 2001 From: Tibor Bossanyi Date: Sun, 16 Apr 2023 16:41:04 +0200 Subject: [PATCH] API 1.2.4 delete meal --- data/db/update_1_2_3.sql | 8 ++++-- data/db/update_1_2_4.sql | 9 ++++++ .../api/controller/PackageController.kt | 6 ++-- .../api/controller/diet/MealController.kt | 28 ++++++++++++++++++- .../com/aitrainer/api/model/diet/Meal.kt | 6 ++-- .../com/aitrainer/api/openai/OpenAIService.kt | 3 ++ .../resources/application-diet.properties | 3 +- .../resources/application-dietprod.properties | 1 + .../resources/application-dietwsl.properties | 1 + src/main/resources/application.properties | 3 +- .../com/aitrainer/api/test/diet/MealTest.kt | 25 ++++++++++++++++- 11 files changed, 80 insertions(+), 13 deletions(-) create mode 100644 data/db/update_1_2_4.sql diff --git a/data/db/update_1_2_3.sql b/data/db/update_1_2_3.sql index 0c1ed17..d66556d 100644 --- a/data/db/update_1_2_3.sql +++ b/data/db/update_1_2_3.sql @@ -3,17 +3,21 @@ START TRANSACTION; ALTER TABLE `meal` ADD COLUMN `normalized_name` CHAR(100) NOT NULL DEFAULT '0' AFTER `name`, ADD COLUMN `serving` DOUBLE(10,2) NULL DEFAULT '0.00' AFTER `quantity_unit`, - ADD COLUMN `serving_unit` CHAR(50) NULL DEFAULT '' AFTER `portion`; + ADD COLUMN `serving_unit` CHAR(50) NULL DEFAULT '' AFTER `serving`; ALTER TABLE `diet_meal` ADD COLUMN `normalized_name` CHAR(100) NOT NULL DEFAULT '0' AFTER `meal_name`, ADD COLUMN `serving` DOUBLE(10,2) NULL DEFAULT '0.00' AFTER `quantity_unit`, - ADD COLUMN `serving_unit` CHAR(50) NULL DEFAULT '' AFTER `portion`; + ADD COLUMN `serving_unit` CHAR(50) NULL DEFAULT '' AFTER `serving`; ALTER TABLE `recipe_meal` CHANGE COLUMN `quantity` `quantity` DOUBLE NULL DEFAULT NULL AFTER `recipe_id`, ADD COLUMN `quantity_unit` CHAR(50) NULL DEFAULT NULL AFTER `quantity`; + ALTER TABLE `meal` + DROP INDEX `name_quantity`, + ADD UNIQUE INDEX `id_normalized_name` (`id`, `normalized_name`); + UPDATE configuration set config_value = "1.2.3", date_change=CURRENT_DATE WHERE config_key = "db_version"; COMMIT; \ No newline at end of file diff --git a/data/db/update_1_2_4.sql b/data/db/update_1_2_4.sql new file mode 100644 index 0000000..1d27702 --- /dev/null +++ b/data/db/update_1_2_4.sql @@ -0,0 +1,9 @@ +START TRANSACTION; + + ALTER TABLE `meal` + DROP INDEX `name_quantity`, + ADD UNIQUE INDEX `normalized_name` (`normalized_name`); + +UPDATE configuration set config_value = "1.2.4", date_change=CURRENT_DATE WHERE config_key = "db_version"; + +COMMIT; \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt index f19a5da..2166d23 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt @@ -12,8 +12,7 @@ import org.springframework.web.bind.annotation.GetMapping import org.springframework.web.bind.annotation.RequestMapping import org.springframework.web.bind.annotation.RestController import com.google.gson.GsonBuilder -import org.springframework.web.bind.annotation.CrossOrigin - +import org.springframework.http.MediaType @RestController @RequestMapping("/api") @@ -42,8 +41,7 @@ class PackageController(private val exerciseAbilityRepository: ExerciseAbilityRe private val dietSensitivityRepository: DietSensitivityRepository ) { - @GetMapping("/diet_package") - @CrossOrigin(origins = ["http://localhost:48102"]) + @GetMapping("/diet_package", produces = [MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"]) fun getDietPackageData(): ResponseEntity { val gson = GsonBuilder() .excludeFieldsWithoutExposeAnnotation() diff --git a/src/main/kotlin/com/aitrainer/api/controller/diet/MealController.kt b/src/main/kotlin/com/aitrainer/api/controller/diet/MealController.kt index dd0c427..32f2dc1 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/diet/MealController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/diet/MealController.kt @@ -2,6 +2,7 @@ package com.aitrainer.api.controller.diet import com.aitrainer.api.model.diet.Meal import com.aitrainer.api.repository.diet.MealRepository +import org.springframework.http.MediaType import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* @@ -15,7 +16,7 @@ class MealController(private val mealRepository: MealRepository) { return ResponseEntity.ok().body(newMeal) } - @GetMapping("/meal") + @GetMapping("/meal", produces = [MediaType.APPLICATION_JSON_VALUE + ";charset=UTF-8"]) fun getAll(): ResponseEntity> { val list = mealRepository.findAll() return if (list.isEmpty()) ResponseEntity.notFound().build() else @@ -36,4 +37,29 @@ class MealController(private val mealRepository: MealRepository) { ResponseEntity.ok().body(meal) } + @PostMapping("/meal/{id}") + fun update(@PathVariable(value = "id") id: Long, @RequestBody meal: Meal): ResponseEntity { + val existingMeal = mealRepository.findById(id) ?: return ResponseEntity.notFound().build() + + val updatedMeal: Meal = existingMeal.copy( + id = existingMeal.id, + name = existingMeal.name, + normalizedName = meal.normalizedName, + description = meal.description, + calMin = meal.calMin, + calMax = meal.calMax, + chMin = meal.chMin, + chMax = meal.chMax, + proteinMin = meal.proteinMin, + proteinMax = meal.proteinMax, + fatMin = meal.fatMin, + fatMax = meal.fatMax, + sugar = meal.sugar, + serving = meal.serving, + servingUnit = meal.servingUnit + ) + + return ResponseEntity.ok().body(mealRepository.save(updatedMeal)) + } + } \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/model/diet/Meal.kt b/src/main/kotlin/com/aitrainer/api/model/diet/Meal.kt index a23c819..60beaf0 100644 --- a/src/main/kotlin/com/aitrainer/api/model/diet/Meal.kt +++ b/src/main/kotlin/com/aitrainer/api/model/diet/Meal.kt @@ -8,11 +8,11 @@ data class Meal ( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Expose val id: Long = 0, @Expose @get: NotNull val name: String = "", - @Expose @get: NotNull val normalizedName: String = "", + @Expose @get: NotNull var normalizedName: String = "", @Expose @get: NotNull val quantity: Double = 0.0, @Expose @get: NotNull val quantityUnit: String = "", - @Expose @get: NotNull val serving: Double = 0.0, - @Expose @get: NotNull val servingUnit: String = "", + @Expose @get: NotNull var serving: Double = 0.0, + @Expose @get: NotNull var servingUnit: String = "", @Expose @get: NotNull val description: String = "", @Expose @get: NotNull val calMin: Double = 0.0, @Expose @get: NotNull val calMax: Double = 0.0, diff --git a/src/main/kotlin/com/aitrainer/api/openai/OpenAIService.kt b/src/main/kotlin/com/aitrainer/api/openai/OpenAIService.kt index 155391a..5917d83 100644 --- a/src/main/kotlin/com/aitrainer/api/openai/OpenAIService.kt +++ b/src/main/kotlin/com/aitrainer/api/openai/OpenAIService.kt @@ -80,6 +80,9 @@ class OpenAIService(@Value("\${openai.key}") private val openaiKey: String, priv } val realModelName = "gpt-3.5-turbo" + /*if ( modelName != null) { + realModelName = modelName + }*/ var realTemperature = 0.1 if ( temperature != null ) { realTemperature = temperature diff --git a/src/main/resources/application-diet.properties b/src/main/resources/application-diet.properties index a2b750a..2a78160 100644 --- a/src/main/resources/application-diet.properties +++ b/src/main/resources/application-diet.properties @@ -23,5 +23,6 @@ jwt.secret=aitrainer openai.key=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 firebase.key=AIzaSyBLn7Bz73Z1hB-OhqphBDsskOyGmpI7J8E spring.mail.properties.mail.mime.charset=UTF-8 +spring.http.encoding.charset=UTF-8 -spring.mvc.cors.allowed-origins=* \ No newline at end of file +spring.mvc.cors.allowed-origins=* diff --git a/src/main/resources/application-dietprod.properties b/src/main/resources/application-dietprod.properties index a8ca6d4..2fba647 100644 --- a/src/main/resources/application-dietprod.properties +++ b/src/main/resources/application-dietprod.properties @@ -21,5 +21,6 @@ jwt.secret=aitrainer firebase.key=AIzaSyBLn7Bz73Z1hB-OhqphBDsskOyGmpI7J8E openai.key=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 spring.mail.properties.mail.mime.charset=UTF-8 +spring.http.encoding.charset=UTF-8 spring.mvc.cors.allowed-origins=* \ No newline at end of file diff --git a/src/main/resources/application-dietwsl.properties b/src/main/resources/application-dietwsl.properties index fa04645..a421c79 100644 --- a/src/main/resources/application-dietwsl.properties +++ b/src/main/resources/application-dietwsl.properties @@ -4,3 +4,4 @@ spring.config.use-legacy-processing = true spring.datasource.url = jdbc:mysql://192.168.100.98:3306/diet4you?serverTimezone=CET&useSSL=false&characterEncoding=UTF-8&allowMultiQueries=true spring.datasource.username = aitrainer spring.datasource.password = ENC(WZplPYr8WmrLHshesY4T6oXplK3MlUVJ) +spring.http.encoding.charset=UTF-8 \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index c8186dc..7afeb1a 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -25,4 +25,5 @@ openai.key=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 spring.mail.properties.mail.mime.charset=UTF-8 firebase.key=AIzaSyCUXBWV3_qzvV__ZWZA1siHftrrJpjDKh4 -spring.mvc.cors.allowed-origins=* \ No newline at end of file +spring.mvc.cors.allowed-origins=* +spring.http.encoding.charset=UTF-8 \ No newline at end of file diff --git a/src/test/kotlin/com/aitrainer/api/test/diet/MealTest.kt b/src/test/kotlin/com/aitrainer/api/test/diet/MealTest.kt index db954dc..78f164c 100644 --- a/src/test/kotlin/com/aitrainer/api/test/diet/MealTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/diet/MealTest.kt @@ -17,6 +17,7 @@ import org.springframework.test.web.servlet.MockMvc import org.springframework.test.web.servlet.request.MockMvcRequestBuilders import org.springframework.test.web.servlet.request.MockMvcRequestBuilders.get import org.springframework.test.web.servlet.result.MockMvcResultMatchers.* +import kotlin.test.assertEquals @ExtendWith(SpringExtension::class) @@ -68,7 +69,7 @@ class MealTest { servingUnit = "db", normalizedName = "Tigris buci" ) - private val meal3 = Meal( + private var meal3 = Meal( name = "Töltötttojás", quantity = 330.0, @@ -180,6 +181,28 @@ class MealTest { val newMealJson3 = mvcResult.response.contentAsString val newMeal3 = gson.fromJson(newMealJson3, Meal::class.java) + // update + newMeal3.normalizedName = "Toltott-tojas" + newMeal3.servingUnit = "db" + newMeal3.serving = 5.0 + mvcResult = mockMvc.perform( + MockMvcRequestBuilders.post("/api/meal/${newMeal3.id}") + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", "Bearer $authToken") + .content(toJson(newMeal3)) + ) .andExpect(status().isOk) + .andReturn() + + val newMealJson3Update = mvcResult.response.contentAsString + val newMeal3Update = gson.fromJson(newMealJson3Update, Meal::class.java) + + assertEquals(newMeal3Update.normalizedName,"Toltott-tojas" ) + /* + .andExpect(jsonPath("$.normalizedName").value("Toltott-tojas")) + .andExpect(jsonPath("$.name").value("Töltötttojás")) + .andExpect(jsonPath("$.calMax").value(112.0)) + .andExpect(jsonPath("$.serving").value(5.0))*/ + mealRepository.delete(newMeal3) }