123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169 |
- 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
- }
|