From bd468c9135491472a593acb87b0dc126477ab0e5 Mon Sep 17 00:00:00 2001 From: Bossanyi Tibor Date: Tue, 4 May 2021 07:52:55 +0200 Subject: [PATCH] API 1.0.36 description table --- build.gradle.kts | 2 +- data/db/install.sql | 25 ++++++++++++++++ data/db/update_1_0_36.sql | 30 +++++++++++++++++++ .../api/controller/PackageController.kt | 9 ++++-- .../com/aitrainer/api/model/Description.kt | 22 ++++++++++++++ .../api/model/DescriptionTranslation.kt | 18 +++++++++++ .../api/repository/DescriptionRepository.kt | 9 ++++++ .../resources/application-prod.properties | 2 +- src/main/resources/application.properties | 2 +- .../com/aitrainer/api/test/AppPackageTest.kt | 26 +++++++++++----- 10 files changed, 132 insertions(+), 13 deletions(-) create mode 100644 data/db/update_1_0_36.sql create mode 100644 src/main/kotlin/com/aitrainer/api/model/Description.kt create mode 100644 src/main/kotlin/com/aitrainer/api/model/DescriptionTranslation.kt create mode 100644 src/main/kotlin/com/aitrainer/api/repository/DescriptionRepository.kt diff --git a/build.gradle.kts b/build.gradle.kts index ea910ab..9436950 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -11,7 +11,7 @@ plugins { } group = "com.aitrainer" -version = "1.0.35" +version = "1.0.36" java.sourceCompatibility = JavaVersion.VERSION_1_8 repositories { diff --git a/data/db/install.sql b/data/db/install.sql index 68abd64..d2d3d4e 100644 --- a/data/db/install.sql +++ b/data/db/install.sql @@ -383,6 +383,31 @@ CREATE TABLE IF NOT EXISTS `django_admin_log` ( CONSTRAINT `django_admin_log_user_id_c564eba6_fk_auth_user_id` FOREIGN KEY (`user_id`) REFERENCES `auth_user` (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=127 DEFAULT CHARSET=utf8 COLLATE=utf8_hungarian_ci; +CREATE TABLE `description` ( + `description_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` CHAR(50) NOT NULL COLLATE 'utf8_hungarian_ci', + `description` TEXT NOT NULL COLLATE 'utf8_hungarian_ci', + `version` INT(3) NULL DEFAULT '0', + `valid_from` DATETIME NULL DEFAULT NULL, + `valid_to` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`description_id`) USING BTREE, + INDEX `name` (`name`) USING BTREE +) +COLLATE='utf8_hungarian_ci' +ENGINE=InnoDB +; + +CREATE TABLE `description_translation` ( + `translation_id` INT(13) NOT NULL AUTO_INCREMENT, + `description_id` INT(11) NOT NULL, + `language_code` CHAR(2) NOT NULL DEFAULT 'en' COLLATE 'utf8mb4_general_ci', + `description_translation` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', + PRIMARY KEY (`translation_id`) USING BTREE +) +COLLATE='utf8mb4_general_ci' +ENGINE=InnoDB +; + -- Tábla adatainak mentése aitrainer2.django_admin_log: ~118 rows (hozzávetőleg) /*!40000 ALTER TABLE `django_admin_log` DISABLE KEYS */; REPLACE INTO `django_admin_log` (`id`, `action_time`, `object_id`, `object_repr`, `action_flag`, `change_message`, `content_type_id`, `user_id`) VALUES diff --git a/data/db/update_1_0_36.sql b/data/db/update_1_0_36.sql new file mode 100644 index 0000000..8535d19 --- /dev/null +++ b/data/db/update_1_0_36.sql @@ -0,0 +1,30 @@ +START TRANSACTION; + +CREATE TABLE `description` ( + `description_id` INT(11) NOT NULL AUTO_INCREMENT, + `name` CHAR(50) NOT NULL COLLATE 'utf8_hungarian_ci', + `description` TEXT NOT NULL COLLATE 'utf8_hungarian_ci', + `version` INT(3) NULL DEFAULT '0', + `valid_from` DATETIME NULL DEFAULT NULL, + `valid_to` DATETIME NULL DEFAULT NULL, + PRIMARY KEY (`description_id`) USING BTREE, + INDEX `name` (`name`) USING BTREE +) +COLLATE='utf8_hungarian_ci' +ENGINE=InnoDB +; + +CREATE TABLE `description_translation` ( + `translation_id` INT(13) NOT NULL AUTO_INCREMENT, + `description_id` INT(11) NOT NULL, + `language_code` CHAR(2) NOT NULL DEFAULT 'en' COLLATE 'utf8mb4_general_ci', + `description_translation` TEXT NULL DEFAULT NULL COLLATE 'utf8mb4_general_ci', + PRIMARY KEY (`translation_id`) USING BTREE +) +COLLATE='utf8mb4_general_ci' +ENGINE=InnoDB +; + +UPDATE configuration set config_value = "1.0.36", date_change=CURRENT_DATE WHERE config_key = "db_version"; + +COMMIT; diff --git a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt index cf36fb1..d4668cc 100644 --- a/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt +++ b/src/main/kotlin/com/aitrainer/api/controller/PackageController.kt @@ -22,7 +22,8 @@ class PackageController(private val exerciseAbilityRepository: ExerciseAbilityRe private val exercisePlanTemplateRepository: ExercisePlanTemplateRepository, private val evaluationRepository: EvaluationRepository, private val sportRepository: SportRepository, - private val tutorialRepository: TutorialRepository + private val tutorialRepository: TutorialRepository, + private val descriptionRepository: DescriptionRepository ) { private val logger = LoggerFactory.getLogger(javaClass) @@ -67,6 +68,9 @@ class PackageController(private val exerciseAbilityRepository: ExerciseAbilityRe val listTutorials = tutorialRepository.findAll() val listTutorialJson: String = gson.toJson(listTutorials) + val listDescriptions = descriptionRepository.findAll() + val listDescriptionJson: String = gson.toJson(listDescriptions) + val packageJson: String = getClassRecord(ExerciseDevice::class.simpleName, listDevicesJson) + "|||" + getClassRecord(Product::class.simpleName, listProductsJson) + @@ -78,7 +82,8 @@ class PackageController(private val exerciseAbilityRepository: ExerciseAbilityRe "|||" + getClassRecord(ExercisePlanTemplate::class.simpleName, listPlanTemplateJson) + "|||" + getClassRecord(Evaluation::class.simpleName, listEvaluationJson) + "|||" + getClassRecord(Sport::class.simpleName, listSportsJson) + - "|||" + getClassRecord(Tutorial::class.simpleName, listTutorialJson) + "|||" + getClassRecord(Tutorial::class.simpleName, listTutorialJson) + + "|||" + getClassRecord(Description::class.simpleName, listDescriptionJson) return if (packageJson.isEmpty()) ResponseEntity.notFound().build() else ResponseEntity.ok().body(packageJson) diff --git a/src/main/kotlin/com/aitrainer/api/model/Description.kt b/src/main/kotlin/com/aitrainer/api/model/Description.kt new file mode 100644 index 0000000..0356f7e --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/model/Description.kt @@ -0,0 +1,22 @@ +package com.aitrainer.api.model + +import com.google.gson.annotations.Expose +import org.hibernate.annotations.Fetch +import org.hibernate.annotations.FetchMode +import org.springframework.lang.NonNull +import javax.persistence.* + +@Entity +data class Description ( + @Expose @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @get: NonNull var descriptionId: Long = 0, + @Expose @get: NonNull var name: String, + @Expose @get: NonNull var description: String, + @Expose @get: NonNull var version: Int? = null, + @Expose @get: NonNull var validFrom: String? = null, + @Expose @get: NonNull var validTo: String? = null +) { + @OneToMany(cascade = [(CascadeType.ALL)], fetch = FetchType.EAGER, mappedBy = "mainDescription") + @Fetch(value = FetchMode.SUBSELECT) + @Expose val translations: List = mutableListOf().toList() + +} \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/model/DescriptionTranslation.kt b/src/main/kotlin/com/aitrainer/api/model/DescriptionTranslation.kt new file mode 100644 index 0000000..8864430 --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/model/DescriptionTranslation.kt @@ -0,0 +1,18 @@ +package com.aitrainer.api.model + +import com.fasterxml.jackson.annotation.JsonIgnore +import com.google.gson.annotations.Expose +import org.springframework.lang.NonNull +import javax.persistence.* +import javax.validation.constraints.NotBlank + +@Entity +data class DescriptionTranslation ( + @Expose @Id @GeneratedValue(strategy = GenerationType.IDENTITY) @get: NonNull var translationId: Long = 0, + @Expose @get: NotBlank var languageCode: String? = "hu", + @Expose @get: NonNull var descriptionTranslation: String? = null +) { + @ManyToOne(fetch = FetchType.LAZY, optional = false) + @JoinColumn(name = "descriptionId", nullable = false) + @JsonIgnore val mainDescription: Description? = null +} \ No newline at end of file diff --git a/src/main/kotlin/com/aitrainer/api/repository/DescriptionRepository.kt b/src/main/kotlin/com/aitrainer/api/repository/DescriptionRepository.kt new file mode 100644 index 0000000..016a056 --- /dev/null +++ b/src/main/kotlin/com/aitrainer/api/repository/DescriptionRepository.kt @@ -0,0 +1,9 @@ +package com.aitrainer.api.repository + +import com.aitrainer.api.model.Description +import org.springframework.data.jpa.repository.JpaRepository +import org.springframework.stereotype.Repository + +@Repository +interface DescriptionRepository: JpaRepository { +} \ No newline at end of file diff --git a/src/main/resources/application-prod.properties b/src/main/resources/application-prod.properties index 2a68045..39bb83c 100644 --- a/src/main/resources/application-prod.properties +++ b/src/main/resources/application-prod.properties @@ -17,6 +17,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.35 +application.version=1.0.36 jwt.secret=aitrainer \ No newline at end of file diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index 57eeed2..1e7f922 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -17,6 +17,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.35 +application.version=1.0.36 jwt.secret=aitrainer \ No newline at end of file diff --git a/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt b/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt index b16d03a..f09fc92 100644 --- a/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt +++ b/src/test/kotlin/com/aitrainer/api/test/AppPackageTest.kt @@ -39,6 +39,8 @@ class AppPackageTest { private lateinit var sportRepository: SportRepository @Autowired private lateinit var tutorialRepository: TutorialRepository + @Autowired + private lateinit var descriptionRepository: DescriptionRepository @Test fun testAppPackage() { @@ -55,7 +57,8 @@ class AppPackageTest { exercisePlanTemplateRepository, evaluationRepository, sportRepository, - tutorialRepository + tutorialRepository, + descriptionRepository ) val response: ResponseEntity<*> = controller.getPackageData() @@ -68,7 +71,7 @@ class AppPackageTest { packages.forEach { val record = it.split("***") print(record[0] + "\n") - if ( record[0] == ExerciseType::class.simpleName) { + if (record[0] == ExerciseType::class.simpleName) { //print("List ExerciseType: " + record[1]) val exerciseTypeJson: String = record[1] val type = object : TypeToken?>() {}.type @@ -128,20 +131,27 @@ class AppPackageTest { assertEquals(sports[2].name, "Footgolf") assertEquals(sports[2].translations[0].sportName, "Footgolf") assertEquals(sports[3].translations[0].sportName, "Tenisz") - } else if (record[0] == Tutorial::class.simpleName) { - print("List Tutorial: " + record[1]) + } else if (record[0] == Tutorial::class.simpleName) { val tutorialJson: String = record[1] val type = object : TypeToken?>() {}.type val tutorials: List = gson.fromJson(tutorialJson, type) assertEquals(tutorials.size, 2) assertEquals(tutorials[0].name, "Basic") assertEquals(tutorials[0].steps.size, 9) - assertEquals(tutorials[0].steps[2].condition, "{\"direction\":\"down\",\"top\":95,\"left\":-1,\"show_bubble\":false,\"bubble_x\":220,\"bubble_y\":220,\"bubble_width\":440,\"bubble_height\":440,\"show_check_text\":false,\"parent\":2}") + assertEquals( + tutorials[0].steps[2].condition, + "{\"direction\":\"down\",\"top\":95,\"left\":-1,\"show_bubble\":false,\"bubble_x\":220,\"bubble_y\":220,\"bubble_width\":440,\"bubble_height\":440,\"show_check_text\":false,\"parent\":2}" + ) assertEquals(tutorials[0].steps[0].translations.size, 1) + } else if (record[0] == Description::class.simpleName) { + val descriptionJson: String = record[1] + val type = object : TypeToken?>() {}.type + val descriptions: List = gson.fromJson(descriptionJson, type) + assertEquals(descriptions.size, 2) + assertEquals(descriptions[0].translations.size, 1) + assertEquals(descriptions[0].name, "sales_page") } } - - - } + } \ No newline at end of file