2019-04-22 02:59:20 +00:00

171 lines
4.8 KiB
Go

package service
import (
"context"
"go-common/app/interface/main/web/model"
accmdl "go-common/app/service/main/account/api"
relmdl "go-common/app/service/main/relation/model"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/sync/errgroup"
)
const _searchEggWebPlat = 6
var _emptyUpRec = make([]*model.UpRecInfo, 0)
// SearchAll search type all.
func (s *Service) SearchAll(c context.Context, mid int64, arg *model.SearchAllArg, buvid, ua, typ string) (data *model.Search, err error) {
data, err = s.dao.SearchAll(c, mid, arg, buvid, ua, typ)
return
}
// SearchByType type video,bangumi,pgc,live,live_user,article,special,topic,bili_user,photo
func (s *Service) SearchByType(c context.Context, mid int64, arg *model.SearchTypeArg, buvid, ua string) (res *model.SearchTypeRes, err error) {
switch arg.SearchType {
case model.SearchTypeVideo:
if res, err = s.dao.SearchVideo(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeBangumi:
if res, err = s.dao.SearchBangumi(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypePGC:
if res, err = s.dao.SearchPGC(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeLive:
if res, err = s.dao.SearchLive(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeLiveRoom:
if res, err = s.dao.SearchLiveRoom(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeLiveUser:
if res, err = s.dao.SearchLiveUser(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeArticle:
if res, err = s.dao.SearchArticle(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeSpecial:
if res, err = s.dao.SearchSpecial(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeTopic:
if res, err = s.dao.SearchTopic(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypeUser:
if res, err = s.dao.SearchUser(c, mid, arg, buvid, ua); err != nil {
return
}
case model.SearchTypePhoto:
if res, err = s.dao.SearchPhoto(c, mid, arg, buvid, ua); err != nil {
return
}
default:
err = ecode.RequestErr
return
}
return
}
// SearchRec search recommend data.
func (s *Service) SearchRec(c context.Context, mid int64, pn, ps int, keyword, fromSource, buvid, ua string) (data *model.SearchRec, err error) {
data, err = s.dao.SearchRec(c, mid, pn, ps, keyword, fromSource, buvid, ua)
return
}
// SearchDefault get search default word.
func (s *Service) SearchDefault(c context.Context, mid int64, fromSource, buvid, ua string) (data *model.SearchDefault, err error) {
data, err = s.dao.SearchDefault(c, mid, fromSource, buvid, ua)
return
}
// UpRec get up recommend
func (s *Service) UpRec(c context.Context, mid int64, arg *model.SearchUpRecArg, buvid string) (data *model.UpRecData, err error) {
var (
ups []*model.SearchUpRecRes
trackID string
mids []int64
cardsReply *accmdl.CardsReply
cardErr error
)
if ups, trackID, err = s.dao.UpRecommend(c, mid, arg, buvid); err != nil {
return
}
data = &model.UpRecData{TrackID: trackID}
if len(ups) == 0 {
data.List = _emptyUpRec
return
}
for _, v := range ups {
mids = append(mids, v.UpID)
}
relInfos := make(map[int64]*relmdl.Stat, len(mids))
group, errCtx := errgroup.WithContext(c)
group.Go(func() error {
if cardsReply, cardErr = s.accClient.Cards3(errCtx, &accmdl.MidsReq{Mids: mids}); cardErr != nil {
log.Error("UpRec s.accClient.Cards3(%v) error(%v)", mids, cardErr)
return cardErr
}
return nil
})
group.Go(func() error {
if relReply, relErr := s.relation.Stats(errCtx, &relmdl.ArgMids{Mids: mids}); relErr != nil {
log.Error("UpRec s.relation.Stats(%d,%v) error(%v)", mid, mids, relErr)
} else if relReply != nil {
relInfos = relReply
}
return nil
})
if err = group.Wait(); err != nil {
return
}
for _, v := range ups {
if info, ok := cardsReply.Cards[v.UpID]; ok && info != nil && info.Silence == 0 {
upInfo := &model.UpRecInfo{
Mid: info.Mid,
Name: info.Name,
Face: info.Face,
Official: info.Official,
RecReason: v.RecReason,
Tid: v.Tid,
SecondTid: v.SecondTid,
Sign: info.Sign,
}
upInfo.Vip.Type = info.Vip.Type
upInfo.Vip.Status = info.Vip.Status
if stat, ok := relInfos[v.UpID]; ok {
upInfo.Follower = stat.Follower
}
if typ, ok := s.typeNames[int32(v.Tid)]; ok {
upInfo.Tname = typ.Name
}
if typ, ok := s.typeNames[int32(v.SecondTid)]; ok {
upInfo.SecondTname = typ.Name
}
data.List = append(data.List, upInfo)
}
}
if len(data.List) == 0 {
data.List = _emptyUpRec
}
return
}
//SearchEgg get search egg by egg id.
func (s *Service) SearchEgg(c context.Context, eggID int64) (data *model.SearchEggRes, err error) {
if _, ok := s.searchEggs[eggID]; !ok {
err = ecode.NothingFound
return
}
data = s.searchEggs[eggID]
return
}