feed.go 4.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171
  1. package service
  2. import (
  3. "context"
  4. "go-common/app/interface/main/web-feed/dao"
  5. "go-common/app/interface/main/web-feed/model"
  6. artmdl "go-common/app/interface/openplatform/article/model"
  7. account "go-common/app/service/main/account/model"
  8. feedmdl "go-common/app/service/main/feed/model"
  9. "go-common/library/log"
  10. "go-common/library/net/metadata"
  11. )
  12. // Feed get feed of ups and bangumi.
  13. func (s *Service) Feed(c context.Context, mid int64, pn, ps int) (res []*model.Feed, err error) {
  14. var (
  15. feeds, newFeeds []*feedmdl.Feed
  16. upAids []int64
  17. accRes map[int64]*account.Card
  18. )
  19. arg := &feedmdl.ArgFeed{
  20. Mid: mid,
  21. Pn: pn,
  22. Ps: ps,
  23. RealIP: metadata.String(c, metadata.RemoteIP),
  24. }
  25. if feeds, err = s.feedRPC.WebFeed(c, arg); err != nil || len(feeds) == 0 {
  26. log.Error("s.feedRPC.WebFeed(%v) error(%v)", arg, err)
  27. if pn == 1 {
  28. res, err = s.dao.FeedCache(c, mid)
  29. log.Info("s.dao.FeedCache(%d) len(%d) error(%v)", mid, len(res), err)
  30. }
  31. return
  32. }
  33. for _, item := range feeds {
  34. if (item.Type == feedmdl.BangumiType) && (item.Bangumi == nil) {
  35. dao.PromError("bangumi为空")
  36. log.Error("s.feedRPC.WebFeed(%v) error(%v)", arg, err)
  37. continue
  38. }
  39. if (item.Type == feedmdl.ArchiveType) && (item.Archive == nil) {
  40. dao.PromError("archive为空")
  41. log.Error("s.feedRPC.WebFeed(%v) error(%v)", arg, err)
  42. continue
  43. }
  44. newFeeds = append(newFeeds, item)
  45. }
  46. feeds = newFeeds
  47. for _, item := range feeds {
  48. if item.Type != feedmdl.ArchiveType {
  49. continue
  50. }
  51. if item.Archive != nil {
  52. upAids = append(upAids, item.Archive.Author.Mid)
  53. }
  54. }
  55. accArg := &account.ArgMids{Mids: upAids}
  56. if accRes, err = s.accRPC.Cards3(c, accArg); err != nil {
  57. dao.PromError("rpc:accRPC.Infos2")
  58. log.Error("Feed s.accRPC.info(%v) error(%v)", arg, err)
  59. err = nil
  60. }
  61. for _, item := range feeds {
  62. tmp := model.Feed{Feed: item}
  63. if tmp.Type == feedmdl.ArchiveType && accRes != nil {
  64. if ai, ok := accRes[item.Archive.Author.Mid]; ok {
  65. tmp.OfficialVerify = &ai.Official
  66. }
  67. }
  68. res = append(res, &tmp)
  69. }
  70. if pn == 1 {
  71. s.cache.Save(func() {
  72. s.dao.SetFeedCache(context.TODO(), mid, res)
  73. })
  74. }
  75. return
  76. }
  77. // UnreadCount get unread count of feed
  78. func (s *Service) UnreadCount(c context.Context, mid int64) (count int, err error) {
  79. arg := &feedmdl.ArgMid{
  80. Mid: mid,
  81. RealIP: metadata.String(c, metadata.RemoteIP),
  82. }
  83. if count, err = s.feedRPC.WebUnreadCount(c, arg); err != nil {
  84. dao.PromError("rpc:feedRPC.WebUnreadCount")
  85. log.Error("s.feedRPC.UnreadCount(%v) error(%v)", arg, err)
  86. }
  87. return
  88. }
  89. // ArticleUnreadCount get unread count of feed
  90. func (s *Service) ArticleUnreadCount(c context.Context, mid int64) (count int, err error) {
  91. arg := &feedmdl.ArgMid{
  92. Mid: mid,
  93. RealIP: metadata.String(c, metadata.RemoteIP),
  94. }
  95. if count, err = s.feedRPC.ArticleUnreadCount(c, arg); err != nil {
  96. dao.PromError("feed:ArticleUnreadCount")
  97. log.Error("s.feedRPC.ArticleUnreadCount(%v) error(%v)", arg, err)
  98. }
  99. return
  100. }
  101. // ArticleFeed get feed of ups and bangumi.
  102. func (s *Service) ArticleFeed(c context.Context, mid int64, pn, ps int) (res []*artmdl.Meta, err error) {
  103. arg := &feedmdl.ArgFeed{
  104. Mid: mid,
  105. Pn: pn,
  106. Ps: ps,
  107. RealIP: metadata.String(c, metadata.RemoteIP),
  108. }
  109. if res, err = s.feedRPC.ArticleFeed(c, arg); err != nil {
  110. log.Error("s.feedRPC.ArticleFeed(%v) error(%v)", arg, err)
  111. return
  112. }
  113. var mids []int64
  114. var accRes map[int64]*account.Card
  115. for _, meta := range res {
  116. if meta.Author != nil {
  117. mids = append(mids, meta.Author.Mid)
  118. }
  119. }
  120. accArg := &account.ArgMids{
  121. Mids: mids,
  122. }
  123. if accRes, err = s.accRPC.Cards3(c, accArg); err != nil {
  124. dao.PromError("rpc:accRPC.Infos2")
  125. log.Error("Feed s.accRPC.info(%v) error(%v)", arg, err)
  126. err = nil
  127. return
  128. }
  129. for _, item := range res {
  130. if (item.Author == nil) || (accRes[item.Author.Mid] == nil) {
  131. continue
  132. }
  133. info := accRes[item.Author.Mid]
  134. item.Author = &artmdl.Author{
  135. Mid: item.Author.Mid,
  136. Name: info.Name,
  137. Face: info.Face,
  138. Pendant: artmdl.Pendant{
  139. Pid: int32(info.Pendant.Pid),
  140. Name: info.Pendant.Name,
  141. Image: info.Pendant.Image,
  142. Expire: int32(info.Pendant.Expire),
  143. },
  144. Nameplate: artmdl.Nameplate{
  145. Nid: info.Nameplate.Nid,
  146. Name: info.Nameplate.Name,
  147. Image: info.Nameplate.Image,
  148. ImageSmall: info.Nameplate.ImageSmall,
  149. Level: info.Nameplate.Level,
  150. Condition: info.Nameplate.Condition,
  151. },
  152. }
  153. if info.Official.Role == 0 {
  154. item.Author.OfficialVerify.Type = -1
  155. } else {
  156. if info.Official.Role <= 2 {
  157. item.Author.OfficialVerify.Type = 0
  158. } else {
  159. item.Author.OfficialVerify.Type = 1
  160. }
  161. item.Author.OfficialVerify.Desc = info.Official.Title
  162. }
  163. }
  164. return
  165. }