mini_get_article_logic.go 4.7 KB
package article

import (
	"context"
	"sort"

	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/svc"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/api/internal/types"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/cmd/discuss/interanl/pkg/domain"
	"gitlab.fjmaimaimai.com/allied-creation/sumifcc-discuss/pkg/xerr"

	"github.com/zeromicro/go-zero/core/logx"
)

type MiniGetArticleLogic struct {
	logx.Logger
	ctx    context.Context
	svcCtx *svc.ServiceContext
}

func NewMiniGetArticleLogic(ctx context.Context, svcCtx *svc.ServiceContext) *MiniGetArticleLogic {
	return &MiniGetArticleLogic{
		Logger: logx.WithContext(ctx),
		ctx:    ctx,
		svcCtx: svcCtx,
	}
}

// 小程序端展示文章内容
func (l *MiniGetArticleLogic) MiniGetArticle(req *types.MiniArticleGetRequest) (resp *types.MiniArticleGetResponse, err error) {
	// 获取文章内容
	var conn = l.svcCtx.DefaultDBConn()

	articleInfo, err := l.svcCtx.ArticleRepository.FindOne(l.ctx, conn, req.Id)
	if err != nil {
		return nil, xerr.NewErrMsgErr("读取文章内容失败", err)
	}
	if articleInfo.CompanyId != req.CompanyId {
		return nil, xerr.NewErrMsg("没有查看权限")
	}

	if len(articleInfo.WhoRead) > 0 {
		inWhoRead := false
		for _, val := range articleInfo.WhoRead {
			if req.UserId == int(val) {
				inWhoRead = true
			}
		}
		if !inWhoRead {
			// 文章内容不显示
			resp = &types.MiniArticleGetResponse{
				Id:    articleInfo.Id,
				Title: articleInfo.Title,
				Show:  int(domain.ArticleShowDisable),
			}
			return resp, nil
		}
	}

	if articleInfo.Show == domain.ArticleShowDisable {
		// 文章内容不显示
		resp = &types.MiniArticleGetResponse{
			Id:    articleInfo.Id,
			Title: articleInfo.Title,
			Show:  int(domain.ArticleShowDisable),
		}
		return resp, nil
	}
	queryOption := domain.NewQueryOptions().
		WithFindOnly().
		MustWithKV("articleId", articleInfo.Id)

	_, sectionList, err := l.svcCtx.ArticleSectionRepository.Find(l.ctx, conn, queryOption)
	if err != nil {
		return nil, xerr.NewErrMsgErr("读取文章内容失败", err)
	}
	var meLoveFlag int
	if req.UserId > 0 {
		// 获取我对文章的点赞标识
		queryOption = domain.NewQueryOptions().
			WithCountOnly().
			MustWithKV("articleId", articleInfo.Id).
			MustWithKV("commentId", 0).
			MustWithKV("userId", req.UserId)
		cnt, _, _ := l.svcCtx.UserLoveFlagRepository.Find(l.ctx, conn, queryOption)
		if cnt > 0 {
			meLoveFlag = 1
		}
	}
	tags := []string{}
	if len(articleInfo.Tags) > 0 {
		queryOption := domain.NewQueryOptions().WithFindOnly().MustWithKV("ids", articleInfo.Tags)
		_, tagList, _ := l.svcCtx.ArticleTagRepository.Find(l.ctx, conn, req.CompanyId, queryOption)
		for _, val := range tagList {
			tags = append(tags, val.Name)
		}
	}
	// 查询我是否已关注文章的作者

	follow, _ := l.svcCtx.UserFollowRepository.FindOneUserFollowing(l.ctx, conn, int64(req.UserId), articleInfo.AuthorId)

	queryOption = domain.NewQueryOptions().WithFindOnly().WithOffsetLimit(1, 1).WithKV("articleId", articleInfo.Id)
	_, backupList, _ := l.svcCtx.ArticleBackupRepository.Find(l.ctx, conn, queryOption)

	sortBy := domain.SortArticleSection(sectionList)
	sort.Sort(sortBy)
	articleSection := []types.ArticleSection{}

	for _, val := range sortBy {
		articleSection = append(articleSection, types.ArticleSection{
			Id:           val.Id,
			Content:      val.Content,
			SortBy:       val.SortBy,
			TotalComment: val.TotalComment,
		})
	}
	resp = &types.MiniArticleGetResponse{
		Id:       articleInfo.Id,
		Title:    articleInfo.Title,
		AuthorId: articleInfo.AuthorId,
		Author: types.ArticleAuthor{
			Id:       articleInfo.Author.Id,
			Name:     articleInfo.Author.Name,
			Avatar:   articleInfo.Author.Avatar,
			Position: articleInfo.Author.Position,
			Company:  articleInfo.Author.Company,
		},
		CreatedAt: articleInfo.CreatedAt,
		Section:   articleSection,
		Images:    []string{},
		WhoRead:   articleInfo.WhoRead,
		WhoReview: articleInfo.WhoReview,
		Location: types.Location{
			Longitude: articleInfo.Location.Longitude,
			Latitude:  articleInfo.Location.Latitude,
			Descript:  articleInfo.Location.Descript,
		},
		CountLove:    articleInfo.CountLove,
		CountComment: articleInfo.CountComment,
		CountRead:    articleInfo.CountRead,
		Show:         int(articleInfo.Show),
		Edit:         0,
		MeLoveFlag:   meLoveFlag,
		MeFollowFlag: 0,
		Tags:         tags,
		MatchUrl:     map[string]string{},
	}
	if len(backupList) > 0 {
		resp.Edit = 1
	}

	for k, v := range articleInfo.MatchUrl {
		resp.MatchUrl[k] = v
	}
	for _, val := range articleInfo.Images {
		resp.Images = append(resp.Images, val.Url)
	}
	if follow != nil {
		resp.MeFollowFlag = 1
	}
	if resp.AuthorId == int64(req.UserId) {
		// 作者本人在查看
		resp.MeFollowFlag = 1
	}
	return
}