244 lines
6.0 KiB
Go
244 lines
6.0 KiB
Go
package plant
|
|
|
|
import (
|
|
"sundynix-go/global"
|
|
"sundynix-go/model/plant"
|
|
plantReq "sundynix-go/model/plant/request"
|
|
"sundynix-go/model/system"
|
|
|
|
"gorm.io/gorm"
|
|
)
|
|
|
|
type PostService struct{}
|
|
|
|
var PostServiceApp = new(PostService)
|
|
|
|
// PublishPost 发表帖子
|
|
func (s *PostService) PublishPost(req plantReq.CreatePost, userId string) error {
|
|
return global.DB.Transaction(func(tx *gorm.DB) error {
|
|
//1.验证oss是否存在
|
|
var ossList []*system.Oss
|
|
err := tx.Where("id in ?", req.OssIds).Find(&ossList).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//2.保存帖子
|
|
post := plant.Post{
|
|
Title: req.Title,
|
|
UserId: userId,
|
|
Content: req.Content,
|
|
Location: req.Location,
|
|
}
|
|
err = tx.Create(&post).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//3.处理图片关系
|
|
if len(ossList) > 0 {
|
|
var relations []map[string]interface{}
|
|
for _, oss := range ossList {
|
|
relations = append(relations, map[string]interface{}{
|
|
"post_id": post.Id,
|
|
"oss_id": oss.Id,
|
|
})
|
|
}
|
|
err = tx.Table("sundynix_post_oss").Create(relations).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
}
|
|
return nil
|
|
})
|
|
}
|
|
|
|
// PostPage 帖子列表
|
|
func (s *PostService) PostPage(req plantReq.PostPage, userId string) (list interface{}, total int64, err error) {
|
|
limit := req.PageSize
|
|
offset := req.PageSize * (req.Current - 1)
|
|
db := global.DB.Model(&plant.Post{}).
|
|
Preload("ImgList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Order("created_at desc")
|
|
}).
|
|
Preload("Publisher", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
}).
|
|
Preload("LikeList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Liker", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
})
|
|
}).
|
|
Preload("CommentList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Commentator", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
})
|
|
})
|
|
var posts []plant.Post
|
|
if req.Title != "" {
|
|
db = db.Where("title like ?", "%"+req.Title+"%")
|
|
}
|
|
//todo 审核帖子
|
|
err = db.Count(&total).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&posts).Error
|
|
// 优化 N+1 查询
|
|
var postIds []string
|
|
for _, v := range posts {
|
|
postIds = append(postIds, v.Id)
|
|
}
|
|
// 批量查询当前用户点赞的记录
|
|
var postLikeList []*plant.PostLike
|
|
err = global.DB.Where("user_id = ? and post_id in ?", userId, postIds).Find(&postLikeList).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
// 构建id映射
|
|
likesMap := make(map[string]bool)
|
|
for _, v := range postLikeList {
|
|
likesMap[v.PostId] = true
|
|
}
|
|
// 是否点赞
|
|
for i := range posts {
|
|
if likesMap[posts[i].Id] {
|
|
posts[i].HasLiked = 1
|
|
} else {
|
|
posts[i].HasLiked = 0
|
|
}
|
|
|
|
}
|
|
|
|
return posts, total, err
|
|
}
|
|
|
|
// MyPost 我的帖子
|
|
func (s *PostService) MyPost(req plantReq.PostPage, userId string) (list interface{}, total int64, err error) {
|
|
limit := req.PageSize
|
|
offset := req.PageSize * (req.Current - 1)
|
|
db := global.DB.Model(&plant.Post{}).
|
|
Preload("ImgList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Order("created_at desc")
|
|
}).
|
|
Preload("Publisher", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
}).
|
|
Preload("LikeList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Liker", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
})
|
|
}).
|
|
Preload("CommentList", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Commentator", func(db *gorm.DB) *gorm.DB {
|
|
return db.Preload("Avatar")
|
|
})
|
|
})
|
|
var posts []plant.Post
|
|
db = db.Where("user_id = ?", userId)
|
|
if req.Title != "" {
|
|
db = db.Where("title like ?", "%"+req.Title+"%")
|
|
}
|
|
//todo 审核帖子
|
|
err = db.Count(&total).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
err = db.Limit(limit).Offset(offset).Order("created_at desc").Find(&posts).Error
|
|
// 优化 N+1 查询
|
|
var postIds []string
|
|
for _, v := range posts {
|
|
postIds = append(postIds, v.Id)
|
|
}
|
|
// 批量查询当前用户点赞的记录
|
|
var postLikeList []*plant.PostLike
|
|
err = global.DB.Where("user_id = ? and post_id in ?", userId, postIds).Find(&postLikeList).Error
|
|
if err != nil {
|
|
return
|
|
}
|
|
// 构建id映射
|
|
likesMap := make(map[string]bool)
|
|
for _, v := range postLikeList {
|
|
likesMap[v.PostId] = true
|
|
}
|
|
// 是否点赞
|
|
for i := range posts {
|
|
if likesMap[posts[i].Id] {
|
|
posts[i].HasLiked = 1
|
|
} else {
|
|
posts[i].HasLiked = 0
|
|
}
|
|
|
|
}
|
|
|
|
return posts, total, err
|
|
}
|
|
|
|
// LikePost 点赞帖或取消赞
|
|
func (s *PostService) LikePost(userId, postId, class string) error {
|
|
// class = 1点赞
|
|
if class == "1" {
|
|
return global.DB.Transaction(func(tx *gorm.DB) error {
|
|
var post plant.Post
|
|
err := tx.Where("id = ?", postId).First(&post).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//1.更新点赞数
|
|
err = tx.Model(&post).Update("like_count", post.LikeCount+1).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//2.添加点赞记录
|
|
like := plant.PostLike{
|
|
UserId: userId,
|
|
PostId: postId,
|
|
}
|
|
return tx.Create(&like).Error
|
|
})
|
|
} else if class == "2" {
|
|
return global.DB.Transaction(func(tx *gorm.DB) error {
|
|
var like plant.PostLike
|
|
err := tx.Where("post_id = ? and user_id = ?", postId, userId).First(&like).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//1.更新点赞数
|
|
var post plant.Post
|
|
err = tx.Where("id = ?", postId).First(&post).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
err = tx.Model(&post).Update("like_count", post.LikeCount-1).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//2.删除点赞记录
|
|
return tx.Unscoped().Delete(&like).Error
|
|
})
|
|
}
|
|
return nil
|
|
}
|
|
|
|
// CommentPost 评论帖子
|
|
func (s *PostService) CommentPost(req plantReq.CreateComment, userId string) error {
|
|
return global.DB.Transaction(func(tx *gorm.DB) error {
|
|
//1.为帖子评论数量+1
|
|
var post plant.Post
|
|
err := global.DB.Where("id = ?", req.PostId).First(&post).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//1.更新评论数
|
|
err = tx.Model(&post).Update("comment_count", post.CommentCount+1).Error
|
|
if err != nil {
|
|
return err
|
|
}
|
|
//2.添加评论
|
|
comment := plant.PostComment{
|
|
PostId: req.PostId,
|
|
UserId: userId,
|
|
Content: req.Content,
|
|
}
|
|
return tx.Create(&comment).Error
|
|
})
|
|
}
|