go-common/app/interface/main/web/service/account.go
2019-04-22 18:49:16 +08:00

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
}