You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
77 lines
1.9 KiB
77 lines
1.9 KiB
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 |
|
}
|
|
|