User & Worker link

This commit is contained in:
Jari 2025-03-11 21:08:05 +01:00
parent 4a1b808b2c
commit 1910f30289
14 changed files with 111 additions and 31 deletions

View File

@ -1,5 +1,5 @@
package org.js.lorca_core.common.enums package org.js.lorca_core.common.enums
enum class EWorkerCategory(name: String) { enum class EWorkerCategory {
FISIO("FISIO") FISIO
} }

View File

@ -3,6 +3,10 @@ package org.js.lorca_core.common.mappers
import org.js.lorca_core.common.models.Worker import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.db.entities.WorkerEntity import org.js.lorca_core.db.entities.WorkerEntity
import org.mapstruct.Mapper import org.mapstruct.Mapper
import org.mapstruct.Mapping
@Mapper(componentModel = "spring") @Mapper(componentModel = "spring")
interface WorkerMapper : GenericMapper<Worker, WorkerEntity> interface WorkerMapper : GenericMapper<Worker, WorkerEntity> {
@Mapping(target = "authUser", ignore = true)
override fun toEntity(model: Worker): WorkerEntity
}

View File

@ -1,8 +1,10 @@
package org.js.lorca_core.common.models package org.js.lorca_core.common.models
import org.js.lorca_core.common.enums.EWorkerCategory
data class Worker( data class Worker(
var id: Long, var id: Long,
var name: String, var name: String,
var surname: String, var surname: String,
val category: WorkerCategory val category: EWorkerCategory
) )

View File

@ -1,5 +1,8 @@
package org.js.lorca_core.common.responses package org.js.lorca_core.common.responses
import org.js.lorca_core.common.models.Worker
data class LoginResponse( data class LoginResponse(
val token: String val token: String,
val userInfo: Worker?
) )

View File

@ -23,7 +23,7 @@ class SecurityConfig(
http http
.authorizeHttpRequests { auth -> .authorizeHttpRequests { auth ->
auth auth
.requestMatchers("/**").permitAll() .requestMatchers("/auth/**").permitAll()
.anyRequest().authenticated() .anyRequest().authenticated()
} }
.sessionManagement { session -> .sessionManagement { session ->

View File

@ -0,0 +1,6 @@
package org.js.lorca_core.db
import org.js.lorca_core.db.entities.ClientEntity
import org.springframework.data.jpa.repository.JpaRepository
interface WorkerCategoryJpa : JpaRepository<ClientEntity, Long>

View File

@ -1,6 +1,7 @@
package org.js.lorca_core.db.entities package org.js.lorca_core.db.entities
import jakarta.persistence.* import jakarta.persistence.*
import org.js.lorca_core.common.enums.EWorkerCategory
@Entity(name = "workers") @Entity(name = "workers")
data class WorkerEntity( data class WorkerEntity(
@ -8,8 +9,7 @@ data class WorkerEntity(
var id: Long = 0L, var id: Long = 0L,
var name: String, var name: String,
var surname: String, var surname: String,
@ManyToOne(fetch = FetchType.LAZY) var category: EWorkerCategory,
val category: WorkerCategoryEntity, @OneToOne
@OneToOne(fetch = FetchType.LAZY) var authUser: UserAuthEntity
val authUser: UserAuthEntity
) )

View File

@ -1,7 +1,10 @@
package org.js.lorca_core.repositories package org.js.lorca_core.repositories
import org.js.lorca_core.common.models.Worker import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.db.entities.UserAuthEntity
interface WorkerRepository { interface WorkerRepository {
fun getByUsername(username: String): Worker? fun getByUsername(username: String): Worker?
fun createForUser(worker: Worker, userAuth: UserAuthEntity): Worker
fun getAll(): MutableList<Worker>
} }

View File

@ -3,6 +3,7 @@ package org.js.lorca_core.repositories.impl
import org.js.lorca_core.common.mappers.WorkerMapper import org.js.lorca_core.common.mappers.WorkerMapper
import org.js.lorca_core.common.models.Worker import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.db.WorkerJpa import org.js.lorca_core.db.WorkerJpa
import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.WorkerRepository import org.js.lorca_core.repositories.WorkerRepository
import org.springframework.stereotype.Component import org.springframework.stereotype.Component
import kotlin.jvm.optionals.getOrNull import kotlin.jvm.optionals.getOrNull
@ -17,4 +18,15 @@ class WorkerRepositoryImpl(
return if (user != null) mapper.toModel(user) else null return if (user != null) mapper.toModel(user) else null
} }
override fun createForUser(worker: Worker, userAuth: UserAuthEntity): Worker {
val w = mapper.toEntity(worker)
w.authUser = userAuth
val ent = jpa.save(w)
return mapper.toModel(ent)
}
override fun getAll(): MutableList<Worker> {
return mapper.toModels(jpa.findAll())
}
} }

View File

@ -0,0 +1,8 @@
package org.js.lorca_core.services
import org.js.lorca_core.common.models.Worker
interface WorkerService {
fun createTestData()
fun getAllWorkers(): List<Worker>
}

View File

@ -6,6 +6,7 @@ import org.js.lorca_core.common.exceptions.LorcaException
import org.js.lorca_core.common.responses.LoginResponse import org.js.lorca_core.common.responses.LoginResponse
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.UserAuthRepository import org.js.lorca_core.repositories.UserAuthRepository
import org.js.lorca_core.repositories.WorkerRepository
import org.js.lorca_core.services.AuthenticationService import org.js.lorca_core.services.AuthenticationService
import org.js.lorca_core.services.JwtService import org.js.lorca_core.services.JwtService
import org.springframework.security.authentication.AuthenticationManager import org.springframework.security.authentication.AuthenticationManager
@ -19,7 +20,8 @@ class AuthenticationServiceImpl(
private val userAuthRepository: UserAuthRepository, private val userAuthRepository: UserAuthRepository,
private val authenticationManager: AuthenticationManager, private val authenticationManager: AuthenticationManager,
private val passwordEncoder: PasswordEncoder, private val passwordEncoder: PasswordEncoder,
private val jwtService: JwtService private val jwtService: JwtService,
private val workerRepository: WorkerRepository
) : AuthenticationService { ) : AuthenticationService {
override fun register(dto: UserAuthDto): Boolean { override fun register(dto: UserAuthDto): Boolean {
@ -39,9 +41,11 @@ class AuthenticationServiceImpl(
) )
) )
val user = userAuthRepository.getByUsername(dto.username) val userAuth = userAuthRepository.getByUsername(dto.username)
var userInfo = workerRepository.getByUsername(dto.username)
return LoginResponse( return LoginResponse(
jwtService.generateToken(user) jwtService.generateToken(userAuth),
userInfo
) )
} }

View File

@ -7,7 +7,6 @@ import io.jsonwebtoken.security.Keys
import org.js.lorca_core.common.enums.EUserRoles import org.js.lorca_core.common.enums.EUserRoles
import org.js.lorca_core.db.entities.UserAuthEntity import org.js.lorca_core.db.entities.UserAuthEntity
import org.js.lorca_core.repositories.UserAuthRepository import org.js.lorca_core.repositories.UserAuthRepository
import org.js.lorca_core.repositories.WorkerRepository
import org.js.lorca_core.services.JwtService import org.js.lorca_core.services.JwtService
import org.springframework.beans.factory.annotation.Value import org.springframework.beans.factory.annotation.Value
import org.springframework.security.core.userdetails.UserDetails import org.springframework.security.core.userdetails.UserDetails
@ -18,8 +17,7 @@ import javax.crypto.SecretKey
@Service @Service
class JwtServiceImpl( class JwtServiceImpl(
private val userAuthRepository: UserAuthRepository, private val userAuthRepository: UserAuthRepository
private val workerRepository: WorkerRepository
) : JwtService { ) : JwtService {
@Value("\${security.jwt.secret-key}") @Value("\${security.jwt.secret-key}")
@ -38,25 +36,12 @@ class JwtServiceImpl(
} }
override fun generateToken(userDetails: UserDetails): String { override fun generateToken(userDetails: UserDetails): String {
val extraClaims: Map<String, Any> = mapOf() val extraClaims: MutableMap<String, Any> = mutableMapOf()
getClaimsForUser(userAuthRepository.getByUsername(userDetails.username)).let { claims -> getClaimsForUser(userAuthRepository.getByUsername(userDetails.username)).let { claims ->
if (claims.isNotEmpty()) { if (claims.isNotEmpty()) {
extraClaims.plus( extraClaims["roles"] = claims
Pair(
"roles",
claims
)
)
} }
} }
workerRepository.getByUsername(userDetails.username)?.let {
extraClaims.plus(
Pair(
"user",
it
)
)
}
return generateToken( return generateToken(
extraClaims, userDetails extraClaims, userDetails

View File

@ -0,0 +1,25 @@
package org.js.lorca_core.services.impl
import org.js.lorca_core.common.enums.EWorkerCategory
import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.repositories.UserAuthRepository
import org.js.lorca_core.repositories.WorkerRepository
import org.js.lorca_core.services.WorkerService
import org.springframework.stereotype.Service
@Service
class WorkerServiceImpl(val repo: WorkerRepository, val authRepository: UserAuthRepository) : WorkerService {
override fun createTestData() {
val worker = Worker(
id = 0,
name = "TestName",
surname = "TestSurname",
category = EWorkerCategory.FISIO
)
repo.createForUser(worker, authRepository.getByUsername("test"))
}
override fun getAllWorkers(): List<Worker> {
return repo.getAll().toList()
}
}

View File

@ -0,0 +1,28 @@
package org.js.lorca_core.web.controllers
import lombok.AllArgsConstructor
import org.js.lorca_core.common.models.Worker
import org.js.lorca_core.services.WorkerService
import org.js.lorca_core.web.advices.WebResponse
import org.springframework.web.bind.annotation.GetMapping
import org.springframework.web.bind.annotation.PostMapping
import org.springframework.web.bind.annotation.RequestMapping
import org.springframework.web.bind.annotation.RestController
@RestController
@RequestMapping("/workers")
@AllArgsConstructor
class WorkerController(
val workerService: WorkerService
) {
@GetMapping
fun getAllWorkers(): WebResponse<List<Worker>> {
return WebResponse.ok(workerService.getAllWorkers())
}
@PostMapping
fun createTestData(): WebResponse<Nothing> {
workerService.createTestData()
return WebResponse.ok()
}
}