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.
362 lines
8.5 KiB
362 lines
8.5 KiB
package space |
|
|
|
import ( |
|
"context" |
|
"encoding/json" |
|
"fmt" |
|
"sync" |
|
|
|
"go-common/app/interface/main/app-interface/model/space" |
|
accmdl "go-common/app/service/main/account/model" |
|
relmdl "go-common/app/service/main/relation/model" |
|
"go-common/library/log" |
|
|
|
"go-common/library/sync/errgroup.v2" |
|
) |
|
|
|
const ( |
|
_initSidebarKey = "sidebar_%d_%d" |
|
_selfCenter = 6 |
|
_mySerive = 7 |
|
_creative = 11 |
|
_ipadSelfCenter = 12 |
|
_ipadCreative = 13 |
|
) |
|
|
|
var ( |
|
iphoneMenu = map[int]string{ |
|
_creative: "创作中心", |
|
_selfCenter: "个人中心", |
|
_mySerive: "我的服务", |
|
} |
|
iphoneNormalMenu = []int{_creative, _selfCenter, _mySerive} |
|
iphoneFilterMenu = []int{_selfCenter, _mySerive} |
|
ipadNormalMenu = []int{_ipadCreative, _ipadSelfCenter} |
|
ipadFilterMenu = []int{_ipadSelfCenter} |
|
) |
|
|
|
// Mine mine center for iphone/android |
|
func (s *Service) Mine(c context.Context, mid int64, platform, filtered string, build int, plat int8) (mine *space.Mine, err error) { |
|
var whiteMap, rdMap map[int64]bool |
|
mine = new(space.Mine) |
|
mine.Official.Type = -1 |
|
if mid > 0 { |
|
if mine, whiteMap, rdMap, err = s.userInfo(c, mid, platform, plat); err != nil { |
|
return |
|
} |
|
} |
|
if platform == "ios" { |
|
mine.Sections = s.sections(c, whiteMap, rdMap, mid, build, filtered == "1", plat) |
|
} |
|
return |
|
} |
|
|
|
// MineIpad mine center for ipad |
|
func (s *Service) MineIpad(c context.Context, mid int64, platform, filtered string, build int, plat int8) (mine *space.Mine, err error) { |
|
var whiteMap, rdMap map[int64]bool |
|
mine = new(space.Mine) |
|
mine.Official.Type = -1 |
|
if mid > 0 { |
|
if mine, whiteMap, rdMap, err = s.userInfo(c, mid, platform, plat); err != nil { |
|
return |
|
} |
|
} |
|
mine.IpadSections, mine.IpadUpperSections = s.ipadSections(c, whiteMap, rdMap, mid, build, filtered == "1", plat) |
|
return |
|
} |
|
|
|
func (s *Service) userInfo(c context.Context, mid int64, platform string, plat int8) (mine *space.Mine, whiteMap, rdMap map[int64]bool, err error) { |
|
mine = new(space.Mine) |
|
whiteMap = make(map[int64]bool) |
|
rdMap = make(map[int64]bool) |
|
eg := errgroup.WithContext(c) |
|
// account userinfo |
|
eg.Go(func(ctx context.Context) (err error) { |
|
var ps *accmdl.ProfileStat |
|
if ps, err = s.accDao.Profile3(ctx, mid); err != nil { |
|
log.Error("s.accDao.UserInfo(%d) error(%v)", mid, err) |
|
return |
|
} |
|
if ps.Silence == 1 { |
|
if mine.EndTime, err = s.accDao.BlockTime(ctx, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
} |
|
} |
|
mine.Silence = ps.Silence |
|
mine.Mid = ps.Mid |
|
mine.Name = ps.Name |
|
mine.Face = ps.Face |
|
mine.Coin = ps.Coins |
|
if ps.Pendant.Image != "" { |
|
mine.Pendant = &space.Pendant{Image: ps.Pendant.Image} |
|
} |
|
switch ps.Sex { |
|
case "男": |
|
mine.Sex = 1 |
|
case "女": |
|
mine.Sex = 2 |
|
default: |
|
mine.Sex = 0 |
|
} |
|
mine.Rank = ps.Rank |
|
mine.Level = ps.Level |
|
if ps.Vip.Status == 1 { |
|
mine.VipType = ps.Vip.Type |
|
} |
|
if ps.Official.Role == 0 { |
|
mine.Official.Type = -1 |
|
} else { |
|
if ps.Official.Role <= 2 { |
|
mine.Official.Type = 0 |
|
} else { |
|
mine.Official.Type = 1 |
|
} |
|
mine.Official.Desc = ps.Official.Title |
|
} |
|
return |
|
}) |
|
// music card |
|
eg.Go(func(ctx context.Context) (err error) { |
|
cardm, err := s.audioDao.Card(ctx, mid) |
|
if err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
if card, ok := cardm[mid]; ok && card.Type == 1 && card.Status == 1 { |
|
mine.AudioType = card.Type |
|
} |
|
return |
|
}) |
|
// following and follower |
|
eg.Go(func(ctx context.Context) (err error) { |
|
var stat *relmdl.Stat |
|
if stat, err = s.relDao.Stat(ctx, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
mine.Following = stat.Following |
|
mine.Follower = stat.Follower |
|
return |
|
}) |
|
// new followers |
|
eg.Go(func(ctx context.Context) (err error) { |
|
if mine.NewFollowers, err = s.relDao.FollowersUnreadCount(ctx, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
return |
|
}) |
|
// dynamic count |
|
eg.Go(func(ctx context.Context) (err error) { |
|
var count int64 |
|
if count, err = s.bplusDao.DynamicCount(ctx, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
mine.Dynamic = count |
|
return |
|
}) |
|
// bcoin |
|
eg.Go(func(ctx context.Context) (err error) { |
|
var bp float64 |
|
if bp, err = s.payDao.UserWalletInfo(ctx, mid, platform); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
mine.BCoin = bp |
|
return |
|
}) |
|
// creative |
|
eg.Go(func(ctx context.Context) (err error) { |
|
var ( |
|
isUp int |
|
show int |
|
) |
|
if isUp, show, err = s.memberDao.Creative(ctx, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
return |
|
} |
|
mine.ShowVideoup = show |
|
mine.ShowCreative = isUp |
|
return |
|
}) |
|
if platform == "ios" { |
|
var mutex sync.Mutex |
|
//white |
|
for _, v := range s.white[plat] { |
|
tmpID := v.ID |
|
tmpURL := v.URL |
|
eg.Go(func(ctx context.Context) (err error) { |
|
ok, err := s.accDao.UserCheck(ctx, mid, tmpURL) |
|
if err != nil { |
|
log.Error("s.accDao.UserCheck error(%+v)", err) |
|
err = nil |
|
return |
|
} |
|
if ok { |
|
mutex.Lock() |
|
whiteMap[tmpID] = true |
|
mutex.Unlock() |
|
} |
|
return |
|
}) |
|
} |
|
//redDot |
|
for _, v := range s.redDot[plat] { |
|
tmpID := v.ID |
|
tmpURL := v.URL |
|
eg.Go(func(ctx context.Context) (err error) { |
|
ok, err := s.accDao.RedDot(ctx, mid, tmpURL) |
|
if err != nil { |
|
log.Error("s.accDao.RedDot error(%+v)", err) |
|
err = nil |
|
return |
|
} |
|
if ok { |
|
mutex.Lock() |
|
rdMap[tmpID] = true |
|
mutex.Unlock() |
|
} |
|
return |
|
}) |
|
} |
|
} |
|
// when account info error,return,ingore else error |
|
err = eg.Wait() |
|
return |
|
} |
|
|
|
func (s *Service) sections(c context.Context, whiteMap, rdMap map[int64]bool, mid int64, build int, filtered bool, plat int8) (sections []*space.Section) { |
|
menus := iphoneNormalMenu |
|
if filtered { |
|
menus = iphoneFilterMenu |
|
} |
|
for _, module := range menus { |
|
key := fmt.Sprintf(_initSidebarKey, plat, module) |
|
ss, ok := s.sectionCache[key] |
|
if !ok { |
|
continue |
|
} |
|
var items []*space.SectionItem |
|
for _, si := range ss { |
|
if !si.CheckLimit(build) { |
|
continue |
|
} |
|
if si.Item.Name == "离线缓存" && filtered { |
|
continue |
|
} |
|
if si.Item.WhiteURL != "" && !whiteMap[si.Item.ID] { |
|
continue |
|
} |
|
tmpItem := &space.SectionItem{ |
|
Title: si.Item.Name, |
|
Icon: si.Item.Logo, |
|
NeedLogin: si.Item.NeedLogin, |
|
URI: si.Item.Param, |
|
} |
|
if si.Item.Red != "" && rdMap[si.Item.ID] { |
|
tmpItem.RedDot = 1 |
|
} |
|
items = append(items, tmpItem) |
|
} |
|
if len(items) == 0 { |
|
continue |
|
} |
|
sections = append(sections, &space.Section{ |
|
Title: iphoneMenu[module], |
|
Items: items, |
|
}) |
|
} |
|
return |
|
} |
|
|
|
func (s *Service) ipadSections(c context.Context, whiteMap, rdMap map[int64]bool, mid int64, build int, filtered bool, plat int8) (ipadSections, ipadUpperSections []*space.SectionItem) { |
|
menus := ipadNormalMenu |
|
if filtered { |
|
menus = ipadFilterMenu |
|
} |
|
for _, module := range menus { |
|
key := fmt.Sprintf(_initSidebarKey, plat, module) |
|
ss, ok := s.sectionCache[key] |
|
if !ok { |
|
continue |
|
} |
|
for _, si := range ss { |
|
if !si.CheckLimit(build) { |
|
continue |
|
} |
|
if si.Item.Name == "离线缓存" && filtered { |
|
continue |
|
} |
|
if si.Item.WhiteURL != "" && !whiteMap[si.Item.ID] { |
|
continue |
|
} |
|
tmpItem := &space.SectionItem{ |
|
Title: si.Item.Name, |
|
Icon: si.Item.Logo, |
|
NeedLogin: si.Item.NeedLogin, |
|
URI: si.Item.Param, |
|
} |
|
if si.Item.Red != "" && rdMap[si.Item.ID] { |
|
tmpItem.RedDot = 1 |
|
} |
|
if module == _ipadCreative { |
|
ipadUpperSections = append(ipadUpperSections, tmpItem) |
|
} else { |
|
ipadSections = append(ipadSections, tmpItem) |
|
} |
|
} |
|
} |
|
return |
|
} |
|
|
|
// Myinfo simple myinfo |
|
func (s *Service) Myinfo(c context.Context, mid int64) (myinfo *space.Myinfo, err error) { |
|
var pf *accmdl.ProfileStat |
|
if pf, err = s.accDao.Profile3(c, mid); err != nil { |
|
log.Error("%+v", err) |
|
return |
|
} |
|
p, _ := json.Marshal(pf) |
|
log.Warn("myinfo mid(%d) pf(%s)", mid, p) |
|
myinfo = new(space.Myinfo) |
|
if pf.Silence == 1 { |
|
if myinfo.EndTime, err = s.accDao.BlockTime(c, mid); err != nil { |
|
log.Error("%+v", err) |
|
err = nil |
|
} |
|
} |
|
myinfo.Coins = pf.Coins |
|
myinfo.Sign = pf.Sign |
|
switch pf.Sex { |
|
case "男": |
|
myinfo.Sex = 1 |
|
case "女": |
|
myinfo.Sex = 2 |
|
default: |
|
myinfo.Sex = 0 |
|
} |
|
myinfo.Mid = mid |
|
myinfo.Birthday = pf.Birthday.Time().Format("2006-01-02") |
|
myinfo.Name = pf.Name |
|
myinfo.Face = pf.Face |
|
myinfo.Rank = pf.Rank |
|
myinfo.Level = pf.Level |
|
myinfo.Vip = pf.Vip |
|
myinfo.Silence = pf.Silence |
|
myinfo.EmailStatus = pf.EmailStatus |
|
myinfo.TelStatus = pf.TelStatus |
|
myinfo.Official = pf.Official |
|
myinfo.Identification = pf.Identification |
|
if pf.Pendant.Image != "" { |
|
myinfo.Pendant = &space.Pendant{Image: pf.Pendant.Image} |
|
} |
|
return |
|
}
|
|
|