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
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) |
|
}
|
|
|