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 )