123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362 |
- 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
- }
|