go-common/app/admin/ep/tapd/service/hook.go
2019-04-22 18:49:16 +08:00

281 lines
6.3 KiB
Go
Raw Blame History

This file contains ambiguous Unicode characters

This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.

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
}