package outbox import ( "errors" "net/http" "time" "github.com/gin-gonic/gin" "github.com/gin-gonic/gin/binding" "github.com/go-admin-team/go-admin-core/sdk/api" "github.com/go-admin-team/go-admin-core/sdk/pkg/jwtauth/user" coreService "github.com/go-admin-team/go-admin-core/sdk/service" "git.ilapage.cn/ila/yovision/Sense/server/common" ) type API struct{ api.Api } func (e *API) service(c *gin.Context) (*Service, error) { base := coreService.Service{} if err := e.MakeContext(c).MakeOrm().MakeService(&base).Errors; err != nil { return nil, err } return NewService(base.Orm), nil } func (e *API) List(c *gin.Context) { service, err := e.service(c) if err != nil { e.writeError(err) return } request := PageRequest{} if err = e.MakeContext(c).Bind(&request).Errors; err != nil { e.audit(c, service, "List", auditFailure, "可靠投递查询条件格式不正确") e.Error(http.StatusBadRequest, err, "查询条件格式不正确") return } response, err := service.List(request) if err != nil { e.audit(c, service, "List", auditFailure, "可靠投递列表查询失败") e.writeError(err) return } e.audit(c, service, "List", auditSuccess, "读取可靠投递列表") e.OK(response, "查询成功") } func (e *API) Get(c *gin.Context) { service, err := e.service(c) if err != nil { e.writeError(err) return } response, err := service.Get(c.Param("id")) if err != nil { e.audit(c, service, "Get", auditFailure, "可靠投递详情查询失败") e.writeError(err) return } e.audit(c, service, "Get", auditSuccess, "读取可靠投递详情 "+response.Message.ID) e.OK(response, "查询成功") } func (e *API) Requeue(c *gin.Context) { service, err := e.service(c) if err != nil { e.writeError(err) return } request := RequeueRequest{} if err = e.MakeContext(c).Bind(&request, binding.JSON).Errors; err != nil { e.audit(c, service, "Requeue", auditFailure, "死信重新排队请求格式不正确") e.Error(http.StatusBadRequest, err, "请求格式不正确") return } message, err := service.Requeue(c.Param("id"), request, user.GetUserId(c)) if err != nil { e.audit(c, service, "Requeue", auditFailure, "死信重新排队被拒绝") e.writeError(err) return } e.audit(c, service, "Requeue", auditSuccess, "死信已重新排队 "+message.ID) e.OK(message, "已重新排队") } func (e *API) audit(c *gin.Context, service *Service, action, status, remark string) { if err := WriteAudit(service.Orm, Audit{Action: action, Method: c.Request.Method, Status: status, Username: user.GetUserName(c), UserID: user.GetUserId(c), ClientIP: common.GetClientIP(c), Route: c.FullPath(), Remark: remark, At: time.Now()}); err != nil { api.GetRequestLogger(c).Errorf("outbox audit failed: %s", err.Error()) } } func (e *API) writeError(err error) { switch { case errors.Is(err, ErrInvalidInput): e.Error(http.StatusBadRequest, err, err.Error()) case errors.Is(err, ErrNotFound): e.Error(http.StatusNotFound, err, err.Error()) case errors.Is(err, ErrNotDead), errors.Is(err, ErrVersionConflict): e.Error(http.StatusConflict, err, err.Error()) default: e.Error(http.StatusInternalServerError, err, "可靠投递操作失败") } }