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.
280 lines
6.3 KiB
280 lines
6.3 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"io" |
|
"io/ioutil" |
|
"strconv" |
|
"time" |
|
|
|
"go-common/app/admin/ep/tapd/model" |
|
"go-common/library/ecode" |
|
) |
|
|
|
// TapdCallBack Tapd Call Back. |
|
func (s *Service) TapdCallBack(c context.Context, body io.ReadCloser) (err error) { |
|
|
|
var ( |
|
URLs []string |
|
jsonByte []byte |
|
eventRequest *model.EventRequest |
|
eventInterface = make(map[string]interface{}) |
|
createdTime time.Time |
|
workspaceID int |
|
eventID int |
|
) |
|
|
|
if jsonByte, err = ioutil.ReadAll(body); err != nil { |
|
return |
|
} |
|
|
|
//get event |
|
if err = json.Unmarshal(jsonByte, &eventRequest); err != nil { |
|
return |
|
} |
|
|
|
if eventRequest.Secret != s.c.Tapd.CallbackToken { |
|
err = ecode.Unauthorized |
|
return |
|
} |
|
|
|
if err = json.Unmarshal(jsonByte, &eventInterface); err != nil { |
|
return |
|
} |
|
|
|
// add log |
|
workspaceID, _ = strconv.Atoi(eventRequest.WorkspaceID) |
|
eventID, _ = strconv.Atoi(eventRequest.EventID) |
|
|
|
eventLog := &model.EventLog{ |
|
Event: string(eventRequest.Event), |
|
WorkspaceID: workspaceID, |
|
EventID: eventID, |
|
} |
|
if err = s.dao.AddEventLog(eventLog); err != nil { |
|
return |
|
} |
|
|
|
//handle special param |
|
if createdTime, err = time.Parse("2006-01-02 15:04:05", eventRequest.Created); err != nil { |
|
return |
|
} |
|
eventInterface["id"] = eventRequest.EventID |
|
eventInterface["created"] = createdTime.Unix() |
|
|
|
if URLs, err = s.GetEnableHookURL(c, eventRequest.Event, workspaceID); err != nil { |
|
return |
|
} |
|
|
|
for _, URL := range URLs { |
|
s.transferChan.Do(context.Background(), func(c context.Context) { |
|
s.dao.CallHookUrlAsForm(context.Background(), URL, eventInterface) |
|
}) |
|
} |
|
return |
|
} |
|
|
|
// GetEnableHookURL Get Enable Hook URL. |
|
func (s *Service) GetEnableHookURL(c context.Context, eventType model.Event, workspaceID int) (URLs []string, err error) { |
|
var hookURLs []*model.HookUrl |
|
|
|
if s.c.Tapd.UseCache { |
|
if hookURLs, err = s.dao.GetEnableHookURLFromCacheAndSaveIfNot(eventType); err != nil { |
|
return |
|
} |
|
} else { |
|
if hookURLs, err = s.dao.GetEnableHookURLFromDB(eventType); err != nil { |
|
return |
|
} |
|
} |
|
|
|
for _, hookURL := range hookURLs { |
|
if hookURL.ID > 0 && hookURL.Status == model.HookURLStatusEnable { |
|
if hookURL.WorkspaceID == 0 { |
|
URLs = append(URLs, hookURL.URL) |
|
} else { |
|
if workspaceID == hookURL.WorkspaceID { |
|
URLs = append(URLs, hookURL.URL) |
|
} |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
// SaveEnableHookURL Save Enable Hook URL. |
|
func (s *Service) SaveEnableHookURL(c context.Context) (eventMap map[string][]*model.HookUrl, err error) { |
|
return s.dao.SaveEnableHookURLToCache() |
|
} |
|
|
|
// QueryEnableHookURLInCache query Enable Hook URL In Cache. |
|
func (s *Service) QueryEnableHookURLInCache(c context.Context) (hookURLs []*model.HookUrl, err error) { |
|
return s.dao.GetEnableHookURLFromCache(model.StoryCreate) |
|
} |
|
|
|
// UpdateHookURL Update Hook URL |
|
func (s *Service) UpdateHookURL(c context.Context, username string, req *model.HookURLUpdateReq) (rep map[string]interface{}, err error) { |
|
var repID int64 |
|
|
|
if req.ID > 0 { |
|
// update |
|
var ( |
|
urlEvents []*model.UrlEvent |
|
urlEventsInDB []*model.UrlEvent |
|
hookUrlInDB *model.HookUrl |
|
) |
|
|
|
if hookUrlInDB, err = s.dao.QueryHookURLByID(req.ID); err != nil { |
|
return |
|
} |
|
|
|
if hookUrlInDB.ID == 0 { |
|
err = ecode.NothingFound |
|
return |
|
} |
|
|
|
hookUrl := &model.HookUrl{ |
|
ID: req.ID, |
|
URL: req.URL, |
|
WorkspaceID: req.WorkspaceID, |
|
Status: req.Status, |
|
UpdateBy: username, |
|
} |
|
|
|
if urlEventsInDB, err = s.dao.QueryURLEventByUrl(req.ID); err != nil { |
|
return |
|
} |
|
|
|
//新增 或修改为可用 |
|
for _, eventStr := range req.Events { |
|
urlEvent := &model.UrlEvent{ |
|
Event: eventStr, |
|
Status: model.HookEventStatusEnable, |
|
UrlID: req.ID, |
|
} |
|
|
|
for _, urlEventInDB := range urlEventsInDB { |
|
if urlEventInDB.Event == eventStr { |
|
urlEvent.ID = urlEventInDB.ID |
|
break |
|
} |
|
} |
|
urlEvents = append(urlEvents, urlEvent) |
|
} |
|
|
|
// 未传值,视为disable |
|
for _, urlEventInDB := range urlEventsInDB { |
|
if urlEventInDB.Status == model.HookEventStatusEnable { |
|
var isEnable bool |
|
for _, eventStr := range req.Events { |
|
if eventStr == urlEventInDB.Event { |
|
isEnable = true |
|
break |
|
} |
|
} |
|
|
|
if !isEnable { |
|
urlEvent := &model.UrlEvent{ |
|
Event: urlEventInDB.Event, |
|
Status: model.HookEventStatusDisable, |
|
ID: urlEventInDB.ID, |
|
UrlID: urlEventInDB.UrlID, |
|
} |
|
urlEvents = append(urlEvents, urlEvent) |
|
} |
|
} |
|
} |
|
|
|
if err = s.dao.UpdateHookURLandEvent(hookUrl, urlEvents); err != nil { |
|
return |
|
} |
|
|
|
repID = req.ID |
|
|
|
} else { |
|
// add |
|
var urlEvents []*model.UrlEvent |
|
|
|
hookUrl := &model.HookUrl{ |
|
URL: req.URL, |
|
WorkspaceID: req.WorkspaceID, |
|
Status: req.Status, |
|
UpdateBy: username, |
|
} |
|
|
|
for _, eventStr := range req.Events { |
|
urlEvent := &model.UrlEvent{ |
|
Event: eventStr, |
|
Status: model.HookEventStatusEnable, |
|
} |
|
urlEvents = append(urlEvents, urlEvent) |
|
|
|
} |
|
if err = s.dao.AddHookURLandEvent(hookUrl, urlEvents); err != nil { |
|
return |
|
} |
|
repID = hookUrl.ID |
|
} |
|
|
|
rep = make(map[string]interface{}) |
|
rep["url_id"] = repID |
|
return |
|
} |
|
|
|
// QueryHookURL Query Hook URL. |
|
func (s *Service) QueryHookURL(c context.Context, req *model.QueryHookURLReq) (rep *model.QueryHookURLRep, err error) { |
|
var ( |
|
total int64 |
|
hookUrls []*model.HookUrl |
|
) |
|
if total, hookUrls, err = s.dao.FindHookURLs(req); err != nil { |
|
return |
|
} |
|
rep = &model.QueryHookURLRep{ |
|
Pagination: model.Pagination{ |
|
PageNum: req.PageNum, |
|
PageSize: req.PageSize, |
|
}, |
|
Total: total, |
|
HookUrls: hookUrls, |
|
} |
|
return |
|
} |
|
|
|
// QueryURLEvent Query URL Event. |
|
func (s *Service) QueryURLEvent(c context.Context, urlID int64) (rep []*model.UrlEvent, err error) { |
|
var tmpUrlEvents []*model.UrlEvent |
|
|
|
if tmpUrlEvents, err = s.dao.QueryURLEventByUrl(urlID); err != nil { |
|
return |
|
} |
|
|
|
for _, tmpUrlEvent := range tmpUrlEvents { |
|
if tmpUrlEvent.Status == model.HookEventStatusEnable { |
|
rep = append(rep, tmpUrlEvent) |
|
} |
|
} |
|
|
|
return |
|
} |
|
|
|
// QueryEventLog Query Event Log. |
|
func (s *Service) QueryEventLog(c context.Context, req *model.QueryEventLogReq) (rep *model.QueryEventLogRep, err error) { |
|
var ( |
|
total int64 |
|
eventLogs []*model.EventLog |
|
) |
|
if total, eventLogs, err = s.dao.FindEventLogs(req); err != nil { |
|
return |
|
} |
|
rep = &model.QueryEventLogRep{ |
|
Pagination: model.Pagination{ |
|
PageNum: req.PageNum, |
|
PageSize: req.PageSize, |
|
}, |
|
Total: total, |
|
EventLogs: eventLogs, |
|
} |
|
return |
|
}
|
|
|