105 lines
2.8 KiB
Go
105 lines
2.8 KiB
Go
package render
|
|
|
|
import (
|
|
"bbs-go/internal/models"
|
|
"bbs-go/internal/models/constants"
|
|
"bbs-go/internal/pkg/markdown"
|
|
"bbs-go/internal/services"
|
|
"html"
|
|
|
|
"github.com/mlogclub/simple/common/arrays"
|
|
"github.com/mlogclub/simple/common/strs"
|
|
)
|
|
|
|
func BuildTopic(topic *models.Topic, currentUser *models.User) *models.TopicResponse {
|
|
resp := _buildTopic(topic, true)
|
|
if currentUser != nil {
|
|
resp.Liked = services.UserLikeService.Exists(currentUser.Id, constants.EntityTopic, topic.Id)
|
|
resp.Favorited = services.FavoriteService.IsFavorited(currentUser.Id, constants.EntityTopic, topic.Id)
|
|
}
|
|
return resp
|
|
}
|
|
|
|
func BuildSimpleTopic(topic *models.Topic) *models.TopicResponse {
|
|
buildContent := topic.Type == constants.TopicTypeTweet // 动态时渲染内容
|
|
return _buildTopic(topic, buildContent)
|
|
}
|
|
|
|
func BuildSimpleTopics(topics []models.Topic, currentUser *models.User) []models.TopicResponse {
|
|
if len(topics) == 0 {
|
|
return nil
|
|
}
|
|
|
|
var likedTopicIds []int64
|
|
if currentUser != nil {
|
|
var topicIds []int64
|
|
for _, topic := range topics {
|
|
topicIds = append(topicIds, topic.Id)
|
|
}
|
|
likedTopicIds = services.UserLikeService.IsLiked(currentUser.Id, constants.EntityTopic, topicIds)
|
|
}
|
|
|
|
var responses []models.TopicResponse
|
|
for _, topic := range topics {
|
|
item := BuildSimpleTopic(&topic)
|
|
item.Liked = arrays.Contains(topic.Id, likedTopicIds)
|
|
responses = append(responses, *item)
|
|
}
|
|
return responses
|
|
}
|
|
|
|
func _buildTopic(topic *models.Topic, buildContent bool) *models.TopicResponse {
|
|
if topic == nil {
|
|
return nil
|
|
}
|
|
|
|
rsp := &models.TopicResponse{}
|
|
|
|
rsp.Id = topic.Id
|
|
rsp.Type = topic.Type
|
|
rsp.Title = topic.Title
|
|
rsp.User = BuildUserInfoDefaultIfNull(topic.UserId)
|
|
rsp.LastCommentTime = topic.LastCommentTime
|
|
rsp.CreateTime = topic.CreateTime
|
|
rsp.ViewCount = topic.ViewCount
|
|
rsp.CommentCount = topic.CommentCount
|
|
rsp.LikeCount = topic.LikeCount
|
|
rsp.Recommend = topic.Recommend
|
|
rsp.RecommendTime = topic.RecommendTime
|
|
rsp.Sticky = topic.Sticky
|
|
rsp.StickyTime = topic.StickyTime
|
|
rsp.Status = topic.Status
|
|
rsp.IpLocation = topic.IpLocation
|
|
|
|
// 构建内容
|
|
if buildContent {
|
|
if topic.Type == constants.TopicTypeTopic {
|
|
content := markdown.ToHTML(topic.Content)
|
|
rsp.Content = handleHtmlContent(content)
|
|
} else {
|
|
rsp.Content = html.EscapeString(topic.Content)
|
|
}
|
|
} else {
|
|
rsp.Summary = markdown.GetSummary(topic.Content, 128)
|
|
}
|
|
|
|
if topic.Type == constants.TopicTypeTweet {
|
|
if strs.IsBlank(topic.Content) {
|
|
rsp.Content = "分享图片"
|
|
} else {
|
|
rsp.Content = html.EscapeString(topic.Content)
|
|
}
|
|
rsp.ImageList = BuildImageList(topic.ImageList)
|
|
}
|
|
|
|
if topic.NodeId > 0 {
|
|
node := services.TopicNodeService.Get(topic.NodeId)
|
|
rsp.Node = BuildNode(node)
|
|
}
|
|
|
|
tags := services.TopicService.GetTopicTags(topic.Id)
|
|
rsp.Tags = BuildTags(tags)
|
|
|
|
return rsp
|
|
}
|