65 lines
2.3 KiB
Kotlin
65 lines
2.3 KiB
Kotlin
package com.android.trisolarisserver.controller
|
|
|
|
import com.android.trisolarisserver.controller.dto.PropertyUserResponse
|
|
import com.android.trisolarisserver.controller.dto.UserResponse
|
|
import com.android.trisolarisserver.repo.AppUserRepo
|
|
import com.android.trisolarisserver.repo.PropertyUserRepo
|
|
import com.android.trisolarisserver.security.MyPrincipal
|
|
import org.springframework.security.core.annotation.AuthenticationPrincipal
|
|
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
|
|
import org.springframework.web.server.ResponseStatusException
|
|
import org.springframework.http.HttpStatus
|
|
|
|
@RestController
|
|
@RequestMapping("/auth")
|
|
class Auth(
|
|
private val appUserRepo: AppUserRepo,
|
|
private val propertyUserRepo: PropertyUserRepo
|
|
) {
|
|
|
|
@PostMapping("/verify")
|
|
fun verify(@AuthenticationPrincipal principal: MyPrincipal?): AuthResponse {
|
|
return buildAuthResponse(principal)
|
|
}
|
|
|
|
@GetMapping("/me")
|
|
fun me(@AuthenticationPrincipal principal: MyPrincipal?): AuthResponse {
|
|
return buildAuthResponse(principal)
|
|
}
|
|
|
|
private fun buildAuthResponse(principal: MyPrincipal?): AuthResponse {
|
|
if (principal == null) {
|
|
throw ResponseStatusException(HttpStatus.UNAUTHORIZED, "Missing principal")
|
|
}
|
|
val user = appUserRepo.findById(principal.userId).orElseThrow {
|
|
ResponseStatusException(HttpStatus.UNAUTHORIZED, "User not found")
|
|
}
|
|
val memberships = propertyUserRepo.findByIdUserId(principal.userId).map {
|
|
PropertyUserResponse(
|
|
userId = it.id.userId!!,
|
|
propertyId = it.id.propertyId!!,
|
|
roles = it.roles.map { role -> role.name }.toSet()
|
|
)
|
|
}
|
|
return AuthResponse(
|
|
user = UserResponse(
|
|
id = user.id!!,
|
|
orgId = user.org.id!!,
|
|
firebaseUid = user.firebaseUid,
|
|
phoneE164 = user.phoneE164,
|
|
name = user.name,
|
|
disabled = user.disabled
|
|
),
|
|
properties = memberships
|
|
)
|
|
}
|
|
}
|
|
|
|
data class AuthResponse(
|
|
val user: UserResponse,
|
|
val properties: List<PropertyUserResponse>
|
|
)
|