84 lines
2.7 KiB
Go
84 lines
2.7 KiB
Go
package alert_lifecycle
|
|
|
|
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 }
|
|
|
|
func (h Handler) Get(c *gin.Context) {
|
|
h.MakeContext(c).MakeOrm()
|
|
if h.Errors != nil {
|
|
h.Error(500, errors.New("数据库连接获取失败"), "数据库连接获取失败")
|
|
return
|
|
}
|
|
detail, err := NewService(h.Orm).Get(c.Request.Context(), c.Param("id"))
|
|
if err == nil {
|
|
current := actor(c)
|
|
detail.CanAck = detail.Projection.Status == StatusOpen && (current.Role == "admin" || current.Role == "operator")
|
|
detail.CanClose = detail.Projection.Status == StatusAcknowledged && (current.Role == "admin" || (detail.Projection.AcknowledgedBy != nil && *detail.Projection.AcknowledgedBy == current.ID))
|
|
}
|
|
h.respond(c, Result{Detail: detail}, err)
|
|
}
|
|
|
|
func (h Handler) Ack(c *gin.Context) {
|
|
h.MakeContext(c).MakeOrm()
|
|
if h.Errors != nil {
|
|
h.Error(500, errors.New("数据库连接获取失败"), "数据库连接获取失败")
|
|
return
|
|
}
|
|
result, err := NewService(h.Orm).Ack(c.Request.Context(), c.Param("id"), actor(c))
|
|
h.respond(c, result, err)
|
|
}
|
|
|
|
func (h Handler) Close(c *gin.Context) {
|
|
if err := restoreCloseBody(c); err != nil {
|
|
h.MakeContext(c).Error(http.StatusBadRequest, ErrOutcomeRequired, "请求内容格式不正确")
|
|
return
|
|
}
|
|
var input CloseInput
|
|
h.MakeContext(c).MakeOrm().Bind(&input, binding.JSON)
|
|
if h.Errors != nil {
|
|
h.Error(http.StatusBadRequest, ErrOutcomeRequired, "请求内容格式不正确")
|
|
return
|
|
}
|
|
result, err := NewService(h.Orm).Close(c.Request.Context(), c.Param("id"), input, actor(c))
|
|
h.respond(c, result, err)
|
|
}
|
|
|
|
func (h Handler) respond(c *gin.Context, result Result, err error) {
|
|
if err == nil {
|
|
h.OK(result, "操作成功")
|
|
c.Set("result", gin.H{"code": http.StatusOK, "data": "<redacted>"})
|
|
return
|
|
}
|
|
code := http.StatusInternalServerError
|
|
switch {
|
|
case errors.Is(err, ErrNotFound):
|
|
code = http.StatusNotFound
|
|
case errors.Is(err, ErrOutcomeRequired):
|
|
code = http.StatusBadRequest
|
|
case errors.Is(err, ErrAlreadyHandled), errors.Is(err, ErrInvalidTransition):
|
|
code = http.StatusConflict
|
|
case errors.Is(err, ErrForbidden):
|
|
code = http.StatusForbidden
|
|
default:
|
|
h.Logger.Errorf("Bell alert lifecycle failed: %v", err)
|
|
}
|
|
c.JSON(http.StatusOK, gin.H{"code": code, "msg": err.Error(), "data": result})
|
|
c.Set("result", gin.H{"code": code, "data": "<redacted>"})
|
|
}
|
|
|
|
func actor(c *gin.Context) Actor {
|
|
claims := jwt.ExtractClaims(c)
|
|
role, _ := claims[jwt.RoleKey].(string)
|
|
return Actor{ID: user.GetUserId(c), Name: user.GetUserName(c), Role: role}
|
|
}
|