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.
164 lines
4.6 KiB
164 lines
4.6 KiB
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 |
|
}
|
|
|