383 lines
10 KiB
Go
383 lines
10 KiB
Go
|
package service
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"encoding/json"
|
||
|
|
||
|
"go-common/app/interface/main/space/model"
|
||
|
tagmdl "go-common/app/interface/main/tag/model"
|
||
|
artmdl "go-common/app/interface/openplatform/article/model"
|
||
|
accwar "go-common/app/service/main/account/api"
|
||
|
accmdl "go-common/app/service/main/account/model"
|
||
|
favmdl "go-common/app/service/main/favorite/model"
|
||
|
memmdl "go-common/app/service/main/member/model"
|
||
|
relmdl "go-common/app/service/main/relation/model"
|
||
|
upmdl "go-common/app/service/main/up/api/v1"
|
||
|
"go-common/library/conf/env"
|
||
|
"go-common/library/ecode"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/net/metadata"
|
||
|
"go-common/library/sync/errgroup"
|
||
|
)
|
||
|
|
||
|
const (
|
||
|
_samplePn = 1
|
||
|
_samplePs = 1
|
||
|
_silenceForbid = 1
|
||
|
_accBlockDefault = 0
|
||
|
_accBlockDue = 1
|
||
|
_officialNoType = -1
|
||
|
_audioCardOn = 1
|
||
|
_noticeForbid = 1
|
||
|
)
|
||
|
|
||
|
var (
|
||
|
_emptyThemeList = make([]*model.ThemeDetail, 0)
|
||
|
_emptyArcItem = make([]*model.ArcItem, 0)
|
||
|
)
|
||
|
|
||
|
// NavNum get space nav num by mid.
|
||
|
func (s *Service) NavNum(c context.Context, mid, vmid int64) (res *model.NavNum) {
|
||
|
ip := metadata.String(c, metadata.RemoteIP)
|
||
|
res = new(model.NavNum)
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
group.Go(func() error {
|
||
|
if reply, err := s.upClient.UpCount(errCtx, &upmdl.UpCountReq{Mid: vmid}); err != nil {
|
||
|
log.Error("s.upClient.UpCount(%d) error(%v)", vmid, err)
|
||
|
} else if reply.Count > 0 {
|
||
|
res.Video = reply.Count
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
res.Channel = new(model.Num)
|
||
|
if chs, err := s.ChannelList(errCtx, vmid, false); err != nil {
|
||
|
log.Error("s.ChannelList(%d) error(%v)", vmid, err)
|
||
|
} else if chCnt := len(chs); chCnt > 0 {
|
||
|
res.Channel.Master = chCnt
|
||
|
for _, v := range chs {
|
||
|
if v.Count > 0 {
|
||
|
res.Channel.Guest++
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
res.Favourite = new(model.Num)
|
||
|
if favs, err := s.dao.FavFolder(errCtx, mid, vmid); err != nil {
|
||
|
log.Error("s.dao.FavFolder(%d) error(%v)", vmid, err)
|
||
|
} else if favCnt := len(favs); favCnt > 0 {
|
||
|
res.Favourite.Master = favCnt
|
||
|
for _, v := range favs {
|
||
|
if v.IsPublic() {
|
||
|
res.Favourite.Guest++
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if _, cnt, err := s.dao.BangumiList(errCtx, vmid, _samplePn, _samplePs); err != nil {
|
||
|
log.Error("s.dao.BangumiList(%d) error(%v)", vmid, err)
|
||
|
} else if cnt > 0 {
|
||
|
res.Bangumi = cnt
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if tag, err := s.tag.SubTags(errCtx, &tagmdl.ArgSub{Mid: vmid, Pn: _samplePn, Ps: _samplePs, RealIP: ip}); err != nil {
|
||
|
log.Error("s.tag.SubTags(%d) error(%v)", vmid, err)
|
||
|
} else if tag != nil {
|
||
|
res.Tag = tag.Total
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if art, err := s.art.UpArtMetas(errCtx, &artmdl.ArgUpArts{Mid: vmid, Pn: 1, Ps: 10, RealIP: ip}); err != nil {
|
||
|
log.Error("s.art.UpArtMetas(%d) error(%v)", vmid, err)
|
||
|
} else if art != nil {
|
||
|
res.Article = art.Count
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if cnt, err := s.fav.CntUserFolders(errCtx, &favmdl.ArgCntUserFolders{Type: favmdl.TypePlayVideo, Mid: vmid, RealIP: ip}); err != nil {
|
||
|
log.Error("s.dao.Playlist(%d) error(%v)", vmid, err)
|
||
|
} else if cnt > 0 {
|
||
|
res.Playlist = cnt
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if cnt, err := s.dao.AlbumCount(errCtx, vmid); err == nil && cnt > 0 {
|
||
|
res.Album = cnt
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if cnt, err := s.dao.AudioCnt(errCtx, vmid); err != nil {
|
||
|
log.Error("s.dao.AudioCnt(%d) error(%v)", vmid, err)
|
||
|
} else if cnt > 0 {
|
||
|
res.Audio = cnt
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Wait()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// UpStat get up stat.
|
||
|
func (s *Service) UpStat(c context.Context, mid int64) (res *model.UpStat, err error) {
|
||
|
var (
|
||
|
info *accwar.InfoReply
|
||
|
arcStat *model.UpArcStat
|
||
|
artStat *model.UpArtStat
|
||
|
arcErr, artErr error
|
||
|
)
|
||
|
if info, err = s.accClient.Info3(c, &accwar.MidReq{Mid: mid}); err != nil || info == nil {
|
||
|
log.Error("s.accClient.Info3(%d) error(%v)", mid, err)
|
||
|
return
|
||
|
}
|
||
|
res = new(model.UpStat)
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
group.Go(func() error {
|
||
|
if arcStat, arcErr = s.UpArcStat(errCtx, mid); arcErr != nil {
|
||
|
log.Error("s.UpArcStat(%d) error(%v)", mid, arcErr)
|
||
|
} else if arcStat != nil {
|
||
|
res.Archive.View = arcStat.View
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if artStat, artErr = s.UpArtStat(errCtx, mid); artErr != nil {
|
||
|
log.Error("s.UpArtStat(%d) error(%v)", mid, artErr)
|
||
|
} else if artStat != nil {
|
||
|
res.Article.View = artStat.View
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Wait()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// MyInfo get my info.
|
||
|
func (s *Service) MyInfo(c context.Context, mid int64) (res *accmdl.ProfileStat, err error) {
|
||
|
var reply *accwar.ProfileStatReply
|
||
|
if reply, err = s.accClient.ProfileWithStat3(c, &accwar.MidReq{Mid: mid}); err != nil {
|
||
|
log.Error("s.accClient.ProfileWithStat3(%d) error(%v)", mid, err)
|
||
|
return
|
||
|
}
|
||
|
level := memmdl.LevelInfo{
|
||
|
Cur: reply.LevelInfo.Cur,
|
||
|
Min: reply.LevelInfo.Min,
|
||
|
NowExp: reply.LevelInfo.NowExp,
|
||
|
NextExp: reply.LevelInfo.NextExp,
|
||
|
}
|
||
|
res = &accmdl.ProfileStat{
|
||
|
Profile: reply.Profile,
|
||
|
LevelExp: level,
|
||
|
Coins: reply.Coins,
|
||
|
Following: reply.Follower,
|
||
|
Follower: reply.Follower,
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// AccTags get account tags.
|
||
|
func (s *Service) AccTags(c context.Context, mid int64) (res json.RawMessage, err error) {
|
||
|
return s.dao.AccTags(c, mid)
|
||
|
}
|
||
|
|
||
|
// SetAccTags set account tags.
|
||
|
func (s *Service) SetAccTags(c context.Context, tags, ck string) (err error) {
|
||
|
return s.dao.SetAccTags(c, tags, ck)
|
||
|
}
|
||
|
|
||
|
// AccInfo web acc info.
|
||
|
func (s *Service) AccInfo(c context.Context, mid, vmid int64) (res *model.AccInfo, err error) {
|
||
|
if env.DeployEnv == env.DeployEnvProd {
|
||
|
if _, ok := s.BlacklistValue[vmid]; ok {
|
||
|
err = ecode.NothingFound
|
||
|
return
|
||
|
}
|
||
|
}
|
||
|
var (
|
||
|
reply *accwar.ProfileStatReply
|
||
|
topPhoto *model.TopPhoto
|
||
|
topErr error
|
||
|
)
|
||
|
if reply, err = s.accClient.ProfileWithStat3(c, &accwar.MidReq{Mid: vmid}); err != nil || reply == nil {
|
||
|
log.Error("s.accClient.ProfileWithStat3(%d) error(%v)", vmid, err)
|
||
|
if ecode.Cause(err) != ecode.UserNotExist {
|
||
|
return
|
||
|
}
|
||
|
reply = model.DefaultProfileStat
|
||
|
}
|
||
|
res = new(model.AccInfo)
|
||
|
res.FromCard(reply)
|
||
|
if res.Mid == 0 {
|
||
|
res.Mid = vmid
|
||
|
}
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
//check privacy
|
||
|
if mid != vmid {
|
||
|
group.Go(func() error {
|
||
|
if privacyErr := s.privacyCheck(errCtx, vmid, model.PcyUserInfo); privacyErr != nil {
|
||
|
res.JoinTime = 0
|
||
|
res.Sex = "保密"
|
||
|
res.Birthday = ""
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
if mid > 0 {
|
||
|
group.Go(func() error {
|
||
|
if relation, err := s.accClient.Relation3(errCtx, &accwar.RelationReq{Mid: mid, Owner: vmid}); err != nil {
|
||
|
log.Error("s.accClient.Relation3(%d,%d) error (%v)", mid, vmid, err)
|
||
|
} else if relation != nil {
|
||
|
res.IsFollowed = relation.Following
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
}
|
||
|
}
|
||
|
//get top photo
|
||
|
group.Go(func() error {
|
||
|
topPhoto, topErr = s.dao.WebTopPhoto(errCtx, vmid)
|
||
|
return nil
|
||
|
})
|
||
|
//get all theme
|
||
|
group.Go(func() error {
|
||
|
res.Theme = struct{}{}
|
||
|
if theme, err := s.dao.Theme(errCtx, vmid); err == nil && theme != nil && len(theme.List) > 0 {
|
||
|
for _, v := range theme.List {
|
||
|
if v.IsActivated == 1 {
|
||
|
res.Theme = v
|
||
|
break
|
||
|
}
|
||
|
}
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
//get live metal
|
||
|
group.Go(func() error {
|
||
|
res.FansBadge, _ = s.dao.LiveMetal(errCtx, vmid)
|
||
|
return nil
|
||
|
})
|
||
|
group.Wait()
|
||
|
if topErr != nil || topPhoto == nil || topPhoto.LImg == "" {
|
||
|
res.TopPhoto = s.c.Rule.TopPhoto
|
||
|
} else {
|
||
|
res.TopPhoto = topPhoto.LImg
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ThemeList get theme list.
|
||
|
func (s *Service) ThemeList(c context.Context, mid int64) (data []*model.ThemeDetail, err error) {
|
||
|
var theme *model.ThemeDetails
|
||
|
if theme, err = s.dao.Theme(c, mid); err != nil {
|
||
|
return
|
||
|
}
|
||
|
if theme == nil || len(theme.List) == 0 {
|
||
|
data = _emptyThemeList
|
||
|
return
|
||
|
}
|
||
|
data = theme.List
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// ThemeActive theme active.
|
||
|
func (s *Service) ThemeActive(c context.Context, mid, themeID int64) (err error) {
|
||
|
var (
|
||
|
theme *model.ThemeDetails
|
||
|
check bool
|
||
|
)
|
||
|
if theme, err = s.dao.Theme(c, mid); err != nil {
|
||
|
return
|
||
|
}
|
||
|
if theme == nil || len(theme.List) == 0 {
|
||
|
err = ecode.RequestErr
|
||
|
return
|
||
|
}
|
||
|
for _, v := range theme.List {
|
||
|
if v.ID == themeID {
|
||
|
if v.IsActivated == 1 {
|
||
|
err = ecode.NotModified
|
||
|
return
|
||
|
}
|
||
|
check = true
|
||
|
}
|
||
|
}
|
||
|
if !check {
|
||
|
err = ecode.RequestErr
|
||
|
return
|
||
|
}
|
||
|
if err = s.dao.ThemeActive(c, mid, themeID); err == nil {
|
||
|
s.dao.DelCacheTheme(c, mid)
|
||
|
}
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// Relation .
|
||
|
func (s *Service) Relation(c context.Context, mid, vmid int64) (data *model.Relation) {
|
||
|
data = &model.Relation{Relation: struct{}{}, BeRelation: struct{}{}}
|
||
|
ip := metadata.String(c, metadata.RemoteIP)
|
||
|
if mid == vmid {
|
||
|
return
|
||
|
}
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
group.Go(func() error {
|
||
|
if relation, err := s.relation.Relation(errCtx, &relmdl.ArgRelation{Mid: mid, Fid: vmid, RealIP: ip}); err != nil {
|
||
|
log.Error("Relation s.relation.Relation(Mid:%d,Fid:%d,%s) error %v", mid, vmid, ip, err)
|
||
|
} else if relation != nil {
|
||
|
data.Relation = relation
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if beRelation, err := s.relation.Relation(errCtx, &relmdl.ArgRelation{Mid: vmid, Fid: mid, RealIP: ip}); err != nil {
|
||
|
log.Error("Relation s.relation.Relation(Mid:%d,Fid:%d,%s) error %v", vmid, mid, ip, err)
|
||
|
} else if beRelation != nil {
|
||
|
data.BeRelation = beRelation
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Wait()
|
||
|
return
|
||
|
}
|
||
|
|
||
|
// WebIndex web index.
|
||
|
func (s *Service) WebIndex(c context.Context, mid, vmid int64, pn, ps int32) (data *model.WebIndex, err error) {
|
||
|
data = new(model.WebIndex)
|
||
|
group, errCtx := errgroup.WithContext(c)
|
||
|
group.Go(func() error {
|
||
|
info, infoErr := s.AccInfo(errCtx, mid, vmid)
|
||
|
if infoErr != nil {
|
||
|
return infoErr
|
||
|
}
|
||
|
data.Account = info
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if setting, e := s.SettingInfo(errCtx, vmid); e == nil {
|
||
|
data.Setting = setting
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
group.Go(func() error {
|
||
|
if upArc, e := s.UpArcs(errCtx, vmid, pn, ps); e != nil {
|
||
|
data.Archive = &model.WebArc{Archives: _emptyArcItem}
|
||
|
} else {
|
||
|
arc := &model.WebArc{
|
||
|
Page: model.WebPage{Pn: pn, Ps: ps, Count: upArc.Count},
|
||
|
Archives: upArc.List,
|
||
|
}
|
||
|
data.Archive = arc
|
||
|
}
|
||
|
return nil
|
||
|
})
|
||
|
err = group.Wait()
|
||
|
return
|
||
|
}
|