2026-01-18 18:20:40 +08:00
|
|
|
package ForumComments
|
|
|
|
|
|
|
|
|
|
import (
|
2026-01-18 21:52:04 +08:00
|
|
|
v1 "TrangleAgent/api/forum/v1"
|
|
|
|
|
"TrangleAgent/internal/dao"
|
|
|
|
|
"TrangleAgent/internal/model/entity"
|
|
|
|
|
"TrangleAgent/internal/service"
|
2026-01-18 18:20:40 +08:00
|
|
|
"context"
|
|
|
|
|
"errors"
|
2026-01-18 21:52:04 +08:00
|
|
|
"fmt"
|
|
|
|
|
|
|
|
|
|
"github.com/gogf/gf/v2/database/gdb"
|
2026-01-18 18:20:40 +08:00
|
|
|
"github.com/gogf/gf/v2/errors/gerror"
|
|
|
|
|
"github.com/gogf/gf/v2/frame/g"
|
2026-01-18 21:52:04 +08:00
|
|
|
"github.com/gogf/gf/v2/os/gtime"
|
2026-01-18 18:20:40 +08:00
|
|
|
)
|
|
|
|
|
|
|
|
|
|
// ForumComments 评论相关方法
|
|
|
|
|
type sForumComments struct{}
|
|
|
|
|
|
|
|
|
|
func init() {
|
|
|
|
|
service.RegisterForumComments(&sForumComments{})
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ForumCommentsCreate 创建评论
|
|
|
|
|
func (s *sForumComments) Create(ctx context.Context, req *v1.ForumCommentsCreateReq) (res *v1.ForumCommentsCreateRes, err error) {
|
|
|
|
|
data := &entity.ForumComments{
|
2026-01-18 21:52:04 +08:00
|
|
|
UserId: req.UserId,
|
|
|
|
|
PostId: req.PostId,
|
|
|
|
|
ParentId: req.ParentId,
|
|
|
|
|
Content: req.Content,
|
|
|
|
|
Status: req.Status,
|
|
|
|
|
LikeCount: 0,
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
result, err := dao.ForumComments.Ctx(ctx).Data(data).OmitEmpty().Insert()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "创建评论失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
id, err := result.LastInsertId()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "获取评论ID失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新帖子的评论数
|
|
|
|
|
if req.PostId > 0 {
|
2026-01-18 21:52:04 +08:00
|
|
|
updateData := map[string]interface{}{
|
|
|
|
|
dao.ForumPosts.Columns().CommentCount: gdb.Raw(fmt.Sprintf("%s + 1", dao.ForumPosts.Columns().CommentCount)),
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
2026-01-18 21:52:04 +08:00
|
|
|
_, err = dao.ForumPosts.Ctx(ctx).WherePri(req.PostId).Data(updateData).Update()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
2026-01-18 21:52:04 +08:00
|
|
|
g.Log().Warning(ctx, "更新帖子评论数失败:", err)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &v1.ForumCommentsCreateRes{
|
|
|
|
|
Id: uint64(id),
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ForumCommentsUpdate 更新评论
|
|
|
|
|
func (s *sForumComments) Update(ctx context.Context, req *v1.ForumCommentsUpdateReq) (res *v1.ForumCommentsUpdateRes, err error) {
|
2026-01-18 21:52:04 +08:00
|
|
|
// 检查评论是否存在(排除已删除的)
|
|
|
|
|
one, err := dao.ForumComments.Ctx(ctx).
|
|
|
|
|
WherePri(req.Id).
|
|
|
|
|
WhereNull(dao.ForumComments.Columns().DeletedAt).
|
|
|
|
|
One()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "查询评论失败")
|
|
|
|
|
}
|
|
|
|
|
if one.IsEmpty() {
|
|
|
|
|
return nil, errors.New("评论不存在")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 更新评论
|
|
|
|
|
_, err = dao.ForumComments.Ctx(ctx).WherePri(req.Id).Data(req).OmitEmpty().Update()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "更新评论失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &v1.ForumCommentsUpdateRes{
|
|
|
|
|
Id: req.Id,
|
|
|
|
|
}, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ForumCommentsView 查看评论
|
|
|
|
|
func (s *sForumComments) View(ctx context.Context, req *v1.ForumCommentsViewReq) (res *v1.ForumCommentsViewRes, err error) {
|
2026-01-18 21:52:04 +08:00
|
|
|
record, err := dao.ForumComments.Ctx(ctx).
|
|
|
|
|
WherePri(req.Id).
|
|
|
|
|
WhereNull(dao.ForumComments.Columns().DeletedAt).
|
|
|
|
|
One()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "查询评论失败")
|
|
|
|
|
}
|
|
|
|
|
if record.IsEmpty() {
|
|
|
|
|
return nil, errors.New("评论不存在")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var entity *entity.ForumComments
|
|
|
|
|
err = record.Struct(&entity)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "解析评论数据失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res = &v1.ForumCommentsViewRes{
|
2026-01-18 21:52:04 +08:00
|
|
|
Id: entity.Id,
|
|
|
|
|
UserId: entity.UserId,
|
|
|
|
|
PostId: entity.PostId,
|
|
|
|
|
ParentId: entity.ParentId,
|
|
|
|
|
Content: entity.Content,
|
|
|
|
|
Status: entity.Status,
|
|
|
|
|
LikeCount: entity.LikeCount,
|
|
|
|
|
CreatedAt: entity.CreatedAt,
|
|
|
|
|
UpdatedAt: entity.UpdatedAt,
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ForumCommentsList 评论列表
|
|
|
|
|
func (s *sForumComments) List(ctx context.Context, req *v1.ForumCommentsListReq) (res *v1.ForumCommentsListRes, err error) {
|
2026-01-18 21:52:04 +08:00
|
|
|
query := dao.ForumComments.Ctx(ctx).
|
|
|
|
|
WhereNull(dao.ForumComments.Columns().DeletedAt).
|
|
|
|
|
OmitEmpty()
|
2026-01-18 18:20:40 +08:00
|
|
|
|
|
|
|
|
if req.UserId > 0 {
|
2026-01-18 21:52:04 +08:00
|
|
|
query = query.Where(dao.ForumComments.Columns().UserId, req.UserId)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
if req.PostId > 0 {
|
2026-01-18 21:52:04 +08:00
|
|
|
query = query.Where(dao.ForumComments.Columns().PostId, req.PostId)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
if req.ParentId > 0 {
|
2026-01-18 21:52:04 +08:00
|
|
|
query = query.Where(dao.ForumComments.Columns().ParentId, req.ParentId)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
if req.Status != "" {
|
2026-01-18 21:52:04 +08:00
|
|
|
query = query.Where(dao.ForumComments.Columns().Status, req.Status)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// 分页查询
|
2026-01-18 21:52:04 +08:00
|
|
|
pageResult, err := query.Page(req.Page, req.PageSize).OrderDesc(dao.ForumComments.Columns().CreatedAt).All()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "查询评论列表失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var list []*v1.ForumCommentsViewRes
|
|
|
|
|
for _, record := range pageResult {
|
|
|
|
|
var entity *entity.ForumComments
|
|
|
|
|
err = record.Struct(&entity)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "解析评论数据失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
item := &v1.ForumCommentsViewRes{
|
2026-01-18 21:52:04 +08:00
|
|
|
Id: entity.Id,
|
|
|
|
|
UserId: entity.UserId,
|
|
|
|
|
PostId: entity.PostId,
|
|
|
|
|
ParentId: entity.ParentId,
|
|
|
|
|
Content: entity.Content,
|
|
|
|
|
Status: entity.Status,
|
|
|
|
|
LikeCount: entity.LikeCount,
|
|
|
|
|
CreatedAt: entity.CreatedAt,
|
|
|
|
|
UpdatedAt: entity.UpdatedAt,
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
list = append(list, item)
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
total, err := query.Count()
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "统计评论总数失败")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
res = &v1.ForumCommentsListRes{}
|
|
|
|
|
res.List = list
|
|
|
|
|
res.Page = req.Page
|
|
|
|
|
res.PageSize = req.PageSize
|
|
|
|
|
res.Total = total
|
|
|
|
|
|
|
|
|
|
return res, nil
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
// ForumCommentsDelete 删除评论
|
|
|
|
|
func (s *sForumComments) Delete(ctx context.Context, req *v1.ForumCommentsDeleteReq) (res *v1.ForumCommentsDeleteRes, err error) {
|
2026-01-18 21:52:04 +08:00
|
|
|
// 检查评论是否存在(排除已删除的)
|
|
|
|
|
one, err := dao.ForumComments.Ctx(ctx).
|
|
|
|
|
WherePri(req.Id).
|
|
|
|
|
WhereNull(dao.ForumComments.Columns().DeletedAt).
|
|
|
|
|
One()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "查询评论失败")
|
|
|
|
|
}
|
|
|
|
|
if one.IsEmpty() {
|
|
|
|
|
return nil, errors.New("评论不存在")
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
var comment *entity.ForumComments
|
|
|
|
|
err = one.Struct(&comment)
|
|
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "解析评论数据失败")
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-18 21:52:04 +08:00
|
|
|
// 软删除评论:更新 deleted_at 和 status
|
|
|
|
|
updateData := map[string]interface{}{
|
|
|
|
|
dao.ForumComments.Columns().DeletedAt: gtime.Now(),
|
|
|
|
|
dao.ForumComments.Columns().Status: "deleted",
|
|
|
|
|
}
|
|
|
|
|
_, err = dao.ForumComments.Ctx(ctx).WherePri(req.Id).Data(updateData).Update()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
|
|
|
|
return nil, gerror.Wrap(err, "删除评论失败")
|
|
|
|
|
}
|
|
|
|
|
|
2026-01-18 21:52:04 +08:00
|
|
|
// 更新帖子的评论数(减少)
|
2026-01-18 18:20:40 +08:00
|
|
|
if comment.PostId > 0 {
|
2026-01-18 21:52:04 +08:00
|
|
|
updatePostData := map[string]interface{}{
|
|
|
|
|
dao.ForumPosts.Columns().CommentCount: gdb.Raw(fmt.Sprintf("GREATEST(0, %s - 1)", dao.ForumPosts.Columns().CommentCount)),
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
2026-01-18 21:52:04 +08:00
|
|
|
_, err = dao.ForumPosts.Ctx(ctx).WherePri(comment.PostId).Data(updatePostData).Update()
|
2026-01-18 18:20:40 +08:00
|
|
|
if err != nil {
|
2026-01-18 21:52:04 +08:00
|
|
|
g.Log().Warning(ctx, "更新帖子评论数失败:", err)
|
2026-01-18 18:20:40 +08:00
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return &v1.ForumCommentsDeleteRes{}, nil
|
|
|
|
|
}
|