281 lines
6.3 KiB
Go
281 lines
6.3 KiB
Go
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
|
||
}
|