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.
169 lines
4.3 KiB
169 lines
4.3 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"net/http" |
|
"net/url" |
|
"reflect" |
|
"strings" |
|
"sync" |
|
|
|
"go-common/app/admin/ep/tapd/model" |
|
"go-common/library/cache/memcache" |
|
"go-common/library/log" |
|
) |
|
|
|
var rwmLock = new(sync.RWMutex) |
|
|
|
// CallHookUrl Call Hook Url. |
|
func (d *Dao) CallHookUrl(c context.Context, URL string, body interface{}) (err error) { |
|
var ( |
|
req *http.Request |
|
res = make(map[string]interface{}) |
|
) |
|
|
|
if req, err = d.newRequest(http.MethodPost, URL, body); err != nil { |
|
log.Error("d.CallHookUrl url(%s) err(%v)", URL, err) |
|
return |
|
} |
|
|
|
if err = d.httpClient.Do(c, req, &res); err != nil { |
|
log.Error("d.CallHookUrl url(%s) err(%v)", URL, err) |
|
} |
|
return |
|
} |
|
|
|
// CallHookUrlAsForm Call Hook Url As Form. |
|
func (d *Dao) CallHookUrlAsForm(c context.Context, URL string, body map[string]interface{}) (err error) { |
|
var ( |
|
res = make(map[string]interface{}) |
|
req *http.Request |
|
) |
|
|
|
data := make(url.Values) |
|
for mapKey := range body { |
|
typeKind := reflect.TypeOf(body[mapKey]).Kind() |
|
|
|
switch typeKind { |
|
|
|
case reflect.Int: |
|
data[mapKey] = []string{fmt.Sprintf("%d", body[mapKey].(int))} |
|
case reflect.Int64: |
|
data[mapKey] = []string{fmt.Sprintf("%d", body[mapKey].(int64))} |
|
case reflect.Float64: |
|
data[mapKey] = []string{fmt.Sprintf("%.0f", body[mapKey].(float64))} |
|
case reflect.String: |
|
data[mapKey] = []string{body[mapKey].(string)} |
|
default: |
|
data[mapKey] = []string{fmt.Sprint(body[mapKey])} |
|
} |
|
} |
|
|
|
if req, err = http.NewRequest(http.MethodPost, URL, strings.NewReader(data.Encode())); err != nil { |
|
return |
|
} |
|
|
|
req.Header.Set("Content-Type", "application/x-www-form-urlencoded") |
|
err = d.httpClient.Do(c, req, &res) |
|
return |
|
} |
|
|
|
// SaveEnableHookURLToCache Save Enable Hook URL To Cache. |
|
func (d *Dao) SaveEnableHookURLToCache() (eventMap map[string][]*model.HookUrl, err error) { |
|
rwmLock.Lock() |
|
defer rwmLock.Unlock() |
|
|
|
var urlEvents []*model.UrlEvent |
|
|
|
eventMap = make(map[string][]*model.HookUrl) |
|
|
|
// 获取有效event |
|
if urlEvents, err = d.QueryURLEventByStatus(model.HookEventStatusEnable); err != nil { |
|
return |
|
} |
|
|
|
//倒查url 过滤不存在或无效状态 |
|
for _, urlEvent := range urlEvents { |
|
var hookURL *model.HookUrl |
|
if hookURL, err = d.QueryHookURLByID(urlEvent.UrlID); err != nil || hookURL.ID == 0 || hookURL.Status != model.HookURLStatusEnable { |
|
continue |
|
} |
|
eventMap[urlEvent.Event] = append(eventMap[urlEvent.Event], hookURL) |
|
} |
|
|
|
for eventMapKey := range eventMap { |
|
item := &memcache.Item{Key: eventMapKey, Object: eventMap[eventMapKey], Flags: memcache.FlagJSON, Expiration: d.expire} |
|
d.tokenCacheSave(context.Background(), item) |
|
} |
|
|
|
return |
|
} |
|
|
|
// GetEnableHookURLFromCacheAndSaveIfNot Get Enable Hook URL From Cache and save if not. |
|
func (d *Dao) GetEnableHookURLFromCacheAndSaveIfNot(event model.Event) (hookURLs []*model.HookUrl, err error) { |
|
var ( |
|
conn = d.mc.Get(context.Background()) |
|
item *memcache.Item |
|
) |
|
|
|
rwmLock.RLock() |
|
|
|
defer rwmLock.RUnlock() |
|
defer conn.Close() |
|
|
|
if item, err = conn.Get(string(event)); err == nil { |
|
if err = json.Unmarshal(item.Value, &hookURLs); err != nil { |
|
log.Error("GetEnableHookURLFromCache json parse error(%v)", err) |
|
} |
|
return |
|
} |
|
|
|
var eventMap map[string][]*model.HookUrl |
|
if eventMap, err = d.SaveEnableHookURLToCache(); err != nil { |
|
return |
|
} |
|
hookURLs = eventMap[string(event)] |
|
return |
|
|
|
} |
|
|
|
// GetEnableHookURLFromCache Get Enable Hook URL From Cache. |
|
func (d *Dao) GetEnableHookURLFromCache(event model.Event) (hookURLs []*model.HookUrl, err error) { |
|
var ( |
|
conn = d.mc.Get(context.Background()) |
|
item *memcache.Item |
|
) |
|
|
|
rwmLock.RLock() |
|
|
|
defer rwmLock.RUnlock() |
|
defer conn.Close() |
|
|
|
if item, err = conn.Get(string(event)); err == nil { |
|
if err = json.Unmarshal(item.Value, &hookURLs); err != nil { |
|
log.Error("GetEnableHookURLFromCache json parse error(%v)", err) |
|
} |
|
return |
|
} |
|
return |
|
} |
|
|
|
// GetEnableHookURLFromDB Get Enable Hook URL From DB. |
|
func (d *Dao) GetEnableHookURLFromDB(event model.Event) (hookURLs []*model.HookUrl, err error) { |
|
var urlEvents []*model.UrlEvent |
|
if urlEvents, err = d.QueryURLEventByEventAndStatus(string(event), model.HookEventStatusEnable); err != nil { |
|
return |
|
} |
|
|
|
for _, urlEvent := range urlEvents { |
|
var hookURL *model.HookUrl |
|
if hookURL, err = d.QueryHookURLByID(urlEvent.UrlID); err != nil { |
|
return |
|
} |
|
hookURLs = append(hookURLs, hookURL) |
|
} |
|
return |
|
|
|
}
|
|
|