From ffeea821f3ea1161353f0e2b48cd9810c78d4ac8 Mon Sep 17 00:00:00 2001
From: Jan-Niclas Struewer <j.n.struewer@gmail.com>
Date: Thu, 21 Nov 2024 19:50:09 +0100
Subject: [PATCH] fix: changed lock type to optimistic and added necessary
 version database field to all entities

---
 .../kotlin/de/fraunhofer/iem/app/kpi/entity/KPIEntity.kt   | 2 ++
 .../iem/app/repository/entity/RepositoryEntity.kt          | 2 ++
 .../iem/app/repository/repository/RepositoryRepository.kt  | 7 +++----
 .../kotlin/de/fraunhofer/iem/app/tool/entity/ToolEntity.kt | 2 ++
 .../fraunhofer/iem/app/tool/repository/ToolRepository.kt   | 2 +-
 .../de/fraunhofer/iem/app/toolRun/entity/LanguageEntity.kt | 2 ++
 .../de/fraunhofer/iem/app/toolRun/entity/ToolRunEntity.kt  | 2 ++
 .../iem/app/toolRun/repository/ToolRunRepository.kt        | 2 +-
 8 files changed, 15 insertions(+), 6 deletions(-)

diff --git a/src/main/kotlin/de/fraunhofer/iem/app/kpi/entity/KPIEntity.kt b/src/main/kotlin/de/fraunhofer/iem/app/kpi/entity/KPIEntity.kt
index d109539e..afe10328 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/kpi/entity/KPIEntity.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/kpi/entity/KPIEntity.kt
@@ -25,6 +25,8 @@ class KPIEntity(
     @CurrentTimestamp(event = [EventType.INSERT])
     @Column(name = "timestamp")
     var createdAt: Timestamp? = null,
+    // Add a version field for optimistic locking
+    @Version @Column(name = "version", nullable = false) var version: Long? = null,
 ) {
     fun toRawValueKpi(): RawValueKpi? {
         return try {
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/repository/entity/RepositoryEntity.kt b/src/main/kotlin/de/fraunhofer/iem/app/repository/entity/RepositoryEntity.kt
index bedaefde..de6f3b4a 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/repository/entity/RepositoryEntity.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/repository/entity/RepositoryEntity.kt
@@ -26,6 +26,8 @@ class RepositoryEntity(
     var visualizationConsent: Boolean = false,
     @CurrentTimestamp(event = [EventType.INSERT]) var createdAt: Instant? = null,
     @UpdateTimestamp var lastUpdatedAt: Instant? = null,
+    // Add a version field for optimistic locking
+    @Version @Column(name = "version", nullable = false) var version: Long? = null,
 ) {
     fun getLastToolRun(): ToolRunEntity {
         return toolRuns.first()
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/repository/repository/RepositoryRepository.kt b/src/main/kotlin/de/fraunhofer/iem/app/repository/repository/RepositoryRepository.kt
index c151eaf1..e4a61bed 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/repository/repository/RepositoryRepository.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/repository/repository/RepositoryRepository.kt
@@ -13,11 +13,10 @@ import org.springframework.transaction.annotation.Transactional
 @Transactional(propagation = MANDATORY)
 interface RepositoryRepository : JpaRepository<RepositoryEntity, UUID> {
 
-    @Lock(LockModeType.PESSIMISTIC_READ) fun findByProjectId(projectId: Long): RepositoryEntity?
+    @Lock(LockModeType.OPTIMISTIC) fun findByProjectId(projectId: Long): RepositoryEntity?
 
-    @Lock(LockModeType.PESSIMISTIC_READ)
-    fun findByVisualizationConsentTrue(): List<RepositoryEntity>
+    @Lock(LockModeType.OPTIMISTIC) fun findByVisualizationConsentTrue(): List<RepositoryEntity>
 
-    @Lock(LockModeType.PESSIMISTIC_READ)
+    @Lock(LockModeType.OPTIMISTIC)
     fun findByProjectIdAndVisualizationConsentTrue(projectId: Long): RepositoryEntity?
 }
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/tool/entity/ToolEntity.kt b/src/main/kotlin/de/fraunhofer/iem/app/tool/entity/ToolEntity.kt
index 426224a6..113c6230 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/tool/entity/ToolEntity.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/tool/entity/ToolEntity.kt
@@ -15,6 +15,8 @@ class ToolEntity(
     var id: UUID? = null,
     @Column(name = "name", length = 500, nullable = false) val name: String,
     @Enumerated(EnumType.STRING) val toolType: ToolType,
+    // Add a version field for optimistic locking
+    @Version @Column(name = "version", nullable = false) var version: Long? = null,
 ) {
 
     fun toDto(): ToolDto {
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/tool/repository/ToolRepository.kt b/src/main/kotlin/de/fraunhofer/iem/app/tool/repository/ToolRepository.kt
index 57310a20..bace0fd3 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/tool/repository/ToolRepository.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/tool/repository/ToolRepository.kt
@@ -13,5 +13,5 @@ import org.springframework.transaction.annotation.Transactional
 @Transactional(propagation = MANDATORY)
 interface ToolRepository : JpaRepository<ToolEntity, UUID> {
 
-    @Lock(LockModeType.PESSIMISTIC_READ) fun findByNameIgnoreCase(name: String?): ToolEntity?
+    @Lock(LockModeType.OPTIMISTIC) fun findByNameIgnoreCase(name: String?): ToolEntity?
 }
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/LanguageEntity.kt b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/LanguageEntity.kt
index cdd3c028..7c77aa17 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/LanguageEntity.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/LanguageEntity.kt
@@ -13,4 +13,6 @@ class LanguageEntity(
     @Column(name = "name") val name: String,
     @Column(name = "percentage") val percentage: Float,
     @ManyToOne @JoinColumn(name = "tool_run_entity_id") val toolRunEntity: ToolRunEntity,
+    // Add a version field for optimistic locking
+    @Version @Column(name = "version", nullable = false) var version: Long? = null,
 )
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/ToolRunEntity.kt b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/ToolRunEntity.kt
index 37578620..ad0db8af 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/ToolRunEntity.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/entity/ToolRunEntity.kt
@@ -31,4 +31,6 @@ class ToolRunEntity(
     val languageEntities: MutableSet<LanguageEntity> = mutableSetOf(),
     @CurrentTimestamp(event = [EventType.INSERT]) var createdAt: Instant? = null,
     @UpdateTimestamp var lastUpdatedAt: Instant? = null,
+    // Add a version field for optimistic locking
+    @Version @Column(name = "version", nullable = false) var version: Long? = null,
 )
diff --git a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/repository/ToolRunRepository.kt b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/repository/ToolRunRepository.kt
index 46e79386..276a6096 100644
--- a/src/main/kotlin/de/fraunhofer/iem/app/toolRun/repository/ToolRunRepository.kt
+++ b/src/main/kotlin/de/fraunhofer/iem/app/toolRun/repository/ToolRunRepository.kt
@@ -12,6 +12,6 @@ import org.springframework.transaction.annotation.Transactional
 @Repository
 @Transactional(propagation = MANDATORY)
 interface ToolRunRepository : JpaRepository<ToolRunEntity, UUID> {
-    @Lock(LockModeType.PESSIMISTIC_READ)
+    @Lock(LockModeType.OPTIMISTIC)
     fun findFirstByRepository_ProjectIdOrderByCreatedAtDesc(projectId: Long): ToolRunEntity?
 }
-- 
GitLab