UserController.kt
package io.github.lishangbu.avalon.auth.controller
import io.github.lishangbu.avalon.auth.entity.dto.CurrentUserView
import io.github.lishangbu.avalon.auth.entity.dto.SaveUserInput
import io.github.lishangbu.avalon.auth.entity.dto.UpdateUserInput
import io.github.lishangbu.avalon.auth.entity.dto.UserSpecification
import io.github.lishangbu.avalon.auth.entity.dto.UserView
import io.github.lishangbu.avalon.auth.service.UserService
import io.github.lishangbu.avalon.oauth2.common.userdetails.UserInfo
import jakarta.validation.Valid
import org.babyfish.jimmer.Page
import org.springframework.data.domain.Pageable
import org.springframework.security.core.annotation.AuthenticationPrincipal
import org.springframework.web.bind.annotation.*
/**
* 用户控制器
*
* @author lishangbu
* @since 2025/8/30
*/
@RequestMapping("/user")
@RestController
class UserController(
/** 用户服务 */
private val userService: UserService,
) {
/**
* 获取当前用户信息
*
* @param user 当前用户信息
* @return 用户信息
*/
@GetMapping("/info")
fun getUserInfo(
@AuthenticationPrincipal user: UserInfo,
): CurrentUserView? = userService.getUserByUsername(user.username)
/**
* 获取当前用户权限编码列表
*
* 主要供前端做按钮级显隐与禁用控制使用。
*/
@GetMapping("/permissions")
fun getCurrentPermissionCodes(
@AuthenticationPrincipal user: UserInfo,
): List<String> = userService.getCurrentPermissionCodes(user.username)
/**
* 分页条件查询用户
*
* @param pageable 分页参数
* @param user 查询条件
* @return 用户分页结果
*/
@GetMapping("/page")
fun getUserPage(
pageable: Pageable,
@ModelAttribute specification: UserSpecification,
): Page<UserView> = userService.getPageByCondition(specification, pageable)
/**
* 条件查询用户列表
*
* @param user 查询条件
* @return 用户列表
*/
@GetMapping("/list")
fun listUsers(
@ModelAttribute specification: UserSpecification,
): List<UserView> = userService.listByCondition(specification)
/**
* 根据 ID 查询用户
*
* @param id 用户 ID
* @return 用户信息
*/
@GetMapping("/{id:\\d+}")
fun getById(
@PathVariable id: Long,
): UserView? = userService.getById(id)
/**
* 新增用户
*
* @param input 用户写入请求
* @return 保存后的用户
*/
@PostMapping
fun save(
@RequestBody @Valid input: SaveUserInput,
): UserView = userService.save(input)
/**
* 更新用户
*
* @param input 用户写入请求
* @return 更新后的用户
*/
@PutMapping
fun update(
@RequestBody @Valid input: UpdateUserInput,
): UserView = userService.update(input)
/**
* 根据 ID 删除用户
*
* @param id 用户 ID
*/
@DeleteMapping("/{id:\\d+}")
fun deleteById(
@PathVariable id: Long,
) {
userService.removeById(id)
}
}