go-common/app/admin/main/workflow/service/callback.go
2019-04-22 18:49:16 +08:00

78 lines
1.9 KiB
Go

package service
import (
"context"
"sort"
"time"
"go-common/app/admin/main/workflow/model"
"go-common/app/admin/main/workflow/model/param"
"go-common/library/log"
"github.com/pkg/errors"
)
// AddOrUpCallback will add or update a callback
func (s *Service) AddOrUpCallback(c context.Context, cbp *param.AddCallbackParam) (cbID int32, err error) {
cb := &model.Callback{}
if err = s.dao.ORM.Model(cb).
Where(&model.Callback{Business: cbp.Business}).
Assign(&model.Callback{
Business: cbp.Business,
URL: cbp.URL,
IsSobot: cbp.IsSobot,
State: cbp.State,
ExternalAPI: cbp.ExternalAPI,
SourceAPI: cbp.SourceAPI,
}).
FirstOrCreate(cb).Error; err != nil {
log.Error("Failed to create a callback(%+v): %v", cb, err)
return
}
cbID = cb.CbID
// load callbacks from datebase in cache
go s.loadCallbacks()
return
}
// ListCallback will list all enabled callbacks
func (s *Service) ListCallback(c context.Context) (cbList model.CallbackSlice, err error) {
for _, cb := range s.callbackCache {
cbList = append(cbList, cb)
}
sort.Slice(cbList, func(i, j int) bool {
return cbList[i].Business > cbList[j].Business
})
return
}
// SendCallbackRetry will try to send callback with specified attempts
func (s *Service) SendCallbackRetry(c context.Context, cb *model.Callback, payload *model.Payload) (err error) {
attempts := 3
for i := 0; i < attempts; i++ {
err = s.dao.SendCallback(c, cb, payload)
if err == nil {
return
}
if i >= (attempts - 1) {
break
}
time.Sleep(time.Second * 1)
}
return errors.Wrapf(err, "after %d attempts", attempts)
}
// SetExtAPI .
func (s *Service) SetExtAPI(ctx context.Context, ea *param.BusAttrExtAPI) (err error) {
if err = s.dao.ORM.Table("workflow_callback").Where("business = ?", ea.Bid).Update("external_api", ea.ExternalAPI).Error; err != nil {
log.Error("Failed to set external_api field where bid = %d : %v", ea.Bid, err)
}
return
}