fix: 管理删评对公众剥离作者身份,评论者本人仍可见原文
Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -32,11 +32,13 @@ func NewCommentService(db *gorm.DB) *CommentService {
|
||||
// CommentNode 评论树节点:嵌入 model.Comment 使 JSON 字段拍平,replies 为空时省略
|
||||
type CommentNode struct {
|
||||
model.Comment
|
||||
Deleted bool `json:"deleted,omitempty"` // 软删占位
|
||||
StaffDeleted bool `json:"staff_deleted,omitempty"` // DeletedBy≠评论者
|
||||
Edited bool `json:"edited,omitempty"` // 相对创建已编辑
|
||||
Deleted bool `json:"deleted,omitempty"` // 软删占位
|
||||
StaffDeleted bool `json:"staff_deleted,omitempty"` // DeletedBy≠评论者
|
||||
Edited bool `json:"edited,omitempty"` // 相对创建已编辑
|
||||
DeletedByUser *CommentActorBrief `json:"deleted_by_user,omitempty"` // 管理删执行者(公开)
|
||||
Replies []CommentNode `json:"replies,omitempty"`
|
||||
// 覆盖嵌入的 User:指针 + omitempty,管理删对公众可整段省略(避免空对象仍进 JSON/DOM)
|
||||
User *model.User `json:"user,omitempty"`
|
||||
}
|
||||
|
||||
// CommentActorBrief 评论相关公开用户摘要(删评管理员链接等)
|
||||
@@ -119,14 +121,14 @@ func (s *CommentService) ListFloorPaged(postID, boardID, viewerID uint, actor *A
|
||||
build = func(pid uint) []CommentNode {
|
||||
out := []CommentNode{}
|
||||
for _, c := range children[pid] {
|
||||
out = append(out, toCommentNode(c, build(c.ID), revealAudit, deleters))
|
||||
out = append(out, toCommentNode(c, build(c.ID), revealAudit, viewerID, deleters))
|
||||
placed[c.ID] = true
|
||||
}
|
||||
return out
|
||||
}
|
||||
result := make([]CommentNode, len(roots))
|
||||
for i := range roots {
|
||||
result[i] = toCommentNode(roots[i], build(roots[i].ID), revealAudit, deleters)
|
||||
result[i] = toCommentNode(roots[i], build(roots[i].ID), revealAudit, viewerID, deleters)
|
||||
placed[roots[i].ID] = true
|
||||
}
|
||||
for _, r := range replies {
|
||||
@@ -135,7 +137,7 @@ func (s *CommentService) ListFloorPaged(postID, boardID, viewerID uint, actor *A
|
||||
}
|
||||
for i := range result {
|
||||
if result[i].ID == *r.RootID {
|
||||
result[i].Replies = append(result[i].Replies, toCommentNode(r, build(r.ID), revealAudit, deleters))
|
||||
result[i].Replies = append(result[i].Replies, toCommentNode(r, build(r.ID), revealAudit, viewerID, deleters))
|
||||
break
|
||||
}
|
||||
}
|
||||
@@ -178,14 +180,25 @@ func (s *CommentService) loadCommentActorsByIDs(ids []uint) map[uint]CommentActo
|
||||
return out
|
||||
}
|
||||
|
||||
// toCommentNode 软删占位:清空公开正文;版主保留原文;自删理由仅版主可见。
|
||||
func toCommentNode(c model.Comment, replies []CommentNode, revealAudit bool, deleters map[uint]CommentActorBrief) CommentNode {
|
||||
// commentAuthorPtr 有预加载作者时返回拷贝,供 JSON omitempty 整段省略。
|
||||
func commentAuthorPtr(c model.Comment) *model.User {
|
||||
if c.User.ID == 0 {
|
||||
return nil
|
||||
}
|
||||
u := c.User
|
||||
return &u
|
||||
}
|
||||
|
||||
// toCommentNode 软删占位:公众清空正文;版主与评论者本人保留原文。
|
||||
// 自删理由仅版主可见。管理删:公众与其他登录用户不返回评论者身份。
|
||||
func toCommentNode(c model.Comment, replies []CommentNode, revealAudit bool, viewerID uint, deleters map[uint]CommentActorBrief) CommentNode {
|
||||
edited := c.UpdatedAt.Sub(c.CreatedAt) > time.Minute
|
||||
if !c.DeletedAt.Valid {
|
||||
return CommentNode{Comment: c, Edited: edited, Replies: replies}
|
||||
return CommentNode{Comment: c, Edited: edited, Replies: replies, User: commentAuthorPtr(c)}
|
||||
}
|
||||
staff := c.DeletedBy != 0 && c.DeletedBy != c.UserID
|
||||
if !revealAudit {
|
||||
isCommenter := viewerID != 0 && viewerID == c.UserID
|
||||
if !revealAudit && !isCommenter {
|
||||
c.Content = ""
|
||||
}
|
||||
if !staff {
|
||||
@@ -201,6 +214,11 @@ func toCommentNode(c model.Comment, replies []CommentNode, revealAudit bool, del
|
||||
deleter = &cp
|
||||
}
|
||||
}
|
||||
// 版主审计、评论者本人仍可见身份;其余观众剥离
|
||||
if staff && !revealAudit && !isCommenter {
|
||||
c.UserID = 0
|
||||
c.User = model.User{}
|
||||
}
|
||||
return CommentNode{
|
||||
Comment: c,
|
||||
Deleted: true,
|
||||
@@ -208,6 +226,7 @@ func toCommentNode(c model.Comment, replies []CommentNode, revealAudit bool, del
|
||||
Edited: edited,
|
||||
DeletedByUser: deleter,
|
||||
Replies: replies,
|
||||
User: commentAuthorPtr(c),
|
||||
}
|
||||
}
|
||||
|
||||
@@ -356,7 +375,7 @@ func (s *CommentService) ListByUser(userID uint, page, size int) ([]UserCommentI
|
||||
query := s.db.Table("comments").
|
||||
Select("comments.id, comments.post_id, posts.title AS post_title, comments.content, comments.created_at").
|
||||
Joins("JOIN posts ON posts.id = comments.post_id").
|
||||
Where("comments.user_id = ? AND comments.status = ? AND posts.deleted_at IS NULL", userID, model.ContentStatusPublished)
|
||||
Where("comments.user_id = ? AND comments.status = ? AND comments.deleted_at IS NULL AND posts.deleted_at IS NULL", userID, model.ContentStatusPublished)
|
||||
|
||||
var total int64
|
||||
if err := query.Count(&total).Error; err != nil {
|
||||
@@ -378,7 +397,7 @@ func (s *CommentService) CountByUser(userID uint) (int64, error) {
|
||||
var total int64
|
||||
err := s.db.Table("comments").
|
||||
Joins("JOIN posts ON posts.id = comments.post_id").
|
||||
Where("comments.user_id = ? AND comments.status = ? AND posts.deleted_at IS NULL", userID, model.ContentStatusPublished).
|
||||
Where("comments.user_id = ? AND comments.status = ? AND comments.deleted_at IS NULL AND posts.deleted_at IS NULL", userID, model.ContentStatusPublished).
|
||||
Count(&total).Error
|
||||
return total, err
|
||||
}
|
||||
@@ -603,16 +622,16 @@ func (s *CommentService) Update(actor *Actor, commentID, userID uint, content st
|
||||
if err := s.db.Preload("User").First(&comment, comment.ID).Error; err != nil {
|
||||
return nil, err
|
||||
}
|
||||
node := toCommentNode(comment, nil, false, nil)
|
||||
node := toCommentNode(comment, nil, false, userID, nil)
|
||||
return &node, nil
|
||||
}
|
||||
|
||||
// CommentEditHistoryItem 管理可见的评论修订记录
|
||||
type CommentEditHistoryItem struct {
|
||||
ID uint `json:"id"`
|
||||
Editor CommentActorBrief `json:"editor"`
|
||||
OldContent string `json:"old_content"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
ID uint `json:"id"`
|
||||
Editor CommentActorBrief `json:"editor"`
|
||||
OldContent string `json:"old_content"`
|
||||
CreatedAt time.Time `json:"created_at"`
|
||||
}
|
||||
|
||||
// ListEditHistory 评论编辑历史(仅版主;含软删评论;按创建时间倒序分页)
|
||||
|
||||
Reference in New Issue
Block a user