153 lines
4.7 KiB
Go
153 lines
4.7 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
|
||
|
"go-common/app/interface/main/web/model"
|
||
|
artmdl "go-common/app/interface/openplatform/article/model"
|
||
|
accmdl "go-common/app/service/main/account/api"
|
||
|
"go-common/app/service/main/archive/model/archive"
|
||
|
relmdl "go-common/app/service/main/relation/model"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/net/metadata"
|
||
|
"go-common/library/sync/errgroup"
|
||
|
)
|
||
|
|
||
|
const _cardBakCacheRand = 10
|
||
|
|
||
|
// Attentions get attention list.
|
||
|
func (s *Service) Attentions(c context.Context, mid int64) (rs []int64, err error) {
|
||
|
var (
|
||
|
attentions []*relmdl.Following
|
||
|
remoteIP = metadata.String(c, metadata.RemoteIP)
|
||
|
)
|
||
|
if attentions, err = s.relation.Followings(c, &relmdl.ArgMid{Mid: mid, RealIP: remoteIP}); err != nil {
|
||
|
log.Error("s.relation.Followings(%d,%s) error %v", mid, remoteIP, err)
|
||
|
} else {
|
||
|
rs = make([]int64, 0)
|
||
|
for _, v := range attentions {
|
||
|
rs = append(rs, v.Mid)
|
||
|
}
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Card get card relation archive count data.
|
||
|
func (s *Service) Card(c context.Context, mid, loginID int64, topPhoto, article bool) (rs *model.Card, err error) {
|
||
|
var (
|
||
|
cardReply *accmdl.CardReply
|
||
|
relResp *accmdl.RelationReply
|
||
|
card *model.AccountCard
|
||
|
space *model.Space
|
||
|
arcCount int
|
||
|
group *errgroup.Group
|
||
|
infoErr, statErr, spaceErr, relErr, upcErr, artErr error
|
||
|
cacheRs *model.Card
|
||
|
remoteIP = metadata.String(c, metadata.RemoteIP)
|
||
|
)
|
||
|
relation := &accmdl.RelationReply{}
|
||
|
stat := &relmdl.Stat{}
|
||
|
upArts := &artmdl.UpArtMetas{}
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
card = new(model.AccountCard)
|
||
|
card.Attentions = make([]int64, 0)
|
||
|
group.Go(func() error {
|
||
|
if cardReply, infoErr = s.accClient.Card3(errCtx, &accmdl.MidReq{Mid: mid}); infoErr != nil {
|
||
|
log.Error("s.accClient.Card3(%d,%s) error %v", mid, remoteIP, infoErr)
|
||
|
} else {
|
||
|
card.FromCard(cardReply.Card)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if stat, statErr = s.relation.Stat(errCtx, &relmdl.ArgMid{Mid: mid, RealIP: remoteIP}); statErr != nil {
|
||
|
log.Error("s.relation.Stat(%d) error(%v)", mid, statErr)
|
||
|
} else {
|
||
|
card.Fans = int(stat.Follower)
|
||
|
card.Attention = int(stat.Following)
|
||
|
card.Friend = int(stat.Following)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
if topPhoto {
|
||
|
group.Go(func() error {
|
||
|
space, spaceErr = s.dao.TopPhoto(errCtx, mid)
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
if loginID > 0 {
|
||
|
group.Go(func() error {
|
||
|
if relResp, relErr = s.accClient.Relation3(errCtx, &accmdl.RelationReq{Mid: loginID, Owner: mid, RealIp: remoteIP}); relErr != nil {
|
||
|
log.Error("s.accClient.Relation3(%d,%d,%s) error %v", loginID, mid, remoteIP, relErr)
|
||
|
} else if relResp != nil {
|
||
|
relation = relResp
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
group.Go(func() error {
|
||
|
if arcCount, upcErr = s.arc.UpCount2(errCtx, &archive.ArgUpCount2{Mid: mid}); upcErr != nil {
|
||
|
log.Error("s.arc.UpCount2(%d) error %v", mid, upcErr)
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
if article {
|
||
|
group.Go(func() error {
|
||
|
if upArts, artErr = s.art.UpArtMetas(errCtx, &artmdl.ArgUpArts{Mid: mid, Pn: _samplePn, Ps: _samplePs, RealIP: remoteIP}); artErr != nil {
|
||
|
log.Error("s.art.UpArtMetas(%d) error(%v)", mid, artErr)
|
||
|
}
|
||
|
if upArts == nil {
|
||
|
upArts = &artmdl.UpArtMetas{Count: 0}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
group.Wait()
|
||
|
addCache := true
|
||
|
if infoErr != nil || (topPhoto && spaceErr != nil) || (loginID > 0 && relErr != nil) || upcErr != nil {
|
||
|
if cacheRs, err = s.dao.CardBakCache(c, mid); err != nil {
|
||
|
addCache = false
|
||
|
log.Error("s.dao.CardBakCache(%d) error (%v)", mid, err)
|
||
|
err = nil
|
||
|
} else if cacheRs != nil {
|
||
|
if infoErr != nil {
|
||
|
card = cacheRs.Card
|
||
|
}
|
||
|
if statErr != nil {
|
||
|
stat = &relmdl.Stat{Follower: cacheRs.Follower}
|
||
|
}
|
||
|
if topPhoto && spaceErr != nil {
|
||
|
space = cacheRs.Space
|
||
|
}
|
||
|
if loginID > 0 && relErr != nil {
|
||
|
relation = &accmdl.RelationReply{Following: cacheRs.Following}
|
||
|
}
|
||
|
if upcErr != nil {
|
||
|
arcCount = cacheRs.ArchiveCount
|
||
|
}
|
||
|
if artErr != nil {
|
||
|
upArts = &artmdl.UpArtMetas{Count: cacheRs.ArticleCount}
|
||
|
}
|
||
|
}
|
||
|
if topPhoto && space == nil {
|
||
|
space = &model.Space{SImg: s.c.DefaultTop.SImg, LImg: s.c.DefaultTop.LImg}
|
||
|
}
|
||
|
}
|
||
|
rs = &model.Card{
|
||
|
Card: card,
|
||
|
Space: space,
|
||
|
Following: relation.Following,
|
||
|
ArchiveCount: arcCount,
|
||
|
ArticleCount: upArts.Count,
|
||
|
Follower: stat.Follower,
|
||
|
}
|
||
|
if addCache {
|
||
|
s.cache.Do(c, func(c context.Context) {
|
||
|
if s.r.Intn(_cardBakCacheRand) == 1 {
|
||
|
s.dao.SetCardBakCache(c, mid, rs)
|
||
|
}
|
||
|
})
|
||
|
}
|
||
|
return
|
||
|
}
|