作者 tangxvhui
@@ -55,6 +55,9 @@ service Core { @@ -55,6 +55,9 @@ service Core {
55 @doc "用户快讯" 55 @doc "用户快讯"
56 @handler miniUserNews 56 @handler miniUserNews
57 post /mini/user/news (MiniUserNewsRequest)returns(MiniUserNewsResposne) 57 post /mini/user/news (MiniUserNewsRequest)returns(MiniUserNewsResposne)
  58 + @doc "我关注人发布的信息"
  59 + @handler miniUserMyFollowingNews
  60 + post /mini/user/my_following_news (MiniUserNewsRequest)returns(MiniUserNewsResposne)
58 @doc "关注我的人" 61 @doc "关注我的人"
59 @handler miniUserFollower 62 @handler miniUserFollower
60 post /mini/user/follower (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse) 63 post /mini/user/follower (MiniUserFollowedSearchRequest)returns(MiniUserFollowedSearchResponse)
@@ -276,6 +276,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) { @@ -276,6 +276,11 @@ func RegisterHandlers(server *rest.Server, serverCtx *svc.ServiceContext) {
276 }, 276 },
277 { 277 {
278 Method: http.MethodPost, 278 Method: http.MethodPost,
  279 + Path: "/mini/user/my_following_news",
  280 + Handler: user.MiniUserMyFollowingNewsHandler(serverCtx),
  281 + },
  282 + {
  283 + Method: http.MethodPost,
279 Path: "/mini/user/follower", 284 Path: "/mini/user/follower",
280 Handler: user.MiniUserFollowerHandler(serverCtx), 285 Handler: user.MiniUserFollowerHandler(serverCtx),
281 }, 286 },
  1 +package user
  2 +
  3 +import (
  4 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/result"
  5 + "net/http"
  6 +
  7 + "github.com/zeromicro/go-zero/rest/httpx"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/logic/user"
  9 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  11 +)
  12 +
  13 +func MiniUserMyFollowingNewsHandler(svcCtx *svc.ServiceContext) http.HandlerFunc {
  14 + return func(w http.ResponseWriter, r *http.Request) {
  15 + var req types.MiniUserNewsRequest
  16 + if err := httpx.Parse(r, &req); err != nil {
  17 + httpx.ErrorCtx(r.Context(), w, err)
  18 + return
  19 + }
  20 +
  21 + l := user.NewMiniUserMyFollowingNewsLogic(r.Context(), svcCtx)
  22 + resp, err := l.MiniUserMyFollowingNews(&req)
  23 + result.HttpResult(r, w, resp, err)
  24 + }
  25 +}
  1 +package user
  2 +
  3 +import (
  4 + "context"
  5 + "github.com/samber/lo"
  6 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
  7 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/contextdata"
  8 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"
  9 +
  10 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
  11 + "gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
  12 +
  13 + "github.com/zeromicro/go-zero/core/logx"
  14 +)
  15 +
  16 +type MiniUserMyFollowingNewsLogic struct {
  17 + logx.Logger
  18 + ctx context.Context
  19 + svcCtx *svc.ServiceContext
  20 +}
  21 +
  22 +func NewMiniUserMyFollowingNewsLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniUserMyFollowingNewsLogic {
  23 + return &MiniUserMyFollowingNewsLogic{
  24 + Logger: logx.WithContext(ctx),
  25 + ctx: ctx,
  26 + svcCtx: svcCtx,
  27 + }
  28 +}
  29 +
  30 +func (l *MiniUserMyFollowingNewsLogic) MiniUserMyFollowingNews(req *types.MiniUserNewsRequest) (resp *types.MiniUserNewsResposne, err error) {
  31 + var (
  32 + conn = l.svcCtx.DefaultDBConn()
  33 + user *domain.User
  34 + userToken = contextdata.GetUserTokenFromCtx(l.ctx)
  35 + articles []*domain.Article
  36 + readArticles = make([]*domain.UserReadArticle, 0)
  37 + userMap = make(map[int64]*domain.User)
  38 + )
  39 + if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
  40 + return nil, xerr.NewErrMsgErr("用户不存在", err)
  41 + }
  42 + var (
  43 + users = user.Following
  44 + )
  45 + if req.AuthorId > 0 {
  46 + users = []int64{req.AuthorId}
  47 + }
  48 + if _, articles, err = l.svcCtx.ArticleRepository.FindAuthorsLatestArticle(l.ctx, conn, user.CompanyId, users, user.Id, req.LastArticleId, req.Size); err != nil {
  49 + return nil, xerr.NewErrMsgErr("获取快讯异常", err)
  50 + }
  51 + resp = &types.MiniUserNewsResposne{
  52 + List: make([]types.UserNewsItem, 0),
  53 + }
  54 + articleIds := domain.Values(articles, func(item *domain.Article) int64 {
  55 + return item.Id
  56 + })
  57 + if len(articleIds) > 0 {
  58 + resp.LastArticleId = articleIds[len(articleIds)-1]
  59 + _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly().WithKV("articleIds", articleIds))
  60 + }
  61 + readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 {
  62 + return item.ArticleId
  63 + })
  64 + lo.ForEach(articles, func(item *domain.Article, index int) {
  65 + newsItem := types.UserNewsItem{
  66 + NewsId: item.Id,
  67 + Type: "article",
  68 + Title: item.Title,
  69 + Summary: item.Summary,
  70 + Time: item.CreatedAt,
  71 + Images: make([]string, 0),
  72 + ReadFlag: false,
  73 + }
  74 + if author, _ := domain.LazyLoad(userMap, l.ctx, conn, item.AuthorId, l.svcCtx.UserRepository.FindOne); author != nil {
  75 + newsItem.Author = types.UserItem{
  76 + Id: author.Id,
  77 + Name: author.Name,
  78 + Avatar: lo.ToPtr(author.Avatar),
  79 + }
  80 + }
  81 + for _, img := range item.Images {
  82 + newsItem.Images = append(newsItem.Images, img.Url)
  83 + }
  84 + if _, ok := readArticlesMap[item.Id]; ok {
  85 + newsItem.ReadFlag = true
  86 + }
  87 + resp.List = append(resp.List, newsItem)
  88 + })
  89 + return
  90 +}
@@ -39,15 +39,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * @@ -39,15 +39,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
39 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil { 39 if user, err = l.svcCtx.UserRepository.FindOne(l.ctx, conn, userToken.UserId); err != nil {
40 return nil, xerr.NewErrMsgErr("用户不存在", err) 40 return nil, xerr.NewErrMsgErr("用户不存在", err)
41 } 41 }
42 - var (  
43 - users = user.Following  
44 - )  
45 - if req.AuthorId > 0 {  
46 - users = []int64{req.AuthorId}  
47 - } else {  
48 - users = append(users, user.Id)  
49 - }  
50 - if _, articles, err = l.svcCtx.ArticleRepository.FindAuthorsLatestArticle(l.ctx, conn, user.CompanyId, users, user.Id, req.LastArticleId, req.Size); err != nil { 42 + if _, articles, err = l.svcCtx.ArticleRepository.FindLatestAccessibleArticle(l.ctx, conn, user.CompanyId, user.Id, req.LastArticleId, req.Size); err != nil {
51 return nil, xerr.NewErrMsgErr("获取快讯异常", err) 43 return nil, xerr.NewErrMsgErr("获取快讯异常", err)
52 } 44 }
53 resp = &types.MiniUserNewsResposne{ 45 resp = &types.MiniUserNewsResposne{
@@ -58,7 +50,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp * @@ -58,7 +50,7 @@ func (l *MiniUserNewsLogic) MiniUserNews(req *types.MiniUserNewsRequest) (resp *
58 }) 50 })
59 if len(articleIds) > 0 { 51 if len(articleIds) > 0 {
60 resp.LastArticleId = articleIds[len(articleIds)-1] 52 resp.LastArticleId = articleIds[len(articleIds)-1]
61 - _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithKV("articleIds", articleIds)) 53 + _, readArticles, _ = l.svcCtx.UserReadArticleRepository.Find(l.ctx, conn, domain.IndexCompanyId(userToken.CompanyId)().WithFindOnly().WithKV("articleIds", articleIds))
62 } 54 }
63 readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 { 55 readArticlesMap := lo.KeyBy(readArticles, func(item *domain.UserReadArticle) int64 {
64 return item.ArticleId 56 return item.ArticleId
@@ -164,6 +164,47 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction. @@ -164,6 +164,47 @@ func (repository *ArticleRepository) Find(ctx context.Context, conn transaction.
164 return total, dms, nil 164 return total, dms, nil
165 } 165 }
166 166
  167 +// FindLatestAccessibleArticle 最新可访问的文章
  168 +func (repository *ArticleRepository) FindLatestAccessibleArticle(ctx context.Context, conn transaction.Conn,
  169 + companyId int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) {
  170 + var (
  171 + tx = conn.DB()
  172 + ms []*models.Article
  173 + dms = make([]*domain.Article, 0)
  174 + total int64
  175 + )
  176 + queryFunc := func() (interface{}, error) {
  177 + tx = tx.Model(&ms).
  178 + Where("company_id=?", companyId).
  179 + Where(fmt.Sprintf("author_id = %d or target_user=0 or who_read @>'[%d]'", whoRead, whoRead)).
  180 + Where("show = 1")
  181 + if lastId > 0 {
  182 + tx.Where("id < ?", lastId)
  183 + }
  184 + tx.Order("id desc")
  185 + if limit > 0 {
  186 + tx.Limit(limit)
  187 + }
  188 + if total, tx = transaction.PaginationAndCount(ctx, tx, domain.NewQueryOptions().WithFindOnly(), &ms); tx.Error != nil {
  189 + return dms, tx.Error
  190 + }
  191 + return dms, nil
  192 + }
  193 +
  194 + if _, err := repository.Query(queryFunc); err != nil {
  195 + return 0, nil, err
  196 + }
  197 +
  198 + for _, item := range ms {
  199 + if dm, err := repository.ModelToDomainModel(item); err != nil {
  200 + return 0, dms, err
  201 + } else {
  202 + dms = append(dms, dm)
  203 + }
  204 + }
  205 + return total, dms, nil
  206 +}
  207 +
167 // FindAuthorsLatestArticle 作者最新的文章 208 // FindAuthorsLatestArticle 作者最新的文章
168 func (repository *ArticleRepository) FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, 209 func (repository *ArticleRepository) FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn,
169 companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) { 210 companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*domain.Article, error) {
@@ -43,6 +43,7 @@ type ArticleRepository interface { @@ -43,6 +43,7 @@ type ArticleRepository interface {
43 FindAuthorsLatestFirstArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) 43 FindAuthorsLatestFirstArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error)
44 FindAuthorsLatestFirstUnreadArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error) 44 FindAuthorsLatestFirstUnreadArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, limit int) (int64, []*Article, error)
45 FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error) 45 FindAuthorsLatestArticle(ctx context.Context, conn transaction.Conn, companyId int64, authors []int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error)
  46 + FindLatestAccessibleArticle(ctx context.Context, conn transaction.Conn, companyId int64, whoRead int64, lastId int64, limit int) (int64, []*Article, error)
46 IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //点赞数量变动 47 IncreaseCountLove(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //点赞数量变动
47 IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //评论数量变动 48 IncreaseCountComment(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //评论数量变动
48 IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //浏览数量变动 49 IncreaseCountRead(ctx context.Context, conn transaction.Conn, incr int, articleId int64) error //浏览数量变动