feat: Implement transaction management for user addition and removal in HibernateUserManager

This commit is contained in:
2026-01-20 16:14:32 +01:00
parent fbb3f48b6d
commit 45dec00b86
3 changed files with 21 additions and 3 deletions

View File

@@ -18,7 +18,9 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
private val logger = Logger(getClass.getName) private val logger = Logger(getClass.getName)
override def addUser(name: String, password: String): Boolean = { override def addUser(name: String, password: String): Boolean = {
val tx = em.getTransaction
try { try {
tx.begin()
// Check if user already exists // Check if user already exists
val existing = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity]) val existing = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity])
.setParameter("username", name) .setParameter("username", name)
@@ -26,6 +28,7 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
if (!existing.isEmpty) { if (!existing.isEmpty) {
logger.warn(s"User $name already exists") logger.warn(s"User $name already exists")
tx.rollback()
return false return false
} }
@@ -39,10 +42,12 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
em.persist(userEntity) em.persist(userEntity)
em.flush() em.flush()
tx.commit()
true true
} catch { } catch {
case e: Exception => { case e: Exception => {
if (tx.isActive) tx.rollback()
logger.error(s"Error adding user $name", e) logger.error(s"Error adding user $name", e)
false false
} }
@@ -50,7 +55,9 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
} }
override def addOpenIDUser(name: String, userInfo: OpenIDUserInfo): Boolean = { override def addOpenIDUser(name: String, userInfo: OpenIDUserInfo): Boolean = {
val tx = em.getTransaction
try { try {
tx.begin()
// Check if user already exists // Check if user already exists
val existing = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity]) val existing = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity])
.setParameter("username", name) .setParameter("username", name)
@@ -58,6 +65,7 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
if (!existing.isEmpty) { if (!existing.isEmpty) {
logger.warn(s"User $name already exists") logger.warn(s"User $name already exists")
tx.rollback()
return false return false
} }
@@ -72,6 +80,7 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
if (!existingOpenID.isEmpty) { if (!existingOpenID.isEmpty) {
logger.warn(s"OpenID user ${userInfo.provider}_${userInfo.id} already exists") logger.warn(s"OpenID user ${userInfo.provider}_${userInfo.id} already exists")
tx.rollback()
return false return false
} }
@@ -80,9 +89,11 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
em.persist(userEntity) em.persist(userEntity)
em.flush() em.flush()
tx.commit()
true true
} catch { } catch {
case e: Exception => { case e: Exception => {
if (tx.isActive) tx.rollback()
logger.error(s"Error adding OpenID user ${userInfo.provider}_${userInfo.id}", e) logger.error(s"Error adding OpenID user ${userInfo.provider}_${userInfo.id}", e)
false false
} }
@@ -167,20 +178,27 @@ class HibernateUserManager @Inject()(em: EntityManager, config: Config) extends
} }
override def removeUser(name: String): Boolean = { override def removeUser(name: String): Boolean = {
val tx = em.getTransaction
try { try {
tx.begin()
val users = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity]) val users = em.createQuery("SELECT u FROM UserEntity u WHERE u.username = :username", classOf[UserEntity])
.setParameter("username", name) .setParameter("username", name)
.getResultList .getResultList
if (users.isEmpty) { if (users.isEmpty) {
tx.rollback()
false false
} else { } else {
em.remove(users.get(0)) em.remove(users.get(0))
em.flush() em.flush()
tx.commit()
true true
} }
} catch { } catch {
case _: Exception => false case _: Exception => {
if (tx.isActive) tx.rollback()
false
}
} }
} }
} }

View File

@@ -23,7 +23,7 @@ openid {
clientId = ${?DISCORD_CLIENT_ID} clientId = ${?DISCORD_CLIENT_ID}
clientSecret = ${?DISCORD_CLIENT_SECRET} clientSecret = ${?DISCORD_CLIENT_SECRET}
redirectUri = ${?DISCORD_REDIRECT_URI} redirectUri = ${?DISCORD_REDIRECT_URI}
redirectUri = "https://knockout.janis-eccarius.de/auth/discord/callback" redirectUri = "https://knockout.janis-eccarius.de/api/auth/discord/callback"
} }
keycloak { keycloak {

View File

@@ -20,7 +20,7 @@ openid {
clientId = ${?DISCORD_CLIENT_ID} clientId = ${?DISCORD_CLIENT_ID}
clientSecret = ${?DISCORD_CLIENT_SECRET} clientSecret = ${?DISCORD_CLIENT_SECRET}
redirectUri = ${?DISCORD_REDIRECT_URI} redirectUri = ${?DISCORD_REDIRECT_URI}
redirectUri = "https://st.knockout.janis-eccarius.de/auth/discord/callback" redirectUri = "https://st.knockout.janis-eccarius.de/api/auth/discord/callback"
} }
keycloak { keycloak {