package contact import ( "errors" "net/http" "os" "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"` ExpectedVersion int `json:"expectedVersion" binding:"required"` } type validationInput struct { Status string `json:"status"` Detail string `json:"detail"` } func (h Handler) service() (Service, error) { key, err := ParseChannelKey(os.Getenv("BELL_CONTACT_CHANNEL_KEY")) return NewService(h.Orm, key), err } func (h Handler) List(c *gin.Context) { var q PageQuery h.MakeContext(c).MakeOrm().Bind(&q, binding.Form) if h.Errors != nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } items, count, err := NewService(h.Orm, nil).List(c.Request.Context(), q) if err != nil { h.Error(500, errors.New("读取联系人失败"), "读取联系人失败") return } p, s := pageValues(q.PageIndex, q.PageSize) h.PageOK(items, int(count), p, s, "查询成功") } func (h Handler) Create(c *gin.Context) { if !admin(c) { h.MakeContext(c).Error(403, errors.New("仅管理员可维护联系人"), "仅管理员可维护联系人") return } var input WriteInput h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON) if h.Errors != nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } item, err := NewService(h.Orm, nil).Create(c.Request.Context(), input, user.GetUserId(c)) h.result(item, err) } func (h Handler) Update(c *gin.Context) { if !admin(c) { h.MakeContext(c).Error(403, errors.New("仅管理员可维护联系人"), "仅管理员可维护联系人") return } var input WriteInput h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON) if h.Errors != nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } item, err := NewService(h.Orm, nil).Update(c.Request.Context(), c.Param("id"), input, user.GetUserId(c)) h.result(item, err) } func (h Handler) SetEnabled(c *gin.Context) { if !admin(c) { h.MakeContext(c).Error(403, errors.New("仅管理员可维护联系人"), "仅管理员可维护联系人") return } var input enabledInput h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON) if h.Errors != nil || input.Enabled == nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } item, err := NewService(h.Orm, nil).SetEnabled(c.Request.Context(), c.Param("id"), *input.Enabled, input.ExpectedVersion, user.GetUserId(c)) h.result(item, err) } func (h Handler) AddChannel(c *gin.Context) { if !admin(c) { h.MakeContext(c).Error(403, errors.New("仅管理员可维护通道"), "仅管理员可维护通道") return } if err := restoreChannelBody(c); err != nil { h.MakeContext(c).Error(http.StatusBadRequest, ErrInvalid, ErrInvalid.Error()) return } var input ChannelInput h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON) if h.Errors != nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } service, keyErr := h.service() if keyErr != nil { h.Error(503, keyErr, keyErr.Error()) return } item, err := service.AddChannel(c.Request.Context(), c.Param("id"), input, user.GetUserId(c)) h.result(item, err) } func (h Handler) ValidateChannel(c *gin.Context) { if !admin(c) { h.MakeContext(c).Error(403, errors.New("仅管理员可验证通道"), "仅管理员可验证通道") return } var input validationInput h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON) if h.Errors != nil { h.Error(400, ErrInvalid, ErrInvalid.Error()) return } item, err := NewService(h.Orm, nil).RecordValidation(c.Request.Context(), c.Param("id"), input.Status, input.Detail, user.GetUserId(c)) h.result(item, err) } func (h Handler) result(item any, err error) { switch { case err == nil: h.OK(item, "保存成功") case errors.Is(err, ErrInvalid): h.Error(400, err, err.Error()) case errors.Is(err, ErrNotFound): h.Error(404, err, err.Error()) case errors.Is(err, ErrConflict): h.Error(409, err, err.Error()) case errors.Is(err, ErrChannelKeyUnavailable): h.Error(503, err, err.Error()) default: h.Logger.Errorf("write Bell contact failed: %v", err) h.Error(409, errors.New("联系人保存失败"), "联系人保存失败") } } func admin(c *gin.Context) bool { claims := jwt.ExtractClaims(c) role, _ := claims[jwt.RoleKey].(string) return role == "admin" } var _ = http.StatusOK