Files
go-common/app/interface/main/growup/service/newbie/letter.go
2019-04-22 18:49:16 +08:00

175 lines
4.5 KiB
Go

package newbie
import (
"context"
"go-common/app/interface/main/growup/conf"
"go-common/app/interface/main/growup/dao/newbiedao"
"go-common/app/interface/main/growup/model"
accApi "go-common/app/service/main/account/api"
"go-common/library/ecode"
"go-common/library/log"
"go-common/library/sync/errgroup.v2"
"strconv"
"time"
)
// Letter newbie letter
func (s *Service) Letter(c context.Context, req *model.NewbieLetterReq) (*model.NewbieLetterRes, error) {
var (
group *errgroup.Group
recUps = make(map[int64]*model.RecommendUp)
NewbieConf = conf.Conf.Newbie
category *model.Category
recUpMidList []int64
activities []*model.Activity
archive *model.VideoUpArchive
accInfo *accApi.InfoReply
i = 0
ok bool
err error
)
res := new(model.NewbieLetterRes)
log.Info("req: %+v", req)
group = errgroup.WithCancel(c)
// get up info
group.Go(func(ctx context.Context) error {
accInfo, err = s.dao.GetInfo(ctx, req.Mid)
return err
})
// get activities
group.Go(func(ctx context.Context) error {
activities, err = s.dao.GetActivities(ctx)
return err
})
// get video up, and set talent
group.Go(func(ctx context.Context) error {
archive, err = s.dao.GetVideoUp(ctx, req.Aid)
return err
})
err = group.Wait()
if err != nil {
return nil, err
}
// data validation, deal with default data
if req.Mid != archive.Mid {
log.Error("The archive is not yours, mid: %d, archive.Mid: %v", req.Mid, archive.Mid)
return nil, ecode.GrowupArchiveNotYours
}
if category, ok = newbiedao.Categories[archive.Tid]; !ok {
log.Error("not found the sub tid, sub tid: %d, Categories: %v", archive.Tid, newbiedao.Categories)
return nil, ecode.GrowupSubTidNotExist
}
if _, ok = newbiedao.Categories[category.Pid]; !ok {
log.Error("not found the tid, tid: %d, Categories: %v", archive.Tid, newbiedao.Categories)
return nil, ecode.GrowupTidNotExist
}
res.Area = newbiedao.Categories[category.Pid].Name
log.Info("sub tid: %d, tid: %d", archive.Tid, category.Pid)
sTid := strconv.FormatInt(archive.Tid, 10)
if res.Talent, ok = NewbieConf.Talents[sTid]; !ok {
res.Talent = NewbieConf.DefaultTalent
}
for _, activity := range activities {
if i >= NewbieConf.ActivityCount {
break
}
if activity.Type != NewbieConf.ActivityShotType {
continue
}
if activity.Cover == "" {
activity.Cover = NewbieConf.DefaultCover
}
res.Activities = append(res.Activities, activity)
i++
}
if len(res.Activities) < NewbieConf.ActivityCount {
log.Error("activity count is not enough %d", NewbieConf.ActivityCount)
return nil, ecode.GrowupActivityCountNotEnough
}
res.UperInfo = new(model.NewbieLetterUpInfo)
res.UperInfo.Mid = accInfo.Info.Mid
res.UperInfo.Name = accInfo.Info.Name
res.Archive = new(model.NewbieLetterArchive)
res.Archive.Title = archive.Title
res.Archive.PTime = time.Unix(archive.PTime, 0).Format(model.TimeLayout)
log.Info("after data validation: data(%+v)", res)
// get recommend up list
if _, ok := newbiedao.RecommendUpList[category.Pid]; !ok {
for _, lists := range newbiedao.RecommendUpList {
for recUpMid, recUp := range lists {
recUps[recUpMid] = recUp
break
}
}
log.Info("Not found recommend up list, system random get them : %+v", recUps)
} else {
recUps = newbiedao.RecommendUpList[category.Pid]
log.Info("found recommend up list : %+v", recUps)
}
// get relations
i = 0
for recUpMid := range recUps {
if i >= NewbieConf.RecommendUpPoolCount {
break
}
if recUpMid == req.Mid {
continue
}
recUpMidList = append(recUpMidList, recUpMid)
i++
}
log.Info("recUpMidList: %+v", recUpMidList)
relations, err := s.dao.GetRelations(c, req.Mid, recUpMidList)
if err != nil {
return nil, err
}
log.Info("relations: %+v", relations)
// get ups info
infosReply, err := s.dao.GetInfos(c, recUpMidList)
if err != nil {
err = ecode.GrowupRecommendUpNotExist
return nil, err
}
log.Info("recUpInfos: %+v", infosReply.Infos)
// select 3 ups
i = 0
for recUpMid := range recUps {
if i >= NewbieConf.RecommendUpCount {
break
}
if _, ok := infosReply.Infos[recUpMid]; !ok {
continue
}
if _, ok := relations[recUpMid]; !ok {
relations[recUpMid] = &model.Relation{
Mid: recUpMid,
Attribute: -1,
}
}
relations[recUpMid].Face = infosReply.Infos[recUpMid].Face
relations[recUpMid].Name = infosReply.Infos[recUpMid].Name
res.Relations = append(res.Relations, relations[recUpMid])
i++
}
log.Info("res.Relations: %+v", res.Relations)
return res, nil
}