Files

101 lines
3.1 KiB
Go

package rule
import (
"errors"
"net/http"
"github.com/gin-gonic/gin"
"github.com/gin-gonic/gin/binding"
"github.com/go-admin-team/go-admin-core/sdk/api"
jwt "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth"
"github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user"
)
type Handler struct{ api.Api }
type enabledInput struct {
Enabled *bool `json:"enabled" binding:"required"`
}
func (h Handler) List(c *gin.Context) {
var query PageQuery
h.MakeContext(c).MakeOrm().Bind(&query, binding.Form)
if h.Errors != nil {
h.Error(http.StatusBadRequest, ErrInvalid, "查询条件不正确")
return
}
items, count, err := NewService(h.Orm).List(c.Request.Context(), query)
if err != nil {
h.Logger.Errorf("list Bell rules failed: %v", err)
h.Error(http.StatusInternalServerError, errors.New("读取规则失败"), "读取规则失败")
return
}
page, size := pageValues(query.PageIndex, query.PageSize)
h.PageOK(items, int(count), page, size, "查询成功")
}
func (h Handler) Create(c *gin.Context) {
if !isAdmin(c) {
h.MakeContext(c).Error(http.StatusForbidden, errors.New("仅管理员可修改规则"), "仅管理员可修改规则")
return
}
var input WriteInput
h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON)
if h.Errors != nil {
h.Error(http.StatusBadRequest, ErrInvalid, ErrInvalid.Error())
return
}
item, err := NewService(h.Orm).Create(c.Request.Context(), input, user.GetUserId(c))
h.writeResult(item, err)
}
func (h Handler) Update(c *gin.Context) {
if !isAdmin(c) {
h.MakeContext(c).Error(http.StatusForbidden, errors.New("仅管理员可修改规则"), "仅管理员可修改规则")
return
}
var input WriteInput
h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON)
if h.Errors != nil {
h.Error(http.StatusBadRequest, ErrInvalid, ErrInvalid.Error())
return
}
item, err := NewService(h.Orm).Update(c.Request.Context(), c.Param("id"), input, user.GetUserId(c))
h.writeResult(item, err)
}
func (h Handler) SetEnabled(c *gin.Context) {
if !isAdmin(c) {
h.MakeContext(c).Error(http.StatusForbidden, errors.New("仅管理员可修改规则"), "仅管理员可修改规则")
return
}
var input enabledInput
h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON)
if h.Errors != nil || input.Enabled == nil {
h.Error(http.StatusBadRequest, ErrInvalid, ErrInvalid.Error())
return
}
item, err := NewService(h.Orm).SetEnabled(c.Request.Context(), c.Param("id"), *input.Enabled, user.GetUserId(c))
h.writeResult(item, err)
}
func (h Handler) writeResult(item Rule, err error) {
switch {
case err == nil:
h.OK(item, "保存成功")
case errors.Is(err, ErrInvalid):
h.Error(http.StatusBadRequest, ErrInvalid, ErrInvalid.Error())
case errors.Is(err, ErrNotFound):
h.Error(http.StatusNotFound, ErrNotFound, ErrNotFound.Error())
default:
h.Logger.Errorf("write Bell rule failed: %v", err)
h.Error(http.StatusConflict, errors.New("规则编码已存在或保存失败"), "规则编码已存在或保存失败")
}
}
func isAdmin(c *gin.Context) bool {
claims := jwt.ExtractClaims(c)
role, _ := claims[jwt.RoleKey].(string)
return role == "admin"
}