go-common/app/interface/bbq/app-bbq/dao/comment.go
2019-04-22 18:49:16 +08:00

426 lines
11 KiB
Go

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
}