Files
TrangleAgent/Backend/internal/logic/Forum/post.go

171 lines
4.5 KiB
Go
Raw Normal View History

2026-02-05 21:35:42 +08:00
package Forum
import (
v1 "TrangleAgent/api/forum/v1"
"TrangleAgent/internal/dao"
"TrangleAgent/internal/model"
2026-02-05 22:03:29 +08:00
"TrangleAgent/internal/model/entity"
"TrangleAgent/internal/model/response"
2026-02-05 21:35:42 +08:00
"TrangleAgent/internal/service"
"context"
"github.com/gogf/gf/v2/errors/gerror"
"github.com/gogf/gf/v2/os/gtime"
)
// sForumPosts 帖子逻辑
type sForumPosts struct{}
func NewForumPosts() *sForumPosts {
return &sForumPosts{}
}
func init() {
service.RegisterForumPosts(NewForumPosts())
}
func (s *sForumPosts) Create(ctx context.Context, req *v1.ForumPostsCreateReq) (res *v1.ForumPostsCreateRes, err error) {
//校验参数
if len(req.Title) < 5 || len(req.Title) > 100 {
return nil, gerror.New("标题长度要在5-100之间")
}
if len(req.Content) < 5 || len(req.Content) > 10000 {
return nil, gerror.New("内容长度要在5-10000之间")
}
if req.BoardId == 0 {
return nil, gerror.New("板块ID不能为空")
}
//创建帖子
2026-02-05 22:03:29 +08:00
insert := entity.ForumPosts{
2026-02-05 21:35:42 +08:00
BoardId: req.BoardId,
UserId: req.UserId,
Title: req.Title,
Content: req.Content,
CoverImage: req.CoverImage,
Status: req.Status,
CreatedAt: gtime.Now(),
UpdatedAt: gtime.Now(),
}
2026-02-05 22:03:29 +08:00
if insert.Status == "" {
insert.Status = "normal"
}
2026-02-05 21:35:42 +08:00
result, err := dao.ForumPosts.Ctx(ctx).Data(insert).Insert()
if err != nil {
return nil, gerror.Wrap(err, "创建帖子失败")
}
id, err := result.LastInsertId()
if err != nil {
return nil, gerror.Wrap(err, "获取帖子ID失败")
}
return &v1.ForumPostsCreateRes{Id: uint64(id)}, nil
}
func (s *sForumPosts) Update(ctx context.Context, req *v1.ForumPostsUpdateReq) (res *v1.ForumPostsUpdateRes, err error) {
//校验参数
if len(req.Title) < 5 || len(req.Title) > 100 {
return nil, gerror.New("标题长度要在5-100之间")
}
if len(req.Content) < 5 || len(req.Content) > 10000 {
return nil, gerror.New("内容长度要在5-10000之间")
}
//只能修改 帖子标题 帖子正文 帖子封面图URL
//更新帖子
2026-02-05 22:03:29 +08:00
_, err = dao.ForumPosts.Ctx(ctx).Data(entity.ForumPosts{
2026-02-05 21:35:42 +08:00
Id: req.Id,
Title: req.Title,
Content: req.Content,
CoverImage: req.CoverImage,
2026-02-05 22:03:29 +08:00
UpdatedAt: gtime.Now(),
}).Fields("title", "content", "cover_image", "updated_at").OmitEmpty().Update()
2026-02-05 21:35:42 +08:00
if err != nil {
return nil, gerror.Wrap(err, "更新帖子失败")
}
return &v1.ForumPostsUpdateRes{Id: req.Id}, nil
}
func (s *sForumPosts) Delete(ctx context.Context, req *v1.ForumPostsDeleteReq) (res *v1.ForumPostsDeleteRes, err error) {
//根据id删除帖子
_, err = dao.ForumPosts.Ctx(ctx).Where(dao.ForumPosts.Columns().Id, req.Id).Delete()
if err != nil {
return nil, gerror.Wrap(err, "删除帖子失败")
}
return &v1.ForumPostsDeleteRes{}, nil
}
func (s *sForumPosts) View(ctx context.Context, req *v1.ForumPostsViewReq) (res *v1.ForumPostsViewRes, err error) {
// 根据id查询帖子
var post model.ForumPostViewParams
err = dao.ForumPosts.Ctx(ctx).Where(dao.ForumPosts.Columns().Id, req.Id).Scan(&post)
if err != nil {
return nil, gerror.Wrap(err, "查询帖子失败")
}
return &v1.ForumPostsViewRes{
ForumPostViewParams: post,
}, nil
}
func (s *sForumPosts) List(ctx context.Context, req *v1.ForumPostsListReq) (res *v1.ForumPostsListRes, err error) {
// 查询帖子列表
mod := dao.ForumPosts.Ctx(ctx)
if req.Title != "" {
mod = mod.WhereLike(dao.ForumPosts.Columns().Title, "%"+req.Title+"%")
}
if req.BoardId != 0 {
mod = mod.Where(dao.ForumPosts.Columns().BoardId, req.BoardId)
}
2026-02-05 22:03:29 +08:00
if req.UserId != 0 {
mod = mod.Where(dao.ForumPosts.Columns().UserId, req.UserId)
}
if req.Status != "" {
mod = mod.Where(dao.ForumPosts.Columns().Status, req.Status)
}
if req.IsPinned != 0 {
mod = mod.Where(dao.ForumPosts.Columns().IsPinned, req.IsPinned)
}
if req.IsEssence != 0 {
mod = mod.Where(dao.ForumPosts.Columns().IsEssence, req.IsEssence)
}
// 排序:优先置顶,然后按创建时间倒序
mod = mod.OrderDesc(dao.ForumPosts.Columns().IsPinned).OrderDesc(dao.ForumPosts.Columns().CreatedAt)
// 分页
page := req.Page
if page <= 0 {
page = 1
}
size := req.PageSize
if size <= 0 {
size = 10
}
total, err := mod.Count()
if err != nil {
return nil, gerror.Wrap(err, "获取帖子总数失败")
}
2026-02-05 21:35:42 +08:00
var list []*model.ForumPostViewParams
2026-02-05 22:03:29 +08:00
err = mod.Page(page, size).Scan(&list)
2026-02-05 21:35:42 +08:00
if err != nil {
return nil, gerror.Wrap(err, "查询帖子列表失败")
}
return &v1.ForumPostsListRes{
2026-02-05 22:03:29 +08:00
PageResult: response.PageResult{
Total: total,
Page: page,
PageSize: size,
},
2026-02-05 21:35:42 +08:00
List: list,
}, nil
}