Files
gremiumhub/legalconsenthub-backend/src/main/kotlin/com/betriebsratkanzlei/legalconsenthub/user/UserService.kt

80 lines
2.6 KiB
Kotlin

package com.betriebsratkanzlei.legalconsenthub.user
import com.betriebsratkanzlei.legalconsenthub.error.UserAlreadyExistsException
import com.betriebsratkanzlei.legalconsenthub.error.UserNotFoundException
import com.betriebsratkanzlei.legalconsenthub.security.CustomJwtTokenPrincipal
import com.betriebsratkanzlei.legalconsenthub_api.model.UserDto
import jakarta.transaction.Transactional
import org.springframework.security.core.context.SecurityContextHolder
import org.springframework.stereotype.Service
@Service
class UserService(
private val userRepository: UserRepository,
private val userMapper: UserMapper,
) {
fun getCurrentUser(): User {
val principal = SecurityContextHolder.getContext().authentication.principal as CustomJwtTokenPrincipal
val userId = principal.id ?: throw IllegalStateException("User ID not found")
return userRepository
.findById(userId)
.orElseThrow { UserNotFoundException(userId) }
}
@Transactional
fun createUpdateUserFromJwt(userDto: UserDto): User {
val existingUser = userRepository.findById(userDto.keycloakId)
if (existingUser.isEmpty) {
return createUser(userDto)
} else {
val user = existingUser.get()
if (user.organizationId == null && userDto.organizationId != null) {
user.organizationId = userDto.organizationId
}
return updateUser(userMapper.toUserDto(user))
}
}
fun createUser(userDto: UserDto): User {
if (userRepository.existsById(userDto.keycloakId)) {
throw UserAlreadyExistsException(userDto.keycloakId)
}
val user =
User(
keycloakId = userDto.keycloakId,
name = userDto.name,
organizationId = userDto.organizationId,
)
return userRepository.save(user)
}
fun getUserById(userId: String): User =
userRepository
.findById(userId)
.orElseThrow { UserNotFoundException(userId) }
@Transactional
fun updateUser(userDto: UserDto): User {
val user =
userRepository
.findById(userDto.keycloakId)
.orElseThrow { UserNotFoundException(userDto.keycloakId) }
user.name = userDto.name
// Only update organization if it's not already set
if (user.organizationId == null && userDto.organizationId != null) {
user.organizationId = userDto.organizationId
}
return userRepository.save(user)
}
fun deleteUser(userId: String) {
userRepository.deleteById(userId)
}
}