123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170 |
- package service
- import (
- "context"
- "encoding/json"
- "go-common/app/interface/bbq/app-bbq/api/http/v1"
- "go-common/app/interface/bbq/app-bbq/conf"
- "go-common/app/interface/bbq/app-bbq/model"
- "go-common/app/service/bbq/common"
- notice "go-common/app/service/bbq/notice-service/api/v1"
- "go-common/library/ecode"
- "go-common/library/log"
- )
- var noticeTypes map[int32]bool
- const (
- _noticeTypeLike = 1
- _noticeTypeComment = 2
- _noticeTypeFan = 3
- _noticeTypeSysMsg = 4
- )
- func init() {
- noticeTypes = map[int32]bool{
- _noticeTypeLike: true,
- _noticeTypeComment: true,
- _noticeTypeFan: true,
- _noticeTypeSysMsg: true,
- }
- }
- // GetNoticeNum 通知红点
- func (s *Service) GetNoticeNum(ctx context.Context, mid int64) (res *v1.NoticeNumResponse, err error) {
- res = new(v1.NoticeNumResponse)
- unreadList, err := s.dao.GetNoticeUnread(ctx, mid)
- if err != nil {
- log.Warnv(ctx, log.KV("log", "get notice unread fail: err="+err.Error()))
- return
- }
- var redDot int64
- for _, v := range unreadList {
- redDot += v.UnreadNum
- }
- res.RedDot = redDot
- return
- }
- // NoticeOverview 通知中心概述
- func (s *Service) NoticeOverview(ctx context.Context, mid int64) (res *v1.NoticeOverviewResponse, err error) {
- res = new(v1.NoticeOverviewResponse)
- unreadList, err := s.dao.GetNoticeUnread(ctx, mid)
- if err != nil {
- log.Warnv(ctx, log.KV("log", "get notice unread fail: err="+err.Error()))
- return
- }
- unreadMap := make(map[int32]*notice.UnreadItem)
- for _, item := range unreadList {
- unreadMap[item.NoticeType] = item
- }
- for _, v := range conf.Conf.Notices {
- var unreadNum int64
- if unreadInfo, exists := unreadMap[v.NoticeType]; exists {
- unreadNum = unreadInfo.UnreadNum
- }
- res.Notices = append(res.Notices, &v1.NoticeOverview{NoticeType: v.NoticeType, ShowType: v.ShowType, Name: v.Name, UnreadNum: unreadNum})
- }
- return
- }
- // NoticeList 请求通知列表,组装成通知消息列表
- func (s *Service) NoticeList(ctx context.Context, req *v1.NoticeListRequest) (res *v1.NoticeListResponse, err error) {
- res = new(v1.NoticeListResponse)
- // 0. 校验请求合法性
- if _, exists := noticeTypes[req.NoticeType]; !exists {
- return nil, ecode.NoticeTypeErr
- }
- cursor, _, err := parseCursor("", req.CursorNext)
- if err != nil {
- log.Errorv(ctx, log.KV("log", "parse cursor fail: cursor_next="+req.CursorNext))
- return
- }
- // 1. 请求notice列表
- list, err := s.dao.NoticeList(ctx, req.NoticeType, req.Mid, cursor.CursorID)
- if err != nil {
- return
- }
- // 2. 根据notice请求相应业务方
- // 2.0 整理notice列表
- var actionMIDs []int64 // 不是map,有可能重复
- var svIDs []int64
- for _, item := range list {
- if item.ActionMid != 0 {
- actionMIDs = append(actionMIDs, item.ActionMid)
- }
- if item.SvId != 0 {
- svIDs = append(svIDs, item.SvId)
- }
- }
- needUserInfo := true
- needFollowState := false
- needSvInfo := false
- switch req.NoticeType {
- case _noticeTypeLike:
- needSvInfo = true
- case _noticeTypeComment:
- needSvInfo = true
- case _noticeTypeFan:
- needFollowState = true
- case _noticeTypeSysMsg:
- needUserInfo = false
- }
- // 2. 请求用户信息
- var userInfos map[int64]*v1.UserInfo
- if needUserInfo && len(actionMIDs) > 0 {
- userInfos, err = s.dao.BatchUserInfo(ctx, req.Mid, actionMIDs, false, false, needFollowState)
- if err != nil {
- log.Errorv(ctx, log.KV("log", "batch fetch user infos fail"))
- err = nil
- }
- }
- // 2. 请求视频信息
- svInfos := make(map[int64]*model.SvInfo)
- if needSvInfo && len(svIDs) > 0 {
- svList, _, err := s.dao.GetVideoDetail(ctx, svIDs)
- if err != nil {
- log.Warnv(ctx, log.KV("log", "batch fetch sv detail fail"))
- err = nil
- } else {
- for _, sv := range svList {
- svInfos[sv.SVID] = sv
- }
- }
- }
- // 3. 组成回包
- for _, item := range list {
- var noticeMsg v1.NoticeMsg
- noticeMsg.NoticeBase = item
- // showtype没有用,这里就按照noticetype返回
- // md,想的好好的扩展灵活性,完全没被践行
- noticeMsg.ShowType = req.NoticeType
- if needUserInfo && (noticeMsg.ActionMid != 0) {
- if val, exists := userInfos[noticeMsg.ActionMid]; exists {
- noticeMsg.UserInfo = val
- }
- }
- if needSvInfo && (noticeMsg.SvId != 0) {
- if val, exists := svInfos[noticeMsg.SvId]; exists && noticeMsg.State >= common.VideoStPendingPassReview {
- noticeMsg.Pic = val.CoverURL
- } else {
- noticeMsg.State = 1
- noticeMsg.ErrMsg = "视频不见了"
- }
- }
- // cursor_value
- var cursor model.CursorValue
- cursor.CursorID = item.Id
- jsonBytes, _ := json.Marshal(cursor)
- noticeMsg.CursorValue = string(jsonBytes)
- res.List = append(res.List, ¬iceMsg)
- }
- return
- }
|