123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292 |
- 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
- }
|