You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
152 lines
4.7 KiB
152 lines
4.7 KiB
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 |
|
}
|
|
|