go-common/app/interface/openplatform/article/dao/berserker.go
2019-04-22 18:49:16 +08:00

102 lines
2.5 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 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[:]))
}