142 lines
3.7 KiB
Go
142 lines
3.7 KiB
Go
|
package v1
|
||
|
|
||
|
import (
|
||
|
"context"
|
||
|
"github.com/pkg/errors"
|
||
|
pb "go-common/app/interface/live/web-ucenter/api/http"
|
||
|
"go-common/app/interface/live/web-ucenter/conf"
|
||
|
"go-common/app/interface/live/web-ucenter/dao/user"
|
||
|
"go-common/app/interface/live/web-ucenter/model"
|
||
|
"go-common/library/log"
|
||
|
"go-common/library/net/metadata"
|
||
|
"go-common/library/sync/errgroup"
|
||
|
"strings"
|
||
|
)
|
||
|
|
||
|
// UserService user service
|
||
|
type UserService struct {
|
||
|
c *conf.Config
|
||
|
dao *user.Dao
|
||
|
}
|
||
|
|
||
|
// NewUserService new user service
|
||
|
func NewUserService(c *conf.Config) (s *UserService) {
|
||
|
s = &UserService{
|
||
|
c: c,
|
||
|
dao: user.New(c),
|
||
|
}
|
||
|
return s
|
||
|
}
|
||
|
|
||
|
// GetUserInfo implementation
|
||
|
// 根据uid查询用户信息
|
||
|
// `midware:"auth"`,需要登录态
|
||
|
func (s *UserService) GetUserInfo(ctx context.Context, req *pb.GetInfoReq) (resp *pb.GetInfoResp, err error) {
|
||
|
var (
|
||
|
group, errCtx = errgroup.WithContext(ctx)
|
||
|
userExp int64
|
||
|
userRank string
|
||
|
)
|
||
|
// check login
|
||
|
uid := metadata.Int64(ctx, metadata.Mid)
|
||
|
if uid == 0 {
|
||
|
err = errors.Wrap(err, "请先登录")
|
||
|
return
|
||
|
}
|
||
|
platform := checkPlatform(req.Platform)
|
||
|
|
||
|
resp = &pb.GetInfoResp{
|
||
|
Uid: uid,
|
||
|
UserCharged: 0,
|
||
|
}
|
||
|
|
||
|
// 并行获取account / xuser.vip / xuser.exp / wallet / rc / rankdb
|
||
|
func() {
|
||
|
// account.ProfileWithStat3
|
||
|
group.Go(func() (err error) {
|
||
|
profile, err := s.dao.GetAccountProfile(errCtx, uid)
|
||
|
if err != nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetAccountProfile error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
resp.Uname = profile.Name
|
||
|
resp.Face = strings.Replace(profile.Face, "http://", "https://", 1)
|
||
|
resp.Coin = profile.Coins
|
||
|
return
|
||
|
})
|
||
|
// wallet
|
||
|
group.Go(func() (err error) {
|
||
|
silver, gold, err := s.dao.GetWallet(errCtx, uid, platform)
|
||
|
if err != nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetWallet error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
resp.Silver = silver
|
||
|
resp.Gold = gold
|
||
|
return
|
||
|
})
|
||
|
// xuser.vip
|
||
|
group.Go(func() (err error) {
|
||
|
vipInfo, err := s.dao.GetLiveVip(errCtx, uid)
|
||
|
if err != nil || vipInfo == nil || vipInfo.Info == nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetLiveVip error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
resp.Vip = vipInfo.Info.Vip
|
||
|
resp.Svip = vipInfo.Info.Svip
|
||
|
return
|
||
|
})
|
||
|
// xuser.exp
|
||
|
group.Go(func() (err error) {
|
||
|
expInfo, err := s.dao.GetLiveExp(errCtx, uid)
|
||
|
if err != nil || expInfo == nil || expInfo.UserLevel == nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetLiveExp error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
userExp = expInfo.UserLevel.UserExp
|
||
|
resp.UserLevel = expInfo.UserLevel.Level
|
||
|
resp.UserNextLevel = expInfo.UserLevel.NextLevel
|
||
|
resp.UserIntimacy = expInfo.UserLevel.UserExp - expInfo.UserLevel.UserExpLeft
|
||
|
resp.UserNextIntimacy = expInfo.UserLevel.UserExpNextLevel
|
||
|
resp.IsLevelTop = expInfo.UserLevel.IsLevelTop
|
||
|
return
|
||
|
})
|
||
|
// rc
|
||
|
group.Go(func() (err error) {
|
||
|
achieve, err := s.dao.GetLiveAchieve(errCtx, uid)
|
||
|
if err != nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetLiveAchieve error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
resp.Achieve = achieve
|
||
|
return
|
||
|
})
|
||
|
// rankdb
|
||
|
group.Go(func() (err error) {
|
||
|
if userRank, err = s.dao.GetLiveRank(errCtx, uid); err != nil {
|
||
|
log.Error("[service.v1.user|GetUserInfo] GetLiveRank error(%v), uid(%d)", err, uid)
|
||
|
return nil
|
||
|
}
|
||
|
return
|
||
|
})
|
||
|
}()
|
||
|
group.Wait()
|
||
|
|
||
|
// 根据exp & rankdb 判断组装返回的user_level_rank字段
|
||
|
if userExp < 120000000 {
|
||
|
resp.UserLevelRank = ">50000"
|
||
|
} else {
|
||
|
resp.UserLevelRank = userRank
|
||
|
}
|
||
|
|
||
|
log.Info("GetUserInfo.resp(%v)", resp)
|
||
|
return
|
||
|
}
|
||
|
|
||
|
func checkPlatform(p string) string {
|
||
|
if p == "" || (p != model.PlatformIos && p != model.PlatformAndroid) {
|
||
|
return model.PlatformPc
|
||
|
}
|
||
|
return p
|
||
|
}
|