|
|
|
package controller
|
|
|
|
|
|
|
|
import (
|
|
|
|
"net/http"
|
|
|
|
"strconv"
|
|
|
|
|
|
|
|
"gofaster/internal/auth/model"
|
|
|
|
"gofaster/internal/auth/service"
|
|
|
|
"gofaster/internal/shared/response"
|
|
|
|
|
|
|
|
"github.com/gin-gonic/gin"
|
|
|
|
)
|
|
|
|
|
|
|
|
type PermissionController struct {
|
|
|
|
permissionService *service.PermissionService
|
|
|
|
}
|
|
|
|
|
|
|
|
func NewPermissionController(permissionService *service.PermissionService) *PermissionController {
|
|
|
|
return &PermissionController{
|
|
|
|
permissionService: permissionService,
|
|
|
|
}
|
|
|
|
}
|
|
|
|
|
|
|
|
// CreatePermission 创建权限
|
|
|
|
// @Summary 创建权限
|
|
|
|
// @Description 创建新的权限记录
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param permission body model.Permission true "权限信息"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Permission}
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions [post]
|
|
|
|
func (c *PermissionController) CreatePermission(ctx *gin.Context) {
|
|
|
|
var permission model.Permission
|
|
|
|
if err := ctx.ShouldBindJSON(&permission); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.permissionService.CreatePermission(ctx.Request.Context(), &permission); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "创建权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "权限创建成功", permission)
|
|
|
|
}
|
|
|
|
|
|
|
|
// UpdatePermission 更新权限
|
|
|
|
// @Summary 更新权限
|
|
|
|
// @Description 更新指定ID的权限信息
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param id path int true "权限ID"
|
|
|
|
// @Param permission body model.Permission true "权限信息"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Permission}
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/{id} [put]
|
|
|
|
func (c *PermissionController) UpdatePermission(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 permission model.Permission
|
|
|
|
if err := ctx.ShouldBindJSON(&permission); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
permission.ID = uint(id)
|
|
|
|
|
|
|
|
if err := c.permissionService.UpdatePermission(ctx.Request.Context(), &permission); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "更新权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "权限更新成功", permission)
|
|
|
|
}
|
|
|
|
|
|
|
|
// DeletePermission 删除权限
|
|
|
|
// @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
|
|
|
|
// @Router /api/auth/permissions/{id} [delete]
|
|
|
|
func (c *PermissionController) DeletePermission(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.permissionService.DeletePermission(ctx.Request.Context(), uint(id)); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "删除权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "权限删除成功", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetPermission 获取权限详情
|
|
|
|
// @Summary 获取权限详情
|
|
|
|
// @Description 根据ID获取权限的详细信息
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param id path int true "权限ID"
|
|
|
|
// @Success 200 {object} response.Response{data=model.Permission}
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 404 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/{id} [get]
|
|
|
|
func (c *PermissionController) GetPermission(ctx *gin.Context) {
|
|
|
|
idStr := ctx.Param("id")
|
|
|
|
id, err := strconv.ParseUint(idStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的权限ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
permission, err := c.permissionService.GetPermission(ctx.Request.Context(), uint(id))
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusNotFound, "权限不存在", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取权限成功", permission)
|
|
|
|
}
|
|
|
|
|
|
|
|
// ListPermissions 获取权限列表
|
|
|
|
// @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}
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions [get]
|
|
|
|
func (c *PermissionController) ListPermissions(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
|
|
|
|
}
|
|
|
|
|
|
|
|
permissions, total, err := c.permissionService.ListPermissions(ctx.Request.Context(), page, pageSize)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "获取权限列表失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取权限列表成功", gin.H{
|
|
|
|
"data": permissions,
|
|
|
|
"page": page,
|
|
|
|
"size": pageSize,
|
|
|
|
"total": total,
|
|
|
|
})
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetPermissionsByResource 根据资源获取权限列表
|
|
|
|
// @Summary 根据资源获取权限列表
|
|
|
|
// @Description 根据资源名称获取相关的权限列表
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param resource path string true "资源名称"
|
|
|
|
// @Success 200 {object} response.Response{data=[]model.Permission}
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/resource/{resource} [get]
|
|
|
|
func (c *PermissionController) GetPermissionsByResource(ctx *gin.Context) {
|
|
|
|
resource := ctx.Param("resource")
|
|
|
|
if resource == "" {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "资源名称不能为空")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
permissions, err := c.permissionService.GetPermissionsByResource(ctx.Request.Context(), resource)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "获取资源权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取资源权限成功", permissions)
|
|
|
|
}
|
|
|
|
|
|
|
|
// AssignPermissionsToRole 为角色分配权限
|
|
|
|
// @Summary 为角色分配权限
|
|
|
|
// @Description 为指定角色分配多个权限
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param roleId path int true "角色ID"
|
|
|
|
// @Param request body object{permission_ids=[]int} true "权限ID列表"
|
|
|
|
// @Success 200 {object} response.Response
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/roles/{roleId}/assign [post]
|
|
|
|
func (c *PermissionController) AssignPermissionsToRole(ctx *gin.Context) {
|
|
|
|
roleIDStr := ctx.Param("roleId")
|
|
|
|
roleID, err := strconv.ParseUint(roleIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var request struct {
|
|
|
|
PermissionIDs []uint `json:"permission_ids" binding:"required"`
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.permissionService.AssignPermissionsToRole(ctx.Request.Context(), uint(roleID), request.PermissionIDs); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "分配权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "权限分配成功", nil)
|
|
|
|
}
|
|
|
|
|
|
|
|
// GetRolePermissions 获取角色的权限列表
|
|
|
|
// @Summary 获取角色的权限列表
|
|
|
|
// @Description 获取指定角色拥有的所有权限列表
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param roleId path int true "角色ID"
|
|
|
|
// @Success 200 {object} response.Response{data=[]model.Permission}
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/roles/{roleId} [get]
|
|
|
|
func (c *PermissionController) GetRolePermissions(ctx *gin.Context) {
|
|
|
|
roleIDStr := ctx.Param("roleId")
|
|
|
|
roleID, err := strconv.ParseUint(roleIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
permissions, err := c.permissionService.GetRolePermissions(ctx.Request.Context(), uint(roleID))
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "获取角色权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "获取角色权限成功", permissions)
|
|
|
|
}
|
|
|
|
|
|
|
|
// RemovePermissionsFromRole 从角色移除权限
|
|
|
|
// @Summary 从角色移除权限
|
|
|
|
// @Description 从指定角色中移除多个权限
|
|
|
|
// @Tags 权限管理
|
|
|
|
// @Accept json
|
|
|
|
// @Produce json
|
|
|
|
// @Param roleId path int true "角色ID"
|
|
|
|
// @Param request body object{permission_ids=[]int} true "权限ID列表"
|
|
|
|
// @Success 200 {object} response.Response
|
|
|
|
// @Failure 400 {object} response.Response
|
|
|
|
// @Failure 500 {object} response.Response
|
|
|
|
// @Router /api/auth/permissions/roles/{roleId}/remove [delete]
|
|
|
|
func (c *PermissionController) RemovePermissionsFromRole(ctx *gin.Context) {
|
|
|
|
roleIDStr := ctx.Param("roleId")
|
|
|
|
roleID, err := strconv.ParseUint(roleIDStr, 10, 32)
|
|
|
|
if err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的角色ID")
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
var request struct {
|
|
|
|
PermissionIDs []uint `json:"permission_ids" binding:"required"`
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := ctx.ShouldBindJSON(&request); err != nil {
|
|
|
|
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
if err := c.permissionService.RemovePermissionsFromRole(ctx.Request.Context(), uint(roleID), request.PermissionIDs); err != nil {
|
|
|
|
response.Error(ctx, http.StatusInternalServerError, "移除权限失败", err.Error())
|
|
|
|
return
|
|
|
|
}
|
|
|
|
|
|
|
|
response.Success(ctx, "权限移除成功", nil)
|
|
|
|
}
|