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.
101 lines
2.5 KiB
101 lines
2.5 KiB
package dao |
|
|
|
import ( |
|
"context" |
|
"crypto/md5" |
|
"encoding/hex" |
|
"fmt" |
|
"net/http" |
|
"net/url" |
|
"strconv" |
|
"strings" |
|
"time" |
|
|
|
"go-common/app/interface/openplatform/article/model" |
|
"go-common/library/log" |
|
"go-common/library/xstr" |
|
) |
|
|
|
var _queryStr = `{"select":[{"name":"tid"},{"name":"oid"},{"name":"log_date"}],"where":{"tid":{"in":[%s]}},"page":{"limit":10,"skip":0}}` |
|
|
|
// BerserkerTagArts . |
|
func (d *Dao) BerserkerTagArts(c context.Context, tags []int64) (aids []int64, err error) { |
|
var ( |
|
query string |
|
res struct { |
|
Code int |
|
Msg string |
|
Result []struct { |
|
Tid int64 `json:"tid"` |
|
Oid string `json:"oid"` |
|
LogDate string `json:"log_date"` |
|
} |
|
} |
|
tmps = make(map[int64]bool) |
|
aid int64 |
|
date time.Time |
|
now = time.Now() |
|
) |
|
query = fmt.Sprintf(_queryStr, xstr.JoinInts(tags)) |
|
if err = d.berserkerQuery(c, query, &res); err != nil { |
|
return |
|
} |
|
if res.Code != 200 { |
|
log.Error("s.BerserkerTagArts.query code(%d) msg(%s)", res.Code, res.Msg) |
|
return |
|
} |
|
for _, v := range res.Result { |
|
if date, err = time.Parse("20060102", v.LogDate); err != nil { |
|
log.Error("s.BerserkerTagArts.time.Parse(%s) error(%+v)", v.LogDate, err) |
|
return |
|
} |
|
if now.Sub(date) > time.Hour*60 { |
|
continue |
|
} |
|
ids := strings.Split(v.Oid, ",") |
|
var ts []int64 |
|
for _, id := range ids { |
|
if aid, err = strconv.ParseInt(id, 10, 64); err != nil { |
|
log.Error("s.BerserkerTagArts.ParseInt(%s) error(%+v)", id, err) |
|
return |
|
} |
|
if !tmps[aid] { |
|
aids = append(aids, aid) |
|
tmps[aid] = true |
|
} |
|
ts = append(ts, aid) |
|
} |
|
d.AddCacheAidsByTag(c, v.Tid, &model.TagArts{Tid: v.Tid, Aids: ts}) |
|
} |
|
return |
|
} |
|
|
|
func (d *Dao) berserkerQuery(c context.Context, query string, res interface{}) (err error) { |
|
var ( |
|
params = url.Values{} |
|
now = time.Now().Format("2006-01-02 15:04:05") |
|
sign string |
|
req *http.Request |
|
) |
|
sign = d.sign(now) |
|
params.Set("appKey", d.c.Berserker.AppKey) |
|
params.Set("signMethod", "md5") |
|
params.Set("timestamp", now) |
|
params.Set("version", "1.0") |
|
params.Set("query", query) |
|
params.Set("sign", sign) |
|
|
|
req, err = http.NewRequest(http.MethodGet, d.c.Berserker.URL+"?"+params.Encode(), nil) |
|
if err != nil { |
|
log.Error("d.berserkerQuery.NewRequest error(%+v)", err) |
|
return |
|
} |
|
return d.httpClient.Do(c, req, res) |
|
} |
|
|
|
// Sign calc appkey and appsecret sign. |
|
func (d *Dao) sign(ts string) string { |
|
str := d.c.Berserker.AppSecret + "appKey" + d.c.Berserker.AppKey + "timestamp" + ts + "version1.0" + d.c.Berserker.AppSecret |
|
mh := md5.Sum([]byte(str)) |
|
return strings.ToUpper(hex.EncodeToString(mh[:])) |
|
}
|
|
|