123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164 |
- package dao
- import (
- "context"
- "encoding/json"
- "fmt"
- "go-common/app/interface/bbq/app-bbq/model"
- "go-common/library/ecode"
- "go-common/library/log"
- bm "go-common/library/net/http/blademaster"
- "go-common/library/net/metadata"
- "net/url"
- "strconv"
- "strings"
- "time"
- jsoniter "github.com/json-iterator/go"
- )
- const (
- httpProto = "http://"
- searchBaseURI = "/bbq/search"
- sugBaseURI = "/main/suggest"
- getSVIDbyRelID = "select id,svid from video where id in (%s)"
- )
- // SearchBBQ 搜索视频
- func (d *Dao) SearchBBQ(c context.Context, sreq *model.SearchBaseReq) (ret *model.RawSearchRes, err error) {
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- ret = new(model.RawSearchRes)
- path := httpProto + d.c.Search.Host + searchBaseURI
- params := url.Values{}
- d.preSetSearchParam(c, ¶ms)
- params.Set("keyword", sreq.KeyWord)
- params.Set("page", strconv.FormatInt(sreq.Page, 10))
- params.Set("pagesize", strconv.FormatInt(sreq.PageSize, 10))
- params.Set("highlight", strconv.FormatInt(sreq.Highlight, 10))
- params.Set("search_type", sreq.Type)
- log.Infov(c, log.KV("log", fmt.Sprintf("search url(%s)", path+"?"+params.Encode())))
- req, err := d.httpClient.NewRequest("GET", path, params.Get("ip"), params)
- if err != nil {
- log.Error("search url(%s) error(%v)", path+"?"+params.Encode(), err)
- return
- }
- if err = d.httpClient.Do(c, req, &ret); err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("search url(%s) error(%v)", path+"?"+params.Encode(), err)))
- return
- }
- if ret.Code != 0 {
- err = ecode.Int(ret.Code)
- log.Errorv(c, log.KV("log", fmt.Sprintf("search url(%s) error(%v)", path+"?"+params.Encode(), err)))
- return
- }
- _str, _ := json.Marshal(ret)
- log.Infov(c,
- log.KV("log", fmt.Sprintf("Search req[%s] ret[%s]", path+"?"+params.Encode(), _str)))
- return
- }
- // SugBBQ 搜索视频
- func (d *Dao) SugBBQ(c context.Context, sreq *model.SugBaseReq) (ret json.RawMessage, err error) {
- path := httpProto + d.c.Search.Host + sugBaseURI
- params := url.Values{}
- d.preSetSearchParam(c, ¶ms)
- params.Set("term", sreq.Term)
- params.Set("suggest_type", sreq.SuggestType)
- params.Set("highlight", strconv.FormatInt(sreq.Highlight, 10))
- params.Set("main_ver", sreq.MainVer)
- params.Set("ts", strconv.FormatInt(time.Now().Unix(), 10))
- log.Infov(c, log.KV("log", fmt.Sprintf("sug url(%s)", path+"?"+params.Encode())))
- req, err := d.httpClient.NewRequest("GET", path, params.Get("ip"), params)
- if err != nil {
- log.Error("sug url(%s) error(%v)", path+"?"+params.Encode(), err)
- return
- }
- var res struct {
- Code int `json:"code"`
- Stoken string `json:"stoken"`
- Res struct {
- Tag json.RawMessage `json:"tag"`
- } `json:"result"`
- }
- if err = d.httpClient.Do(c, req, &res); err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("sug url(%s) error(%v)", path+"?"+params.Encode(), err)))
- return
- }
- if res.Code != 0 {
- err = ecode.Int(res.Code)
- log.Errorv(c, log.KV("log", fmt.Sprintf("sug url(%s) error(%v)", path+"?"+params.Encode(), err)))
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- _str, _ := json.Marshal(ret)
- log.Infov(c, log.KV("log", fmt.Sprintf("Sug req[%s] ret[%s]", path+"?"+params.Encode(), _str)))
- ret = res.Res.Tag
- return
- }
- func (d *Dao) preSetSearchParam(c context.Context, params *url.Values) {
- device := c.Value("device")
- if device != nil {
- dev := device.(*bm.Device)
- if dev.RawPlatform != "" {
- params.Set("platform", dev.RawPlatform)
- }
- if dev.RawMobiApp != "" {
- params.Set("mobi_app", dev.RawMobiApp)
- }
- if dev.Device != "" {
- params.Set("device", dev.Device)
- }
- if dev.Build > 0 {
- params.Set("device", strconv.FormatInt(dev.Build, 10))
- }
- }
- ip := metadata.String(c, metadata.RemoteIP)
- if ip != "" {
- params.Set("clientip", ip)
- }
- }
- // ConvID2SVID 转换搜索相对id到svid
- func (d *Dao) ConvID2SVID(c context.Context, ids []int64) (res map[int64]int64, err error) {
- var idList []string
- res = make(map[int64]int64)
- if len(ids) == 0 {
- return
- }
- for _, id := range ids {
- idList = append(idList, strconv.FormatInt(id, 10))
- }
- if len(idList) == 0 {
- log.Warn("empty query list relID [%v]", ids)
- return
- }
- idStr := strings.Join(idList, ",")
- sql := fmt.Sprintf(getSVIDbyRelID, idStr)
- rows, err := d.db.Query(c, sql)
- if err != nil {
- log.Warn("Query Err [%v]", err)
- return
- }
- defer rows.Close()
- for rows.Next() {
- var svid int64
- var id int64
- err = rows.Scan(&id, &svid)
- if err != nil {
- log.Warn("Scan Err [%v]", err)
- return
- }
- res[id] = svid
- }
- return
- }
- // ParseRel2ID 转换搜索相对id到自增id
- func (d *Dao) ParseRel2ID(relID []int32) (idList []int64) {
- for _, id := range relID {
- idList = append(idList, int64(id/100))
- }
- return
- }
|