diff --git a/build.gradle.kts b/build.gradle.kts index db0fd83..5dd02d7 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "com.aitrainer" -version = "1.2.0" +version = "1.2.1" java.sourceCompatibility = JavaVersion.VERSION_17 repositories { diff --git a/data/db/update_1_2_1.sql b/data/db/update_1_2_1.sql new file mode 100644 index 0000000..61ac05f --- /dev/null +++ b/data/db/update_1_2_1.sql @@ -0,0 +1,7 @@ +START TRANSACTION; +ALTER TABLE `diet_meal` + ADD COLUMN `meal_date` DATETIME NULL DEFAULT NULL AFTER `quantity_unit`; + +UPDATE configuration set config_value = "1.2.1", 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/CustomerAppTextController.kt b/src/main/kotlin/com/aitrainer/api/controller/CustomerAppTextController.kt new file mode 100644 index 0000000..dbaebe9 --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/controller/CustomerAppTextController.kt @@ -0,0 +1,22 @@ +package com.aitrainer.api.controller + +import com.aitrainer.api.model.AppText +import com.aitrainer.api.repository.AppTextRepository +import org.slf4j.LoggerFactory +import org.springframework.http.ResponseEntity +import org.springframework.web.bind.annotation.* + +@RestController +@RequestMapping("/api") +class CustomerAppTextController(private val appTextRepository: AppTextRepository) { + private val logger = LoggerFactory.getLogger(javaClass) + + @GetMapping("/app_text") + fun getAppTextWithTranslation(): ResponseEntity> { + val list = appTextRepository.findAllWithTranslation() + + logger.info(" -- Get All app texts $list") + return if (list.isEmpty()) ResponseEntity.notFound().build() else + ResponseEntity.ok().body(list) + } +} \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/controller/OpenAIController.kt b/src/main/kotlin/com/aitrainer/api/controller/OpenAIController.kt index 7cce938..869e3e5 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/OpenAIController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/OpenAIController.kt @@ -50,6 +50,7 @@ class OpenAIController() { var result: String val openAIService = OpenAIService(openaiKey, openai.modelName, openai.temperature) val deferred = GlobalScope.async { + println(openai.messages) openAIService.chatCompletion(openai.messages) } runBlocking { diff --git a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt index ae951ba..a862add 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt @@ -66,13 +66,17 @@ class PackageController(private val exerciseAbilityRepository: ExerciseAbilityRe val listDietSensitivity = dietSensitivityRepository.findAll() val listDietSensitivityJson = gson.toJson(listDietSensitivity) + val listAppText = appTextRepository.findAllWithTranslation() + val listAppTextJson = gson.toJson(listAppText) + val packageJson: String = getClassRecord(Property::class.simpleName, listPropertyJson) + "|||" + getClassRecord(Membership::class.simpleName, listMembershipJson) + "|||" + getClassRecord(Store::class.simpleName, listStoreJson) + "|||" + getClassRecord(Recipe::class.simpleName, listRecipeJson) + "|||" + getClassRecord(Meal::class.simpleName, listRawMaterialJson) + - "|||" + getClassRecord(DietSensitivity::class.simpleName, listDietSensitivityJson) + "|||" + getClassRecord(DietSensitivity::class.simpleName, listDietSensitivityJson) + + "|||" + getClassRecord(AppText::class.simpleName, listAppTextJson) return if (packageJson.isEmpty()) ResponseEntity.notFound().build() else ResponseEntity.ok().body(packageJson) diff --git a/src/main/kotlin/com/aitrainer/api/controller/diet/DietController.kt b/src/main/kotlin/com/aitrainer/api/controller/diet/DietController.kt index 05d0a65..de532a0 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/diet/DietController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/diet/DietController.kt @@ -2,6 +2,7 @@ package com.aitrainer.api.controller.diet import com.aitrainer.api.model.diet.Diet import com.aitrainer.api.repository.diet.DietRepository +import org.slf4j.LoggerFactory import org.springframework.http.ResponseEntity import org.springframework.web.bind.annotation.* import java.util.* @@ -9,6 +10,7 @@ import java.util.* @RestController @RequestMapping("/api") class DietController(private val dietRepository: DietRepository) { + private val logger = LoggerFactory.getLogger(javaClass) @PostMapping("/diet") fun insert(@RequestBody diet: Diet): ResponseEntity<*> { @@ -32,9 +34,26 @@ class DietController(private val dietRepository: DietRepository) { return ResponseEntity.ok().body(dietRepository.save(updatedDiet)) } + @PostMapping("/diet/no_text/{id}") + fun updateNoText(@PathVariable(value = "id") id: Long, @RequestBody diet: Diet): ResponseEntity { + val existingDiet = dietRepository.findByDietId(id) ?: return ResponseEntity.notFound().build() + + val updatedDiet: Diet = existingDiet.copy( + dietId = diet.dietId, + dietUserId = diet.dietUserId, + startDate = diet.startDate + ) + diet.meals.forEach { + it.diet = diet + updatedDiet.meals.add(it) + } + return ResponseEntity.ok().body(dietRepository.save(updatedDiet)) + } + @GetMapping("/diet/{dietUserId}") fun getByDietUserId(@PathVariable dietUserId: Long): ResponseEntity> { val list = dietRepository.findByDietUserId(dietUserId) + return if (list.isEmpty()) ResponseEntity.notFound().build() else ResponseEntity.ok().body(list) } diff --git a/src/main/kotlin/com/aitrainer/api/model/diet/Diet.kt b/src/main/kotlin/com/aitrainer/api/model/diet/Diet.kt index 69fcc47..56512e6 100644 --- a/src/main/kotlin/com/aitrainer/api/model/diet/Diet.kt +++ b/src/main/kotlin/com/aitrainer/api/model/diet/Diet.kt @@ -11,7 +11,7 @@ data class Diet ( @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @Expose val dietId: Long = 0, @Expose @get: NotNull val dietUserId: Long = 0, @Expose @get: NotNull val dietText: String = "", - @Expose @get: NotNull val startDate: String = "", + @Expose @get: NotNull var startDate: String = "", ) { @OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER, mappedBy = "diet") @Fetch(value = FetchMode.SUBSELECT) diff --git a/src/main/kotlin/com/aitrainer/api/model/diet/DietMeal.kt b/src/main/kotlin/com/aitrainer/api/model/diet/DietMeal.kt index 5567424..d091650 100644 --- a/src/main/kotlin/com/aitrainer/api/model/diet/DietMeal.kt +++ b/src/main/kotlin/com/aitrainer/api/model/diet/DietMeal.kt @@ -4,6 +4,7 @@ import com.fasterxml.jackson.annotation.JsonIgnore import com.google.gson.annotations.Expose import jakarta.persistence.* import org.jetbrains.annotations.NotNull +import org.springframework.lang.NonNull @Entity data class DietMeal ( @@ -11,8 +12,9 @@ data class DietMeal ( @Expose @get: NotNull val mealId: Long = 0, @Expose @get: NotNull val mealName: String = "", @Expose @get: NotNull val meal: String = "", - @Expose @get: NotNull val quantity: Double = 0.0, + @Expose @get: NotNull var quantity: Double = 0.0, @Expose @get: NotNull val quantityUnit: String = "", + @Expose @get: NonNull var mealDate: String = "", ) { @ManyToOne(fetch = FetchType.EAGER, optional = false) @JoinColumn(name = "dietId", nullable = false) diff --git a/src/main/kotlin/com/aitrainer/api/repository/AppTextRepository.kt b/src/main/kotlin/com/aitrainer/api/repository/AppTextRepository.kt index d764e10..6a6ee92 100644 --- a/src/main/kotlin/com/aitrainer/api/repository/AppTextRepository.kt +++ b/src/main/kotlin/com/aitrainer/api/repository/AppTextRepository.kt @@ -2,8 +2,12 @@ package com.aitrainer.api.repository import com.aitrainer.api.model.AppText import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.data.jpa.repository.Query import org.springframework.stereotype.Repository @Repository interface AppTextRepository: JpaRepository { + @Query("FROM AppText as e " + + "LEFT JOIN AppTextTranslation as t ON e.textId = t.appText AND t.languageCode = 'hu' ") + fun findAllWithTranslation(): List } \ No newline at end of file diff --git a/src/main/resources/application-diet.properties b/src/main/resources/application-diet.properties index e039315..b28635d 100644 --- a/src/main/resources/application-diet.properties +++ b/src/main/resources/application-diet.properties @@ -16,7 +16,7 @@ logging.config=classpath:logback-spring.xml logging.file=logs # if the database structure has been changed, increment this version number -application.version=1.2.0 +application.version=1.2.1 jwt.secret=aitrainer diff --git a/src/main/resources/application-dietprod.properties b/src/main/resources/application-dietprod.properties index e314ebc..477278a 100644 --- a/src/main/resources/application-dietprod.properties +++ b/src/main/resources/application-dietprod.properties @@ -14,7 +14,7 @@ logging.config=classpath:logback-spring.xml logging.file=logs # if the database structue has been changed, increment this version number -application.version=1.2.0 +application.version=1.2.1 jwt.secret=aitrainer diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 136f313..32c5791 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -14,7 +14,7 @@ logging.config=classpath:logback-spring.xml logging.file=logs # if the database structue has been changed, increment this version number -application.version=1.2.0 +application.version=1.2.1 jwt.secret=aitrainer diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 8dcd6d6..cae4e88 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,7 +17,7 @@ logging.config=classpath:logback-spring.xml logging.file=logs # if the database structure has been changed, increment this version number -application.version=1.2.0 +application.version=1.2.1 jwt.secret=aitrainer diff --git a/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt b/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt index 41000c6..dbca57d 100644 --- a/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt @@ -111,6 +111,7 @@ class AppPackageTest { val packages = dietPackageJson.split("|||").toTypedArray() + var appText = false packages.forEach { val record = it.split("***") if (record[0] == Membership::class.simpleName) { @@ -155,8 +156,20 @@ class AppPackageTest { assertTrue(list.isNotEmpty()) assertEquals(list[0].name, "Nut Allergy") assertEquals(list[1].name, "Penicillin sensitivity") + } else if ( record[0] == AppText::class.simpleName) { + val appTextJson: String = record[1] + val type = object : TypeToken?>() {}.type + val list: List = gson.fromJson(appTextJson, type) + assertTrue(list.isNotEmpty()) + assertEquals(list[0].textKey, "monday") + assertEquals(list[1].translations[0].translation, "kedd") + assertEquals(list[6].textKey, "sunday") + appText = true + } } + + assertEquals(appText, true) } @Test diff --git a/src/test/kotlin/com/aitrainer/api/test/diet/DietTest.kt b/src/test/kotlin/com/aitrainer/api/test/diet/DietTest.kt index e02417b..ad45e09 100644 --- a/src/test/kotlin/com/aitrainer/api/test/diet/DietTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/diet/DietTest.kt @@ -72,20 +72,23 @@ class DietTest { mealName = "monday|breakfast", meal = "Főtt tojás", quantity = 2.0, - mealId = 0 + mealId = 0, + mealDate = "2023-03-07 08:00:00" ) val meal2 = DietMeal( mealName = "monday|lunch", meal = "Disznópörkölt", quantity = 120.0, - mealId = 0 + mealId = 0, + mealDate = "2023-03-07 12:00:00" ) val meal3 = DietMeal( mealName = "monday|lunch", meal = "Savanyúkáposzta", quantity = 2.0, quantityUnit = "tányér", - mealId = 3 + mealId = 3, + mealDate = "2023-03-07 12:00:00" ) newDiet.meals.add(meal) @@ -103,12 +106,27 @@ class DietTest { .andExpect(jsonPath("$.dietUserId").value(1)) .andExpect(jsonPath("$.meals[0].meal").value("Főtt tojás")) .andExpect(jsonPath("$.meals[0].quantity").value(2.0)) + .andExpect(jsonPath("$.meals[0].mealDate").value("2023-03-07 08:00:00")) .andExpect(jsonPath("$.meals[1].mealName").value("monday|lunch")) .andExpect(jsonPath("$.meals[2].meal").value("Savanyúkáposzta")) .andExpect(jsonPath("$.meals[2].quantity").value(2.0)) .andExpect(jsonPath("$.meals[2].mealId").value(3)) .andExpect(jsonPath("$.meals[2].quantityUnit").value("tányér")) + // update no_text + + newDiet.startDate = "2023-03-20" + newDiet.meals[0].quantity = 102.0 + mockMvc.perform( + MockMvcRequestBuilders.post("/api/diet/no_text/${newDiet.dietId}") + .contentType(MediaType.APPLICATION_JSON) + .header("Authorization", "Bearer $authToken") + .content(toJson(newDiet)) + ) + .andExpect(status().isOk) + .andExpect(jsonPath("$.startDate").value("2023-03-20")) + .andExpect(jsonPath("$.meals[0].quantity").value(102.0)) + .andExpect(jsonPath("$.dietText").value("Test diet text")) }