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.
219 lines
5.5 KiB
219 lines
5.5 KiB
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) |
|
}
|
|
|