You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
 
 
 
 
 
 

236 lines
7.2 KiB

package controller
import (
"net/http"
"strconv"
"gofaster/internal/auth/model"
"gofaster/internal/auth/repository"
"gofaster/internal/auth/service"
"gofaster/internal/shared/response"
"github.com/gin-gonic/gin"
)
type ResourceController struct {
resourceService *service.ResourceService
routeMappingRepo *repository.RouteMappingRepository
}
func NewResourceController(resourceService *service.ResourceService, routeMappingRepo *repository.RouteMappingRepository) *ResourceController {
return &ResourceController{
resourceService: resourceService,
routeMappingRepo: routeMappingRepo,
}
}
// CreateResource 创建资源
func (c *ResourceController) CreateResource(ctx *gin.Context) {
var resource model.Resource
if err := ctx.ShouldBindJSON(&resource); err != nil {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
return
}
if err := c.resourceService.CreateResource(ctx.Request.Context(), &resource); err != nil {
response.Error(ctx, http.StatusInternalServerError, "创建资源失败", err.Error())
return
}
response.Success(ctx, "资源创建成功", resource)
}
// UpdateResource 更新资源
func (c *ResourceController) UpdateResource(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 resource model.Resource
if err := ctx.ShouldBindJSON(&resource); err != nil {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", err.Error())
return
}
resource.ID = uint(id)
if err := c.resourceService.UpdateResource(ctx.Request.Context(), &resource); err != nil {
response.Error(ctx, http.StatusInternalServerError, "更新资源失败", err.Error())
return
}
response.Success(ctx, "资源更新成功", resource)
}
// DeleteResource 删除资源
func (c *ResourceController) DeleteResource(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.resourceService.DeleteResource(ctx.Request.Context(), uint(id)); err != nil {
response.Error(ctx, http.StatusInternalServerError, "删除资源失败", err.Error())
return
}
response.Success(ctx, "资源删除成功", nil)
}
// GetResource 获取资源详情
func (c *ResourceController) GetResource(ctx *gin.Context) {
idStr := ctx.Param("id")
id, err := strconv.ParseUint(idStr, 10, 32)
if err != nil {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "无效的资源ID")
return
}
resource, err := c.resourceService.GetResource(ctx.Request.Context(), uint(id))
if err != nil {
response.Error(ctx, http.StatusNotFound, "资源不存在", err.Error())
return
}
response.Success(ctx, "获取资源成功", resource)
}
// ListResources 获取资源列表
func (c *ResourceController) ListResources(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
}
resources, total, err := c.resourceService.ListResources(ctx.Request.Context(), page, pageSize)
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取资源列表失败", err.Error())
return
}
response.Success(ctx, "获取资源列表成功", gin.H{
"data": resources,
"page": page,
"size": pageSize,
"total": total,
})
}
// GetResourceTree 获取资源树
func (c *ResourceController) GetResourceTree(ctx *gin.Context) {
resources, err := c.resourceService.GetResourceTree(ctx.Request.Context())
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取资源树失败", err.Error())
return
}
response.Success(ctx, "获取资源树成功", resources)
}
// SyncResources 同步资源
func (c *ResourceController) SyncResources(ctx *gin.Context) {
if err := c.resourceService.SyncResourcesFromRoutes(ctx.Request.Context()); err != nil {
response.Error(ctx, http.StatusInternalServerError, "同步资源失败", err.Error())
return
}
response.Success(ctx, "资源同步成功", nil)
}
// ListResourcesByModule 根据模块获取资源列表
func (c *ResourceController) ListResourcesByModule(ctx *gin.Context) {
module := ctx.Param("module")
if module == "" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "模块名称不能为空")
return
}
resources, err := c.resourceService.ListResourcesByModule(ctx.Request.Context(), module)
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取模块资源失败", err.Error())
return
}
response.Success(ctx, "获取模块资源成功", resources)
}
// ListResourcesByType 根据类型获取资源列表
func (c *ResourceController) ListResourcesByType(ctx *gin.Context) {
resourceType := ctx.Param("type")
if resourceType == "" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "资源类型不能为空")
return
}
resources, err := c.resourceService.ListResourcesByType(ctx.Request.Context(), resourceType)
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取类型资源失败", err.Error())
return
}
response.Success(ctx, "获取类型资源成功", resources)
}
// GetAuthGroupStats 获取权限分组统计
// @Summary 获取权限分组统计
// @Description 获取路由映射的权限分组统计信息
// @Tags 资源管理
// @Accept json
// @Produce json
// @Success 200 {object} response.Response{data=map[string]int}
// @Failure 400 {object} response.Response
// @Router /api/resources/auth-group-stats [get]
func (c *ResourceController) GetAuthGroupStats(ctx *gin.Context) {
stats, err := c.routeMappingRepo.GetAuthGroupStats()
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取权限分组统计失败", err.Error())
return
}
response.Success(ctx, "获取权限分组统计成功", stats)
}
// ListRoutesByAuthGroup 根据权限分组获取路由列表
// @Summary 根据权限分组获取路由列表
// @Description 根据权限分组获取路由映射列表
// @Tags 资源管理
// @Accept json
// @Produce json
// @Param authGroup path string true "权限分组" Enums(Read, Edit)
// @Success 200 {object} response.Response{data=[]model.RouteMapping}
// @Failure 400 {object} response.Response
// @Router /api/resources/auth-group/{authGroup}/routes [get]
func (c *ResourceController) ListRoutesByAuthGroup(ctx *gin.Context) {
authGroup := ctx.Param("authGroup")
if authGroup == "" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "权限分组不能为空")
return
}
// 验证权限分组值
if authGroup != "Read" && authGroup != "Edit" {
response.Error(ctx, http.StatusBadRequest, "请求参数错误", "权限分组只能是Read或Edit")
return
}
routes, err := c.routeMappingRepo.FindByAuthGroup(authGroup)
if err != nil {
response.Error(ctx, http.StatusInternalServerError, "获取权限分组路由失败", err.Error())
return
}
response.Success(ctx, "获取权限分组路由成功", routes)
}