app.go 9.2 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317
  1. package service
  2. import (
  3. "context"
  4. "time"
  5. "go-common/app/interface/main/space/model"
  6. artmdl "go-common/app/interface/openplatform/article/model"
  7. accwar "go-common/app/service/main/account/api"
  8. blkmdl "go-common/app/service/main/member/model/block"
  9. relmdl "go-common/app/service/main/relation/model"
  10. upmdl "go-common/app/service/main/up/api/v1"
  11. "go-common/library/conf/env"
  12. "go-common/library/ecode"
  13. "go-common/library/log"
  14. "go-common/library/net/metadata"
  15. "go-common/library/sync/errgroup"
  16. )
  17. const (
  18. _devicePad = "pad"
  19. _platShopH5 = 1
  20. _shopGoodsOn = 1
  21. )
  22. // AppIndex app index info.
  23. func (s *Service) AppIndex(c context.Context, arg *model.AppIndexArg) (data *model.AppIndex, err error) {
  24. if env.DeployEnv == env.DeployEnvProd {
  25. if _, ok := s.BlacklistValue[arg.Vmid]; ok {
  26. err = ecode.NothingFound
  27. return
  28. }
  29. }
  30. var appInfo *model.AppAccInfo
  31. if appInfo, err = s.appAccInfo(c, arg.Mid, arg.Vmid, arg.Platform, arg.Device); err != nil {
  32. return
  33. }
  34. data = new(model.AppIndex)
  35. data.Info = appInfo
  36. group, errCtx := errgroup.WithContext(c)
  37. group.Go(func() error {
  38. data.Tab, _ = s.appTabInfo(errCtx, arg.Mid, arg.Vmid, arg.Device, arg.Platform)
  39. return nil
  40. })
  41. if arg.Device == _devicePad {
  42. group.Go(func() error {
  43. data.Archive, _ = s.UpArcs(errCtx, arg.Vmid, _samplePn, arg.Ps)
  44. return nil
  45. })
  46. }
  47. group.Go(func() error {
  48. dyListArg := &model.DyListArg{Mid: arg.Mid, Vmid: arg.Vmid, Qn: arg.Qn, Pn: _samplePn}
  49. data.Dynamic, _ = s.DynamicList(errCtx, dyListArg)
  50. return nil
  51. })
  52. group.Wait()
  53. if arg.Device == _devicePad {
  54. if data.Archive != nil && len(data.Archive.List) > 0 {
  55. data.Tab.Archive = true
  56. }
  57. }
  58. if data.Dynamic != nil && len(data.Dynamic.List) > 0 {
  59. data.Tab.Dynamic = true
  60. }
  61. return
  62. }
  63. // AppAccInfo get app account info.
  64. func (s *Service) appAccInfo(c context.Context, mid, vmid int64, platform, device string) (data *model.AppAccInfo, err error) {
  65. var (
  66. profile *accwar.ProfileStatReply
  67. ip = metadata.String(c, metadata.RemoteIP)
  68. )
  69. data = new(model.AppAccInfo)
  70. if profile, err = s.accClient.ProfileWithStat3(c, &accwar.MidReq{Mid: vmid}); err != nil {
  71. if ecode.Cause(err) == ecode.UserNotExist {
  72. err = ecode.NothingFound
  73. return
  74. }
  75. log.Error("s.accClient.ProfileWithStat3(%d) error(%v)", vmid, err)
  76. err = nil
  77. profile = model.DefaultProfileStat
  78. } else if profile == nil || profile.Profile == nil {
  79. profile = model.DefaultProfileStat
  80. }
  81. data.FromProfile(profile)
  82. if data.Mid == 0 {
  83. data.Mid = vmid
  84. }
  85. group, errCtx := errgroup.WithContext(c)
  86. data.Relation = struct{}{}
  87. data.BeRelation = struct{}{}
  88. if mid > 0 {
  89. if mid != vmid {
  90. group.Go(func() error {
  91. if relation, err := s.relation.Relation(errCtx, &relmdl.ArgRelation{Mid: mid, Fid: vmid, RealIP: ip}); err != nil {
  92. log.Error("s.relation.Relation(%d,%d,%s) error %v", mid, vmid, ip, err)
  93. } else if relation != nil {
  94. data.Relation = relation
  95. }
  96. return nil
  97. })
  98. group.Go(func() error {
  99. if relation, err := s.relation.Relation(errCtx, &relmdl.ArgRelation{Mid: vmid, Fid: mid, RealIP: ip}); err != nil {
  100. log.Error("s.relation.Relation(%d,%d,%s) error %v", vmid, mid, ip, err)
  101. } else if relation != nil {
  102. data.BeRelation = relation
  103. }
  104. return nil
  105. })
  106. } else {
  107. data.LevelInfo = profile.LevelInfo
  108. if data.Silence == _silenceForbid {
  109. group.Go(func() error {
  110. if i, err := s.member.BlockInfo(errCtx, &blkmdl.RPCArgInfo{MID: mid}); err != nil {
  111. log.Error("s.member.BlockInfo mid(%d) error(%v)", mid, err)
  112. data.Block = &model.AccBlock{Status: _accBlockDefault}
  113. } else {
  114. data.Block = &model.AccBlock{
  115. Status: int(i.BlockStatus),
  116. }
  117. if i.BlockStatus == blkmdl.BlockStatusLimit {
  118. if time.Now().Unix() >= i.EndTime {
  119. data.Block.IsDue = _accBlockDue
  120. }
  121. if status, err := s.dao.IsAnswered(errCtx, mid, i.StartTime); err == nil {
  122. data.Block.IsAnswered = status
  123. }
  124. }
  125. }
  126. return nil
  127. })
  128. }
  129. }
  130. }
  131. //get top photo
  132. group.Go(func() error {
  133. data.TopPhoto, _ = s.dao.TopPhoto(errCtx, mid, vmid, platform, device)
  134. return nil
  135. })
  136. //get live status
  137. group.Go(func() error {
  138. if live, err := s.dao.Live(errCtx, vmid, ""); err != nil || live == nil {
  139. log.Error("s.dao.Live error(%+v) live(%+v)", err, live)
  140. data.Live = struct{}{}
  141. } else {
  142. data.Live = live
  143. }
  144. return nil
  145. })
  146. //get live metal
  147. group.Go(func() error {
  148. if fansBadge, err := s.dao.LiveMetal(errCtx, vmid); err != nil {
  149. log.Error("s.dao.LiveMetal error(%+v)", err)
  150. } else {
  151. data.FansBadge = fansBadge
  152. }
  153. return nil
  154. })
  155. //get audio card
  156. group.Go(func() error {
  157. if card, err := s.dao.AudioCard(errCtx, vmid); err != nil {
  158. log.Error("s.dao.AudioCard error(%+v)", err)
  159. } else {
  160. if v, ok := card[vmid]; ok && v.Type == _audioCardOn && v.Status == 1 {
  161. data.Audio = 1
  162. }
  163. }
  164. return nil
  165. })
  166. //get elec info
  167. group.Go(func() error {
  168. if elec, err := s.dao.ElecInfo(errCtx, vmid, mid); err != nil || elec == nil {
  169. log.Error("appAccInfo s.dao.ElecInfo vmid:%d mid:%d error(%+v) elec(%+v)", vmid, mid, err, elec)
  170. data.Elec = struct{}{}
  171. } else {
  172. elec.Show = true
  173. data.Elec = elec
  174. }
  175. return nil
  176. })
  177. //get shop info
  178. group.Go(func() error {
  179. if shop, err := s.dao.ShopLink(errCtx, vmid, _platShopH5); err != nil || shop == nil {
  180. log.Error("s.dao.ShopInfo error(%+v) shop(%+v)", err, shop)
  181. data.Shop = struct{}{}
  182. } else {
  183. data.Shop = &model.ShopInfo{ID: shop.ShopID, Name: shop.Name, URL: shop.JumpURL}
  184. }
  185. return nil
  186. })
  187. //audio card
  188. group.Go(func() error {
  189. if cert, err := s.dao.AudioUpperCert(errCtx, vmid); err != nil {
  190. log.Error("s.dao.AudioUpperCert error(%+v)", err)
  191. } else if cert != nil && cert.Cert != nil && cert.Cert.Type != -1 && cert.Cert.Desc != "" {
  192. if data.OfficialInfo.Type == _officialNoType {
  193. data.OfficialInfo.Type = cert.Cert.Type
  194. }
  195. if data.OfficialInfo.Desc != "" {
  196. data.OfficialInfo.Desc = data.OfficialInfo.Desc + "、" + cert.Cert.Desc
  197. } else {
  198. data.OfficialInfo.Desc = cert.Cert.Desc
  199. }
  200. }
  201. return nil
  202. })
  203. //group count
  204. group.Go(func() error {
  205. if fansGroup, err := s.dao.GroupsCount(errCtx, mid, vmid); err != nil {
  206. log.Error("s.dao.GroupsCount mid(%d) vmid(%d) error(%v)", mid, vmid, err)
  207. } else {
  208. data.FansGroup = fansGroup
  209. }
  210. return nil
  211. })
  212. group.Wait()
  213. return
  214. }
  215. // AppTabInfo get app tab info.
  216. func (s *Service) appTabInfo(c context.Context, mid, vmid int64, device, platform string) (tab *model.AppTab, err error) {
  217. ip := metadata.String(c, metadata.RemoteIP)
  218. tab = new(model.AppTab)
  219. privacy := s.privacy(c, vmid)
  220. group, errCtx := errgroup.WithContext(c)
  221. // pad tab dy,arc value out this func
  222. if device != _devicePad {
  223. group.Go(func() error {
  224. if dyCnt, err := s.dao.DynamicCnt(errCtx, vmid); err != nil {
  225. log.Error("s.dao.DynamicCnt error(%+v)", err)
  226. } else if dyCnt > 0 {
  227. tab.Dynamic = true
  228. }
  229. return nil
  230. })
  231. group.Go(func() error {
  232. if shop, err := s.dao.ShopLink(errCtx, vmid, _platShopH5); err != nil {
  233. log.Error("s.dao.ShopInfo error(%+v)", err)
  234. } else if shop != nil && shop.ShowItemsTab == _shopGoodsOn {
  235. tab.Shop = true
  236. }
  237. return nil
  238. })
  239. group.Go(func() error {
  240. if reply, err := s.upClient.UpCount(c, &upmdl.UpCountReq{Mid: vmid}); err != nil {
  241. log.Error("s.arc.UpCount2 mid(%d) error(%v)", vmid, err)
  242. } else if reply.Count > 0 {
  243. tab.Archive = true
  244. }
  245. return nil
  246. })
  247. group.Go(func() error {
  248. if article, err := s.art.UpArtMetas(errCtx, &artmdl.ArgUpArts{Mid: vmid, Pn: 1, Ps: 10, RealIP: ip}); err != nil {
  249. log.Error("s.art.UpArtMetas(%d) error(%v)", vmid, err)
  250. } else if article != nil && len(article.Articles) > 0 {
  251. tab.Article = true
  252. }
  253. return nil
  254. })
  255. group.Go(func() error {
  256. if audioCnt, err := s.dao.AudioCnt(errCtx, vmid); err != nil {
  257. log.Error("s.dao.AudioCnt error(%+v)", err)
  258. } else if audioCnt > 0 {
  259. tab.Audio = true
  260. }
  261. return nil
  262. })
  263. group.Go(func() error {
  264. if albumCnt, err := s.dao.AlbumCount(errCtx, vmid); err == nil && albumCnt > 0 {
  265. tab.Album = true
  266. }
  267. return nil
  268. })
  269. if value, ok := privacy[model.PcyGame]; (ok && value == _defaultPrivacy) || mid == vmid {
  270. group.Go(func() error {
  271. if _, gameCnt, err := s.dao.AppPlayedGame(errCtx, vmid, platform, _samplePn, _samplePs); err == nil && gameCnt > 0 {
  272. tab.Game = true
  273. }
  274. return nil
  275. })
  276. }
  277. }
  278. if value, ok := privacy[model.PcyFavVideo]; (ok && value == _defaultPrivacy) || mid == vmid {
  279. group.Go(func() error {
  280. if fav, err := s.dao.FavFolder(errCtx, mid, vmid); err != nil {
  281. log.Error("s.dao.FavFolder error(%+v)", err)
  282. } else if len(fav) > 0 {
  283. for _, v := range fav {
  284. if v.CurCount > 0 {
  285. tab.Favorite = true
  286. break
  287. }
  288. }
  289. }
  290. return nil
  291. })
  292. }
  293. if value, ok := privacy[model.PcyBangumi]; (ok && value == _defaultPrivacy) || mid == vmid {
  294. group.Go(func() error {
  295. if _, cnt, err := s.dao.BangumiList(errCtx, vmid, _samplePn, _samplePs); err != nil {
  296. log.Error("s.dao.BangumiList mid(%d) error(%v)", vmid, err)
  297. } else if cnt > 0 {
  298. tab.Bangumi = true
  299. }
  300. return nil
  301. })
  302. }
  303. group.Wait()
  304. return
  305. }
  306. // AppTopPhoto get app top photo.
  307. func (s *Service) AppTopPhoto(c context.Context, mid, vmid int64, platform, device string) (imgURL string) {
  308. imgURL, _ = s.dao.TopPhoto(c, mid, vmid, platform, device)
  309. return
  310. }