220 lines
5.5 KiB
Go
220 lines
5.5 KiB
Go
package account
|
||
|
||
import (
|
||
"context"
|
||
"go-common/library/log"
|
||
"go-common/library/net/metadata"
|
||
"go-common/library/sync/errgroup"
|
||
"time"
|
||
|
||
accmdl "go-common/app/interface/main/creative/model/account"
|
||
account "go-common/app/service/main/account/model"
|
||
"go-common/library/ecode"
|
||
xtime "go-common/library/time"
|
||
"sync"
|
||
)
|
||
|
||
const creatorMID = 37090048
|
||
|
||
// MyInfo get use level.
|
||
func (s *Service) MyInfo(c context.Context, mid int64, ip string, now time.Time) (m *accmdl.MyInfo, err error) {
|
||
var (
|
||
idCkCode = 0
|
||
res *account.Profile
|
||
)
|
||
// init myinfo
|
||
m = &accmdl.MyInfo{
|
||
Mid: mid,
|
||
Level: 1,
|
||
Activated: true,
|
||
Deftime: xtime.Time(now.Add(time.Duration(14400) * time.Second).Unix()),
|
||
DeftimeEnd: xtime.Time(now.Add(time.Duration(15*24) * time.Hour).Unix()),
|
||
DeftimeMsg: ecode.String(ecode.VideoupDelayTimeErr.Error()).Message(),
|
||
IdentifyInfo: &accmdl.IdentifyInfo{
|
||
Code: idCkCode,
|
||
Msg: accmdl.IdentifyEnum[idCkCode],
|
||
},
|
||
UploadSize: map[string]bool{
|
||
"4-8": false,
|
||
"8-16": false,
|
||
},
|
||
DmSubtitle: true,
|
||
}
|
||
if res, err = s.acc.Profile(c, mid, ip); err != nil {
|
||
log.Error("s.acc.Profile (%d) error(%v)", mid, err)
|
||
return
|
||
}
|
||
if res == nil {
|
||
err = ecode.NothingFound
|
||
return
|
||
}
|
||
if res.Silence == 1 {
|
||
m.Banned = true
|
||
}
|
||
if res.EmailStatus == 1 || res.TelStatus == 1 {
|
||
m.Activated = true
|
||
}
|
||
m.Name = res.Name
|
||
m.Face = res.Face
|
||
m.Level = int(res.Level)
|
||
if _, ok := s.exemptIDCheckUps[mid]; ok {
|
||
log.Info("s.exemptIDCheckUps (%d) info(%v)", mid, s.exemptIDCheckUps)
|
||
idCkCode = 0
|
||
} else {
|
||
idCkCode, _ = s.acc.IdentifyInfo(c, mid, 0, ip)
|
||
}
|
||
m.IdentifyInfo.Code = idCkCode
|
||
m.IdentifyInfo.Msg = accmdl.IdentifyEnum[idCkCode] // NOTE: exist check
|
||
m = s.ignoreLevelUpAndActivated(m, mid, s.exemptZeroLevelAndAnswerUps)
|
||
if _, ok := s.uploadTopSizeUps[mid]; ok {
|
||
m.UploadSize["4-8"] = true
|
||
m.UploadSize["8-16"] = true
|
||
}
|
||
return
|
||
}
|
||
|
||
// type为12的白名单人员,免账号激活,免账号升级到1级
|
||
func (s *Service) ignoreLevelUpAndActivated(m *accmdl.MyInfo, mid int64, exemptZeroLevelAndAnswerUps map[int64]int64) *accmdl.MyInfo {
|
||
if len(exemptZeroLevelAndAnswerUps) > 0 {
|
||
_, ok := exemptZeroLevelAndAnswerUps[mid]
|
||
if ok && (m.Level < 1 || !m.Activated) {
|
||
m.Activated = true
|
||
m.Level = 1
|
||
}
|
||
}
|
||
return m
|
||
}
|
||
|
||
// UpInfo get video article pic blink up infos.
|
||
func (s *Service) UpInfo(c context.Context, mid int64, ip string) (v *accmdl.UpInfo, err error) {
|
||
cache := true
|
||
if v, err = s.acc.UpInfoCache(c, mid); err != nil {
|
||
s.pCacheMiss.Incr("upinfo_cache")
|
||
err = nil
|
||
cache = false
|
||
} else if v != nil {
|
||
s.pCacheHit.Incr("upinfo_cache")
|
||
return
|
||
}
|
||
s.pCacheMiss.Incr("upinfo_cache")
|
||
var (
|
||
g = &errgroup.Group{}
|
||
ctx = context.TODO()
|
||
)
|
||
v = &accmdl.UpInfo{
|
||
Archive: accmdl.NotUp,
|
||
Article: accmdl.NotUp,
|
||
Pic: accmdl.NotUp,
|
||
Blink: accmdl.NotUp,
|
||
}
|
||
g.Go(func() error {
|
||
blikCnt, _ := s.acc.Blink(ctx, mid, ip)
|
||
if blikCnt > 0 {
|
||
v.Blink = accmdl.IsUp
|
||
}
|
||
return nil
|
||
})
|
||
g.Go(func() error {
|
||
picCnt, _ := s.acc.Pic(c, mid, ip)
|
||
if picCnt > 0 {
|
||
v.Pic = accmdl.IsUp
|
||
}
|
||
return nil
|
||
})
|
||
g.Go(func() error {
|
||
arcCnt, _ := s.archive.UpCount(c, mid)
|
||
if arcCnt > 0 {
|
||
v.Archive = accmdl.IsUp
|
||
}
|
||
return nil
|
||
})
|
||
g.Go(func() error {
|
||
isAuthor, _ := s.article.IsAuthor(c, mid, ip)
|
||
if isAuthor {
|
||
v.Article = accmdl.IsUp
|
||
}
|
||
return nil
|
||
})
|
||
g.Wait()
|
||
if cache {
|
||
s.addCache(func() {
|
||
s.acc.AddUpInfoCache(context.Background(), mid, v)
|
||
})
|
||
}
|
||
return
|
||
}
|
||
|
||
// RecFollows 推荐关注
|
||
func (s *Service) RecFollows(c context.Context, mid int64) (fs []*accmdl.Friend, err error) {
|
||
var (
|
||
fsMids = []int64{creatorMID}
|
||
shouldFollowMids = []int64{}
|
||
infos = make(map[int64]*account.Info)
|
||
)
|
||
ip := metadata.String(c, metadata.RemoteIP)
|
||
if shouldFollowMids, err = s.acc.ShouldFollow(c, mid, fsMids, ip); err != nil {
|
||
log.Error("s.acc.ShouldFollow mid(%d)|ip(%s)|error(%v)", mid, ip, err)
|
||
return
|
||
}
|
||
if len(shouldFollowMids) > 0 {
|
||
if infos, err = s.acc.Infos(c, shouldFollowMids, ip); err != nil {
|
||
log.Error("s.acc.Infos mid(%d)|ip(%s)|shouldFollowMids(%+v)|error(%v)", mid, ip, shouldFollowMids, err)
|
||
return
|
||
}
|
||
for mid, info := range infos {
|
||
f := &accmdl.Friend{
|
||
Mid: mid,
|
||
Sign: info.Sign,
|
||
Face: info.Face,
|
||
Name: info.Name,
|
||
}
|
||
if mid == creatorMID {
|
||
f.Comment = "关注创作中心,获取更多创作情报"
|
||
f.ShouldFollow = 0
|
||
}
|
||
fs = append(fs, f)
|
||
}
|
||
}
|
||
return
|
||
}
|
||
|
||
// Infos 获取多个UP主的信息
|
||
func (s *Service) Infos(c context.Context, mids []int64, ip string) (res map[int64]*account.Info, err error) {
|
||
return s.acc.Infos(c, mids, ip)
|
||
}
|
||
|
||
// Relations 批量获取mid与其它用户的关系
|
||
func (s *Service) Relations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
|
||
return s.acc.Relations(c, mid, fids, ip)
|
||
}
|
||
|
||
// FRelations 获取用户与mid的关系(Relations的反向)
|
||
func (s *Service) FRelations(c context.Context, mid int64, fids []int64, ip string) (res map[int64]int, err error) {
|
||
var (
|
||
g errgroup.Group
|
||
sm sync.RWMutex
|
||
)
|
||
res = make(map[int64]int)
|
||
for _, v := range fids {
|
||
g.Go(func() error {
|
||
var r map[int64]int
|
||
if r, err = s.acc.Relations(c, v, []int64{mid}, ip); err != nil {
|
||
return err
|
||
}
|
||
sm.Lock()
|
||
res[v] = r[mid]
|
||
sm.Unlock()
|
||
return nil
|
||
})
|
||
}
|
||
if err = g.Wait(); err != nil {
|
||
log.Error("s.FRelations(%d,%v) error(%v)", mid, fids, err)
|
||
}
|
||
return
|
||
}
|
||
|
||
// Cards 批量获取用户的Card
|
||
func (s *Service) Cards(c context.Context, mids []int64, ip string) (cards map[int64]*account.Card, err error) {
|
||
return s.acc.Cards(c, mids, ip)
|
||
}
|