123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166 |
- package relation
- import (
- "context"
- "fmt"
- "hash/crc32"
- "sort"
- "go-common/app/interface/main/app-interface/model/live"
- model "go-common/app/interface/main/app-interface/model/relation"
- account "go-common/app/service/main/account/model"
- relation "go-common/app/service/main/relation/model"
- "go-common/library/ecode"
- "go-common/library/log"
- "go-common/library/sync/errgroup"
- )
- var (
- _emptyFollowings = []*model.Following{}
- _emptyTagInfos = []*model.Tag{}
- )
- // Followings get user followings list.
- func (s *Service) Followings(c context.Context, vmid, mid int64, pn, ps int, version uint64, order string) (f []*model.Following, crc32v uint32, total int, err error) {
- res, err := s.relDao.Followings(c, vmid)
- if err != nil {
- return
- }
- total = len(res)
- if order == "asc" {
- sort.Sort(model.ByMTime(res))
- }
- start, end := (pn-1)*ps, pn*ps
- switch {
- case start >= len(res):
- res = res[:0]
- case end >= len(res):
- res = res[start:]
- default:
- res = res[start:end]
- }
- if len(res) == 0 {
- f = _emptyFollowings
- return
- }
- data := []byte(fmt.Sprintf("%s", res))
- crc32v = crc32.Checksum(data, crc32.IEEETable)
- if uint64(crc32v) == version {
- err = ecode.NotModified
- return
- }
- var fids []int64
- for _, r := range res {
- fids = append(fids, r.Mid)
- }
- var (
- flm map[int64]*relation.Following
- cardm map[int64]*account.Card
- sm map[int64]*live.Status
- )
- g, ctx := errgroup.WithContext(c)
- g.Go(func() (err error) {
- cardm, err = s.accDao.Cards3(ctx, fids)
- return
- })
- // !self, compute !self user and up's followings' attr
- if mid != vmid && mid != 0 {
- g.Go(func() (err error) {
- if flm, err = s.relDao.Relations(ctx, mid, fids); err != nil {
- log.Error("%+v", err)
- err = nil
- }
- return
- })
- }
- g.Go(func() error {
- sm, _ = s.liveDao.StatusInfo(ctx, fids)
- return nil
- })
- if err = g.Wait(); err != nil {
- log.Error("%+v", err)
- return
- }
- f = make([]*model.Following, 0, len(res))
- for _, r := range res {
- fl := &model.Following{Following: r}
- if _, ok := cardm[r.Mid]; ok {
- fl.Face = cardm[r.Mid].Face
- fl.Uname = cardm[r.Mid].Name
- fl.Sign = cardm[r.Mid].Sign
- if mid != vmid {
- if f, ok := flm[r.Mid]; ok {
- fl.Attribute = f.Attribute
- } else {
- fl.Attribute = relation.AttrNoRelation
- }
- }
- fl.OfficialVerify = cardm[r.Mid].Official
- fl.Vip.Type = int(cardm[r.Mid].Vip.Type)
- fl.Vip.VipStatus = int(cardm[r.Mid].Vip.Status)
- fl.Vip.DueDate = cardm[r.Mid].Vip.DueDate
- if status, ok := sm[r.Mid]; ok {
- fl.Live = status.LiveStatus
- }
- }
- f = append(f, fl)
- }
- return
- }
- func (s *Service) Tag(c context.Context, mid, tid int64, pn, ps int) (t []*model.Tag, err error) {
- mids, err := s.relDao.Tag(c, mid, tid)
- if err != nil {
- return
- }
- start, end := (pn-1)*ps, pn*ps
- switch {
- case start >= len(mids):
- mids = mids[:0]
- case end >= len(mids):
- mids = mids[start:]
- default:
- mids = mids[start:end]
- }
- if len(mids) == 0 {
- t = _emptyTagInfos
- return
- }
- var (
- cardm map[int64]*account.Card
- sm map[int64]*live.Status
- )
- g, ctx := errgroup.WithContext(c)
- g.Go(func() (err error) {
- cardm, err = s.accDao.Cards3(ctx, mids)
- return
- })
- g.Go(func() error {
- sm, _ = s.liveDao.StatusInfo(ctx, mids)
- return nil
- })
- if err = g.Wait(); err != nil {
- log.Error("%+v", err)
- return
- }
- t = make([]*model.Tag, 0, len(mids))
- for _, mid = range mids {
- tag := &model.Tag{Mid: mid}
- if _, ok := cardm[mid]; ok {
- tag.Mid = mid
- tag.Face = cardm[mid].Face
- tag.Uname = cardm[mid].Name
- tag.Sign = cardm[mid].Sign
- tag.OfficialVerify = cardm[mid].Official
- tag.Vip.Type = int(cardm[mid].Vip.Type)
- tag.Vip.VipStatus = int(cardm[mid].Vip.Status)
- tag.Vip.DueDate = cardm[mid].Vip.DueDate
- }
- if status, ok := sm[mid]; ok {
- tag.Live = status.LiveStatus
- }
- t = append(t, tag)
- }
- return
- }
|