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.
166 lines
3.7 KiB
166 lines
3.7 KiB
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 |
|
}
|
|
|