123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382 |
- 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
- }
|