|
|
|
package controller
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"gofaster/internal/auth/model"
|
|
|
|
"gofaster/internal/auth/service"
|
|
|
|
"gofaster/internal/shared/response"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
type RoleController struct {
|
|
|
|
roleService *service.RoleService
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewRoleController(roleService *service.RoleService) *RoleController {
|
|
|
|
return &RoleController{
|
|
|
|
roleService: roleService,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreateRole 创建角色
|
|
|
|
// @Summary 创建角色
|
|
|
|
// @Description 创建新的角色
|
|
|
|
// @Tags 角色管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param role body model.Role true "角色信息"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Role} "创建成功"
|
|
|
|
// @Failure 400 {object} response.Response "请求参数错误"
|
|
|
|
// @Failure 500 {object} response.Response "服务器内部错误"
|
|
|
|
// @Security BearerAuth
|
|
|
|
// @Router /auth/roles [post]
|
|
|
|
func (c *RoleController) CreateRole(ctx *gin.Context) {
|
|
|
|
var role model.Role
|
|
|
|
if err := ctx.ShouldBindJSON(&role); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.roleService.CreateRole(ctx.Request.Context(), &role); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "创建角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "角色创建成功", role)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdateRole 更新角色
|
|
|
|
// @Summary 更新角色
|
|
|
|
// @Description 根据ID更新角色信息
|
|
|
|
// @Tags 角色管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param id path int true "角色ID"
|
|
|
|
// @Param role body model.Role true "角色信息"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Role} "更新成功"
|
|
|
|
// @Failure 400 {object} response.Response "请求参数错误"
|
|
|
|
// @Failure 500 {object} response.Response "服务器内部错误"
|
|
|
|
// @Security BearerAuth
|
|
|
|
// @Router /auth/roles/{id} [put]
|
|
|
|
func (c *RoleController) UpdateRole(ctx *gin.Context) {
|
|
|
|
idStr := ctx.Param("id")
|
|
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var role model.Role
|
|
|
|
if err := ctx.ShouldBindJSON(&role); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
role.ID = uint(id)
|
|
|
|
|
|
|
|
if err := c.roleService.UpdateRole(ctx.Request.Context(), &role); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "更新角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "角色更新成功", role)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeleteRole 删除角色
|
|
|
|
// @Summary 删除角色
|
|
|
|
// @Description 根据ID删除角色
|
|
|
|
// @Tags 角色管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param id path int true "角色ID"
|
|
|
|
// @Success 200 {object} response.Response "删除成功"
|
|
|
|
// @Failure 400 {object} response.Response "请求参数错误"
|
|
|
|
// @Failure 500 {object} response.Response "服务器内部错误"
|
|
|
|
// @Security BearerAuth
|
|
|
|
// @Router /auth/roles/{id} [delete]
|
|
|
|
func (c *RoleController) DeleteRole(ctx *gin.Context) {
|
|
|
|
idStr := ctx.Param("id")
|
|
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.roleService.DeleteRole(ctx.Request.Context(), uint(id)); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "删除角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "角色删除成功", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetRole 获取角色详情
|
|
|
|
// @Summary 获取角色详情
|
|
|
|
// @Description 根据ID获取角色详细信息
|
|
|
|
// @Tags 角色管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param id path int true "角色ID"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Role} "获取成功"
|
|
|
|
// @Failure 400 {object} response.Response "请求参数错误"
|
|
|
|
// @Failure 404 {object} response.Response "角色不存在"
|
|
|
|
// @Security BearerAuth
|
|
|
|
// @Router /auth/roles/{id} [get]
|
|
|
|
func (c *RoleController) GetRole(ctx *gin.Context) {
|
|
|
|
idStr := ctx.Param("id")
|
|
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
role, err := c.roleService.GetRole(ctx.Request.Context(), uint(id))
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusNotFound, "角色不存在", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取角色成功", role)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListRoles 获取角色列表
|
|
|
|
// @Summary 获取角色列表
|
|
|
|
// @Description 分页获取角色列表
|
|
|
|
// @Tags 角色管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param page query int false "页码" default(1)
|
|
|
|
// @Param pageSize query int false "每页数量" default(10)
|
|
|
|
// @Success 200 {object} response.Response{data=object{data=[]model.Role,page=int,size=int,total=int}} "获取成功"
|
|
|
|
// @Failure 500 {object} response.Response "服务器内部错误"
|
|
|
|
// @Security BearerAuth
|
|
|
|
// @Router /auth/roles [get]
|
|
|
|
func (c *RoleController) ListRoles(ctx *gin.Context) {
|
|
|
|
pageStr := ctx.DefaultQuery("page", "1")
|
|
|
|
pageSizeStr := ctx.DefaultQuery("pageSize", "10")
|
|
|
|
|
|
|
|
page, err := strconv.Atoi(pageStr)
|
|
|
|
if err != nil || page < 1 {
|
|
|
|
page = 1
|
|
|
|
}
|
|
|
|
|
|
|
|
pageSize, err := strconv.Atoi(pageSizeStr)
|
|
|
|
if err != nil || pageSize < 1 || pageSize > 100 {
|
|
|
|
pageSize = 10
|
|
|
|
}
|
|
|
|
|
|
|
|
roles, total, err := c.roleService.ListRoles(ctx.Request.Context(), page, pageSize)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "获取角色列表失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取角色列表成功", gin.H{
|
|
|
|
"data": roles,
|
|
|
|
"page": page,
|
|
|
|
"size": pageSize,
|
|
|
|
"total": total,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// AssignRolesToUser 为用户分配角色
|
|
|
|
func (c *RoleController) AssignRolesToUser(ctx *gin.Context) {
|
|
|
|
userIDStr := ctx.Param("userId")
|
|
|
|
userID, err := strconv.ParseUint(userIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var request struct {
|
|
|
|
RoleIDs []uint `json:"role_ids" binding:"required"`
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.roleService.AssignRolesToUser(ctx.Request.Context(), uint(userID), request.RoleIDs); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "分配角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "角色分配成功", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetUserRoles 获取用户的角色列表
|
|
|
|
func (c *RoleController) GetUserRoles(ctx *gin.Context) {
|
|
|
|
userIDStr := ctx.Param("userId")
|
|
|
|
userID, err := strconv.ParseUint(userIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
roles, err := c.roleService.GetUserRoles(ctx.Request.Context(), uint(userID))
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "获取用户角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取用户角色成功", roles)
|
|
|
|
}
|
|
|
|
|
|
|
|
// RemoveRolesFromUser 从用户移除角色
|
|
|
|
func (c *RoleController) RemoveRolesFromUser(ctx *gin.Context) {
|
|
|
|
userIDStr := ctx.Param("userId")
|
|
|
|
userID, err := strconv.ParseUint(userIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的用户ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var request struct {
|
|
|
|
RoleIDs []uint `json:"role_ids" binding:"required"`
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.roleService.RemoveRolesFromUser(ctx.Request.Context(), uint(userID), request.RoleIDs); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "移除角色失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "角色移除成功", nil)
|
|
|
|
}
|