147 lines
4.4 KiB
Go
147 lines
4.4 KiB
Go
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
|