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.
292 lines
7.7 KiB
292 lines
7.7 KiB
package service |
|
|
|
import ( |
|
"context" |
|
"fmt" |
|
"go-common/app/interface/bbq/app-bbq/api/http/v1" |
|
"go-common/app/interface/bbq/app-bbq/dao" |
|
"go-common/app/interface/bbq/app-bbq/model" |
|
notice "go-common/app/service/bbq/notice-service/api/v1" |
|
"go-common/library/ecode" |
|
"go-common/library/log" |
|
bm "go-common/library/net/http/blademaster" |
|
"net/url" |
|
"strconv" |
|
) |
|
|
|
//CommentSubCursor 游标评论列表 |
|
func (s *Service) CommentSubCursor(c context.Context, mid int64, arg *v1.CommentSubCursorReq, device *bm.Device) (res *model.SubCursorRes, err error) { |
|
res = new(model.SubCursorRes) |
|
if _, err = s.dao.VideoBase(c, mid, arg.SvID); err != nil { |
|
log.Warnw(c, "log", "get video base fail", "svid", arg.SvID) |
|
return |
|
} |
|
|
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"sort": arg.Sort, |
|
"root": arg.Root, |
|
} |
|
if len(arg.Access) != 0 { |
|
req["access_key"] = arg.Access |
|
} |
|
if arg.RpID != 0 { |
|
req["rpid"] = arg.RpID |
|
} |
|
if arg.Size != 0 { |
|
req["size"] = arg.Size |
|
} |
|
if arg.MinID > 0 && arg.MaxID > 0 { |
|
err = ecode.ParamInvalid |
|
return |
|
} |
|
if arg.MinID != 0 { |
|
req["min_id"] = arg.MinID |
|
} |
|
if arg.MaxID != 0 { |
|
req["max_id"] = arg.MaxID |
|
} |
|
|
|
res, err = s.dao.ReplySubCursor(c, req) |
|
return |
|
} |
|
|
|
//CommentList 游标评论列表 |
|
func (s *Service) CommentList(c context.Context, arg *v1.CommentListReq, device *bm.Device) (res *model.ReplyList, err error) { |
|
res = new(model.ReplyList) |
|
if _, err = s.dao.VideoBase(c, arg.MID, arg.SvID); err != nil { |
|
log.Warnw(c, "log", "get video base fail", "svid", arg.SvID) |
|
return |
|
} |
|
|
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"sort": arg.Sort, |
|
"nohot": arg.NoHot, |
|
} |
|
|
|
if len(arg.Access) != 0 { |
|
req["access_key"] = arg.Access |
|
} |
|
if arg.Pn != 0 { |
|
req["pn"] = arg.Pn |
|
} |
|
if arg.Ps != 0 { |
|
req["ps"] = arg.Ps |
|
} |
|
if device.Build != 0 { |
|
req["build"] = arg.Build |
|
} |
|
if device.RawPlatform != "" { |
|
req["plat"] = arg.Plat |
|
} |
|
if device.RawMobiApp != "" { |
|
req["mobi_app"] = device.RawMobiApp |
|
} |
|
res, err = s.dao.ReplyList(c, req) |
|
return |
|
} |
|
|
|
//CommentCursor 游标评论列表 |
|
func (s *Service) CommentCursor(c context.Context, arg *v1.CommentCursorReq, device *bm.Device) (res *model.CursorRes, err error) { |
|
res = new(model.CursorRes) |
|
if _, err = s.dao.VideoBase(c, arg.MID, arg.SvID); err != nil { |
|
log.Warnw(c, "log", "get video base fail", "svid", arg.SvID) |
|
return |
|
} |
|
|
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"sort": arg.Sort, |
|
"max_id": arg.MaxID, |
|
"min_id": arg.MinID, |
|
"size": arg.Size, |
|
} |
|
if arg.RpID != 0 { |
|
req["rpid"] = arg.RpID |
|
} |
|
if len(arg.Access) != 0 { |
|
req["access_key"] = arg.Access |
|
} |
|
res, err = s.dao.ReplyCursor(c, req) |
|
return |
|
} |
|
|
|
//CommentAdd 发表评论评论服务 |
|
func (s *Service) CommentAdd(c context.Context, mid int64, arg *v1.CommentAddReq, device *bm.Device) (res *model.AddRes, err error) { |
|
res = new(model.AddRes) |
|
// 屏蔽词 |
|
level, filterErr := s.dao.Filter(c, arg.Message, dao.FilterAreaReply) |
|
if filterErr != nil { |
|
log.Errorv(c, log.KV("log", "filter fail")) |
|
} else if level >= dao.FilterLevel { |
|
err = ecode.CommentFilterErr |
|
log.Warnv(c, log.KV("log", fmt.Sprintf("content filter fail: content=%s, level=%d", arg.Message, level))) |
|
return |
|
} |
|
|
|
var upMid int64 |
|
videoBase, err := s.dao.VideoBase(c, mid, arg.SvID) |
|
if err != nil { |
|
log.Warnw(c, "log", "get video base fail", "svid", arg.SvID) |
|
return |
|
} |
|
upMid = videoBase.Mid |
|
parentMid := upMid |
|
|
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"message": arg.Message, |
|
"access_key": arg.AccessKey, |
|
} |
|
if arg.At != "" { |
|
req["at"] = arg.At |
|
} |
|
if arg.Parent != 0 { |
|
req["parent"] = arg.Parent |
|
req["root"] = arg.Root |
|
} else if arg.Root != 0 { |
|
req["root"] = arg.Root |
|
} |
|
if arg.Plat != 0 { |
|
req["plat"] = arg.Plat |
|
} |
|
if arg.Device != "" { |
|
req["device"] = arg.Plat |
|
} |
|
if arg.Code != "" { |
|
req["code"] = arg.Code |
|
} |
|
res, err = s.dao.ReplyAdd(c, req) |
|
//wrap error |
|
switch ecode.Cause(err).Code() { |
|
case ecode.ReplyDeniedAsCaptcha.Code(): |
|
err = ecode.CommentForbidden |
|
case ecode.ReplyContentOver.Code(): |
|
err = ecode.CommentLengthIllegal |
|
} |
|
// 推送评论给通知中心 |
|
if err == nil { |
|
title := "评论了你的作品" |
|
bizType := int32(notice.NoticeBizTypeSv) |
|
rootID := res.RpID |
|
if arg.Parent != 0 { |
|
title = "回复了你的评论" |
|
bizType = int32(notice.NoticeBizTypeComment) |
|
rootID = arg.Parent |
|
// get root comment's owner |
|
list, tmpErr := s.dao.ReplyMinfo(c, arg.SvID, []int64{arg.Parent}) |
|
if tmpErr != nil || len(list) == 0 { |
|
log.Warnv(c, log.KV("log", "get root reply rpid info fail"), log.KV("rsp_size", len(list))) |
|
return |
|
} |
|
reply, exists := list[arg.Parent] |
|
if !exists { |
|
log.Errorv(c, log.KV("log", "not found reply rpid's info")) |
|
return |
|
} else if reply.Mid == 0 { |
|
log.Errorv(c, log.KV("log", "reply rpid's owner mid=0")) |
|
return |
|
} |
|
parentMid = reply.Mid |
|
} |
|
if parentMid == mid { |
|
log.V(1).Infov(c, log.KV("log", "action_mid=mid"), log.KV("mid", mid)) |
|
return |
|
} |
|
urlVal := make(url.Values) |
|
urlVal.Add("svid", strconv.FormatInt(arg.SvID, 10)) |
|
urlVal.Add("rootid", strconv.FormatInt(rootID, 10)) |
|
urlVal.Add("rpid", strconv.FormatInt(res.RpID, 10)) |
|
jumpURL := fmt.Sprintf("qing://commentdetail?%s", urlVal.Encode()) |
|
notice := ¬ice.NoticeBase{ |
|
Mid: parentMid, ActionMid: mid, SvId: arg.SvID, NoticeType: notice.NoticeTypeComment, Title: title, Text: arg.Message, |
|
JumpUrl: jumpURL, BizType: bizType, BizId: res.RpID} |
|
tmpErr := s.dao.CreateNotice(c, notice) |
|
if tmpErr != nil { |
|
log.Error("create comment notice fail: notice_msg=%s", notice.String()) |
|
} |
|
} |
|
|
|
return |
|
} |
|
|
|
//CommentLike 评论点赞服务 |
|
func (s *Service) CommentLike(c context.Context, mid int64, arg *v1.CommentLikeReq, device *bm.Device) (err error) { |
|
if _, err = s.dao.VideoBase(c, mid, arg.SvID); err != nil { |
|
log.Warnw(c, "log", "get video base fail", "svid", arg.SvID) |
|
return |
|
} |
|
|
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"rpid": arg.RpID, |
|
"action": arg.Action, |
|
"access_key": arg.AccessKey, |
|
} |
|
err = s.dao.ReplyLike(c, req) |
|
if ecode.Cause(err).Code() == ecode.ReplyForbidAction.Code() { |
|
err = ecode.CommentForbidLike |
|
return |
|
} |
|
// TODO: 推送评论给通知中心 |
|
if arg.Action == 1 && err == nil { |
|
// get root comment's owner |
|
list, tmpErr := s.dao.ReplyMinfo(c, arg.SvID, []int64{arg.RpID}) |
|
if tmpErr != nil || len(list) == 0 { |
|
log.Warnv(c, log.KV("log", "get root rpid info fail")) |
|
return |
|
} |
|
reply, exists := list[arg.RpID] |
|
if !exists { |
|
log.Errorv(c, log.KV("log", "not found reply rpid's info")) |
|
return |
|
} else if reply.Mid == 0 { |
|
log.Errorv(c, log.KV("log", "reply rpid's owner mid=0")) |
|
return |
|
} |
|
parentMid := reply.Mid |
|
if parentMid == mid { |
|
log.V(1).Infov(c, log.KV("log", "action_mid=mid"), log.KV("mid", mid)) |
|
return |
|
} |
|
|
|
text := "" |
|
if reply.Content != nil { |
|
text = reply.Content.Message |
|
} |
|
title := "点赞了你的评论" |
|
bizType := int32(notice.NoticeBizTypeComment) |
|
notice := ¬ice.NoticeBase{ |
|
Mid: parentMid, ActionMid: mid, SvId: arg.SvID, NoticeType: notice.NoticeTypeLike, Title: title, Text: text, |
|
BizType: bizType, BizId: arg.RpID} |
|
tmpErr = s.dao.CreateNotice(c, notice) |
|
if tmpErr != nil { |
|
log.Errorv(c, log.KV("log", "create like notice fail: notice_msg="+notice.String()+", err="+err.Error())) |
|
return |
|
} |
|
} |
|
|
|
return |
|
} |
|
|
|
//CommentReport 评论举报服务 |
|
func (s *Service) CommentReport(c context.Context, arg *v1.CommentReportReq) (err error) { |
|
req := map[string]interface{}{ |
|
"oid": arg.SvID, |
|
"type": arg.Type, |
|
"rpid": arg.RpID, |
|
"reason": arg.Reason, |
|
"access_key": arg.AccessKey, |
|
} |
|
if arg.Content != "" { |
|
req["content"] = arg.Content |
|
} |
|
err = s.dao.ReplyReport(c, req) |
|
return |
|
}
|
|
|