feat(moderation): 帖评删除占位感知与硬删清场
管理删帖须填类型与理由并展示专用页;评论软删占位、版主可硬删不占楼。 Co-authored-by: Cursor <cursoragent@cursor.com>
This commit is contained in:
@@ -6,6 +6,7 @@ import (
|
||||
"strconv"
|
||||
|
||||
"github.com/freefire/jiang13-bbs/middleware"
|
||||
"github.com/freefire/jiang13-bbs/model"
|
||||
"github.com/freefire/jiang13-bbs/service"
|
||||
"github.com/gin-gonic/gin"
|
||||
"gorm.io/gorm"
|
||||
@@ -118,7 +119,33 @@ func (h *Handlers) AdminListComments(c *gin.Context) {
|
||||
}
|
||||
|
||||
func (h *Handlers) AdminSoftDeletePost(c *gin.Context) {
|
||||
h.execContentAction(c, h.Moderation.SoftDeletePost)
|
||||
id, err := strconv.ParseUint(c.Param("id"), 10, 64)
|
||||
if err != nil || id == 0 {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "无效的 ID"})
|
||||
return
|
||||
}
|
||||
var body struct {
|
||||
DeleteType string `json:"delete_type"`
|
||||
DeleteReason string `json:"delete_reason"`
|
||||
}
|
||||
if err := c.ShouldBindJSON(&body); err != nil {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": "请提交删除类型与理由"})
|
||||
return
|
||||
}
|
||||
actor := middleware.CurrentActor(c)
|
||||
authorID, err := h.Moderation.SoftDeletePost(actor, uint(id), body.DeleteType, body.DeleteReason)
|
||||
if err != nil {
|
||||
h.writeModerationError(c, err)
|
||||
return
|
||||
}
|
||||
label := model.PostDeleteTypeLabel(body.DeleteType)
|
||||
preview := label
|
||||
if body.DeleteReason != "" {
|
||||
preview = label + ":" + body.DeleteReason
|
||||
}
|
||||
h.Notification.Create(authorID, actor.ID, model.NotificationTypeDeleted, uint(id), 0, preview)
|
||||
h.broadcastModerationChanged()
|
||||
c.JSON(http.StatusOK, gin.H{"message": "操作成功"})
|
||||
}
|
||||
|
||||
func (h *Handlers) AdminRestorePost(c *gin.Context) {
|
||||
@@ -168,7 +195,9 @@ func (h *Handlers) writeModerationError(c *gin.Context, err error) {
|
||||
default:
|
||||
msg := err.Error()
|
||||
if msg == "帖子已在回收站" || msg == "帖子未被删除" ||
|
||||
msg == "评论已在回收站" || msg == "评论未被删除" {
|
||||
msg == "评论已在回收站" || msg == "评论未被删除" ||
|
||||
msg == "无效的删除类型" || msg == "请填写删除理由" ||
|
||||
msg == "删除理由不能超过 200 字" {
|
||||
c.JSON(http.StatusBadRequest, gin.H{"error": msg})
|
||||
return
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user