123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679 |
- package space
- import (
- "context"
- "strconv"
- "time"
- "go-common/app/interface/main/app-interface/model"
- "go-common/app/interface/main/app-interface/model/audio"
- "go-common/app/interface/main/app-interface/model/bangumi"
- "go-common/app/interface/main/app-interface/model/bplus"
- "go-common/app/interface/main/app-interface/model/community"
- "go-common/app/interface/main/app-interface/model/favorite"
- "go-common/app/interface/main/app-interface/model/shop"
- "go-common/app/interface/main/app-interface/model/space"
- article "go-common/app/interface/openplatform/article/model"
- account "go-common/app/service/main/account/model"
- "go-common/app/service/main/archive/api"
- thumbup "go-common/app/service/main/thumbup/model"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- "github.com/pkg/errors"
- )
- const (
- _shopName = "的店铺"
- _businessLike = "archive"
- )
- // Space aggregation space data.
- func (s *Service) Space(c context.Context, mid, vmid int64, plat int8, build int, pn, ps int, platform, device, mobiApp, name string, now time.Time) (sp *space.Space, err error) {
- if _, ok := s.BlackList[vmid]; ok {
- err = ecode.NothingFound
- return
- }
- sp = &space.Space{}
- // get card
- card, err := s.card(c, vmid, name)
- if err != nil {
- if ecode.String(errors.Cause(err).Error()) == ecode.UserNotExist || vmid < 1 {
- err = ecode.NothingFound
- return
- }
- sp.Card = &space.Card{Mid: strconv.FormatInt(vmid, 10)}
- log.Error("%+v", err)
- } else if card == nil {
- log.Warn("space mid(%d) vmid(%d) name(%s) plat(%s) device(%s) card is nil", mid, vmid, name, platform, device)
- err = ecode.NothingFound
- return
- } else {
- if card.Mid == "" {
- err = ecode.NothingFound
- return
- }
- if vmid > 0 && card.Mid != strconv.FormatInt(vmid, 10) {
- err = ecode.NothingFound
- return
- }
- if vmid < 1 {
- if vmid, _ = strconv.ParseInt(card.Mid, 10, 64); vmid < 1 {
- err = ecode.NothingFound
- return
- }
- }
- sp.Card = card
- // ignore some card field
- sp.Card.Rank = ""
- sp.Card.DisplayRank = ""
- sp.Card.Regtime = 0
- sp.Card.Spacesta = 0
- sp.Card.Birthday = ""
- sp.Card.Place = ""
- sp.Card.Article = 0
- sp.Card.Friend = 0
- sp.Card.Attentions = nil
- sp.Card.Pendant.Pid = 0
- sp.Card.Pendant.Image = ""
- sp.Card.Pendant.Expire = 0
- sp.Card.Nameplate.Nid = 0
- sp.Card.Nameplate.Name = ""
- sp.Card.Nameplate.Image = ""
- sp.Card.Nameplate.ImageSmall = ""
- sp.Card.Nameplate.Level = ""
- sp.Card.Nameplate.Condition = ""
- }
- // space
- g, ctx := errgroup.WithContext(c)
- g.Go(func() error {
- sp.Space, _ = s.spcDao.SpaceMob(ctx, mid, vmid, platform, device)
- return nil
- })
- g.Go(func() error {
- sp.Card.FansGroup, _ = s.bplusDao.GroupsCount(ctx, mid, vmid)
- return nil
- })
- g.Go(func() (err error) {
- cardm, err := s.audioDao.Card(ctx, vmid)
- if err != nil {
- log.Error("%+v", err)
- err = nil
- return
- }
- if card, ok := cardm[vmid]; ok && card.Type == 1 && card.Status == 1 {
- sp.Card.Audio = 1
- }
- return
- })
- if vmid == mid {
- g.Go(func() (err error) {
- if sp.Card.FansUnread, err = s.relDao.FollowersUnread(ctx, vmid); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return
- })
- }
- g.Go(func() (err error) {
- cert, err := s.audioDao.UpperCert(ctx, vmid)
- if err != nil {
- log.Error("%+v", err)
- err = nil
- return
- }
- if cert == nil || cert.Cert == nil || cert.Cert.Type == -1 || cert.Cert.Desc == "" {
- return
- }
- if sp.Card.OfficialVerify.Type == -1 {
- sp.Card.OfficialVerify.Type = int8(cert.Cert.Type)
- }
- if sp.Card.OfficialVerify.Desc != "" {
- sp.Card.OfficialVerify.Desc = sp.Card.OfficialVerify.Desc + "、" + cert.Cert.Desc
- } else {
- sp.Card.OfficialVerify.Desc = cert.Cert.Desc
- }
- return
- })
- // iOS蓝版 强行去除充电模块
- if model.IsIPhone(plat) && (build >= 7000 && build <= 8000) {
- sp.Elec = nil
- } else {
- // elec rank
- g.Go(func() (err error) {
- info, err := s.elecDao.Info(ctx, vmid, mid)
- if err != nil {
- log.Error("%+v", err)
- err = nil
- return
- }
- if info != nil {
- info.Show = true
- sp.Elec = info
- }
- return
- })
- }
- g.Go(func() error {
- rel, _ := s.accDao.RichRelations3(ctx, mid, vmid)
- // -999:无关系, -1:我已经拉黑该用户, 0:我悄悄关注了该用户, 1:我公开关注了该用户
- // 1- 悄悄关注 2 关注 6-好友 128-拉黑
- if rel == 1 {
- sp.Relation = 0
- } else if rel == 2 || rel == 6 {
- sp.Relation = 1
- } else if rel >= 128 {
- sp.Relation = -1
- } else {
- sp.Relation = -999
- }
- return nil
- })
- g.Go(func() (err error) {
- if sp.Medal, err = s.liveDao.MedalStatus(ctx, vmid); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return
- })
- // g.Go(func() (err error) {
- // if sp.Attention, err = s.relDao.Attention(ctx, mid, vmid); err != nil {
- // log.Error("%+v", err)
- // err = nil
- // }
- // return
- // })
- g.Go(func() (err error) {
- if sp.Live, err = s.liveDao.Live(ctx, vmid, platform); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return
- })
- sp.Tab = &space.Tab{}
- // up archives
- g.Go(func() error {
- sp.Archive = s.UpArcs(ctx, vmid, pn, ps, now)
- if sp.Archive != nil && len(sp.Archive.Item) > 0 {
- sp.Tab.Archive = true
- }
- return nil
- })
- g.Go(func() (err error) {
- if sp.Tab.Dynamic, err = s.bplusDao.Dynamic(ctx, vmid); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return
- })
- g.Go(func() error {
- sp.Article = s.UpArticles(ctx, vmid, 0, 3)
- if sp.Article != nil && len(sp.Article.Item) != 0 {
- sp.Tab.Article = true
- }
- return nil
- })
- g.Go(func() error {
- sp.Clip = s.upClips(ctx, vmid)
- if sp.Clip != nil && len(sp.Clip.Item) != 0 {
- sp.Tab.Clip = true
- }
- return nil
- })
- g.Go(func() error {
- sp.Album = s.upAlbums(ctx, vmid)
- if sp.Album != nil && len(sp.Album.Item) != 0 {
- sp.Tab.Album = true
- }
- return nil
- })
- g.Go(func() error {
- sp.Audios = s.audios(ctx, vmid, 1, 3)
- if sp.Audios != nil && len(sp.Audios.Item) != 0 {
- sp.Tab.Audios = true
- }
- return nil
- })
- g.Go(func() (err error) {
- var info *shop.Info
- if info, err = s.shopDao.Info(ctx, vmid, mobiApp, device, build); err != nil {
- log.Error("%+v", err)
- err = nil
- return
- }
- if info != nil && info.Shop != nil && info.Shop.Status == 2 {
- sp.Tab.Shop = true
- sp.Shop = &space.Shop{ID: info.Shop.ID, Name: info.Shop.Name + _shopName}
- }
- return
- })
- if sp.Setting, err = s.spcDao.Setting(c, vmid); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- if sp.Setting == nil {
- err = g.Wait()
- return
- }
- g.Go(func() error {
- sp.Favourite = s.favFolders(ctx, mid, vmid, sp.Setting, plat, build, mobiApp)
- if sp.Favourite != nil && len(sp.Favourite.Item) != 0 {
- sp.Tab.Favorite = true
- }
- return nil
- })
- g.Go(func() error {
- sp.Season = s.Bangumi(ctx, mid, vmid, sp.Setting, pn, ps)
- if sp.Season != nil && len(sp.Season.Item) != 0 {
- sp.Tab.Bangumi = true
- }
- return nil
- })
- g.Go(func() error {
- sp.CoinArc = s.CoinArcs(ctx, mid, vmid, sp.Setting, pn, ps)
- if sp.CoinArc != nil && len(sp.CoinArc.Item) != 0 {
- sp.Tab.Coin = true
- }
- return nil
- })
- g.Go(func() error {
- sp.LikeArc = s.LikeArcs(ctx, mid, vmid, sp.Setting, pn, ps)
- if sp.LikeArc != nil && len(sp.LikeArc.Item) != 0 {
- sp.Tab.Like = true
- }
- return nil
- })
- err = g.Wait()
- return
- }
- // UpArcs get upload archive .
- func (s *Service) UpArcs(c context.Context, uid int64, pn, ps int, now time.Time) (res *space.ArcList) {
- var (
- arcs []*api.Arc
- err error
- )
- res = &space.ArcList{Item: []*space.ArcItem{}}
- if res.Count, err = s.arcDao.UpCount2(c, uid); err != nil {
- log.Error("%+v", err)
- }
- if arcs, err = s.arcDao.UpArcs3(c, uid, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(arcs) != 0 {
- res.Item = make([]*space.ArcItem, 0, len(arcs))
- for _, v := range arcs {
- si := &space.ArcItem{}
- si.FromArc(v)
- res.Item = append(res.Item, si)
- }
- }
- return
- }
- // UpArticles get article.
- func (s *Service) UpArticles(c context.Context, uid int64, pn, ps int) (res *space.ArticleList) {
- res = &space.ArticleList{Item: []*space.ArticleItem{}, Lists: []*article.List{}}
- g, ctx := errgroup.WithContext(c)
- g.Go(func() (err error) {
- var ams []*article.Meta
- if ams, res.Count, err = s.artDao.UpArticles(ctx, uid, pn, ps); err != nil {
- return err
- }
- if len(ams) != 0 {
- res.Item = make([]*space.ArticleItem, 0, len(ams))
- for _, v := range ams {
- if v.AttrVal(article.AttrBitNoDistribute) {
- continue
- }
- si := &space.ArticleItem{}
- si.FromArticle(v)
- res.Item = append(res.Item, si)
- }
- }
- return err
- })
- g.Go(func() (err error) {
- var lists []*article.List
- lists, res.ListsCount, err = s.artDao.UpLists(c, uid)
- if err != nil {
- return err
- }
- if len(lists) > 0 {
- res.Lists = lists
- }
- return err
- })
- if err := g.Wait(); err != nil {
- log.Error("%+v", err)
- }
- return
- }
- // favFolders get favorite folders
- func (s *Service) favFolders(c context.Context, mid, vmid int64, setting *space.Setting, plat int8, build int, mobiApp string) (res *space.FavList) {
- const (
- _oldAndroidBuild = 427100
- _oldIOSBuild = 3910
- )
- var (
- fs []*favorite.Folder
- err error
- )
- res = &space.FavList{Item: []*favorite.Folder{}}
- if mid != vmid {
- if setting == nil {
- setting, err = s.spcDao.Setting(c, vmid)
- if err != nil {
- log.Error("%+v", err)
- return
- }
- }
- if setting.FavVideo != 1 {
- return
- }
- }
- var mediaList bool
- // 双端版本号限制,符合此条件显示为“默认收藏夹”:
- // iPhone <5.36.1(8300) 或iPhone>5.36.1(8300)
- // Android <5360001或Android>5361000
- // 双端版本号限制,符合此条件显示为“默认播单”:
- // iPhone=5.36.1(8300)
- // 5360001 <=Android <=5361000
- if (plat == model.PlatIPhone && build == 8300) || (plat == model.PlatAndroid && build >= 5360001 && build <= 5361000) {
- mediaList = true
- }
- if fs, err = s.favDao.Folders(c, mid, vmid, mobiApp, build, mediaList); err != nil {
- log.Error("%+v", err)
- return
- }
- for _, v := range fs {
- if ((plat == model.PlatAndroid || plat == model.PlatAndroidG) && build <= _oldAndroidBuild) || ((plat == model.PlatIPhone || plat == model.PlatIPhoneI) && build <= _oldIOSBuild) {
- v.Videos = v.Cover
- v.Cover = nil
- }
- }
- res.Item = fs
- res.Count = len(fs)
- return
- }
- // Bangumi get concern season
- func (s *Service) Bangumi(c context.Context, mid, vmid int64, setting *space.Setting, pn, ps int) (res *space.BangumiList) {
- var (
- seasons []*bangumi.Season
- err error
- )
- res = &space.BangumiList{Item: []*space.BangumiItem{}}
- if mid != vmid {
- if setting == nil {
- setting, err = s.spcDao.Setting(c, vmid)
- if err != nil {
- log.Error("%+v", err)
- return
- }
- }
- if setting.Bangumi != 1 {
- return
- }
- }
- if seasons, res.Count, err = s.bgmDao.Concern(c, mid, vmid, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(seasons) != 0 {
- res.Item = make([]*space.BangumiItem, 0, len(seasons))
- for _, v := range seasons {
- si := &space.BangumiItem{}
- si.FromSeason(v)
- res.Item = append(res.Item, si)
- }
- }
- return
- }
- // Community get community
- func (s *Service) Community(c context.Context, uid int64, pn, ps int, ak, platform string) (res *space.CommuList) {
- var (
- comm []*community.Community
- err error
- )
- res = &space.CommuList{Item: []*space.CommItem{}}
- if comm, res.Count, err = s.commDao.Community(c, uid, ak, platform, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(comm) != 0 {
- res.Item = make([]*space.CommItem, 0, len(comm))
- for _, v := range comm {
- si := &space.CommItem{}
- si.FromCommunity(v)
- res.Item = append(res.Item, si)
- }
- }
- return
- }
- // CoinArcs get coin archives.
- func (s *Service) CoinArcs(c context.Context, mid, vmid int64, setting *space.Setting, pn, ps int) (res *space.ArcList) {
- var (
- coins []*api.Arc
- err error
- )
- res = &space.ArcList{Item: []*space.ArcItem{}}
- if mid != vmid {
- if setting == nil {
- setting, err = s.spcDao.Setting(c, vmid)
- if err != nil {
- log.Error("%+v", err)
- return
- }
- }
- if setting.CoinsVideo != 1 {
- return
- }
- }
- if coins, res.Count, err = s.coinDao.CoinList(c, vmid, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(coins) != 0 {
- res.Item = make([]*space.ArcItem, 0, len(coins))
- for _, v := range coins {
- si := &space.ArcItem{}
- si.FromCoinArc(v)
- res.Item = append(res.Item, si)
- }
- }
- return
- }
- // LikeArcs get like archives.
- func (s *Service) LikeArcs(c context.Context, mid, vmid int64, setting *space.Setting, pn, ps int) (res *space.ArcList) {
- var (
- likes []*thumbup.ItemLikeRecord
- err error
- )
- res = &space.ArcList{Item: []*space.ArcItem{}}
- if mid != vmid {
- if setting == nil {
- setting, err = s.spcDao.Setting(c, vmid)
- if err != nil {
- log.Error("%+v", err)
- return
- }
- }
- if setting.LikesVideo != 1 {
- return
- }
- }
- if likes, res.Count, err = s.thumbupDao.UserTotalLike(c, vmid, _businessLike, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(likes) != 0 {
- aids := make([]int64, 0, len(likes))
- for _, v := range likes {
- aids = append(aids, v.MessageID)
- }
- var as map[int64]*api.Arc
- if as, err = s.arcDao.Archives2(c, aids); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(as) == 0 {
- return
- }
- res.Item = make([]*space.ArcItem, 0, len(as))
- for _, v := range likes {
- if a, ok := as[v.MessageID]; ok {
- si := &space.ArcItem{}
- si.FromLikeArc(a)
- res.Item = append(res.Item, si)
- }
- }
- }
- return
- }
- func (s *Service) upClips(c context.Context, uid int64) (res *space.ClipList) {
- var (
- clips []*bplus.Clip
- err error
- )
- res = &space.ClipList{Item: []*space.Item{}}
- if clips, res.Count, err = s.bplusDao.AllClip(c, uid, 200); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(clips) != 0 {
- res.Item = make([]*space.Item, 0, len(clips))
- for k, v := range clips {
- si := &space.Item{}
- si.FromClip(v)
- res.Item = append(res.Item, si)
- if k == 1 {
- break
- }
- }
- }
- return
- }
- func (s *Service) upAlbums(c context.Context, uid int64) (res *space.AlbumList) {
- var (
- album []*bplus.Album
- err error
- )
- res = &space.AlbumList{Item: []*space.Item{}}
- if album, res.Count, err = s.bplusDao.AllAlbum(c, uid, 6); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(album) != 0 {
- res.Item = make([]*space.Item, 0, len(album))
- for k, v := range album {
- si := &space.Item{}
- si.FromAlbum(v)
- res.Item = append(res.Item, si)
- if k == 5 {
- break
- }
- }
- }
- return
- }
- // card get card by mid, vmid or name.
- func (s *Service) card(c context.Context, vmid int64, name string) (scard *space.Card, err error) {
- scard = &space.Card{}
- var profile *account.ProfileStat
- if vmid > 0 {
- profile, err = s.accDao.Profile3(c, vmid)
- } else if name != "" {
- profile, err = s.accDao.ProfileByName3(c, name)
- }
- if err != nil {
- err = errors.Wrapf(err, "%v,%v", vmid, name)
- return
- }
- scard.Mid = strconv.FormatInt(profile.Mid, 10)
- scard.Name = profile.Name
- // scard.Approve =
- scard.Sex = profile.Sex
- scard.Rank = strconv.FormatInt(int64(profile.Rank), 10)
- scard.Face = profile.Face
- scard.DisplayRank = strconv.FormatInt(int64(profile.Rank), 10)
- // scard.Regtime =
- if profile.Silence == 1 {
- scard.Spacesta = -2
- }
- // scard.Birthday =
- // scard.Place =
- scard.Description = profile.Official.Desc
- scard.Article = 0
- scard.Attentions = []int64{}
- scard.Fans = int(profile.Follower)
- // scard.Friend = profile.Following
- scard.Attention = int(profile.Following)
- scard.Sign = profile.Sign
- scard.LevelInfo.Cur = profile.Level
- scard.LevelInfo.Min = profile.LevelExp.Min
- scard.LevelInfo.NowExp = profile.LevelExp.NowExp
- scard.LevelInfo.NextExp = profile.LevelExp.NextExp
- if profile.LevelExp.NextExp == -1 {
- scard.LevelInfo.NextExp = "--"
- }
- scard.Pendant.Pid = profile.Pendant.Pid
- scard.Pendant.Name = profile.Pendant.Name
- scard.Pendant.Image = profile.Pendant.Image
- scard.Pendant.Expire = profile.Pendant.Expire
- scard.OfficialVerify.Role = profile.Official.Role
- scard.OfficialVerify.Title = profile.Official.Title
- if profile.Official.Role == 0 {
- scard.OfficialVerify.Type = -1
- } else {
- if profile.Official.Role <= 2 {
- scard.OfficialVerify.Type = 0
- } else {
- scard.OfficialVerify.Type = 1
- }
- scard.OfficialVerify.Desc = profile.Official.Title
- }
- scard.Vip.Type = int(profile.Vip.Type)
- scard.Vip.VipStatus = int(profile.Vip.Status)
- scard.Vip.DueDate = profile.Vip.DueDate
- // scard.FansGroup =
- // scard.Audio =
- // scard.FansUnread =
- return
- }
- // audios
- func (s *Service) audios(c context.Context, mid int64, pn, ps int) (res *space.AudioList) {
- var (
- audios []*audio.Audio
- err error
- )
- res = &space.AudioList{Item: []*space.AudioItem{}}
- if audios, res.Count, err = s.audioDao.Audios(c, mid, pn, ps); err != nil {
- log.Error("%+v", err)
- return
- }
- if len(audios) != 0 {
- res.Item = make([]*space.AudioItem, 0, len(audios))
- for _, v := range audios {
- si := &space.AudioItem{}
- si.FromAudio(v)
- res.Item = append(res.Item, si)
- }
- }
- return
- }
- // Report func
- func (s *Service) Report(c context.Context, mid int64, reason, ak string) (err error) {
- return s.spcDao.Report(c, mid, reason, ak)
- }
|