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": ""}) 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": ""}) } 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} }