package controller import ( "net/http" "strconv" "ezops/model" "github.com/gin-gonic/gin" "gorm.io/gorm" ) // ItemRoleHandler Item Role handler (Jenkins-style regex pipeline matching) type ItemRoleHandler struct { db *gorm.DB } // NewItemRoleHandler creates a new ItemRoleHandler func NewItemRoleHandler(db *gorm.DB) *ItemRoleHandler { return &ItemRoleHandler{db: db} } // ListItemRoles GET /admin/item-roles func (h *ItemRoleHandler) ListItemRoles(c *gin.Context) { var roles []model.ItemRole h.db.Order("created_at DESC").Find(&roles) c.JSON(http.StatusOK, model.Response{ Code: 200, Data: model.ListResponse{List: roles, Total: int64(len(roles))}, }) } // CreateItemRole POST /admin/item-roles func (h *ItemRoleHandler) CreateItemRole(c *gin.Context) { var req model.CreateItemRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) return } // 唯一性校验 var existing model.ItemRole if err := h.db.Where("name = ? OR code = ?", req.Name, req.Code).First(&existing).Error; err == nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "Item Role 名称或编码已存在"}) return } role := model.ItemRole{ Name: req.Name, Code: req.Code, Pattern: req.Pattern, Role: req.Role, Description: req.Description, Status: 1, } if err := h.db.Create(&role).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "创建失败"}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "创建成功", Data: role}) } // UpdateItemRole PUT /admin/item-roles/:id func (h *ItemRoleHandler) UpdateItemRole(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的 ID"}) return } var req model.UpdateItemRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) return } var role model.ItemRole if err := h.db.First(&role, id).Error; err != nil { c.JSON(http.StatusNotFound, model.Response{Code: 404, Message: "Item Role 不存在"}) return } updates := map[string]interface{}{} if req.Name != "" { updates["name"] = req.Name } if req.Code != "" { updates["code"] = req.Code } if req.Pattern != "" { updates["pattern"] = req.Pattern } if req.Role != "" { updates["role"] = req.Role } if req.Description != "" { updates["description"] = req.Description } if req.Status != nil { updates["status"] = *req.Status } if len(updates) > 0 { if err := h.db.Model(&role).Updates(updates).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "更新失败"}) return } } h.db.First(&role, id) c.JSON(http.StatusOK, model.Response{Code: 200, Message: "更新成功", Data: role}) } // DeleteItemRole DELETE /admin/item-roles/:id func (h *ItemRoleHandler) DeleteItemRole(c *gin.Context) { id, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的 ID"}) return } // Clean up user associations first h.db.Where("item_role_id = ?", id).Delete(&model.UserItemRole{}) if err := h.db.Delete(&model.ItemRole{}, id).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "删除失败"}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "删除成功"}) } // ListUserItemRoles GET /admin/users/:id/item-roles func (h *ItemRoleHandler) ListUserItemRoles(c *gin.Context) { userID, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的用户 ID"}) return } var assignments []model.UserItemRole h.db.Preload("ItemRole").Where("user_id = ?", userID).Find(&assignments) c.JSON(http.StatusOK, model.Response{ Code: 200, Data: model.ListResponse{List: assignments, Total: int64(len(assignments))}, }) } // AssignItemRole POST /admin/users/:id/item-roles func (h *ItemRoleHandler) AssignItemRole(c *gin.Context) { userID, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的用户 ID"}) return } var req model.AssignItemRoleRequest if err := c.ShouldBindJSON(&req); err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "请求参数错误: " + err.Error()}) return } // Check if already assigned var existing model.UserItemRole if err := h.db.Where("user_id = ? AND item_role_id = ?", userID, req.ItemRoleID).First(&existing).Error; err == nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "该用户已拥有此 Item Role"}) return } assignment := model.UserItemRole{ UserID: uint(userID), ItemRoleID: req.ItemRoleID, } if err := h.db.Create(&assignment).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "分配失败"}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "分配成功", Data: assignment}) } // RemoveItemRole DELETE /admin/users/:id/item-roles/:roleId func (h *ItemRoleHandler) RemoveItemRole(c *gin.Context) { userID, err := strconv.Atoi(c.Param("id")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的用户 ID"}) return } roleID, err := strconv.Atoi(c.Param("roleId")) if err != nil { c.JSON(http.StatusBadRequest, model.Response{Code: 400, Message: "无效的 Role ID"}) return } if err := h.db.Where("user_id = ? AND item_role_id = ?", uint(userID), roleID).Delete(&model.UserItemRole{}).Error; err != nil { c.JSON(http.StatusInternalServerError, model.Response{Code: 500, Message: "移除失败"}) return } c.JSON(http.StatusOK, model.Response{Code: 200, Message: "移除成功"}) }