From 844717e2cea7816b75b4cdfa4318623c8af79fc5 Mon Sep 17 00:00:00 2001 From: Paul-Christian Volkmer Date: Mon, 9 Jun 2025 14:44:18 +0200 Subject: [PATCH] feat: add lab data profiles --- .../onco/grzmetadataprocessor/data/LabData.kt | 7 +- .../data/LabDataProfile.kt | 22 +++ .../web/LabDataController.kt | 27 ++-- .../web/LabDataProfileController.kt | 43 ++++++ .../mariadb/V0_1_0_1__SeqProfiles.sql | 16 +++ src/main/resources/templates/casemenu.html | 9 ++ .../resources/templates/labdataprofiles.html | 126 ++++++++++++++++++ 7 files changed, 241 insertions(+), 9 deletions(-) create mode 100644 src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabDataProfile.kt create mode 100644 src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataProfileController.kt create mode 100644 src/main/resources/db/migrations/mariadb/V0_1_0_1__SeqProfiles.sql create mode 100644 src/main/resources/templates/labdataprofiles.html diff --git a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabData.kt b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabData.kt index d9c03a4..9e4c4fe 100644 --- a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabData.kt +++ b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabData.kt @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.grzmetadataprocessor.data import org.springframework.data.annotation.Id +import org.springframework.data.annotation.Transient import org.springframework.data.relational.core.mapping.Table import org.springframework.data.repository.CrudRepository @@ -15,6 +16,7 @@ data class LabData( val sequenceType: SequenceType? = null, val sequenceSubtype: SequenceSubtype? = null, val fragmentationMethod: FragmentationMethod? = null, + val profile: Long? = null, val libraryType: LibraryType? = null, val libraryPrepKit: String = "", val libraryPrepKitManufacturer: String = "", @@ -30,7 +32,10 @@ data class LabData( val bioinformaticsPipelineName: String = "", val bioinformaticsPipelineVersion: String = "", val referenceGenome: ReferenceGenome? = null, -) +) { + @Transient + var profileData: LabDataProfile? = null +} enum class SampleConservation(val value: String) { FRESH_TISSUE("fresh-tissue"), diff --git a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabDataProfile.kt b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabDataProfile.kt new file mode 100644 index 0000000..01a0c05 --- /dev/null +++ b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/data/LabDataProfile.kt @@ -0,0 +1,22 @@ +package dev.pcvolkmer.onco.grzmetadataprocessor.data + +import org.springframework.data.annotation.Id +import org.springframework.data.relational.core.mapping.Table +import org.springframework.data.repository.CrudRepository + +@Table("tbl_lab_data_profile") +data class LabDataProfile( + @Id val id: Long? = null, + val profileName: String = "", + val libraryType: LibraryType? = null, + val libraryPrepKit: String = "", + val libraryPrepKitManufacturer: String = "", + val sequencerModel: String = "", + val sequencerManufacturer: String = "", + val kitName: String = "", + val kitManufacturer: String = "", + val enrichmentKit: String = "", + val enrichmentKitManufacturer: EnrichmentKitManufacturer? = null +) + +interface LabDataProfileRepository : CrudRepository diff --git a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataController.kt b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataController.kt index 439f6b8..e34add3 100644 --- a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataController.kt +++ b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataController.kt @@ -1,6 +1,7 @@ package dev.pcvolkmer.onco.grzmetadataprocessor.web import dev.pcvolkmer.onco.grzmetadataprocessor.data.LabData +import dev.pcvolkmer.onco.grzmetadataprocessor.data.LabDataProfileRepository import dev.pcvolkmer.onco.grzmetadataprocessor.data.LabDataRepository import org.springframework.stereotype.Controller import org.springframework.ui.Model @@ -9,34 +10,44 @@ import org.springframework.web.bind.annotation.* @Controller @RequestMapping("/donors/{donorId}/labdatas") class LabDataController( - private val repository: LabDataRepository + private val labDataRepository: LabDataRepository, + private val labDataProfileRepository: LabDataProfileRepository ) { @GetMapping fun getAllLabData(@PathVariable donorId: Long, model: Model): String { - model.addAttribute("labdatas", repository.findByDonorId(donorId)) + model.addAttribute("labdatas", allLabDatasByDonorId(donorId)) + model.addAttribute("labdataprofiles", labDataProfileRepository.findAll()) return "labdatas" } @PostMapping fun postLabData(@PathVariable donorId: Long, model: Model): String { - repository.save(LabData(donorId = donorId)) - model.addAttribute("labdatas", repository.findByDonorId(donorId)) + labDataRepository.save(LabData(donorId = donorId)) + model.addAttribute("labdatas", allLabDatasByDonorId(donorId)) + model.addAttribute("labdataprofiles", labDataProfileRepository.findAll()) return "labdatas" } @PutMapping(path = ["{labdataId}"]) fun putLabData(@PathVariable donorId: Long, labData: LabData, model: Model): String { - repository.save(labData) - model.addAttribute("labdatas", repository.findByDonorId(donorId)) + labDataRepository.save(labData) + model.addAttribute("labdatas", allLabDatasByDonorId(donorId)) + model.addAttribute("labdataprofiles", labDataProfileRepository.findAll()) return "labdatas" } @DeleteMapping(path = ["{labdataId}"]) fun deleteLabData(@PathVariable donorId: Long, @PathVariable labdataId: Long, model: Model): String { - repository.deleteById(labdataId) - model.addAttribute("labdatas", repository.findByDonorId(donorId)) + labDataRepository.deleteById(labdataId) + model.addAttribute("labdatas", allLabDatasByDonorId(donorId)) + model.addAttribute("labdataprofiles", labDataProfileRepository.findAll()) return "labdatas" } + private fun allLabDatasByDonorId(donorId: Long): List { + return labDataRepository.findByDonorId(donorId) + .map { it.apply { labDataProfileRepository.findById(this.profile ?: 0).ifPresent { profileData = it } } } + } + } diff --git a/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataProfileController.kt b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataProfileController.kt new file mode 100644 index 0000000..8a13fe3 --- /dev/null +++ b/src/main/kotlin/dev/pcvolkmer/onco/grzmetadataprocessor/web/LabDataProfileController.kt @@ -0,0 +1,43 @@ +package dev.pcvolkmer.onco.grzmetadataprocessor.web + +import dev.pcvolkmer.onco.grzmetadataprocessor.data.LabDataProfile +import dev.pcvolkmer.onco.grzmetadataprocessor.data.LabDataProfileRepository +import org.springframework.stereotype.Controller +import org.springframework.ui.Model +import org.springframework.web.bind.annotation.* + +@Controller +@RequestMapping("/labdataprofiles") +class LabDataProfileController( + private val repository: LabDataProfileRepository +) { + + @GetMapping + fun getAllLabDataProfiles(model: Model): String { + println(repository.findAll().sortedByDescending { it.id }) + model.addAttribute("labdataprofiles", repository.findAll().sortedByDescending { it.id }) + return "labdataprofiles" + } + + @PostMapping + fun postLabDataProfile(model: Model): String { + repository.save(LabDataProfile(profileName = "Neues Sequenzierprofil")) + model.addAttribute("labdataprofiles", repository.findAll().sortedByDescending { it.id }) + return "labdataprofiles" + } + + @PutMapping(path = ["{labdataProfileId}"]) + fun putLabData(@PathVariable labdataProfileId: Long, labDataProfile: LabDataProfile, model: Model): String { + repository.save(labDataProfile) + model.addAttribute("labdataprofiles", repository.findAll().sortedByDescending { it.id }) + return "labdataprofiles" + } + + @DeleteMapping(path = ["{labdataProfileId}"]) + fun deleteLabData(@PathVariable labdataProfileId: Long, model: Model): String { + repository.deleteById(labdataProfileId) + model.addAttribute("labdataprofiles", repository.findAll().sortedByDescending { it.id }) + return "labdataprofiles" + } + +} diff --git a/src/main/resources/db/migrations/mariadb/V0_1_0_1__SeqProfiles.sql b/src/main/resources/db/migrations/mariadb/V0_1_0_1__SeqProfiles.sql new file mode 100644 index 0000000..498c408 --- /dev/null +++ b/src/main/resources/db/migrations/mariadb/V0_1_0_1__SeqProfiles.sql @@ -0,0 +1,16 @@ +CREATE TABLE IF NOT EXISTS tbl_lab_data_profile +( + id int auto_increment primary key, + profile_name varchar(255), + library_type varchar(255), + library_prep_kit varchar(255) not null, + library_prep_kit_manufacturer varchar(255) not null, + sequencer_model varchar(255) not null, + sequencer_manufacturer varchar(255) not null, + kit_name varchar(255) not null, + kit_manufacturer varchar(255) not null, + enrichment_kit varchar(255) not null, + enrichment_kit_manufacturer varchar(255) +); + +ALTER TABLE tbl_lab_data ADD COLUMN profile int; diff --git a/src/main/resources/templates/casemenu.html b/src/main/resources/templates/casemenu.html index 31f0df8..71e75e4 100644 --- a/src/main/resources/templates/casemenu.html +++ b/src/main/resources/templates/casemenu.html @@ -1,6 +1,7 @@
GRZ-Metadaten
diff --git a/src/main/resources/templates/labdataprofiles.html b/src/main/resources/templates/labdataprofiles.html new file mode 100644 index 0000000..eaca9ba --- /dev/null +++ b/src/main/resources/templates/labdataprofiles.html @@ -0,0 +1,126 @@ + + + + + Title + + + + + + +
+
+
+

Probe

+
+
Keine Sequenzierprofile gefunden
+ +
+
+ +
+

+ Sequenzierprofil + "[[ ${ profile.profileName } ]]" +

+ +
+ + +
+ +
+ +
+ +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+ + + +
+ +
+
+ +
+
+ + + +