123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425 |
- package dao
- import (
- "bytes"
- "context"
- "fmt"
- "strconv"
- "strings"
- "go-common/app/interface/bbq/app-bbq/model"
- user "go-common/app/service/bbq/user/api"
- "go-common/library/log"
- "go-common/library/net/metadata"
- "github.com/json-iterator/go"
- )
- // ReplySubCursor http请求子评论游标获取评论
- func (d *Dao) ReplySubCursor(c context.Context, req map[string]interface{}) (res *model.SubCursorRes, err error) {
- var r []byte
- ip := metadata.String(c, metadata.RemoteIP)
- res = new(model.SubCursorRes)
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_subcursor"], "GET", req, ip)
- if err != nil {
- log.Infov(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- // err = json.Unmarshal(r, &res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- return
- }
- //获取所有mid
- var mid []int64
- if res.Root != nil {
- mid = append(mid, res.Root.Mid)
- }
- if res.Root.Replies != nil {
- mid = append(mid, d.getMidInReplys(res.Root.Replies)...)
- }
- //批量获取userinfo
- var userinfo map[int64]*user.UserBase
- userinfo, err = d.JustGetUserBase(c, mid)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("d.UserBase err[%v]", err)))
- return
- }
- if res.Root != nil {
- d.replaceMemberInReply(res.Root, userinfo)
- }
- return
- }
- // ReplyCursor http请求游标获取评论
- func (d *Dao) ReplyCursor(c context.Context, req map[string]interface{}) (res *model.CursorRes, err error) {
- var r []byte
- ip := metadata.String(c, metadata.RemoteIP)
- res = new(model.CursorRes)
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_cursor"], "GET", req, ip)
- if err != nil {
- log.Infov(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- return
- }
- //获取所有mid
- var mid []int64
- if res.Replies != nil {
- mid = append(mid, d.getMidInReplys(res.Replies)...)
- }
- if res.Hots != nil {
- mid = append(mid, d.getMidInReplys(res.Hots)...)
- }
- if res.Top != nil {
- if res.Top.Admin != nil {
- mid = append(mid, res.Top.Admin.Mid)
- }
- if res.Top.Upper != nil {
- mid = append(mid, res.Top.Upper.Mid)
- }
- }
- //批量获取userinfo
- var userinfo map[int64]*user.UserBase
- userinfo, err = d.JustGetUserBase(c, mid)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("d.UserBase err[%v]", err)))
- return
- }
- if res.Replies != nil {
- d.replaceMemberInReplys(res.Replies, userinfo)
- }
- if res.Hots != nil {
- d.replaceMemberInReplys(res.Hots, userinfo)
- }
- if res.Top != nil {
- if res.Top.Admin != nil {
- d.replaceMemberInReplys(res.Top.Admin.Replies, userinfo)
- }
- if res.Top.Upper != nil {
- d.replaceMemberInReplys(res.Top.Upper.Replies, userinfo)
- }
- }
- return
- }
- // getMidInReplys 批量获取评论列表中mid
- func (d *Dao) getMidInReplys(r []*model.Reply) (l []int64) {
- for _, v := range r {
- l = append(l, v.Mid)
- for _, c := range v.Content.Members {
- cmid, err := strconv.ParseInt(c.Mid, 10, 64)
- if err != nil {
- log.Errorv(
- context.Background(),
- log.KV("log", fmt.Sprintf("strconv err [%v] data[%s]", err, c.Mid)),
- )
- continue
- }
- l = append(l, cmid)
- }
- if len(v.Replies) > 0 {
- sl := d.getMidInReplys(v.Replies)
- l = append(l, sl...)
- }
- }
- return
- }
- // replaceMemberInReplys 批量替换评论列表中用户信息
- func (d *Dao) replaceMemberInReplys(r []*model.Reply, umap map[int64]*user.UserBase) {
- for _, v := range r {
- if u, ok := umap[v.Mid]; ok {
- v.Member.BInfo = u
- } else {
- v.Member.BInfo = new(user.UserBase)
- v.Member.BInfo.Mid = v.Mid
- v.Member.BInfo.Uname = v.Member.Name
- v.Member.BInfo.Face = v.Member.Avatar
- }
- for _, c := range v.Content.Members {
- cmid, err := strconv.ParseInt(c.Mid, 10, 64)
- if err != nil {
- log.Errorv(
- context.Background(),
- log.KV("log", fmt.Sprintf("strconv err [%v] data[%s]", err, c.Mid)),
- )
- continue
- }
- if u, ok := umap[cmid]; ok {
- c.BInfo = u
- } else {
- c.BInfo = new(user.UserBase)
- c.BInfo.Mid = cmid
- c.BInfo.Uname = c.Name
- c.BInfo.Face = c.Avatar
- }
- }
- if len(v.Replies) > 0 {
- d.replaceMemberInReplys(v.Replies, umap)
- }
- }
- }
- // replaceMemberInReply 替换评论中用户信息
- func (d *Dao) replaceMemberInReply(r *model.Reply, umap map[int64]*user.UserBase) {
- if u, ok := umap[r.Mid]; ok {
- r.Member.BInfo = u
- } else {
- r.Member.BInfo = new(user.UserBase)
- r.Member.BInfo.Mid = r.Mid
- r.Member.BInfo.Uname = r.Member.Name
- r.Member.BInfo.Face = r.Member.Avatar
- }
- for _, c := range r.Content.Members {
- cmid, err := strconv.ParseInt(c.Mid, 10, 64)
- if err != nil {
- log.Errorv(
- context.Background(),
- log.KV("log", fmt.Sprintf("strconv err [%v] data[%s]", err, c.Mid)),
- )
- continue
- }
- if u, ok := umap[cmid]; ok {
- c.BInfo = u
- } else {
- c.BInfo = new(user.UserBase)
- c.BInfo.Mid = cmid
- c.BInfo.Uname = c.Name
- c.BInfo.Face = c.Avatar
- }
- }
- if len(r.Replies) > 0 {
- d.replaceMemberInReplys(r.Replies, umap)
- }
- }
- // ReplyAdd http请求添加评论
- func (d *Dao) ReplyAdd(c context.Context, req map[string]interface{}) (res *model.AddRes, err error) {
- ip := metadata.String(c, metadata.RemoteIP)
- res = new(model.AddRes)
- var r []byte
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_add"], "POST", req, ip)
- if err != nil {
- log.Infov(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- json.Unmarshal(r, &res)
- return
- }
- //ReplyLike http请求评论点赞
- func (d *Dao) ReplyLike(c context.Context, req map[string]interface{}) (err error) {
- ip := metadata.String(c, metadata.RemoteIP)
- _, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_like"], "POST", req, ip)
- return
- }
- // ReplyList 评论列表
- func (d *Dao) ReplyList(c context.Context, req map[string]interface{}) (res *model.ReplyList, err error) {
- ip := metadata.String(c, metadata.RemoteIP)
- res = new(model.ReplyList)
- var r []byte
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_list"], "GET", req, ip)
- if err != nil {
- log.Infov(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- return
- }
- //获取所有mid
- var mid []int64
- if res.Replies != nil {
- mid = append(mid, d.getMidInReplys(res.Replies)...)
- }
- if res.Hots != nil {
- mid = append(mid, d.getMidInReplys(res.Hots)...)
- }
- if res.Top != nil {
- mid = append(mid, res.Top.Mid)
- }
- //批量获取userinfo
- var userinfo map[int64]*user.UserBase
- userinfo, err = d.JustGetUserBase(c, mid)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("d.UserBase err[%v]", err)))
- return
- }
- if res.Replies != nil {
- d.replaceMemberInReplys(res.Replies, userinfo)
- }
- if res.Hots != nil {
- d.replaceMemberInReplys(res.Hots, userinfo)
- }
- if res.Top != nil {
- d.replaceMemberInReplys(res.Top.Replies, userinfo)
- }
- return
- }
- // ReplyReport 评论举报
- func (d *Dao) ReplyReport(c context.Context, req map[string]interface{}) (err error) {
- ip := metadata.String(c, metadata.RemoteIP)
- _, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_report"], "POST", req, ip)
- return
- }
- // ReplyCounts 批量评论数
- func (d *Dao) ReplyCounts(c context.Context, ids []int64, t int64) (res map[int64]*model.ReplyCount, err error) {
- ip := metadata.String(c, metadata.RemoteIP)
- oidStr := strings.Replace(strings.Trim(fmt.Sprint(ids), "[]"), " ", ",", -1)
- req := map[string]interface{}{
- "type": t,
- "oid": oidStr,
- }
- res = make(map[int64]*model.ReplyCount)
- var r []byte
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_counts"], "GET", req, ip)
- if err != nil {
- log.Infov(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- }
- return
- }
- // ReplyMinfo 批量请求评论
- func (d *Dao) ReplyMinfo(c context.Context, svID int64, rpids []int64) (res map[int64]*model.Reply, err error) {
- res = make(map[int64]*model.Reply)
- if len(rpids) == 0 {
- return
- }
- ip := metadata.String(c, metadata.RemoteIP)
- var rpidStr string
- for _, rpid := range rpids {
- if len(rpidStr) != 0 {
- rpidStr += fmt.Sprintf(",%d", rpid)
- } else {
- rpidStr += fmt.Sprintf("%d", rpid)
- }
- }
- log.V(1).Infov(c, log.KV("log", "reply minfo: rpids="+rpidStr))
- req := map[string]interface{}{
- "type": model.DefaultCmType,
- "oid": svID,
- "rpid": rpidStr,
- }
- var r []byte
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_minfo"], "GET", req, ip)
- if err != nil {
- log.Errorv(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- }
- log.V(1).Infov(c, log.KV("log", "get reply minfo"), log.KV("req_size", len(rpids)), log.KV("rsp_size", len(res)))
- return
- }
- // ReplyHot 获取批量热评
- func (d *Dao) ReplyHot(c context.Context, mid int64, oids []int64) (res map[int64][]*model.Reply, err error) {
- res = make(map[int64][]*model.Reply)
- if len(oids) == 0 {
- return
- }
- ip := metadata.String(c, metadata.RemoteIP)
- var oidStr string
- for _, oid := range oids {
- if len(oidStr) != 0 {
- oidStr += fmt.Sprintf(",%d", oid)
- } else {
- oidStr += fmt.Sprintf("%d", oid)
- }
- }
- log.V(1).Infov(c, log.KV("log", "reply minfo: oids="+oidStr))
- req := map[string]interface{}{
- "type": model.DefaultCmType,
- "oids": oidStr,
- "mid": mid,
- }
- var r []byte
- r, err = replyHTTPCommon(c, d.httpClient, d.c.URLs["reply_hots"], "GET", req, ip)
- if err != nil {
- log.Errorv(c,
- log.KV("log", fmt.Sprintf("replyHTTPCommon err [%v]", err)),
- )
- return
- }
- var json = jsoniter.ConfigCompatibleWithStandardLibrary
- decoder := json.NewDecoder(bytes.NewBuffer(r))
- decoder.UseNumber()
- err = decoder.Decode(&res)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("json unmarlshal err data[%s]", string(r))))
- }
- log.V(1).Infov(c, log.KV("log", "get reply hots"), log.KV("req_size", len(oids)), log.KV("rsp_size", len(res)))
- // 替换bbq的用户信息
- var mIDs []int64
- for _, replies := range res {
- for _, reply := range replies {
- mIDs = append(mIDs, reply.Mid)
- }
- }
- var userBases map[int64]*user.UserBase
- userBases, err = d.JustGetUserBase(c, mIDs)
- if err != nil {
- log.Errorv(c, log.KV("log", fmt.Sprintf("d.UserBase err[%v]", err)))
- return
- }
- for _, replies := range res {
- if len(replies) > 0 {
- d.replaceMemberInReplys(replies, userBases)
- }
- }
- return
- }
|